メイン/サブフォーム間で情報を交換するお手本データベース

図1-4-1 メイン/サブフォーム間で情報交換するフォーム
このサンプルデータベースは、メインフォームとサブフォーム間でお互いに情報交換します。情報交換は、メイン/サブフォームにフォーム独自のメソッドとプロパティを作成して行います。(フォームモジュールは、クラスモジュールとして作成されますので、フォームモジュールにメソッド/プロパティを作成することができます。)
メインフォームのSet Sub1ボタンをクリックすると、メインフォームのHelloプロパティがサブフォームのHelloSub1プロパティに設定されます。メインフォームのGet Sub1ボタンをクリックすると、サブフォームのHelloSub1プロパティがメインフォームのHelloプロパティに設定されます。メインフォームのMethod1ボタンをクリックすると、サブフォームのHelloSub1プロパティの内容が表示されます。
サンプルフォームのように、メインフォームに複数のサブフォームが配置されている場合、サブフォームで取得した情報をメインフォームのプロパティに保存しておくことにより、メインフォームで情報を集中管理することができます。
メイン/サブフォーム間で情報交換する具体例は、スタッフのスケジュールを管理するサンプルデータベースで紹介します。
サンプルデータベース(CH1-4.mdb)では、以下のノウハウを習得することができます。
◆ フォームにアプリ独自のメソッド/プロパティを作成する方法
◆ サブフォームからメインフォームのプロパティを参照/設定する方法
◆ サブフォームからメインフォームのメソッドを実行する方法
◆ メインフォームからサブフォームのプロパティを参照/設定する方法
◆ メインフォームからサブフォームのメソッドを実行する方法
● メイン/サブフォーム間で情報交換するフォームを作成するには
1 Access を起動して作業フォルダに、新規データベース CH1-4.mdbを作成します。
2 データベースウィンドウからフォーム
をクリックしたら、新規作成ボタンをクリックします。フォームの新規作成ダイアログが表示されたら、一覧からデザインビューを選択してOKボタンをクリックします。フォームのデザインビューが表示されたら、ツールボックスからテキストボックスのアイコン
をクリックして、フォームの上位中央に配置します。テキストボックスのラベル標題を”Hello
Sub1 Property”に書き替えます。ツールボックスからコマンドボタンのアイコン
(Iconコマンドボタン.tif)をクリックしたら、Set、Get、ReSetの3個のボタンを作成します。フォームに作成したコントロールのプロパティを表1-4-1のように設定します。
表1-4-1 フォーム frmSub1に作成したコントロールのプロパティ
|
コントロールの種類 |
プロパティ |
値 |
|
テキストボックス |
名前 |
txtHello |
|
コマンドボタン1 |
名前 |
cmdSet |
|
コマンドボタン2 |
名前 |
cmdGet |
|
コマンドボタン3 |
名前 |
cmdReSet |

図1-4-2 サブフォーム frmSub1にテキストボックスとコマンドボタンを作成した例
3 メニューからコードのアイコン
をクリックして、フォームモジュールを表示させます。CH1-4.mdbを開いたら、frmSub1のフォームモジュールをコピーして貼り付けます。フォームモジュールのソースコードは、リスト1-4-2を参照してください。フォームをfrmSub1の名称で保存します。それから、CH1-4.mdbからモジュールbasMyLibをインポートします。
4 フォームの新規作成ボタンをクリックしたら、frmSub1を作成した手順でフォームfrmSub2を作成して保存します。
表1-4-2 フォーム frmSub2に作成したコントロールのプロパティ
|
コントロールの種類 |
プロパティ |
値 |
|
テキストボックス |
名前 |
txtHello |
|
コマンドボタン1 |
名前 |
cmdSet |
|
コマンドボタン2 |
名前 |
cmdGet |
|
コマンドボタン3 |
名前 |
cmdReSet |

