このFor Each文は、繰り返し処理の中でも少し異色です。
ただ、とても便利なので必ず覚えましょう。
For Each文は、指定したコレクションのメンバをひとつずつ取り出して、そのメンバに対するなんらかの操作を行います。
つまり、メンバの数だけ繰り返すわけです。
対象は、コレクションです。
たとえば、そのブックのすべてのワークシートに対してある処理を施したいなら、Worksheetsコレクションに対して、Foe Each文を用いるのです。
ブックにあるすべてのシーをの名前をメッセージボックスで表示してみましょう。
こうなるでしょう。
Private Sub CommandButton1_Click()
Dim wsName
For Each wsName In Worksheets
MsgBox wsName.Name
Next
End Sub
一行ずつ説明します。
Dim wsName
変数を宣言しています。データ型を指定していないので、バリアント型になります。
正確を期すなら、データ型にはWorksheet型というのがあるので、「Dim wsName As Worksheet」としても良いです。
For Each wsName In Worksheets
For Each文の始まりです。書式はこうです。
For Each 変数名 In コレクション名
処理
Next
Worksheetsコレクションの中身が、ひとつずつ変数(というか配列)wsNameに入れられます。一回目のループでは、一枚目のシートが入ります。
MsgBox wsName.Name
今、一行目でひとつ目のWorksheetsコレクションのメンバ(つまり、一枚目のシートです)が入りました。その、Nameプロパティをメッセージボックスで表示しています。
これは「MsgBox Worksheets(1).Name」としているのと同じことです。
よって、この文をFor文で書き直すと下記のようになります。
Dim i
For i = 1 To 3
MsgBox Worksheets(i).Name
Next
ただ、これだとあらかじめコレクション(シート)の数が分かっていなければなりません。実行前にそれが分からない場合、またはいちいち数えるとたいへんな数の場合、やはり、For Each文が便利です。
Next
For Each文の結びです。ここで、エクセルはコレクションを探しに行きます。すべて無くなっていれば、終了です。まだあるなら、繰り返し処理を続行します。
コレクションとしてセルを指定する例です。
Private Sub CommandButton1_Click()
Dim rngC
For Each rngC In Range("A1:A3")
rngC.Interior.ColorIndex = 3
Next
End Sub
一行ずつ説明します。
Dim rngC
変数を宣言しています。データ型を指定していないので、バリアント型になります。
正確を期すなら、データ型にはセルを表わすRange型というのがあるので、「Dim rngC as Range」としても良いです。
For Each rngC In Range("A1:A3")
For Each文の始まりです。
一回目のループでは変数rngCには「Range("A1")」が入ります。気を付けて欲しいのは、代入されるのはセルA1の値、というわけではないことです。あくまでもセルA1というオブジェクトが入るのです。よって、変数rngCを操作することで、セルのNameプロパティやClearメソッドなどを利用することができるのです。
rngC.Interior.ColorIndex = 3
セルの背景色を操作しています。ColorIndexの3は赤を意味します。
この文は一回目のループでは「Range("A1").Interior.ColorIndex = 3」としているのと同じことです。
二回目なら「Range("A2").Interior.ColorIndex =
3」、3回目なら「Range("A3").Interior.ColorIndex = 3」です。
Next
For Each文の結びです。次のコレクションが無ければここで終了です。
コレクションとして配列を指定する例です。