• ベストアンサー

サブフォームのイベント取得

親フォームからサブフォームのレコード移動時、クリック時等のイベントを取得できるのでしょうか? また、同様に親フォームからサブフォームの中のサブフォームのイベントを取得することができるのでしょうか? ご存じの方がいらっしゃいましたらご教授よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.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

shogo5121
質問者

お礼

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

すると、全ての回答が全文表示されます。

その他の回答 (1)

  • MARU4812
  • ベストアンサー率43% (196/452)
回答No.1

フォームのイベントとして自作のイベントを用意し、 該当のイベントが起こったときに自作のイベントを 発生させてやるとか?

shogo5121
質問者

お礼

ご返事ありがとうございます。 なんとなくイメージはつかめましたが、正直、それを実装する方法がわかりません。。。 無知ですみません。。。

すると、全ての回答が全文表示されます。

関連するQ&A