ポップアップカレンダーを表示するお手本データベース

図3-3-1 マウスの右ボタンをクリックするとテキストボックスの近くにポップアップカレンダーが表示されます
このサンプルデータベースは、テキストボックスにマウスを移動して右ボタンをクリックするとポップアップカレンダーを表示します。カレンダーには、テキストボックスに日付が入力されているとき、その日付が選択された状態で表示されます。テキストボックスが空のときは、システム日付が選択された状態で表示されます。ポップアップカレンダーに、年月の2個のコンボボックスが配置されていますので任意の年月にカレンダーを移動させて日付を選択することができます。このサンプルデータベースでは、ポップアップカレンダーから日付を選択する他に、”+”、”-“キーを押して日付をスクロールすることもできます。
サンプルデータベース(CH3-3.mdb)では、以下のノウハウを習得することができます。
◆ ポップアップカレンダーのフォームを作成する方法
◆ テキストボックスの近くにポップアップカレンダーを表示する方法
◆ “+”、”-“キーで日付をスクロールさせる方法
● ポップアップカレンダーのフォームを作成するには
1 Accessを起動して作業フォルダに新規データベースCH3-5.mdbを作成します。
2 メニューからツール、ActiveXコントロールをクリックしてActiveXコントロールのダイアログを表示させます。利用可能なコントロールのリストボックスをスクロールしてカレンダーコントロールX.Xが登録されているか確認します。登録されているときは、閉じるのボタンをクリックしてダイアログを閉じます。登録されていないときは、Access 2000/2002/2003/2007のCD-ROMからカレンダーコントロールをインストールします。
3 データベースウィンドウからフォーム
をクリックして、新規作成ボタンをクリックします。フォームの新規作成ダイアログが表示されたら、デザインビューを選択してOKボタンをクリックします。フォームのデザインビューが表示されたら、ツールボックスからコントロールの選択アイコン
をクリックして一覧からカレンダーコントロールX.Xをクリックします。フォーム中央にActiveXカレンダーを作成したら、コントロールの名前を”ctlCalendar”に書き替えます。カレンダーのオブジェクトをダブルクリックして、Calendarのプロパティを表示させます。全般タブをクリックしたら、表示のチェックボックスからタイトルをクリックしてチェックを外します。次に、フォントのタブをクリックしたら、DayFontを選択してフォント(MS Pゴシック)、サイズ(8.25)、文字飾り(太字)を選択します。、TitleFontには、フォント(MS Pゴシック)、サイズ(12)、文字飾り(太字)を選択します。最後にOKボタンをクリックしてプロパティを閉じます。

図3-3-2 Calendarのプロパティを表示させて、全般、フォントのプロパティを再設定する
フォームに作成したカレンダーが図3-3-3のようになるようにサイズを調整します。カレンダーの外側に四角形のコントロールを作成します。四角形のプロパティを表示させたら、境界線色を”255”、立体表示を”影付き”、境界線幅を”3ポイント”に設定します。次に、フォームのプロパティを表示させたら、ポップアップを”はい”、作業ウィンドウの固定を”はい”、スクロールバーを”なし”、レコードセレクタを”いいえ”、移動ボタンを”いいえ”、区切り線を”いいえ”、サイズ自動修正を”いいえ”、中央自動寄せを”いいえ”、境界線スタイルを”なし”、コントロールボックスを”いいえ”に設定します。
表3-3-1 フォームおよびActiveXカレンダーのプロパティ
|
コントロールの種類 |
プロパティ |
値 |
|
フォーム |
ショートカットメニュー |
いいえ |
|
ポップアップ |
はい |
|
|
作業ウィンドウ固定 |
はい |
|
|
スクロールバー |
なし |
|
|
レコードセレクタ |
いいえ |
|
|
移動ボタン |
いいえ |
|
|
区切り線 |
いいえ |
|
|
サイズ自動修正 |
いいえ |
|
|
自動中央寄せ |
いいえ |
|
|
境界線スタイル |
なし |
|
|
コントロールボックス |
いいえ |
|
|
四角形 |
立体表示 |
影付き |
|
境界線幅 |
3ポイント |
|
|
境界線色 |
255 |
|
|
境界線スタイル |
実線 |
|
|
ActiveXカレンダーコントロール (全般/フォントのプロパティは、カレンダーコントロールをダブルクリックすると表示されます) |
名前 |
ctlCalendar |
|
全般タブ(表示) |
タイトル-なし |
|
|
フォントタブ(DayFont) |
フォント-MS Pゴシック サイズ-8.25 飾り文字-太字 |
|
|
フォントタブ(TitleFont) |
フォント-MS Pゴシック サイズ-12 飾り文字-太字 |

