VBA(Visual Basic for Applications)で繰り返し処理を行う際に便利な構文が「For Each」です。
この構文は、コレクションや配列の要素を一つずつ取り出して処理するのに使われ、コードが簡潔で読みやすくなるというメリットがあります。
この記事では、「For Each」の基本的な書き方から応用例までを、初心者の方にもわかりやすく丁寧に解説していきます。
Excel VBAを使って日々の業務を効率化したい方は、ぜひ最後までお読みください。
「For Each」は、コレクション(セル範囲やワークシートなど)や配列の要素を1つずつ処理したいときに使います。
基本構文は以下の通りです。
For Each 要素 In コレクション
' 繰り返したい処理
Next 要素
この書き方により、処理対象が1つずつ順番に「要素」として取得され、ループ処理を行うことができます。
例えば、セルの中身を順番に取得して処理したり、ブック内のすべてのワークシートに処理を施したりできます。
「For Each」はコレクションや配列向け、「For Next」は数値による繰り返し向けという違いがあります。
どちらも使いこなすことで、VBAの柔軟な繰り返し処理が可能になります。
以下は、指定した範囲のセルの値を順にメッセージボックスで表示する例です。
Sub ShowCellValues()
Dim c As Range
For Each c In Range("A1:A5")
MsgBox c.Value
Next c
End Sub
このコードは、A1からA5までの各セルを順に「c」に代入し、それぞれの値をメッセージで表示します。
ワークシートにある図形すべてに対して、名前を表示するサンプルです。
Sub ShowShapeNames()
Dim shp As Shape
For Each shp In ActiveSheet.Shapes
MsgBox shp.Name
Next shp
End Sub
このように、Shapesコレクションに「For Each」を使えば、すべての図形に一括で処理できます。
ブック内のすべてのワークシートに、共通の処理(例:A1セルに文字を入力)を行う例です。
Sub WriteToAllSheets()
Dim ws As Worksheet
For Each ws In ThisWorkbook.Worksheets
ws.Range("A1").Value = "共通処理済"
Next ws
End Sub
このコードにより、全シートのA1セルに同じ文字列が入力されます。複数シートを一括操作したいときに非常に便利です。
配列にも「For Each」は使えますが、少し注意点があります。
Sub ArrayLoopExample()
Dim fruits As Variant
Dim item As Variant
fruits = Array("りんご", "バナナ", "みかん")
For Each item In fruits
MsgBox item
Next item
End Sub
ポイントは、Variant
型を使って配列を扱うことです。
数値インデックスで処理したい場合は、For Next
の方が向いているケースもあります。
「For Each」内に条件分岐(If文)を組み合わせることで、より柔軟な処理が可能になります。
Sub HighlightEmptyCells()
Dim cell As Range
For Each cell In Range("A1:A10")
If cell.Value = "" Then
cell.Interior.Color = vbYellow
End If
Next cell
End Sub
このコードでは、A1~A10の範囲内で空白のセルを黄色に塗りつぶします。
「For Each」は基本的にコレクション(Range、Worksheetsなど)か配列に使います。
String型や単なる数値には使えません。
「Exit For」を使えば、特定の条件でループを抜けることが可能です。
If 条件 Then
Exit For
End If
「For Each」は、コードの可読性と保守性を高める非常に便利な構文です。
セル範囲の一括処理、複数ワークシートの共通処理、図形やオブジェクトへの操作など、幅広く応用できます。
まずは簡単な例から実際に手を動かして書いてみて、徐々に応用力を身につけていきましょう。
慣れてくれば、業務効率もぐんとアップするはずです。