【VBAスタンダード対策】For Each ... Next によるワークシートの全件処理を攻略!
ブック内のすべてのシートに対して同じ処理を繰り返し実行したい時に活躍するのが For Each ... Next です。コレクションからオブジェクトを1つずつ取り出す際の、正しい変数宣言と構文構造をマスターしましょう。
1. 問題:Worksheetsコレクションに対する For Each の指定方法
【 問題 】 アクティブブック内のすべてのワークシートの名前をイミディエイトウィンドウに出力したい。空欄 ( A ) に入る記述として、文法上**誤っている**(エラーになる)ものはどれでしょうか?
Sub SheetNameList()
Dim ( A )
For Each ws In Worksheets
Debug.Print ws.Name
Next ws
End Sub
Dim ( A )
For Each ws In Worksheets
Debug.Print ws.Name
Next ws
End Sub
① ws As Worksheet
② ws As Variant
③ ws As Object
④ ws As Worksheets
2. 正解:For Each の要素変数宣言に関する正解
正解: ④ ws As Worksheets
3. 解説:「単数形(要素)」と「複数形(集合)」の構造的な違い
For Each ... Next では、取り出す「中身(要素)」と全体の「集まり(コレクション)」の型を正しく区別して定義する必要があります。
[ For Each の変数宣言構造 ]
構文:For Each [要素変数] In [コレクション]
・要素変数(ws)の型ルール
取り出すのは「シート1枚(単体)」なので、単体を表す Worksheet型(①)、またはあらゆるオブジェクト・値を受け取れる Variant型(②)、汎用オブジェクトの Object型(③)を指定する必要があります。
・誤り(④)の理由
Worksheets(複数形)はシートの「集まり(コレクション)」を表す型です。1枚のシートを受け取る変数
構文:For Each [要素変数] In [コレクション]
・要素変数(ws)の型ルール
取り出すのは「シート1枚(単体)」なので、単体を表す Worksheet型(①)、またはあらゆるオブジェクト・値を受け取れる Variant型(②)、汎用オブジェクトの Object型(③)を指定する必要があります。
・誤り(④)の理由
Worksheets(複数形)はシートの「集まり(コレクション)」を表す型です。1枚のシートを受け取る変数
ws に対してコレクション型を指定することはできないため、データ型の不一致エラー(コンパイルエラー)が発生します。ここが試験に出る!: スタンダード試験では、For Each ws In Worksheets のように要素変数(単数形の Worksheet)とコレクション(複数形の Worksheets)の「sのあるなし」をひっかけとして出してきます。また、Sheets コレクション(グラフシートも含む)を処理する場合の型の選び方についても正確に押さえておきましょう。
4. まとめ
「取り出す変数には単体(Worksheet)を指定し、In の後ろには集合(Worksheets)を指定する」。この単数形と複数形の構造ルールを意識しておけば、全シートの一括処理や非表示シートの自動判定など、実務で強力な一括制御マクロを迷わず書けるようになります。
PR