Access 2010 アプリケーションのカレンダー コントロールを置き換える

Office Visual How To

**概要:**Microsoft Access 2010 アプリケーション内の現在使用されていない Calendar コントロールを置き換える方法を説明します。

適用対象: Access 2007 | Access 2010 | Access Services | Office 2007 | Office 2010

公開: 2010 年 10 月

提供元: Ken Getz、MCW Technologies, LLC (英語)

概要

Microsoft Access には、Access 2.0 で ActiveX コントロールのサポートが初めて追加されて以来、Calendar コントロールが含まれています。このカレンダー コントロール (MSCAL.OCX) は、Access 2010 には付属していません。また、このコントロールが含まれるフォームを開こうとすると、"Microsoft Office Access データベースまたはプロジェクトにファイル MSCAL.OCX を参照する切断された参照が含まれています。" というエラーが表示されます。

コード化する

Access 2010 アプリケーション内の Calendar コントロールを置き換えるには、次に示すいくつかの方法があります。

  • 日付フィールドにバインドされているすべての TextBox コントロールで組み込みの DatePicker 機能を使用する。

  • Windows コモン コントロールに含まれている Windows の DatePicker コントロールを使用する。

  • カレンダーと同様の外観と機能を持つサブフォームを使用する。

  • サードパーティの日付/カレンダー コントロールを使用する。

この Visual How To では、最後のものを除くすべての方法を説明します。最初に、サンプル データベースである CalendarDemo.accdb (Access 2010 データベース) をダウンロードします。このデータベースには、3 つのフィールド (ID、得意先名、および生年月日) を持つ生年月日という名前のテーブルと、次の 2 つのフォームが含まれています。

  • 生年月日 (生年月日というサンプル テーブルにバインドされています)

  • frmCalendar (Calendar コントロールの代替となるサンプルです)

現在のアプリケーションで MSCAL.OCX カレンダー コントロールを使用している場合は、現状ではこのコントロールが含まれる上記のフォームを使用する前に、このコントロールの各インスタンスを削除する必要があります。この例では、その次の手順である、Access の Calendar コントロールの代替オブジェクトの使用方法を説明します。

組み込みの DatePicker を使用する

Access 2007 および Access 2010 では、日付フィールドにバインドされている任意のテキスト ボックス コントロールに日付の選択コントロールを付加できます。フォームの動作を確認するには、生年月日フォームを開きます (図 1 を参照)。[Birthdate] テキスト ボックスは 生年月日テーブル内の生年月日フィールドにバインドされており、このテキスト ボックスがフォーカスを取得しているときには、生年月日フィールドの隣にある小さなカレンダー アイコンをクリックすることで、カレンダーを表示して日付を選択できます。このカレンダー アイコンは、テキスト ボックスがフォーカスを取得しているときにしか表示されません。

図 1. 組み込みの日付の選択

組み込みの日付の選択

組み込みの日付の選択コントロールを使用するには、図 2 に示すように、ShowDatePicker プロパティが For Dates に設定されていることを確認する必要があります。TextBox コントロールは日付フィールドにバインドされている必要があり、以前に定型入力を作成していた場合は、このコントロールの InputMask プロパティを削除する必要があります。

図 2. ShowDatePicker プロパティ

ShowDatePicker プロパティ

DatePicker コントロールを使用する

Windows コモン コントロールには、すべてのアプリケーションにわたって使用できる DatePicker という ActiveX コントロールが用意されています。Access アプリケーションでもこのコントロールを使用できます。このコントロールを使用する場合は、組み込みの日付の選択コントロールの場合よりも手間がかかりますが、より高い柔軟性が得られます。

サンプル アプリケーションには Windows の DatePicker コントロールのインスタンスがいくつか含まれていますが、別のインスタンスを自分で追加するようにしてください。Windows の DatePicker コントロールを使用するには、デザイン ビューで生年月日フォームを開きます。リボンで、コントロールのグループの右下隅にあるドロップダウン ボタンをクリックしてすべてのコントロールを表示し、[ActiveX コントロール] を一覧から選択します (図 3 を参照)。

図 3. ActiveX コントロールのオプション

ActiveX コントロールのオプション

[ActiveX コントロールの挿入] ダイアログ ボックスの表示を下方にスクロールさせて Microsoft Date and Time Picker Control 6.0 (SP4) (お使いのコンピューターによっては、SP6 など、新しい SP になっている場合があります) を選択し、[OK] をクリックしてこのコントロールを挿入します (図 4 を参照)。ただし、使用可能なコントロールの一覧は、図 4 と異なる場合があります。

図 4. マイクロソフトの日付と時刻の選択コントロール

Microsoft 日付と時刻の選択コントロール

コントロールを選択すると、現在のフォーム上にインスタンスが挿入されます。このコントロールは、Access 内の他のすべてのコントロールと同じように (元のCalendar コントロールの場合とまったく同様に)、サイズ変更、移動、および変更が行えます。先ほど追加したコントロールは削除します。フォーム上には、既に DatePicker コントロールのインスタンスが存在します (図 5 を参照)。

