2025年9月1日月曜日

ExcelマクロでMsgBoxの処理をインターセプト


Excelマクロで以下のMacro1ように、中でMsgBoxを呼び出していると、いちいちメッセージボックスが表示される。
これを別マクロ(Macro2)から複数回呼び出すと、複数回メッセージボックスが表示され、何度も応答しなければならなくなる。
Macro1を別マクロから複数回呼び出しにも耐えられるように、Macro1に手を加えないで、メッセージボックスにOKボタンを押したことにしたい。 そこで、MsgBoxの呼び出しをインターセプトしてみる。 オブジェクトブラウザによると、MsgBoxはVBAライブラリにあるFunctionで第1引数が必須で、戻り値がVbMsgBoxResultのよう。
ということで、VBAライブラリよりも早く呼び出されるように、同プロジェクトの標準モジュールにMsgBox関数を定義する。 まず、標準モジュール追加で、
追加されたモジュールのオブジェクト名をわかりやすく「MsgBoxインターセプト」とする。
この「MsgBoxインターセプト」標準モジュールにMsgBox関数を追加する。
コードは以下のもの。 If文の条件をインターセプトするかどうかの判断で、インターセプトするなら、Then以降の部分に処理を記述し、 インターセプトしないなら、Else以降の部分で、VBAライブラリのMsgBox関数を受け取った引数で呼び出して、結果をMsgBoxに格納する。 Function MsgBox(Prompt As String, Optional Buttons As VbMsgBoxStyle = vbOKOnly, Optional Title, Optional HelpFile, Optional Context) As VbMsgBoxResult If Left(Prompt, 2) = "終了" Then MsgBox = vbOK Exit Function Else MsgBox = VBA.MsgBox(Prompt, Buttons, Title, HelpFile, Context) End If End Function これで、メッセージボックスを表示したくない場合の動きができる。 実用ではメッセージボックスを表示しない代わりに、引数と呼び出し時間をログ出力する方がよいかもです。

0 件のコメント: