For Each~Next文のほうがFor~Next文よりシンプルに書ける場合の例をご紹介しました。
この例をご覧になって、どのような処理でもFor Each~Next文のほうがシンプルになるとは、思いこまないでください。
例えば『いちばんやさしいExcel VBAの教本』の、Lesson 69「ワークシート名一覧を作成するマクロを作ってみましょう」で作成しているSubプロシージャの場合、
For Each~Next文で書くよりも、For~Next文のほうがシンプルなコードで済みます。
シート名一覧作成をFor Each~Next文で書いたサンプルマクロ
アクティブなブックの先頭にワークシートを追加して、もともと存在していたシートの名前をA1セルから下方向に書き出すSubプロシージャを、あえてFor Each~Next文で書くと以下のようになります。
Dim sh As Worksheet
Dim n As Long Worksheets.Add Before:=Worksheets(1)
n = 1
For Each sh In Worksheets
If sh.Index <> 1 Then
Cells(n, "A").Value = sh.Name
n = n + 1
End If
Next sh
End Sub
サンプルマクロの解説
For~Next文の場合は、拙著でご紹介している、
For i = 2 to Worksheets.Count
のように初期値の指定で、挿入したばかりの1枚目のワークシートを除外できますが、For Each~Next文の場合、すべてに対してループ処理が行われるので、
For Each sh In Worksheets
If sh.Index <> 1 Then
のようにIf文で条件分岐する必要があります。
「sh.Index」は、WorksheetオブジェクトのIndexプロパティで、何枚目のワークシートかを取得しているコードです。
For~Next文の場合、
For i = 2 to Worksheets.Count
の行で省略されている「Step 1」で、カウンター変数iが1ずつ加算されますが、For Each~Next文の場合は、
n = n + 1
のような加算処理を書く必要があります。
For~Next文とFor Each~Next文の区別が明確になっていないレベルの方の場合、こういった加算処理が不要なのに入れてしまったり、必要なのに入れ忘れてしまったりしがちです。
Home » いちばんやさしいExcel VBAの教本 » シート名一覧作成をFor Each~Next文で