このコントロールについては、次の点に注意してください。

  • DatePicker コントロールの ControlSource プロパティは、他のすべての Access コントロールと同じような外観と機能になるように、Birthdate に設定されています。そのため、DatePicker で日付を変更すると、その値は Access によって自動的にフォームの現在の行の生年月日フィールドに格納されます。

  • このコントロールの CheckBox プロパティは、Yes に設定されています。このプロパティは、コントロールが Null 以外の値を保持していることを示すチェック ボックスを表示するかどうかを決定します。ユーザーがフォームの基になるテーブルに新しい行を追加できるようにするには、このプロパティを Yes に設定します。Yes に設定しなかった場合、このコントロールは生年月日フィールドの新しい行が Null 値であることを示すことができません。

  • このコントロールのユーザー インターフェイスは、かなり自由に制御できます。上方向および下方向の矢印の表示/非表示を切り替えたり、フォント (サンプルでは他のコントロールに合わせて Calibri に設定されています) などの視覚的な特性を変更したりできます。

図 5. DatePicker コントロールを含むサンプル フォーム

DatePicker コントロールが含まれるサンプル フォーム

このコントロールの動作を確認します。生年月日フォームを開き、コントロール内のドロップダウン矢印をクリックします (図 6 を参照)。日付を選択し、次の行に移動して戻ると、現在の人物の生年月日が正しく変更されていることがわかります。新しい行に移動すると、コントロール内のチェック ボックスがオフになっている (つまり、値が Null でない) ことがわかります。操作を完了したら、フォームを閉じます。

図 6. DatePicker コントロール

DatePicker コントロール

カスタム カレンダー フォームを使用する

これまでの技法に加えて、以前の Calendar コントロールとちょうど同じように、常に表示されるカレンダーが必要になる場合があります。これを実現する方法の 1 つは、カレンダーのすべての動作が含まれるサブフォームを使用することです。こうした動作の少なくとも 1 つは上記のような場合のために作成されたものであり、サンプル アプリケーションには frmCalendar という名前のフォームが含まれています。この自己完結型のフォームは、独自のアプリケーションにインポートするだけで、その他任意のフォームにサブフォームとして埋め込むことができます。frmCalendar をデザイン ビューで開くと (図 7 を参照)、ボタンやその他のコントロールを持つ小さなフォームが現れます。フォーム内のコードは、このフォームの更新および管理のすべての作業を実行します。リボンの [ツール] グループにある [コードの表示] を選択し、コードを確認してください。ただし、コードは変更しないでください。コードの確認を完了したら、Visual Basic Editor、frmCalendar の順に閉じます。

図 7. デザイン ビューのサンプル frmCalendar

デザイン ビューのサンプル frmCalendar

このカレンダー フォームの動作を確認するには、リボン内で [作成]、[フォーム デザイン] の順に選択します。ナビゲーション ウィンドウから frmCalendar のコピーを新しいフォーム上にドラッグします。この操作により、図 8 に示すような新しいサブフォームが作成されます。既定では、このサブフォームの名前が Calendar になっています。この名前は変更できますが、ここでは既定値のままにしておきます。

図 8. 新しいフォーム上の frmCalendar のインスタンス

新しいフォーム上の frmCalendar のインスタンス

日付を選択できるだけでは、このカレンダー フォームが便利であるとはいえません。選択された日付が変更されたタイミングを検出できる必要もあります。このサンプル フォームは、DateChanged イベントを発生させます。このイベントは、新たに選択された日付が格納されたパラメーターを自らのイベント ハンドラーに渡します。このサブフォームはコントロールではないので、イベントに応答するには追加の作業が必要です。実際に必要になるのは、2 行の追加コードだけです。以下に、イベント ハンドラーを接続する手順を示します。

先ほど作成した新しいフォームをデザイン ビューで開いた状態で、TextBox コントロールをフォーム上のカレンダーの隣に追加します。新しい TextBox コントロールに selectedDate という名前を付けます。リボンの [コードの表示] を選択します。このフォームのモジュールに次の宣言を追加します。

```VB Private WithEvents calendarForm as Form_frmCalendar ```

この宣言では、カレンダー フォームのクラス (既定の名前は Form_frmCalendar です。すべてのフォームには "Form_<フォーム名>" という名前のクラスが用意されています) を参照できる変数を定義しています。WithEvents キーワードを使用すると、この変数が参照するオブジェクトが発生させたイベントに応答できます。この場合は、オブジェクトが発生させるイベントが DateChanged だけなので、このイベントに対するイベント ハンドラーを追加します。

Visual Basic Editor の左上隅にある [オブジェクト] ドロップダウン リストから [フォーム] を選択します。この操作により、Form_Load イベント ハンドラーが作成されます。このイベント ハンドラーを次のコード例のように変更します。

```VB Private Sub Form_Load() Set calendarForm = Calendar.Form End Sub ```

