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
コメント
【Bard脚本】Callステートメントの省略
シーン:IT企業の社員食堂。
登場人物
田中:20代後半の男性社員。VBAの経験が豊富。
佐藤:30代前半の男性社員。VBAを始めたばかり。
田中:佐藤さん、最近VBAでサブルーチンを呼び出すとき、Callステートメントを省略して書いてますよね?
佐藤:はい。Callステートメントって、省略しても問題ないんですよね?
田中:はい、省略しても問題はありません。でも、僕はCallステートメントを省略するのは好きじゃないんですよね。
佐藤:どうしてですか?
田中:Callステートメントを省略すると、コードが読みにくくなると思うんです。プロシージャを呼び出していることがわかりづらいんですよね。
佐藤:確かに、Callステートメントを省略すると、一見するとプロシージャの呼び出しなのか、単なる式なのか区別がつかないですね。
田中:あと、Callステートメントを省略すると、引数を渡すときにエラーが出やすくなると思うんです。引数の型や順序を間違えると、エラーが出ずに実行できてしまうんですよね。
佐藤:それは気づきませんでした。Callステートメントを省略するのは、リスクがあるんですね。
田中:はい。僕は、Callステートメントを省略するのは、コードの可読性や保守性を下げる可能性があるので、あまりおすすめしません。
佐藤:わかりました。これからは、Callステートメントを省略しないように気をつけます。
田中:よかったです。
(食事を続けながら、他の話に移る。)
解説:この脚本では、Callステートメントを省略するメリットとデメリットについて、2人のIT社員が議論しています。Callステートメントを省略するメリットは、コードが簡潔になるという点です。また、Callステートメントを省略しても、コードが動作に影響を与えないという点もメリットです。一方、Callステートメントを省略するデメリットは、コードの可読性や保守性が下がるという点です。また、引数を渡すときにエラーが出やすくなるという点もデメリットです。最終的には、Callステートメントを省略するかどうかは、コードの可読性や保守性、エラーの防止といった点を考慮して判断することになります。