ACCESS VBA 別フォームのイベントを呼び出す方法(VBAコード公開)

別フォームのイベントを呼び出す方法別フォームのイベントを呼び出す方法別フォームのイベントを呼び出す方法別フォームのイベントを呼び出す方法別フォームのイベントを呼び出す方法

ACCESSで複数のフォームを使用していると、あるフォームから別のフォームを開き、そのフォームに設定したイベントプロシージャを実行したい場合があります。

しかし、標準モジュールのイベントプロシージャと異なり、クラスモジュールである別フォームのイベントを呼び出すには独自の記述が必要です。

今回は、VBAで別フォームのイベントプロシージャを呼び出して実行する方法をご紹介します。


こんにちは。
はこにわガジェット (@hakoniwagadget) です。

ACCESSを使った売上管理、顧客管理などのデータベース開発を行っています。
ACCESSは基本機能だけでも十分便利ですが、VBAを使うことで格段に使いやすいデータベースを作成可能です。
この記事ではACCESSでのVBAの使い方をご紹介していきます。

別フォームのイベント呼び出し方法

それでは、別フォームのイベントを呼び出す際の設定のポイントだけを先にまとめます。

呼び出し元

呼び出し元のイベントプロシージャでは以下のように記述します。

 
 Call Form_フォーム名.イベントプロシージャ名
 

例えば、T_msgboxフォームの表示_ボタンのクリック時イベントを呼び出したいときは以下のように記述します。


 Call Form_T_msgbox.表示_ボタン_Click
 

呼び出し先

別フォームからイベントを呼び出すためには、呼び出し先のイベントにも設定が必要です。


  Public Sub イベント名
 

のように、Private Subではなく、Public Subにて外部からの呼び出しが可能にしておく必要があります。
例えば、上記の例ですと


  Public Sub 表示_ボタン_Click()
 

にしておく、ということになります。

別フォームのイベント呼び出しを行うシーン

別フォームのイベント呼び出しはどんな時に必要になるでしょうか。

例えば、あるフォームから別のフォームを開くという動作はかなり多いと思います。
Docmd.Openform メソッドを使うことで実現できます。

そして、フォームを開いた後に、そのフォームに上に設定した処理をそのまま実行させたいというケースがあります。
例えば、フォーム上のコントロールを再計算をさせたり、特定の値に基づいてフォーム上の表示を変えたりする場合です。

これを簡単に実現するなら、呼び出されたほうのフォームの「開くとき」や「読み込み時」イベントにその処理を設定すればよいわけですが、どうしてもそれでは困る場合もあります。

それは、特定のフォームから呼び出した時のみ、その処理を実行したい、というケースです。
フォームを開く動線が2種類あり、一方の動線では処理を行うが、一方の動線では処理を行わないといった条件分岐が必要になるため、単純にフォームを開く時のイベントでは制御が難しいのです。

フォームを開く際に参照する変数を作成し、その変数の値を見て処理を変えさせることで、上記に対応させること自体は可能です。
しかし、フォームを開く処理のたびに変数の設定を行うので処理が複雑になっていきます。

そんな時に、元フォームのフォームを開くイベントの後に、そのまま開いたフォームのイベントプロシージャを元フォームのイベント内で実行してしまえば、処理の作成も楽になるというわけです。

完成形

まずは今回作成する機能の完成形を示します。
event_call というフォームから、msgbox というフォームを表示し、msgbox フォーム上の表示ボタンイベントを動作させます。

呼び出しボタンを押すことで、

別フォームであるmsgbox フォームが開き、フォーム上の表示ボタンが押されたときの処理が行われます。

作成方法

呼び出し元フォーム

では、作成方法を見ていきましょう。
まずは呼び出し元のフォームのイベントを設定します。

ボタンを配置し、クリック時のイベントプロシージャを設定しましょう。

イベントプロシージャの内容は以下の通りです。


 Private Sub 呼び出し_ボタン_Click()

    DoCmd.OpenForm "T_msgbox"

    Call Form_T_msgbox.表示_ボタン_Click

 End Sub
 

最初の


 DoCmd.OpenForm "T_msgbox"
 

で別フォームを開けています。
「T_msgbox」というのが呼び出し先のイベントがあるフォームの名称です。

次に


 Call Form_T_msgbox.表示_ボタン_Click
 

で、T_msgboxフォームのイベントである表示_ボタン_Clickを呼び出しています。
Callは書いても書かなくても動作するのですが、別のプロシージャを呼び出していることが分かりやすいので、コードの可読性を高める目的で記載しておくのが良いでしょう。

呼び出し先フォーム

次に呼び出し先のフォームを見ていきましょう。

こちらも同じように、表示_ボタンというボタンにイベントプロシージャを設定します。

イベントプロシージャの内容は以下の通りです。


 Public Sub 表示_ボタン_Click()

 MsgBox "処理が完了しました。" & vbCrLf & "処理件数は20件です。", vbOKOnly + vbInformation, "処理完了"
    
 End Sub
 

ここで注意したいのは、イベントをPrivateではなく、Publicにすることです。

最初の行で


 Public Sub 表示_ボタン_Click()
 

と書いていますよね。

通常はフォームに作成したイベントプロシージャはそのフォームでしか使用しませんので、作成時にはPrivateになります。
今回は別のフォームから呼び出しができるように、Publicに変えているのです。

以上、別フォームのイベントを呼び出す方法をご紹介しました。


ACCESSを使いこなせば、業務の効率化や自動化が実現できます。
しかし、自分でACCESSを学ぶには時間がない、難しそうで不安、という方も多いでしょう。

そんな時は、ACCESS開発歴20年以上、過去に100以上のACCESSデータベースを開発してきた私(@hakoniwagadget)にお任せください。

ACCESSの新規開発、既存のACCESSの修正、ACCESSの操作レッスンなど様々なサービスをご提供しています。
ご興味のある方は下記のサービス一覧をご覧ください。

サービス一覧

最後までお読みいただき、ありがとうございました。