EventDblClickShowCalendarNumberFormatIsDate|表示形式が日付のセルをダブルクリックだけでカレンダーが起動するようにする|Excel VBA
- yuji fukami
- 3月4日
- 読了時間: 3分
概要(ダブルクリックするだけでカレンダーが出てくる)
今回は、Excelのワークシート上で 表示形式が「日付」になっているセルをダブルクリックするだけで、カレンダー(UserForm)を起動できる ようにする実装例を紹介します。
Googleスプレッドシートには、入力規則で日付を指定するとカレンダーが表示される標準機能がありますが、Excelには同等の機能が標準では用意されていません。そこでVBAを使い、セルの表示形式を日付にしておくだけで、ダブルクリック時にカレンダーを表示できる仕組みを実現します。
通常の日付入力は、数字やスラッシュを手入力する必要があり、入力ミスや表記ゆれが起きやすいのが難点です。カレンダー入力にすることで、直感的に日付を選べるようになり、入力の手間とミスを減らせます。

実際の実装例
実際の動作は、下の動画のとおりです。対象のセル範囲の表示形式を「日付」に設定しておくと、そのセルを ダブルクリックしたタイミングでカレンダーが起動し、日付を選択して入力できるようになります。
「日付列だけ入力を簡単にしたい」「入力ミスを防ぎたい」といった場面で、特に効果が出やすいUI改善です。
実装手順
動画にも実際のコードを掲載していますが、ここでは実装手順を文章で整理します。本機能は、シートのダブルクリックイベント(Worksheet_BeforeDoubleClick)から、汎用プロシージャ EventDblClickShowCalendarNumberFormatIsDate を呼び出す構成です。
1. シート側にダブルクリックイベントを記述する
まず、対象シートのコードモジュール(例:Sheet1)に、ダブルクリック時のイベントを記述します。ここでは Target(クリックされたセル)と Cancel(既定動作のキャンセル)を引数として、汎用プロシージャへ渡すだけでOKです。
2. 汎用プロシージャ側で「表示形式が日付か」を判定する
次に、汎用プロシージャ EventDblClickShowCalendarNumberFormatIsDate を標準モジュールに用意します。ダブルクリックしたセルは Target(Rangeオブジェクト)として渡されるため、まず Target.NumberFormatLocal から表示形式を取得し、日付形式かどうかを判定します。
判定方法はシンプルで、表示形式の文字列に y / m / d が含まれているかどうかを確認します。日付形式と判定できた場合は Cancel = True としてセル編集を止め、カレンダー(UserForm)を表示します。
3. カレンダー(UserForm)はパッケージをインポートして準備する
カレンダー本体は、下記のZIPパッケージとして用意しています。ダウンロード後、VBE(Visual Basic Editor)のプロジェクトエクスプローラーに ドラッグ&ドロップ でインポートしてください。
ZIPの中には、以下のファイルが入っています。
clsBtnDay.bas(日付ボタン関連のクラス)
frmCalendar.bas(UserForm本体のコード)
frmCalendar.frx(UserFormのフォーム定義)
この3点が取り込めれば、カレンダーフォームは利用できる状態になります。

4. フォーム表示位置をセルの近くに合わせる(任意)
カレンダーは frmCalendar.Show vbModeless で表示していますが、さらに使い勝手を上げるため、選択セルの近く(右上など)にフォームを配置しています。配置処理には SetFormNearCell を利用します。