図1-4-3 サブフォーム frmSub2にテキストボックスとコマンドボタンを作成した例
5 フォームの新規作成ボタンをクリックして、デザインビューを表示させます。ツールボックスからテキストボックスのアイコン
をクリックして、フォームの上位中央に配置します。テキストボックスのラベル標題を、”Hello
Property”に書き替えます。ツールボックスからコマンドボタンのアイコン
をクリックして、7個のコマンドボタンを作成します。データベースウィンドウからサブフォームfrmSub1のアイコンをドラッグしたら、メインフォームの下位左側に配置します。同様の手順でサブフォームfrmSub2をメインフォームの下位右側に配置します。
表1-4-3 メインフォームに作成したコントロールのプロパティ
|
コントロールの種類 |
プロパティ |
値 |
|
テキストボックス |
名前 |
txtHello |
|
コマンドボタン1 |
名前 |
cmdMethod1 |
|
コマンドボタン2 |
名前 |
cmdSetSub1 |
|
コマンドボタン3 |
名前 |
cmdGetSub1 |
|
コマンドボタン4 |
名前 |
cmdMethod2 |
|
コマンドボタン5 |
名前 |
cmdSetSub2 |
|
コマンドボタン6 |
名前 |
cmdGetSub2 |
|
コマンドボタン7 |
名前 |
cmdReSet |
|
サブフォーム1 |
名前 |
frmSub1 |
|
サブフォーム2 |
名前 |
frmSub2 |

図1-4-4 メインフォームfrmMainにサブフォームを配置した例
6 メニューからコードのアイコン
をクリックしてフォームモジュールを表示させます。CH1-4.mdbを開いたら、frmMainのフォームモジュールをコピーして貼り付けます。フォームモジュールのソースコードは、リスト1-4-1を参照してください。メインフォームをfrmMainの名称で保存して閉じます。
7 メインフォームfrmMainをビューモードで開いたら、Method、Set、Getコマンドをクリックしてメイン/サブフォーム間で情報が交換されるか確認します。
8 Accessを終了させます。

