メイン/サブフォーム形式のフォームでは、デザインビューも含めて、メインフォーム側だけを開けばサブフォームもいっしょに開かれます。しかしフォームビューで開くときのイベントの発生順はそのイメージと異なり、次のような順番でイベントが発生します。
- サブフォーム側のForm_Loadイベント
- メインフォーム側のForm_Loadイベント
そのためイベントによっては、サブフォームのコードからメインフォームを参照しようとすると、まだメインフォームが読み込まれていないために正しい値が取得できなかったり、エラーが発生したりすることがあります。そのようなとき、メインフォームがすでに開いているかどうかを事前に調べ、開いているときだけ処理を実行することで問題を回避できます。
その例としてまず次のようなイベントプロシージャをそれぞれ用意します。
■メインフォーム側
Public pvarData As Variant
Private Sub Form_Load()
'メインフォームの読み込み時
'変数に値を代入
pvarData = "12345678"
End Sub
■サブフォーム側
Private Sub Form_Current()
'サブフォームのレコード移動時
'メインフォームの変数の値を表示
MsgBox Parent.pvarData
End Sub
この状態で、メインフォームを開くと次のようなメッセージが表示されます。
図A: |
 |
そしてサブフォーム側でレコード移動を行うと次のようなメッセージが表示されます。
図B: |
 |
このように、最初のサブフォーム側のイベント発生時にはまだ変数値が空の状態になっていることが分かります。
そこで、サブフォーム側のイベントプロシージャを次のように書き換えてみます。
Private Sub Form_Current()
'サブフォームのレコード移動時
If Parent.Visible Then
'メインフォームのForm_Loadイベントが既に発生済みのとき
'メインフォームの変数の値を表示
MsgBox Parent.pvarData
End If
End Sub
この状態で上記と同じ操作をすると、図Aは表示されず、図Bだけが表示されるようになります。
つまり、サブフォームのイベントプロシージャ内において、メインフォームがすでに開いているかどうかは『Parent.Visible』というメインフォームのプロパティ値(”メインフォームが可視状態になっているかどうかの真偽)で判断できます。
|