Accessお手本データベースのホームへ戻る

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

 

3-3-1 マウスの右ボタンをクリックするとテキストボックスの近くにポップアップカレンダーが表示されます

 

このサンプルデータベースは、テキストボックスにマウスを移動して右ボタンをクリックするとポップアップカレンダーを表示します。カレンダーには、テキストボックスに日付が入力されているとき、その日付が選択された状態で表示されます。テキストボックスが空のときは、システム日付が選択された状態で表示されます。ポップアップカレンダーに、年月の2個のコンボボックスが配置されていますので任意の年月にカレンダーを移動させて日付を選択することができます。このサンプルデータベースでは、ポップアップカレンダーから日付を選択する他に、”+”キーを押して日付をスクロールすることもできます。

 

サンプルデータベース(CH3-3.mdb)では、以下のノウハウを習得することができます。

 

◆ ポップアップカレンダーのフォームを作成する方法

◆ テキストボックスの近くにポップアップカレンダーを表示する方法

◆ キーで日付をスクロールさせる方法

 

   ポップアップカレンダーのフォームを作成するには

 

1 Accessを起動して作業フォルダに新規データベースCH3-5.mdbを作成します。

 

2 メニューからツールActiveXコントロールをクリックしてActiveXコントロールのダイアログを表示させます。利用可能なコントロールのリストボックスをスクロールしてカレンダーコントロールX.Xが登録されているか確認します。登録されているときは、閉じるのボタンをクリックしてダイアログを閉じます。登録されていないときは、Access 2000/2002/2003/2007CD-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カレンダー固有のイベントで、日付をクリックして日付が変更されたときに実行されます。このイベントでは、basCalendarSub SetDate_FSを呼び出します。SetDate_FSでは、mtxtの変数に保存されているテキストボックスにカレンダーで選択した日付を設定して、DoCmdCloseメソッドでポップアップカレンダーを閉じます。尚、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()イベントの処理について

このイベントは、ポップアップカレンダーのフォームが開かれてデータがロードされたときに実行されます。このイベントでは、basCalendarSub 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()

このサブプロシージャは、マウスをテキストボックスに移動して右ボタンをクリックしたときにfrmPopupCalendarOnMouseDownイベントから呼ばれます。このサブプロシージャには、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

 

WindowsAPI GetSystemMetricsGetCursorPosで取得した、スクリーンの解像度とカーソル位置を元にポップアップカレンダーの表示位置を計算します。DoCmdOpenFormメソッドでポップアップカレンダーを開いたら、DoCmdMoveSizeメソッドでカレンダーをテキストボックスの近くに移動します。

    

DoCmd.OpenForm conFormName

             DoCmd.MoveSize sngMoveX, sngMoveY

 

 

Sub SetDate_FS()

このサブプロシージャは、ActiveXカレンダーのAfterUpdate/Clickイベントから呼ばれます。このサブプロシージャでは、mtxtに保存されているテキストボックスに、ActiveXカレンダーで選択した日付を設定します。そして、DoCmdCloseメソッドでポップアップカレンダーを閉じます。

 

 

Sub SetDefaultDate_FS()

このサブプロシージャは、frmCalendarForm_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

 

 

   ポップアップカレンダーを表示するサンプルフォームを作成するには

 

  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

ポップアップカレンダー処理フロー

 

      frmPopupCalendarのテキストボックスでマウスの右ボタンをクリックするとOnMouseDownイベント発生。イベントからPopupCalendar_FSを呼び出す。

      frmCalendarを開く。

      frmCalendarOnLoadイベント発生。イベントからSetDefault_FSを呼び出す。SetDefault_FSでは、frmCalendarで表示するデフォルトの日付設定。

      ActiveXカレンダーのOnAfterUpdate/OnClickイベント発生。イベントからSetDate_FSを呼び出す。

      SetDate_FSでは、テキストボックスにカレンダーで選択した日付を設定。

      frmCalendarを閉じる。

 

 

 

3-3-6 ポップアップカレンダーの処理フロー

 


 

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イベントを登録して、イベント処理を記述する必要があります。クラスモジュールのテクニックを応用すると、テキストボックスのOnMouseDownOnKeyPressイベントの処理を全てクラスモジュール内で制御することができます。ポップアップカレンダーを組み込むにはフォームのOnLoadイベントで、clsCalendarのインスタンスを生成して、RegisterControlsメソッドでポップアップカレンダーを表示させるテキストボックスを登録します。 CH3-3.mdbにクラスモジュールを採用した場合のサンプル、frmCalendarClass, frmPopupCalendarClass, clsCalendarが収録されていますので参考にしてください。

 

Private mclsCal As clsCalendar

 

Private Sub Form_Load()

  Set mclsCal = New clsCalendar

  With mclsCal

    .RegisterControls _

      Me.受付日, Me.受注日, Me.出荷日

  End With

End Sub

 

 

 

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個以上のテキストボックスを登録するときは、clsCalendarRegisterControlsメソッドに引数を追加してください。RegisterControlsメソッドの引数は省略できませんので、3個以内のときは、最初のテキストボックスを指定してください。

 

例えば、1個のテキストボックスを登録するときは、

 

    .RegisterControls  Me.日付1, Me.日付1, Me.日付1

 

のように引数を指定します。 

 

 

Private Sub Form_Load()

  Set mclsCal = New clsCalendar

  With mclsCal

    .RegisterControls Me.日付1, Me.日付2, Me.日付3

  End With

End Sub

 

 

 

  フォーム(frmMyForm)のプロパティを表示させたら、ショートカットメニューを“いいえ”に設定します。これで組み込み完了です。

 

5 フォームを開いて、マウスの右ボタンをクリックしたときにポップアップカレンダーが表示されるか確認します。また、“+”、“-”キーを押したときに、日付がローリングするか確認します。

 

6 フォーム(frmMyForm)を保存して、Access を終了させます。

 

 

ダウンロード (CH3-3.lzh)
Accessお手本データベースのホームへ戻る