図1-4-5 フォーム独自のメソッド/プロパティの使い方
Property Get/Let Hello
フォーム独自のHelloプロパティを定義します。Getは、プロパティの参照、Letは、プロパティの更新を意味します。プロパティを保存するメモリ変数は、モジュールの先頭で定義します。
Private mstrHello As String
Sub cmdGetSub1_Click()/Sub
cmdGetSub2_Click()イベントの処理
これらのイベントは、メインフォームのGetSub1/GetSub2ボタンをクリックしたときに実行されます。これらのイベントでは、サブフォームのHelloSub1/HelloSub2プロパティを取得して、メインフォームのHelloプロパティに設定します。
Me.Hello = Me.frmSub1.Form.HelloSub1
Me.Hello = Me.frmSub2.Form.HelloSub2
Sub cmdSetSub1_Click()/cmdSetSub1_Click()イベントの処理
これらのイベントは、メインフォームのSetSub1/SetSub2ボタンをクリックしたときに実行されます。これらのイベントでは、メインフォームのHelloプロパティを取得して、サブフォームのHelloSub1/HelloSub2プロパティに設定します。
Me.frmSub1.Form.HelloSub1 = Me.Hello
Me.frmSub2.Form.HelloSub2 = Me.Hello
Sub cmdMethod1_Click()/cmdMethod1_Click()イベントの処理
これらのイベントは、メインフォームのMethod1/Method2ボタンをクリックしたときに実行されます。これらのイベントでは、サブフォームに定義されているMethodSub1/MethodSub2メソッドを実行します。
Me.frmSub1.Form.MethodSub1
Me.frmSub2.Form.MethodSub2
サブフォームからメインフォームのメソッドを実行するには:
Me.Parent.MethodMain
のように記述します。
リスト1-4-1 frmMainのフォームモジュール
|
Option Compare Database Option Explicit Private mstrHello As String
'------------------------------------ ' Form Specific
Property: Hello
'------------------------------------ Public Property Get Hello() As String Hello = mstrHello End Property Public Property Let Hello(strHello As String) mstrHello = strHello ShowHello End Property
'------------------------------------ ' Form Specific method
'------------------------------------ Private Sub ShowHello() Me.txtHello = Me.Hello End Sub
'------------------------------------ ' Event Procedures
'------------------------------------ Private Sub Form_Open(Cancel As Integer) SetAppTitle_FS ("Main/Sub Form Communications (C) " _ & Year(Date) & " by Akio Kasai") End Sub Private Sub Form_Load() Me.Hello = "Hello Main" End Sub Private Sub txtHello_AfterUpdate() Me.Hello = Nz(Me.txtHello, "") End Sub Private Sub cmdGetSub1_Click() Me.Hello = Me.frmSub1.Form.HelloSub1 End Sub Private Sub cmdGetSub2_Click() Me.Hello = Me.frmSub2.Form.HelloSub2 End Sub Private Sub cmdMethod1_Click() Me.frmSub1.Form.MethodSub1 End Sub Private Sub cmdMethod2_Click() Me.frmSub2.Form.MethodSub2 End Sub Private Sub cmdReSet_Click() Me.Hello = "Hello Main" End Sub Private Sub cmdSetSub1_Click() Me.frmSub1.Form.HelloSub1 = Me.Hello End Sub Private Sub cmdSetSub2_Click() Me.frmSub2.Form.HelloSub2 = Me.Hello End Sub |
Property Get/Let HelloSub1()
フォーム独自のHelloSub1プロパティを定義します。 Getは、プロパティの参照、Letは、プロパティの更新を意味します。プロパティを保存するメモリ変数は、モジュールの先頭で定義します。
Private mstrHello As String
Sub MethodSub1()
フォーム独自のメソッドを定義します。他のフォームから参照する場合は、Public属性のサブプロシージャとして定義します。
Sub cmdGet_Click()イベントの処理
このイベントは、サブフォームのGetボタンをクリックしたときに実行されます。このイベントでは、メインフォームのHelloプロパティを取得して、サブフォームのHelloSub1プロパティに設定します。
Me.HelloSub1 = Me.Parent.Hello
Sub cmdSet_Click()イベントの処理
このイベントは、サブフォームのSetボタンをクリックしたときに実行されます。このイベントでは、サブフォームのHelloSub1プロパティを取得してメインフォームのHelloプロパティに設定します。
Me.Parent.Hello = Me.HelloSub1
リスト1-4-2 frmSub1のフォームモジュール
|
Option Compare Database Option Explicit Private mstrHello As String
'------------------------------------ ' Form Specific
Property: HelloSub1
'------------------------------------ Public Property Get HelloSub1() As String HelloSub1 = mstrHello End Property Public Property Let HelloSub1(strHello As String) mstrHello = strHello ShowHello End Property
'------------------------------------ ' Form Specific Method:
MethodSub1
'------------------------------------ Public Sub MethodSub1() MsgBox Me.HelloSub1, vbInformation, "MethodSub1" End Sub
'------------------------------------ ' Event Procedures
'------------------------------------ Private Sub cmdGet_Click() Me.HelloSub1 = Me.Parent.Hello End Sub Private Sub cmdReSet_Click() Me.HelloSub1 = "Hello Sub1" End Sub Private Sub cmdSet_Click() Me.Parent.Hello = Me.HelloSub1 End Sub Private Sub ShowHello() Me.txtHello = Me.HelloSub1 End Sub Private Sub Form_Load() Me.HelloSub1 = "Hello Sub1" End Sub Private Sub txtHello_AfterUpdate() Me.HelloSub1 = Nz(Me.txtHello, "") End Sub |
リスト1-4-3 frmSub2のフォームモジュール
|
Option Compare Database Option Explicit Private mstrHello As String
'------------------------------------ ' Form Specific
Property: HelloSub2
'------------------------------------ Public Property Get HelloSub2() As String HelloSub2 = mstrHello End Property Public Property Let HelloSub2(strHello As String) mstrHello = strHello ShowHello End Property
'------------------------------------ ' Form Specific Method:
Sub2
'------------------------------------ Public Sub MethodSub2() MsgBox Me.HelloSub2, vbInformation, "MethodSub2" End Sub
'------------------------------------ ' Event Procedures
'------------------------------------ Private Sub cmdGet_Click() Me.HelloSub2 = Me.Parent.Hello End Sub Private Sub cmdReSet_Click() Me.HelloSub2 = "Hello Sub2" End Sub Private Sub cmdSet_Click() Me.Parent.Hello = Me.HelloSub2 End Sub Private Sub ShowHello() Me.txtHello = Me.HelloSub2 End Sub Private Sub Form_Load() Me.HelloSub2 = "Hello Sub2" End Sub Private Sub txtHello_AfterUpdate() Me.HelloSub2 = Nz(Me.txtHello, "") End Sub |