#622 メインフォームのプロシージャをサブフォームから実行させるには? フォーム、VBA

メイン/サブフォーム形式の画面において、ある同じ処理を、メインフォーム側の何らかのアクションで起動したりサブフォーム側からのアクションでも起動したりしたい場合があります。

そのような場合、微妙にコードを変えることでそれぞれのフォームにイベントプロシージャを作ってもよいのですが、いずれかにひとつだけ作って、それを共通的に呼び出すようにした方が作るのも楽ですしあとで修正する場合も一方だけで済みます。

ここではその作成例として、次のような処理を考えてみます。
  • メインフォーム上の[表示]ボタンをクリックすると、サブフォームのカレントレコードに関する情報メッセージが表示される

  • サブフォーム側の任意のレコードのある欄をダブルクリックすると、そのレコードに関する情報メッセージが表示される

  • それらの処理内容は同じなので、メインフォーム側の[表示]ボタンのクリック時イベントプロシージャとして記述する

【デザイン例】


そして、メイン/サブのフォームのモジュールは次のように記述します。

メインフォーム側:

Public Sub cmd表示_Click()

  MsgBox "サブフォームのカレント行の商品名は " & _
          Me!frm商品マスタ_sub!商品名 & "です。", vbOKOnly + vbInformation

End Sub

※ここで「cmd表示」は[表示]ボタンの名前です。またサブフォームコントロール名は「frm商品マスタ_sub」です。

サブフォーム側:

Private Sub 商品コード_DblClick(Cancel As Integer)

  Parent.cmd表示_Click

End Sub

Private Sub 商品名_DblClick(Cancel As Integer)

  Parent.cmd表示_Click

End Sub

Private Sub 標準原価_DblClick(Cancel As Integer)

  Parent.cmd表示_Click

End Sub


ここのでのポイントは、次の2点です。
  • メインフォームのイベントプロシージャはサブフォーム、つまり他のモジュールから呼び出されますので、「Public」という宣言に書き換えます。

  • サブフォームの側からはメインフォーム上のプロシージャを呼び出しますので、プロシージャ名の先頭に「Parent.」という記述を付加します。

実行例:




上記の例では、分かりやすくするためサブフォームのテキストボックスごとにイベントプロシージャを作っていますが、これをひとつのFunctionプロシージャとして”サブフォームの方のモジュール上”に作り、プロパティシート上の設定でそれを呼び出すようにすることもできます。

Private Function ShowSubData()

  Parent.cmd表示_Click

End Function



プロパティシートでの呼び出し設定ですので、VBEのエディタ上で検索したり置換したりできなくなり、モジュールだけで一括管理できなくなるというデメリットもありますが、同じようなダブルクリック時イベントプロシージャをいくつも書かなくてよいというメリットがあります。たくさんのコントロールに対してイベントを割り当てる場合は楽かもしれません。
| Index | Prev | Next |

この情報は参考になりましたか?、問題は解決しましたか?、もしまだなら......
T'sWareのワンポイトテクニカルアドバイスをご利用ください。3000円/件〜でご支援します。
スタンドアロンからSQL Server対応まで、オーダーメイドのシステムを短納期・安価でお届けします
 

Copyright © T'sWare All rights reserved