図3-3-3 ActiveXカレンダーのサイズを調整して縮小した例
4 フォームを開いたら、ポップアップカレンダーが図3-3-4のように表示されるか確認します。フォームの四角形にマウスを移動させたら、右ボタンをクリックしてショートカットメニューを表示させて、フォームデザインをクリックしてデザインビューに切り替えます。(注:ActiveXカレンダー上にマウスを移動して右ボタンをクリックしても、ショートカットメニューは表示されません。)

図3-3-4 ポップアップカレンダーを開いた例
5 メニューからコードのアイコン
をクリックしてフォームモジュールを表示させたら、CH3-3.mdbを開いて”frmCalendar”のフォームモジュールをコピーして貼り付けます。フォームモジュールのリストは、リスト3-3-1を参照してください。また、CH3-3.mdbのモジュールからbasCalendar, basMyLibをインポートしてください。
Sub ctlCalendar_AfterUpdate()イベントの処理について
このイベントは、ActiveXカレンダー固有のイベントで、日付をクリックして日付が変更されたときに実行されます。このイベントでは、basCalendarのSub SetDate_FSを呼び出します。SetDate_FSでは、mtxtの変数に保存されているテキストボックスにカレンダーで選択した日付を設定して、DoCmdのCloseメソッドでポップアップカレンダーを閉じます。尚、mtxtには、 Sub PopUpCalendar_FSを呼び出したときに引数で指定したテキストボックスのオブジェクトポンターが保存されています。
With frm("ctlCalendar")
mtxt.Value = .Value
DoCmd.Close acForm, conFormName
End With
Sub ctlCalendar_Click()イベントの処理について
このイベントは、ActiveXカレンダー固有のイベントで、日付をクリックしたときに実行されます。AfterUpdateイベントは、日付が変更されたときに実行されますが、Clickイベントは、日付を変更しないとき(既に選択されている日付を再度クリック)も実行されます。
このイベントでは、AfterUpdateイベントと同様、テキストボックスに選択した日付を設定してポップアップカレンダーを閉じます。
Sub Form_Load()イベントの処理について
このイベントは、ポップアップカレンダーのフォームが開かれてデータがロードされたときに実行されます。このイベントでは、basCalendarのSub SetDefaultDate_FSを呼び出します。SetDefaultDate_FSでは、ActiveXカレンダーのデフォルト値を設定します。mtxtに保存されているテキストボックスの値がNullのときはシステム日付、テキストボックスに日付が格納されているときはその日付をデフォルトとします。
With frm("ctlCalendar")
If IsNull(mtxt.Value) Then
.Value = Date
Else
.Value = mtxt.Value
End If
End With
リスト3-3-1 frmCalendarのフォームモジュール
|
Option Compare Database Option Explicit Private Sub ctlCalendar_AfterUpdate() Call SetDate_FS(Me) End Sub Private Sub ctlCalendar_Click() Call SetDate_FS(Me) End Sub Private Sub Form_Load() Call SetDefaultDate_FS(Me) End Sub |
Sub PopUpCalendar_FS()
このサブプロシージャは、マウスをテキストボックスに移動して右ボタンをクリックしたときにfrmPopupCalendarのOnMouseDownイベントから呼ばれます。このサブプロシージャには、2個の引数を指定します。引数1にはフォーム、引数2には日付を設定するテキストボックスを指定します。
If Button = acRightButton Then
Call PopUpCalendar_FS(Me, Me.受注日)
End If
PopUpCalendar_FSで指定した引数は、Setでモジュールレベルのメモリ変数(mfrm, mtxt)に保存されます。
Set mfrm = frm
Set mtxt = txt
WindowsのAPI GetSystemMetricsとGetCursorPosで取得した、スクリーンの解像度とカーソル位置を元にポップアップカレンダーの表示位置を計算します。DoCmdのOpenFormメソッドでポップアップカレンダーを開いたら、DoCmdのMoveSizeメソッドでカレンダーをテキストボックスの近くに移動します。
DoCmd.OpenForm conFormName
DoCmd.MoveSize sngMoveX, sngMoveY
Sub SetDate_FS()
このサブプロシージャは、ActiveXカレンダーのAfterUpdate/Clickイベントから呼ばれます。このサブプロシージャでは、mtxtに保存されているテキストボックスに、ActiveXカレンダーで選択した日付を設定します。そして、DoCmdのCloseメソッドでポップアップカレンダーを閉じます。
Sub SetDefaultDate_FS()
このサブプロシージャは、frmCalendarのForm_Loadイベントから呼ばれます。このサブプロシージャでは、mtxtに保存されているテキストボックスの値を調べてデフォルトの日付を設定します。テキストボックスの値がNullのときは、システム日付をデフォルトとします。テキストボックスに値が格納されているときは、その日付をデフォルトとします。
リスト3-3-2 basCalendarのソースコード
|
ption Compare Database Option Explicit Dim mfrm As Form Dim mtxt As TextBox Const conFactor = 14 Const conFormName = "frmCalendar" Private Declare Function GetSystemMetrics& _ Lib "User32" (ByVal nIndex&) Private Type POINTAPI X As Long Y As Long End Type Private Declare Function GetCursorPos _ Lib "User32" (lpPoint As POINTAPI) As Long Public Sub PopUpCalendar_FS(frm As Form, txt As TextBox)
Dim pAPI As POINTAPI Dim sngMoveX As Single Dim sngMoveY As Single Dim sngScrH As Single Dim sngScrW As Single Dim sngTxtH As Single Dim sngTxtW As Single
Set mfrm = frm Set mtxt = txt
' スクリーンの解像度を取得します sngScrH = GetSystemMetrics(1) sngScrW = GetSystemMetrics(0)
sngScrH = sngScrH / conFactor sngScrW = sngScrW / conFactor ' カーソルの位置を取得してポップアップカレンダーを表示する ' 位置を計算する GetCursorPos pAPI With txt sngTxtH = .Top / conFactor sngTxtW = .Left / conFactor End With If Abs((sngScrH - (pAPI.Y / conFactor))) < sngTxtH Then sngMoveY = (pAPI.Y * conFactor) + (2 * sngTxtH) Else sngMoveY = (pAPI.Y * conFactor) - (sngTxtH * 10.25) End If If Abs((sngScrW - (pAPI.X / conFactor))) < sngTxtW Then sngMoveX = (pAPI.X * conFactor) + sngTxtW Else sngMoveX = (pAPI.X * conFactor) - (sngTxtW * 6) End If
' ポップアップカレンダーを開いてテキストボックスの近くに移動する DoCmd.OpenForm conFormName DoCmd.MoveSize sngMoveX, sngMoveY
End Sub Public Sub SetDate_FS(frm As Form) On Error Resume Next With frm("ctlCalendar") mtxt.Value = .Value DoCmd.Close acForm, conFormName End With End Sub Public Sub SetDefaultDate_FS(frm As Form) On Error Resume Next With frm("ctlCalendar") If IsNull(mtxt.Value) Then .Value = Date Else .Value = mtxt.Value End If End With End Sub |
● ポップアップカレンダーを表示するサンプルフォームを作成するには
1 Access を起動したら作業フォルダに作成した CH3-3.mdbを開きます。
2 データベースウィンドウからフォーム
をクリックして、新規作成のボタンをクリックします。フォームの新規作成ダイアログが表示されたら、デザインビューを選択してOKをクリックします。フォームのデザインビューが表示されたら、受付日、受注日、出荷日の3個のテキストボックスを最左端、中央、最右端に作成します。テキストボックスのコントロール名を、“受付日”、“受注日”、“出荷日”に書き替えます。次に、ラベルを作成して説明文を入力します。フォームのプロパティを表示させたら、ショートカットメニューを“いいえ”に設定します。
表3-3-2 サンプルフォームのプロパティ
|
コントロールの種類 |
プロパティ |
値 |
|
フォーム |
ショートカット |
いいえ |
|
テキストボックス1 |
名前 |
受付日 |
|
既定値 |
Date() |
|
|
書式 |
日付(S) |
|
|
テキストボックス2 |
名前 |
受注日 |
|
既定値 |
Date() |
|
|
書式 |
日付(S) |
|
|
テキストボックス3 |
名前 |
出荷日 |
|
既定値 |
Date()+7 |
|
|
書式 |
日付(S) |