このコードは、フォーム上に作成したサブフォームの Form プロパティを参照するように、先ほど作成した変数を設定します。つまり、この変数を使用すると、プログラムによってカレンダー フォームを操作できます。

さらに、[オブジェクト] ドロップダウン リストから [calendarForm] (先ほど WithEvents キーワードを使用して宣言した変数) を選択します。この操作により、calendarForm_DateChanged イベント ハンドラーが作成されます。このイベント ハンドラーを次のコード例のように変更します。

```VB Private Sub calendarForm_DateChanged(newDate As Date) selectedDate = newDate End Sub ```

このコードは、カレンダー フォームによってイベント ハンドラーに渡されたパラメーターを受け取り、その値をフォーム上の [selectedDate] テキスト ボックスにコピーします。

変更内容を保存し、このフォームに Form1 という名前を付けて、Access 2010 の画面に戻ります。このフォームを開き、カレンダーで日付を選択します。すると、選択した日付が TextBox コントロール内に表示されるはずです (図 9 を参照)。作業を完了したら、フォームを閉じます。

図 9. カレンダーの日付

カレンダーの日付

このカレンダー フォームでは、Calendar コントロールで可能だったような、テーブルのフィールドへのバインドはできませんが、コードを記述してその動作をエミュレートできます。サンプルの生年月日フォームには、バインドを設定する簡単なコードが含まれています。このフォームをデザイン ビューで開き、[コードの表示] を選択します。フォーム モジュール内のコードは、既に確認したコードによく似ていますが、次のコード例に示すように、フォームの Current イベント ハンドラーが追加されている点が異なります。

```VB Private Sub Form_Current() On Error Resume Next calendarForm.Value = Me.Birthdate End Sub ```

このコードは、フォームの行から行へと移動すると、カレンダー フォームによって現在の行に生年月日フィールドが表示されることを確認するものです。On Error Resume Next ステートメントの追加により、このコードでは、新しい行の生年月日フィールドが Null の場合に必要だった特殊なエラー処理が不要になっています。

また、DateChanged イベント ハンドラーでは、このフォーム上の TextBox コントロールの値ではなく、このフォームの生年月日フィールドの値を設定しています。

```VB Private Sub calendarForm_DateChanged(newDate As Date) Me.Birthdate = newDate End Sub ```

以前のコードにこの変更を加えると、カレンダー フォーム内の変更が基になる生年月日フィールドに直ちに反映されるようになるので、このフィールドにバインドされている他のすべてのコントロールは、変更後すぐに更新されます。

Visual Basic Editor のウィンドウを閉じ、生年月日フォームを開きます。行を移動して、このカレンダー フォームが現在の生年月日フィールドに一致するように更新されることを確認します。カレンダー フォーム内の生年月日を変更し、生年月日フィールドにバインドされているその他のコントロールも更新されることを確認します。確認が終了したら、フォームを閉じます。

手順

ここで示した方法により、Calendar コントロールを組み込みの日付の選択コントロール、DatePicker コントロール、またはカレンダー サブフォームで置き換えることができます。これらの動作はいずれも元の Calendar コントロールとまったく同じではありませんが、これらの方法の 1 つによって元のコントロールを置き換えることは可能なはずです。

以下に、それぞれの方法の長所と短所を示します。

  • 組み込みの日付の選択

    • 使用方法が簡単 (必要なのは ShowDatePicker プロパティの設定のみ)。

    • カスタマイズできない。

    • テーブル内の日付フィールドにバインドされた TextBox コントロールでしか機能しない。

  • DatePicker コントロール

    • 使用方法が比較的簡単。

    • 組み込みの日付の選択よりもカスタマイズできる点が多い。

    • 時刻の選択にも使用できる。

    • データ ソースにバインドできる。

    • マイクロソフトのカスタム コントロール DLL に依存しており、バージョン管理の点で大きな問題がある。インストールされている DLL のバージョンがエンド ユーザー側のものと異なる可能性があり、その場合はエンド ユーザー側の DLL を最新版に更新する必要がある。

    • ドロップダウンとしてのみ表示され、カレンダーを開いた状態のままにはできない。

  • カレンダー フォーム

    • 開いた状態のカレンダーとしてのみ表示される (一長一短あり)。

    • 完全にカスタマイズできるが、デザイナーやコードでの作業が必要。

    • 使用方法が簡単 (フォームにドラッグしてコードを記述するだけ)。

    • イベントの設定には追加コードの記述が必要。

    • コードを記述しないとバインドを利用できない。

ビデオ

ビデオを見る

ビデオを見る (英語) | Length: 00:12:24

クリックしてコードを取得

コードを取得する (英語)

関連情報

著者について
Ken Getz 氏は、MCW Technologies のシニア コンサルタント。『ASP.NET Developers Jumpstart』(Addison-Wesley 刊、2002 年)、『Access Developer's Handbook』(Sybex 刊、2001 年)、および『VBA Developer's Handbook, 2nd Edition』(Sybex 刊、2001 年) の共著者でもあります。