「これはヤバかったな」という遅刻エピソード

親フォームからサブフォームのレコード移動時、クリック時等のイベントを取得できるのでしょうか?

また、同様に親フォームからサブフォームの中のサブフォームのイベントを取得することができるのでしょうか?

ご存じの方がいらっしゃいましたらご教授よろしくお願いします。

A 回答 (2件)

親フォームからサブフォーム、或いは逆でも、イベントの取得は可能です。


但し、手続き(?)が複雑なことなどから、意図した動作をさせるには、
かなり苦労するかもしれません(汗)

ともあれ、とりあえず簡単なサンプルを提示してみます。
 ・子フォームのレコード移動時イベントを、親フォームで取得
 ・親フォームのコマンドボタンのクリック時イベントを、子フォームで取得

【構成】
 ・親フォームに設置したコンボボックスの名前: 起動
 ・コントロールとしてのサブフォームの名: SF1
※レコード移動時イベントを発生させる関係上、子側のレコードソースには
 適当なテーブル/クエリを指定して下さい。

【コード】
<親側>

'フォームのモジュールレベル(全てのSub/Functionよりも前の領域)で、
'イベントを取得したいオブジェクトを参照する変数を宣言
'★「WithEvents」により、イベント取得が可能になります★
Private WithEvents Frm As Form

'開く時イベント
Private Sub Form_Open(Cancel As Integer)
  '変数に子フォームを設定
  Set Frm = Me!SF1.Form
End Sub

'閉じる時イベント
Private Sub Form_Close()
  '念のため、明示的に変数を解放
  Set Frm = Nothing
End Sub

'サブフォームのレコード移動時イベントを受けて行う処理
'★「Sub」の後は「Form_」でなく「Frm」(=変数名)なので注意★
Private Sub Frm_Current()
  MsgBox "子側でレコード移動がありました"
End Sub

'自身に設置したコマンドボタンのクリック時
Private Sub 起動_Click()
  MsgBox "親側でボタンクリック"
End Sub


<子側>

'親と同様にモジュールレベルで変数を宣言
Private WithEvents Btn As CommandButton

'開く時
Private Sub Form_Open(Cancel As Integer)
  Set Btn = Me.Parent!起動
End Sub

'閉じる時
Private Sub Form_Close()
  Set Btn = Nothing
End Sub

'レコード移動時
Private Sub Form_Current()
  MsgBox "子側でレコード移動"
End Sub

'親側のコマンドボタンのクリックを受けて行う処理
Private Sub Btn_Click()
  MsgBox "親側でボタンがクリックされました"
End Sub


・・・以上です。
これで、子側のレコード移動で、親/子の双方のMsgBoxが表示
されることを確認したら、これをベースに、実際に行いたい処理コードを
追加していってみてください。

なお、「Private Sub Btn_Click()」などは、全て手入力する必要が
あります(「Sub 」の後は、「変数名」+「_」(アンダーバー)+「イベント名」)。
また、マウスボタンクリック時のように、引数を持つイベントの場合は、
それらも同様に記述しないと、コンパイルエラーになるのでご注意下さい。


◆参考(別手法)◆
禁じ手的ではありますが(汗)、「親側から子側のイベント取得」とは逆に、
「子側から親側の各イベント時の処理の呼び出し」も可能です。

例えば、子側のレコード移動時に、親側の『起動』ボタンのクリック時
の処理を実行するには、以下のようにします:

<親側>
 同ボタンのクリック時イベントの「Private」を「Public」に変更

<子側>
 以下のような構文で、同ボタンのクリック時の処理を子側のレコード
 移動時に呼び出せます:

Private Sub Form_Current()
  Call Me.Parent.起動_Click
End Sub


※親側からの呼び出しは以下のようにします:
 (子側のレコード移動時イベントの処理を実行する場合)
  SF1.Form.Form_Current
 または
  Me.SF1.Form.Form_Current
「サブフォームのイベント取得」の回答画像2
    • good
    • 0
この回答へのお礼

ご返事ありがとうございます。

とてもわかりやすいご回答ありがとうございます。このサンプルを元に自分でも色々試してみようと思います。

ありがとうございました。

お礼日時:2011/04/11 11:00

フォームのイベントとして自作のイベントを用意し、


該当のイベントが起こったときに自作のイベントを
発生させてやるとか?
    • good
    • 0
この回答へのお礼

ご返事ありがとうございます。

なんとなくイメージはつかめましたが、正直、それを実装する方法がわかりません。。。

無知ですみません。。。

お礼日時:2011/04/06 10:49

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報

このQ&Aを見た人がよく見るQ&A