忍者ブログ
バイオインフォマティックス技術者試験、情報処理試験など、IT系の試験を基礎から勉強します。また、Javaなどプログラミングを勉強します。

【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

① String
② Variant
③ Object
④ Array

2. 正解:配列に対する要素変数の型に関する正解

正解: ② Variant

3. 解説:配列を For Each で回す際の厳格な構文ルール

For Each ... Next を配列(Array)に対して使用する場合、VBAには言語仕様上の明確な制約が存在します。

[ 配列×For Each の構文ルール ]

・要素変数(item)は必ず Variant 型にする必要がある
たとえ配列の中身がすべて文字列(String型)であっても、For Each item In arr の要素変数 itemVariant 型(または型指定なしの標準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