VBA のマクロの頭についている Sub とは Subroutine のこと。つまり、全てのマクロは他のマクロのサブルーチンとしてはたらくことができるということです。特にあるマクロの中で、引数を指定して他のマクロを呼び出すようなプログラムを作成すれば、全体として構造の分かりやすいシステムを作り上げることができます。
【VBA】サブルーチンを呼び出す方法
簡単な例として、任意の文字列の中に含まれる文字列 “a” を文字列 “b” に変換するマクロを作ってみましょう。まずサブルーチンから作ってみます。
'[VBA] 任意の文字列を受け取ってaをbに置き換えるサブルーチン Sub replace_ab (w1 As String) Dim w2 As String '任意の文字w1のaをbに変換 w2 = Replace(w1, "a", "b") '変換された文字をプリント Debug.Print w2 End Sub
マクロ名のあとの () に変数とデータ型宣言が記述されています。
Sub replace_ab(w1 As String)
これは文字列型 w1 を引数としてはたらくマクロであることを示しています。このように、引数の指定されたマクロは単体では実行できないようになっていて、このマクロを動かすための本体が必要となります。3行目の
w2 = Replace(w1, "a", "b")
では Riplace 関数が使われています。上のコードは w1 という文字に含まれる a を b に置き換えるという意味です。
サブルーチンを動かす本体は簡単なマクロです。
'[VBA] サブルーチンを呼び出す Sub run_replace_ab() replace_ab "aaa" replace_ab "aac" replace_ab "abc" End Sub
たったこれだけです。本体でサブルーチンを動かすには
サブルーチン 引数
と書くだけです。run_replace_ab() は aaa, aac, abc という文字列を replace_ab() の変数 w1 に受け渡して「含まれている “a” を “b” に変えてください」とお願いしているわけです。このマクロを実行するとイミディエイトウィンドウに 「bbb, bbc, bbc」と表示されるです。
【VBA】Callステートメント
Call ステートメントを使って、サブルーチンを呼び出すこともできます。前述したように、別に Call を使わなくてもサブルーチンを呼び出せますが、チームに VBA に不慣れな人がいた場合などは、Call があったほうが、別のプログラムを呼び出していることがわかりやすいかもしれません。Call ステートメントでサブルーチンを呼び出す場合は、渡す引数は括弧で括ります(これも他言語に馴染んでいる人にはしっくりくるかもしれません)。
'[VBA] Callでサブルーチンを呼び出す Sub call_replace_ab() Call replace_ab("abc") End Sub '実行結果: 'bbc
コメント