Excel VBA の For Each ステートメントは、コレクションや配列を効率的にループ処理するための構文です。このステートメントを使えば、データの操作や自動化を簡潔に実現できます。
この記事では、For Each ステートメントの基本構文から活用例までを解説します。
目次
For Each ステートメントの基本
For Each は、コレクションや配列の各要素を順番に処理するためのループ構文です。対象となるオブジェクトには、ワークシート、セル、ファイルなどがあります。
【基本構文】
For Each 要素 In コレクション
' 処理内容
Next 要素
- 要素: ループ内で操作する個々のアイテム(例: ワークシート、セル、配列の要素)。
- コレクション: 操作対象のオブジェクトの集合(例: Worksheets、Cells、配列)。
ワークシートをループ処理
すべてのワークシートをループして、それぞれに操作を加える例です。
Sub LoopThroughWorksheets()
Dim ws As Worksheet
For Each ws In ThisWorkbook.Worksheets
MsgBox "シート名: " & ws.Name
Next ws
End Sub
解説
Worksheetsコレクションを使用して、すべてのワークシートをループします。- 各ワークシートの名前をメッセージボックスで表示します。
範囲内のセルをループ処理
特定の範囲内のすべてのセルをループし、操作を行う例です。
Sub LoopThroughCells()
Dim cell As Range
For Each cell In Range("A1:A10")
cell.Value = cell.Value * 2 ' 各セルの値を2倍にする
Next cell
End Sub
解説
- 範囲
A1:A10の各セルを順番に処理します。 - 各セルの値を 2 倍に更新します。
ファイルをループ処理(フォルダ内のすべてのファイルを操作)
指定したフォルダ内のすべてのファイルをループ処理する例です。
Sub LoopThroughFiles()
Dim fileName As String
Dim folderPath As String
folderPath = "C:\ExampleFolder\" ' 対象のフォルダパス
fileName = Dir(folderPath & "*.*") ' フォルダ内のファイルを取得
Do While fileName <> ""
MsgBox "ファイル名: " & fileName
fileName = Dir ' 次のファイルを取得
Loop
End Sub
解説
Dir関数を使用して、指定フォルダ内のファイルを取得します。Excel VBAにおけるDir関数の活用法- 各ファイル名を順番に表示します。
配列と For Each
For Each は、配列を効率的にループ処理するためにも使用できます。
【配列をループ処理する例】
Sub LoopThroughArray()
Dim fruits As Variant
Dim fruit As Variant
fruits = Array("Apple", "Banana", "Cherry") ' 配列を定義
For Each fruit In fruits
MsgBox "果物: " & fruit
Next fruit
End Sub
解説
Array関数を使用して配列を定義します。【VBA】配列(array)の1次元配列・2次元配列- 配列内の各要素をループ処理し、メッセージボックスで表示します。
For Each と条件分岐の組み合わせ
If ステートメントと組み合わせて条件付きで操作を行うことができます。
【特定の条件に一致するセルだけを操作する例】
Sub LoopWithConditions()
Dim cell As Range
For Each cell In Range("A1:A10")
If cell.Value > 50 Then
cell.Interior.Color = RGB(255, 0, 0) ' セルの背景色を赤に設定
End If
Next cell
End Sub
解説
- 範囲内のセルで、値が 50 を超えるセルだけを赤色にします。
For Each の制約と注意点
- インデックスがない
For Eachは要素のインデックス(位置)を取得できません。インデックスが必要な場合は、Forステートメントを使用します。 - 一部のオブジェクトには使用不可
For Eachはコレクションや配列に対して使用できますが、単一のセルや値には使用できません。 - 配列の種類に注意
配列を使用する場合、1次元配列やバリアント型が適しています。2次元配列では別のアプローチが必要になることがあります。
ネストされた For Each ループ
For Each を入れ子構造にして、より複雑な処理を行うことも可能です。
【ネストされた For Each の例】
Sub NestedForEach()
Dim ws As Worksheet
Dim cell As Range
For Each ws In ThisWorkbook.Worksheets
For Each cell In ws.Range("A1:A10")
If cell.Value <> "" Then
cell.Font.Bold = True ' セルのフォントを太字に設定
End If
Next cell
Next ws
End Sub
解説
- すべてのワークシートをループ。
- 各シート内の
A1:A10範囲をループして、値が空でないセルを太字にします。
まとめ
For Each ステートメントは、Excel VBA の効率的なループ処理を実現するための重要なツールです。以下のポイントを押さえて活用してください:
- コレクションや配列を簡潔にループ処理できる。
- 特定条件の処理には
Ifステートメントと組み合わせる。 - ネストされたループで複雑な処理も実現可能。
- 制約を理解して適切なケースで使用する。