【VBAスタンダード対策】引数の受け渡し「ByVal」と「ByRef」の文法を攻略!
引数をどのように受け取るかは、プロシージャ宣言の「カッコ内」で指定します。キーワードの配置場所と、何も記述しなかった場合にVBAがどのように解釈するかという構造的ルールを確認しましょう。
1. 問題:引数受け渡しの正確な宣言文法
【 問題 】 プロシージャ Calculate を定義する際、引数 num を「呼び出し元の値に影響を与えない値渡し」として、また引数 target を「VBAの既定である参照渡し」として正確に記述しているものはどれでしょうか?
① Sub Calculate(num ByVal As Integer, target ByRef As String)
② Sub Calculate(ByVal num As Integer, ByRef target As String)
③ Sub Calculate(As Integer ByVal num, As String ByRef target)
④ Sub Calculate(Value num As Integer, Reference target As String)
2. 正解:引数宣言の記述順序に関する正解
正解: ② Sub Calculate(ByVal num As Integer, ByRef target As String)
3. 解説:引数リストの物理的構造
VBAにおいて、引数の性質を決定するキーワード(ByVal / ByRef)は、必ず**「変数名の直前」**に配置するという構造的な決まりがあります。
(キーワード) + (引数名) + As + (型名)
・ByVal(値渡し):呼び出し元から「値のコピー」だけを受け取る。
・ByRef(参照渡し):呼び出し元の「変数そのもの(参照)」を受け取る。
[ 構造上の重要なルール ]
★ 省略時の挙動:キーワードを何も書かずに
Sub Calculate(num As Integer) と書いた場合、VBAは構造的に ByRef(参照渡し) であるとみなします。この「省略=参照渡し」は試験の超頻出ポイントです。★ 配置のミス:①のように変数名と型の間にキーワードを挟むことはできません。
1. ここが試験に出る!: スタンダード試験では、あえてキーワードを省略したコードを提示し、「呼び出し元の変数が書き換わるかどうか」を判断させる問題が出ます。「何も書いていなければ ByRef(本物が書き換わる)」という構造的デフォルトを即座に思い出せるかが合格の決め手です。
2. エンジニアの視点: Java 17などの現代的な言語は、基本データ型は値渡し、オブジェクトは参照(のコピー)渡しと決まっていますが、VBAは個別の引数ごとに明示的に指定できる柔軟な構造を持っています。実務では「意図しない書き換え」という最も厄介なバグを防ぐため、すべての引数に ByVal を明示するスタイルが推奨されます。理系NEOな保守性を高めるためにも、構造を明示する癖をつけましょう。
4. まとめ
「キーワードは変数名の前、書かなければ ByRef」。この文法構造を正確に守ることで、データの「安全性」と「共有」を自在にコントロールできるようになります。減数分裂が情報の受け渡しを厳密に行うように、VBAも引数の宣言一つで、プログラム全体のデータの運命を決定づけるのです。