【VBA】セルクリックでカレンダー入力(ユーザーフォーム)を作る

excelvba エクセル

エクセルでカレンダー入力をしようと思うとアドインを入れたりACCESSのカレンダーコントロールを使ったりする方法がありますがカスタムには向いていません。

また、セルをクリックしてそのセルに日付を入れたいという希望もあります。

なので、ユーザーフォームでカレンダーを作ってみました。

Worksheet_SelectionChange()と合わせてセルがクリックされたら表示するようにしてみましょう。

※Worksheet_SelectionChange()はApplication.EnableEvents = Falseでイベントを抑止することによってWorksheet_SelectionChange()がWorksheet_SelectionChange()を呼ぶということが無いようにしておきましょう。また、範囲が広い場合は重くなる可能性がありますのでご了承ください。

スポンサーリンク

sheetモジュール

まずはセルをクリックしたときの動きを作ります。

sheet名は気にしない前提で、対象のセルを指定します。(Microsoft Excel Objects内のsheet1などに記述します。)

B2セルを入力欄とします。

「If Not Intersect(Target, ThisWorkbook.Worksheets(HT_setFile).Cells(HT_str_row, HT_str_col)) Is Nothing Then」がクリックされた場合に反応します。

rangeで範囲指定も可能です。

この「Worksheet_SelectionChange」はセルの選択が変わった時に実行されます。

選択されたセルが条件に合うかで処理をするというものです。

難点はすでに選択されている場合は他のセルを選択しないとセル上をクリックしても反応しない点と処理数が多くなるので重くなるという点です。

後ほど作る標準フォームで選択をし直すなどの処理が必要になることもあります。

ボタン化するなどの方が使用として優れている場合がありますので臨機応変に修正してください。

標準モジュール

標準モジュールには共通変数(Public )や変数、セルがクリックされた後の処理から、カレンダーフォームを呼び出す処理とそのあとの処理を書いていきます。

ここでの問題はPublic変数を使う点です。

フォームへの変数を引き渡しの際は.showでの受け渡しができません。

どうしてもPublic変数が必要になります。重複など変数名の設定には気をつけましょう。

ユーザーフォーム

ユーザーフォームに関してはビジュアル部分があるのでファイルを掲載します。

プロジェクトからインポートしてください。

フォームの見た目はこんな感じです。

フォームソースのダウンロードはこちら

calender_form.zip (1173 ダウンロード)

以下はソースです。

色々入っていますがフォームをインポートしてもらってから見ていった方がいいかもしれません。

 

上記を実装するとセルをクリックするとカレンダーが表示して選択したセルにカレンダーで選んだ日付が入ります。

細かい設定は変える必要があるかもしれませんがとりあえず実行出来るかなと思います。

尚、セルが選択されたら実行する「Worksheet_SelectionChange」に関しては関係ないセルでも実行します。

ある程度の負荷が出ることを考慮して作成しましょう。

コメント

タイトルとURLをコピーしました