2012年10月31日

マクロ名を変数に代入して実行

ExcelVBA入門AccessVBA入門で頂いたご質問]

ExcelVBAの経験者の方々から、
「変数に代入されたマクロ名やプロシージャ名を使って、他のプログラムを呼び出す方法はないか」
というご質問を時々いただきます。

「Application.Run」を使うと、変数に代入されたマクロ名を使って、他のマクロを呼び出すことができます。
Application.Run は以下のように使います。


 Sub マクロ1()
   MsgBox "ハロー"
 End Sub

 Sub マクロ2()
   Dim マクロ名 As String
   マクロ名 = "マクロ1"
   Application.Run マクロ名
 End Sub


上記の「マクロ2」を実行すると
「Application.Run マクロ名」の行で、変数「マクロ名」に代入された「マクロ1」が呼び出されます。


呼び出されるマクロに引数がある場合は、
「Application.Run マクロ名」に続けてカンマで区切ってマクロ名を列挙します。


 Sub マクロ3(メッセージ)
   MsgBox メッセージ
 End Sub

 Sub マクロ4()
   Dim マクロ名 As String
   マクロ名 = "マクロ3"
   Application.Run マクロ名, "ハロー"
 End Sub


「マクロ4」を実行すると
「Application.Run マクロ名」に続く引数 "ハロー" が、マクロ3の引数として渡されます。


沢山のプログラムを利用する場合や、複数のバージョンのプログラムを使い分ける場合などには、変数を使ってサブルーチンの実行ができると、管理やメンテナンスの手間が減る場合があると思います。


変数が使えますので、例えばExcelのセルに、実行したいマクロ名を記入しておいて利用することもできます。
上手に使うと、仕様書と、実行されるマクロを連動させることもできると思います。


プログラムの実行には Call を使うことが多いと思いますが、Callは変数を使ってサブルーチンを呼び出すことができません。
作成の目的や量によっては、Application.Run を使った方が便利な場合も出てくるかも知れません。

システム化などを目的にExcel、AccessのVBAを利用される場合などには、一度利用してみると、分かりやすくメンテナンスしやすいプログラミングのための良いアイディアが浮かぶのではないでしょうか。

posted by Three bit com at 10:00| Excel & Access