VBA(Visual Basic for Applications)で繰り返し処理を行う際に便利な構文が「For Each」です。
この構文は、コレクションや配列の要素を一つずつ取り出して処理するのに使われ、コードが簡潔で読みやすくなるというメリットがあります。
この記事では、「For Each」の基本的な書き方から応用例までを、初心者の方にもわかりやすく丁寧に解説していきます。
Excel VBAを使って日々の業務を効率化したい方は、ぜひ最後までお読みください。
For Eachとは?基本構文を理解しよう
「For Each」は、コレクション(セル範囲やワークシートなど)や配列の要素を1つずつ処理したいときに使います。
基本構文は以下の通りです。
For Each 要素 In コレクション
' 繰り返したい処理
Next 要素
この書き方により、処理対象が1つずつ順番に「要素」として取得され、ループ処理を行うことができます。
例えば、セルの中身を順番に取得して処理したり、ブック内のすべてのワークシートに処理を施したりできます。
For EachとFor Nextの違いを知っておこう
「For Each」はコレクションや配列向け、「For Next」は数値による繰り返し向けという違いがあります。
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を使う
配列にも「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でVBAを効率化しよう
「For Each」は、コードの可読性と保守性を高める非常に便利な構文です。
セル範囲の一括処理、複数ワークシートの共通処理、図形やオブジェクトへの操作など、幅広く応用できます。
まずは簡単な例から実際に手を動かして書いてみて、徐々に応用力を身につけていきましょう。
慣れてくれば、業務効率もぐんとアップするはずです。