For Each ~ Nextは、コレクション中のすべてのオブジェクトに対して、連続して処理を実行します。処理する順番は指定できませんが、すべてのオブジェクトに対する処理を解決に記述できます。
すべてのワークシートの名前をセル「A1」に入力する

Sub for_each_next()
For Each w In Worksheets
w.Range("A1").Value = w.Name
Next
End Sub
For Each ~ Nextステートメント
「処理の対象をオブジェクト」と呼び、「オブジェクトの集まりがコレクション」と呼びます。コレクションに含まれるすべてのオブジェクトに対して処理を実行するのがFor Each ~ Nextステートメントです。For ~ Nextは繰り返しの回数を決めて実行しますが、For Each ~ Nextはコレクションに含まれるオブジェクトの数だけ処理を繰り返します。
- For Each ~ Nextステートメント
For Each 変数名 In コレクション
繰り返す処理
Next
「コレクション」が持つすべてのオブジェクトを、「変数名」に次々と代入しながら、「繰り返す処理」を繰り返し実行します。ただし、処理するオブジェクトの順番を指定することはできません。
すべてのワークシートに対して処理
ブックに存在するすべてのワークシート(Worksheetオブジェクト)は、Worksheetsコレクションで表すことができます。サンプルプログラムでは、すべてのワークシートが順番に変数wに代入されます。
そしてWorksheetオブジェクトのNameプロパティは、ワークシートの「ワークシート名」を返します。Nameプロパティで取得したワークシート名を、各ワークシートのせる「A1」に書き込んでいます。たとえば次のような処理を行っているのと同じです。
Worksheets(“Sheet1”).Range(“A1”).Value = Worksheets(“Sheet1”).Name
Worksheets(“Sheet1”).Range(“A1”).Value = Worksheets(“Sheet1”).Name
Worksheets(“Sheet1”).Range(“A1”).Value = Worksheets(“Sheet1”).Name ・・・
関連知識
セル範囲D5:M14の数値をすべて100倍にする
Rangeオブジェクトは1つのセルを表す場合も、複数のセルを含むセル範囲を表す場合もRangeオブジェクトといい、Rangeコレクションとはいわないという話をしました。
次の例ではFor Each ~ Nextステートメント中で「For Each c In Range(・・・)」のように使っています。つまりこのサンプルでRangeは「コレクション」として働いているのです。このようにRangeコレクションとはいわないが、コレクションとして使用できることを覚えておいてください。
For Each c In Range("D5:M14")
c.Value = c.Value * 100
Next
入力されていないセルだけ黄色で塗りつぶす
これもRangeがコレクションとなり、「For Each ~ Next」でそのすべてのセルに対して処理する例です。
セル範囲D5:M14のすべてのセルに対し、その1つのセルの値を「c.Value」としてこれが””だったら、そのセルを黄色に塗りつぶします。
Sub 入力されていないセルは黄色()
For Each c In Range ("D5:M14")
If c.Value = "" Then
c.Interior.Color = vbYellow
End If
Next
End Sub
コメント