#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'sFactory
Accessで動く生産管理DB
Ureru Express
Webで使う販売顧客管理
Access開発&アドバイス
DB開発やテクニカルアドバイス
Copyright © T'sWare All rights reserved