図3-3-5 ポップアップカレンダーを表示するフォームに3個のテキストボックスを作成した例
3 メニューからコードのアイコンをクリックしてフォームモジュールを表示させたら、CH3-3.mdbを開いて”frmPopupCalendar”のフォームモジュールをコピーして貼り付けます。フォームモジュールのリストは、リスト3-3-3を参照してください。
4 フォームを開いたら、マウスを任意のテキストボックスに移動して右ボタンをクリックします。このときテキストボックスの近くにポップアップカレンダーが表示されます。カレンダーは、テキストボックスに格納されている日付が選択された状態で表示されます。カレンダーから任意の日付をクリックすると、テキストボックスにその日付が設定されます。テキストボックスに表示されている日付をローリング(増減)させるには、マウスをテキストボックスに移動させてクリックします。テキストボックスがフォーカスされている状態で、“+”、“-”キーを押すと日付がローリングします。
5 ポップアップカレンダーが正常に動作することを確認したらフォームを”frmPopupCalendar”の名称で保存して、Accessを終了させます。
Note
Sub 受付日_KeyPress()/受注日_KeyPress()/出荷日_KeyPress()
これらのイベントは、テキストボックスにキーを入力したときに実行されます。これらのイベントでは、KeyPressイベントで渡された引数(KeyAscii)を調べて、“+”、“-”キーが入力されたか調べます。“+”のときは、.Value = .Value + 1で日付を加算します。“-”のときは、.Value = .Value – 1で日付を減算します。最後に、引数KeyAscii に 0を設定して入力した“+”、“-”キーを無効とします。
Sub 受付日_MouseDown()/受注日_MouseDown()/出荷日_MouseDown()
これらのイベントは、マウスをクリックしたときに実行されます。これらの関数では、MouseDownイベントの引数Buttonを調べます。右ボタン(acRightButton)がクリックされたときは、PopUpCalendar_FSを呼んでポップアップカレンダーを表示させます。カレンダーから日付をクリックすると、PopUpCalendar_FSの引数に指定したテキストボックスに日付を設定して、カレンダーを閉じます。
リスト3-3-3 frmPopupCalendarのフォームモジュール
|
Option Compare Database Option Explicit Private Sub Form_Open(Cancel As Integer) Call SetAppTitle_FS("Popup Calendar (C) " _ & Year(Date) & " by Akio Kasai") End Sub Private Sub 受注日_KeyPress(KeyAscii As Integer) With Me.受注日 Select Case KeyAscii Case 43 ' Plus key KeyAscii = 0 .Value = .Value + 1 Case 45 ' Minus key KeyAscii = 0 .Value = .Value - 1 End Select End With End Sub Private Sub 受注日_MouseDown(Button As Integer, _ Shift As Integer, X As Single, Y As Single) If Button = acRightButton Then Call PopUpCalendar_FS(Me, Me.受注日) End If End Sub Private Sub 受付日_KeyPress(KeyAscii As Integer) With Me.受付日 Select Case KeyAscii Case 43 ' Plus key KeyAscii = 0 .Value = .Value + 1 Case 45 ' Minus key KeyAscii = 0 .Value = .Value - 1 End Select End With End Sub Private Sub 受付日_MouseDown(Button As Integer, _ Shift As Integer, X As Single, Y As Single) If Button = acRightButton Then Call PopUpCalendar_FS(Me, Me.受付日) End If End Sub Private Sub 出荷日_KeyPress(KeyAscii As Integer) With Me.出荷日 Select Case KeyAscii Case 43 ' Plus key KeyAscii = 0 .Value = .Value + 1 Case 45 ' Minus key KeyAscii = 0 .Value = .Value - 1 End Select End With End Sub Private Sub 出荷日_MouseDown(Button As Integer, _ Shift As Integer, X As Single, Y As Single) If Button = acRightButton Then Call PopUpCalendar_FS(Me, Me.出荷日) End If End Sub |
Tip
|
ここで紹介したサンプルデータベースは、ポップアップカレンダーを表示させるのに、標準モジュール basCalendarに登録されているPublic属性のサブプロシージャを使用して実現しています。この方式を採用した場合、ポップアップカレンダーを表示させる全てのテキストボックスにOnMouseDownイベントを登録して、イベント処理を記述する必要があります。クラスモジュールのテクニックを応用すると、テキストボックスのOnMouseDownとOnKeyPressイベントの処理を全てクラスモジュール内で制御することができます。ポップアップカレンダーを組み込むにはフォームのOnLoadイベントで、clsCalendarのインスタンスを生成して、RegisterControlsメソッドでポップアップカレンダーを表示させるテキストボックスを登録します。 CH3-3.mdbにクラスモジュールを採用した場合のサンプル、frmCalendarClass, frmPopupCalendarClass, clsCalendarが収録されていますので参考にしてください。
|
Tip
|
既に作成済みのデータベースにポップアップカレンダーを組み込むには: 既に作成済みのデータベースにクラスモジュール版のポップアップカレンダーを組み込む手順を説明します。 1 Access を起動して既に作成済みのデータベース(MyDB.mdb)を開きます。 2 CH3-3.mdbのフォームからfrmCalendarClass、モジュールからclsCalendarをインポートします。 3 ポップアップカレンダーを組み込むフォーム(frmMyForm)をデザインモードで開きます。フォームモジュールを表示したら、モジュールレベルの変数Private mclsCal As clsCalendarを定義します。 Private mclsCal As clsCalendarフォームのOnLoadイベントに、以下のコードを追加します。RegisterControlsメソッドでは、最大3個のテキストボックスを登録することができます。3個以上のテキストボックスを登録するときは、clsCalendarのRegisterControlsメソッドに引数を追加してください。RegisterControlsメソッドの引数は省略できませんので、3個以内のときは、最初のテキストボックスを指定してください。 例えば、1個のテキストボックスを登録するときは、 .RegisterControls Me.日付1, Me.日付1, Me.日付1 のように引数を指定します。
4 フォーム(frmMyForm)のプロパティを表示させたら、ショートカットメニューを“いいえ”に設定します。これで組み込み完了です。 5 フォームを開いて、マウスの右ボタンをクリックしたときにポップアップカレンダーが表示されるか確認します。また、“+”、“-”キーを押したときに、日付がローリングするか確認します。 6 フォーム(frmMyForm)を保存して、Access を終了させます。
|