【VBAスタンダード対策】For Each ... Next による「配列」の反復処理を攻略!
For Each ... Next はワークシートやセル範囲だけでなく、「配列」の全要素を一括処理する際にも頻繁に使用されます。配列を走査する際の変数宣言(データ型)のルールをマスターしましょう。
1. 問題:配列に対する For Each の要素変数の型
【 問題 】 下記の ArrayLoopTest プロシージャを実行し、配列の要素を1つずつメッセージボックスに表示したい。空欄 ( A ) に入る要素変数のデータ型として、文法上**正しいもの**はどれでしょうか?
Sub ArrayLoopTest()
Dim arr As Variant
Dim item As ( A )
arr = Array("Tokyo", "Osaka", "Nagoya")
For Each item In arr
MsgBox item
Next item
End Sub
Dim arr As Variant
Dim item As ( A )
arr = Array("Tokyo", "Osaka", "Nagoya")
For Each item In arr
MsgBox item
Next item
End Sub
① String
② Variant
③ Object
④ Array
2. 正解:配列に対する要素変数の型に関する正解
正解: ② Variant
3. 解説:配列を For Each で回す際の厳格な構文ルール
For Each ... Next を配列(Array)に対して使用する場合、VBAには言語仕様上の明確な制約が存在します。
[ 配列×For Each の構文ルール ]
・要素変数(item)は必ず Variant 型にする必要がある
たとえ配列の中身がすべて文字列(String型)であっても、
・なぜ String 型(①)ではエラーになるのか?
VBAの仕様上、配列を
・要素変数(item)は必ず Variant 型にする必要がある
たとえ配列の中身がすべて文字列(String型)であっても、
For Each item In arr の要素変数 item は Variant 型(または型指定なしの標準Variant)で宣言しなければなりません。・なぜ String 型(①)ではエラーになるのか?
VBAの仕様上、配列を
For Each で受ける変数には Variant 型または Object 型しか認められていません。Dim item As String と記述すると、実行時に「変数の型が一致しません(コンパイルエラー)」が発生します。ここが試験に出る!: スタンダード試験では、「中身が文字列だから As String で受けられる」という勘違いを狙うトラップ問題が非常に多く出題されます。「コレクション(WorksheetsやRange)なら特定の型(WorksheetやRange)が使えるが、配列のFor Eachは Variant型 が必須」という構造の違いを必ず暗記しておきましょう。
4. まとめ
「配列を For Each で受ける変数は Variant 一択」。このルールさえ覚えておけば、実務で `Array` 関数で作ったリストや動的配列の全要素チェックを行う際にも、コンパイルエラーを起こさずにスムーズなループ処理が実装できます。
PR