【VBAスタンダード対策】一括データを渡す「配列引数」の構造を攻略!
複数のデータをまとめた「配列」を別のプロシージャへ渡す際、VBAには「引数名の後ろにカッコを付ける」という独自の記述ルールがあります。また、配列の受け渡しには、通常の変数とは異なる構造上の大きな制約が存在します。
1. 問題:配列を引数として受け取る正確な記述
【 問題 】 文字列型の配列 names を引数として受け取り、その内容を処理するプロシージャ ProcessAll を定義したい。また、VBAの構造的制約として、**「配列を引数として渡す場合は、必ず参照渡し(ByRef)でなければならない」**というルールに従うものとする。空欄 ( A ) に入る正確な組み合わせはどれでしょうか?
Dim MyList(5) As String
' --- 配列にデータを格納する処理 ---
Call ProcessAll(MyList)
End Sub
Sub ProcessAll(( A ))
' --- 配列をループで回す処理 ---
End Sub
① ByVal names As String()
② ByRef names() As String
③ ByVal names() As String
④ ByRef names As String
2. 正解:配列引数の宣言構造に関する正解
正解: ② ByRef names() As String
3. 解説:配列引数特有の「カッコ」と「ByRef」
VBAにおいて配列を引数に取る場合、引数名の後ろに**「中身が空のカッコ ()」**を記述することで、それが単一の変数ではなく配列であることを構造的に明示します。
・カッコの配置:
names() のように、型名(String)の前ではなく、変数名の直後にカッコを置きます。・ByRefの強制:VBAの構造上、固定長配列(サイズが決まっている配列)を引数として渡す際は、
ByVal(値渡し)を指定することはできません。必ず ByRef(参照渡し) である必要があります。[ なぜ ③ ByVal は誤りなのか ]
★ 構造的制約:配列はデータサイズが大きくなる可能性があるため、VBAではメモリ効率を考慮し、コピーを作成する
ByVal での受け渡しを(Variant型に格納しない限り)認めていません。1. ここが試験に出る!: スタンダード試験では、この「配列=カッコ付きのByRef」という組み合わせが正確に書けているかが問われます。特に、Javaなどの他言語の癖で String() names のように型側にカッコを付けてしまうミスに注意が必要です。
2. エンジニアの視点: Java 17などの現代的な言語では配列もオブジェクト参照として渡されるため、実質的にVBAの ByRef に近い挙動になります。VBAで「どうしても元の配列を壊したくない」場合は、呼び出す直前で別の配列にコピー(代入)してから渡すといった工夫が必要になります。理系NEOな設計としては、この「書き換えのリスク」を承知した上で、効率的なメモリアクセスを行う構造を意識することが大切です。
4. まとめ
「配列を渡すならカッコを付けてByRef」。この物理的な記述ルールをマスターすることで、大量のデータを扱うマクロの構造を正しく制御できます。減数分裂において大量の遺伝情報がセットで受け継がれるように、VBAも配列という構造体を使って、複雑な情報を一括で、かつ正確にリレーしていくのです。