For文 VBAで自動化 VBAテクニック集 VBA一覧 文法・構文

【VBA】For Each ステートメントの使い方と活用例

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

解説

配列と 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

解説

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 の制約と注意点

  1. インデックスがない
    For Each は要素のインデックス(位置)を取得できません。インデックスが必要な場合は、For ステートメントを使用します。

    Dim i As Integer
    For i = 1 To 10

    MsgBox "インデックス: " & i

    Next i

  2. 一部のオブジェクトには使用不可
    For Each はコレクションや配列に対して使用できますが、単一のセルや値には使用できません。
  3. 配列の種類に注意
    配列を使用する場合、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 の効率的なループ処理を実現するための重要なツールです。以下のポイントを押さえて活用してください:

  1. コレクションや配列を簡潔にループ処理できる。
  2. 特定条件の処理には If ステートメントと組み合わせる。
  3. ネストされたループで複雑な処理も実現可能。
  4. 制約を理解して適切なケースで使用する。

    -For文, VBAで自動化, VBAテクニック集, VBA一覧, 文法・構文