VBAでセル範囲や配列を繰り返し処理|For Each文の実例と注意点

当ページのリンクには広告 (Amazonアソシエイト含む) が含まれています。
ForEachのアイキャッチ

「エクセルVBAを使用していて、いまいち「For Each文」の意味が分からない...」
このように悩んでいませんか?

Excelのセル範囲やコレクションに対して、処理を繰り返したい!

・ループの回数を意識せずに、データ全体に対して一括操作をしたい!

その場合は、VBAの「For Each文」を
使用すると解決します!


この記事では、VBAの「For Each文」を使用して、範囲やコレクション内の全要素に対して効率的に繰り返し処理を行う方法を解説します。

「For Each文」は初心者でも直感的に理解でき、配列やセル範囲、オブジェクトのコレクションを扱う際にとても便利です。

使用例はすべてコピペして実行できるので、ぜひ最後までお読みいただき、実践してみてください。


【 この記事の概要 】

よく使う度
難しさ
覚えておくと安心度

VBAをしっかり学びたいけれど、「どこから始めればいいかわからない」と迷っていませんか?

そんな方には、UdemyのVBA講座がおすすめです。

動画での丁寧な解説や、実践的な学習スタイルで、初心者でも無理なく基礎から応用まで習得できます。
自己学習を進める上で、何度でも繰り返し見返せる講座は非常に心強い味方になりますよ!

多彩な講座から自分に合った講座を探そう!
UdemyでVBAを検索
UdemyでVBAを検索 画像出典:Udemy

\  自分のペースで学べるVBA講座はこちら  /

目次

この記事を読むとできるようになること

この記事を読むことで、以下のことができるようになります。

スポンサーリンク

VBAの繰り返し処理「For Each文」とは?

VBAの「For Each文」は、コレクションや配列の各要素に対して繰り返し処理を行うための構文です。
Excelの「セル範囲」や「配列」、「オブジェクト」を効率的に操作する際に非常に便利です。

「For Each文」を使うことで、各要素に順次アクセスし、個別に処理を行うことができます。

「For文」と異なり、ループの回数やカウンタ変数を意識する必要がないため、直感的かつミスが少ないコードを記述できます。

以下に、VBAで使用できる主要なループ処理を一覧でまとめました。

回るチンチラ

「For Each文」と「For Next文」との違いについて解説

「For Next文」は、あらかじめ繰り返す回数を指定して、ループを行います。
カウンタ変数(例: i)を使って、決まった回数だけ繰り返し処理を行います。

「For Each文」と「For Next文」の違い

ループ処理特徴使いどころ
For Next文回数を指定してループを行う。何回繰り返すかが決まっている場合に使う。
For Each文コレクションや配列の各要素を
順番に処理
する。回数は不要。
VBA 繰り返しでデータ全体に処理を適用したい
場合に便利。

For Next分については、別の記事で詳細を解説しています。
合わせてご覧ください。

あわせて読みたい
VBA For Next文の使い方完全ガイド|ループ処理と抜ける方法を解説 「エクセルを使用していて、同じ処理を効率的に処理したい。」このように悩んでいませんか? ・Excelで同じ処理を繰り返し行いたい!・特定の範囲やデータに対して効率...

繰り返し処理「For Each文」の基本構文

For Each文の構文
構成について解説
  • 要素
    • コレクション内の各要素がこの変数に代入されます。
      たとえば、セル範囲「A1」の各セルを順番に処理する場合、そのセルの値が変数に代入されていきます。
  • コレクション
    • 配列やRange(セル範囲)などのコレクションを指定します。
      配列やセル範囲(Range)、ワークシートの集合体などがコレクションとして扱われます。

この構文を使えば、配列やセル範囲などのすべての要素に対して処理を行うことができます。

実際のコード記述例

以下に、実際のコードの記述例を示します。

具体的な動作やコード解説については、使用例で確認してください。

Sub セル範囲の値を処理する()
    Dim cell As Range

    For Each cell In Range("A1:A10")
        cell.Value = "処理済み"
    Next cell
End Sub

このコードでは、セル範囲「A1」内のすべてのセルに「処理済み」という文字を入力します。

より詳しい情報は、Microsoft公式のFor Each…Next ステートメントを使用するを参照してください。

For Each文を使った繰り返し処理とループの抜け方 | セル範囲と配列操作

For Each文が「セル範囲」に対する処理順序

Excelのセル範囲(Range)に対してFor Each文を使った場合、データの処理は「列方向」に進んでいきます

その後、「行方向」に1つセルを下にずらし、再度「列方向」に進みます

For Each文でセルを繰り返した際の処理手順

つまり、最初に列方向を基準にセルを処理し、次に行方向へ移動するという動作になります。

For Eachで「セル範囲」を指定する場合のコード具体例

以下のコードでは、セル範囲「A1:C3」の各セルに対してループ処理を行い、そのループしたセルのアドレスをイミディエイトウィンドウに出力します。

Sub CellProcessingOrder()
    Dim cell As Range
    Dim targetRange As Range
    
    '// セル範囲を指定
    Set targetRange = Range("A1:C3")
    
    '// For Each文を使ってセル範囲内の各セルを処理
    For Each cell In targetRange
        '// セルのアドレスを出力
        Debug.Print cell.Address
    Next cell
    
End Sub

このコードを実行すると、以下の順番でセルのアドレスが出力されます。

For Each文でセルを繰り返した際の処理手順結果

このように、ExcelのRangeオブジェクトでFor Each文で処理を行った場合は、「列方向から行方向」に処理が進んでいることが分かります。

For Each文で、セル範囲の処理を行う際は、処理の順序に注意しましょう。

For Each文による配列の繰り返し処理

「For Each文」は、VBAで配列内の要素に対して繰り返し処理を行う際も非常に便利です。

VBAで配列を効率よく繰り返し処理を行いたい場合、For Each文を使えば配列内の全要素に対して簡単に操作できます。

以下に、VBAで配列のループ処理を行うための具体例を示します。

1次元配列を使ったFor Each文の具体例

まずは、1次元配列に対する繰り返し処理の例です。

1次元配列とは、単純なリストのようなもので、VBAでデータを連続的に保存し、繰り返し処理に活用できるデータ構造です。

たとえば、数値や文字列を複数格納し、それらを順番に処理する場合に使用します。

以下のコードでは、数値を含む配列を作成し、For Each文を使って配列内の各要素に対して繰り返し処理を行い、要素を2倍にしてイミディエイトウィンドウに出力しています。

Sub ArrayProcessing()
    Dim numArray As Variant
    Dim num As Variant

    '// 配列を作成
    numArray = Array(1, 2, 3, 4, 5)

    '// For Each文で配列内の各要素を処理
    For Each num In numArray
        Debug.Print num * 2 '// 各要素を2倍にしてイミディエイトウィンドウに出力
    Next num
End Sub

このコードを実行すると、各要素が2倍され、以下のような結果がイミディエイトウィンドウに出力されます。

1次元配列を使ったFor Each文の処理結果
1次元配列の処理結果を解説

このように、1次元配列では要素が一つずつ順番に処理され、ループ処理によって繰り返し操作が簡単に行えます。

あわせて読みたい
VBA Array関数の使い方徹底解説!1次元配列・2次元配列の操作をマスターしよう 「VBAで配列の要素数を簡単に取得したいけど、どうやるんだろう?」このように悩んだことはありませんか? ・複数のデータを一度に扱いたい。 どうやって配列を簡単に...

2次元配列を使ったFor Each文の具体例

次に、2次元配列に対するFor Each文の使い方を解説します。

⇒ 2次元配列とは?という方はこちら

VBAで2次元配列の繰り返し処理する際に「For Each」を使うと、メモリ上で効率よくデータを扱うことができます。これにより、処理の高速化が可能です。

以下のコードでは、2次元配列を作成し、For Each文を使って各要素に対して繰り返し処理を行い、要素を2倍にしてイミディエイトウィンドウに出力します。

Sub TwoDimArrayProcessing()
    Dim twoDimArray(1, 2) As Variant
    Dim element As Variant

    '// 2次元配列に手動でデータを代入
    twoDimArray(0, 0) = 1
    twoDimArray(0, 1) = 2
    twoDimArray(0, 2) = 3
    twoDimArray(1, 0) = 4
    twoDimArray(1, 1) = 5
    twoDimArray(1, 2) = 6

    '// For Each文で2次元配列内の各要素を処理
    For Each element In twoDimArray
        Debug.Print element * 2 '// 各要素を2倍にしてイミディエイトウィンドウに出力
    Next element
End Sub

このコードを実行すると、2次元配列内の各要素が処理され、結果がイミディエイトウィンドウに出力されます。

2次元配列を使ったFor Each文の処理結果

2次元配列の処理順序を解説

For Each文で2次元配列を処理する場合、配列内の要素はまず「行方向」に処理され、その後「列方向」に進んでいきます。

配列に対するFor Each文の注意点

  • 配列のデータ型
    • For Each文で配列を扱う場合、配列のデータ型に注意が必要です。
      特に、Variant型の配列はさまざまなデータ型を保持できるため、For Each文を使う際の柔軟性が高まります。
  • 配列の範囲外エラーは発生しない
    • For Each文を使った場合、配列の全要素に自動的にアクセスできるため、For文を使った場合に発生しやすい「配列の範囲外エラー」を気にする必要がありません。

For Eachで処理する際の「セル範囲」と「配列」の違い

  • セル範囲
    • Excelシート上の特定のセルの範囲を対象に処理を行います。
      セル範囲を「For Each」で処理すると、左から右(列方向)、そして上から下(行方向)の順番で進みます。
  • 配列
    • 配列は、Excelシートではなくメモリ上に一時的に保存されたデータの集まりです。
      配列を「For Each」で処理すると、まず行方向に進み、次に列方向に処理を行います。
      このため、セル範囲とは処理の順序が異なります。

For Each文でループを抜ける方法

VBAで「For Each文」を使用している場合、特定の条件が満たされた時点でループを終了したいことがあります。このようなケースでは、「Exit For」を使うことで簡単にループを抜けることができます。

たとえば、配列やセル範囲を繰り返し処理している最中に、特定の値に達したら処理を終了させたい場合に便利です。次のコードでは、値が「5」になった時点でループを終了しています。

オブジェクト変数「cell」の値が、「5」になったら処理を終了
Sub ForEachExitExample()
    Dim cell As Range
    For Each cell In Range("A1:A10")
        If cell.Value = 5 Then
            Exit For ' ループを抜ける
        End If
    Next cell
End Sub

このように、VBAでループを抜ける方法としてExit Forは非常に便利です。
特定の条件を満たした際にループをすぐに終了できるため、処理を効率化して動作を早めることができます。

例えば、不要なループを回避できるので、全体の処理速度が向上します。

For Each文を使う際の注意ポイントについて

  • 配列やセル範囲などのサイズに注意
    • 「For Each文」はすべての要素に対して処理を行うため、処理する範囲が広すぎるとパフォーマンスに影響が出る可能性があります。
      対象範囲が適切なサイズであることを確認しましょう。
  • オブジェクト変数の型に注意
    • 「For Each文」を使う場合、対象となる要素の型を正しく宣言しておくことが重要です。
      特に、セル範囲を操作する場合は「Range」型の変数を使うようにしましょう。
スポンサーリンク

For Each文の使用例をご紹介

ここからは、「For Each文」の使用例を紹介します。

どれも実際に動作するコードなので、ぜひ実行してみてください。

VBAをしっかり学びたいけれど、「どこから始めればいいかわからない」と迷っていませんか?

そんな方には、UdemyのVBA講座がおすすめです。

動画での丁寧な解説や、実践的な学習スタイルで、初心者でも無理なく基礎から応用まで習得できます。
自己学習を進める上で、何度でも繰り返し見返せる講座は非常に心強い味方になりますよ!

多彩な講座から自分に合った講座を探そう!
UdemyでVBAを検索
UdemyでVBAを検索 画像出典:Udemy

\  自分のペースで学べるVBA講座はこちら  /

使用例1: 指定したセルに、文字を繰り返し入力。

特定のセル範囲内のすべてのセルに対して繰り返し処理を行う方法を紹介します。
ここでは、範囲内の各セルに「値」を入力します。

主な使用用途: 特定のセル範囲に対して処理を一括で適用したいときに使用します。

Sub セル範囲の値を処理する()
    Dim cell As Range

    For Each cell In Range("A1:A10")
        cell.Value = "処理済み"
    Next cell

End Sub

処理結果

使用例1の処理結果

コードの動作概要

STEP
変数「cell」を宣言

変数「cell」を Range 型で宣言し、セル範囲内の各セルを一時的に保持します。

STEP
For Eachループを開始

範囲「A1」内の各セルに対して繰り返し処理を行います。

STEP
セルに値を入力

各セルに「処理済み」という文字列を入力します。

STEP
ループ終了

すべてのセルに対する処理が完了し、ループが終了します。

このコードで使用している機能

1行ずつコードを解説

クリック」してコードの詳細解説を見る
  1. Sub セル範囲の値を処理する()
    • この行では、「Subステートメント」を使用して新しいプロシージャ(サブルーチン)を定義しています。
      プロシージャ名は「セル範囲の値を処理する」で、このサブルーチンが実行されると、指定された一連の操作が実行されます。
  2. Dim cell As Range
    • ここでは、変数「cell」を Range 型として宣言しています。
      この変数は、後に For Each ループで使用され、セル範囲内の各セルを順番に保持するためのものです。
  3. For Each cell In Range(“A1:A10”)
    • この行では、「For Each」ループが開始されます。
      Range(“A1:A10”) で、セル範囲「A1」を取得し、各セルを変数「cell」に順次代入しながらループ処理を行います。
      「For Each」ループは、範囲内のすべてのセルに対して繰り返し処理を行います。
  4. cell.Value = “処理済み”
    • この行では、現在のセル(cell)の値を「処理済み」に設定しています。
      ループが進むごとに、セル範囲「A1」の各セルにこの値が代入されます。
  5. Next cell
    • この行では、「For Each」ループが次のセルに進むことを示します。
      変数「cell」に次のセルが代入され、再びループ内の処理が実行されます。
      範囲内のすべてのセルに対する処理が終了するまで、このループが繰り返されます。
  6. End Sub
    • この行は、サブルーチン「セル範囲の値を処理する」の終わりを示します。
      すべてのセルに対する処理が完了し、プログラムは次に実行するステップに進みます。

この処理を行うことで、指定したセル範囲に文字列を入力することができます。

使用例2: ワークシートの名前を取得し、セルに出力

現在のエクセルブック内のすべてのシート名を取得し、シート1(最初のシート)のセルに順次出力する方法を紹介します。
複数のシートを持つワークブックで、シート名をリストとしてセルに表示する場合に便利です。

主な使用用途: ワークブック内のすべてのシートの名前をセルに表示したい場合に使用します。

Sub ワークシート名をセルに出力する()
    Dim Ws As Worksheet
    Dim i As Long
    
    i = 1 '// セルの行番号をカウントする変数

    For Each Ws In ThisWorkbook.Sheets
        Sheets(1).Cells(i, 1).Value = Ws.Name
        i = i + 1 '// 次の行に移動
    Next Ws
    
End Sub

処理結果

使用例2: ワークシートの名前を取得し、セルに出力の処理結果

コードの動作概要

STEP
変数「Ws」と「i」を宣言

変数「Ws」はワークシートを保持し、「i」はセルの行番号を示します。

STEP
i を「1」に初期化する

最初のワークシート名を「A1」セルに出力するために「i」を「1」に設定します。

STEP
For Each ループを開始

ThisWorkbook.Sheets からすべてのワークシートを順次取得し、それを「Ws」に代入してループ処理を行います。

STEP
ワークシートの名前をセルに出力

ループごとに、1番目のシートの Cells(i, 1) に Ws.Name(現在のワークシート名)を代入し、出力します。

STEP
次のセルに進む

ループごとに「i」を1増やし、次のワークシート名を次のセルに書き込むように設定します。

このコードで使用している機能

1行ずつコードを解説

クリック」してコードの詳細解説を見る
  1. Sub ワークシート名をセルに出力する()
    • ここで新しいサブルーチン(Sub)を定義しています。
      このサブルーチンは、すべてのワークシート名を取得してセルに出力する処理を行います。
  2. Dim Ws As Worksheet
    Dim i As Long
    • 「Ws」という変数を Worksheet 型で宣言しています。
      これは、ワークブック内の各ワークシートを保持するための変数です。
  3. i = 1
    • 行番号カウンタ「i」に「1」を代入します。
      これは、最初のワークシート名を出力するセル「A1」に対応しています。
  4. For Each Ws In ThisWorkbook.Sheets
    • For Each ループを使って、現在開いているワークブック(Excelファイル)内のすべてのワークシートを順番に調べます

      ThisWorkbook は、今開いているファイル(ブック)のことを指します。
      .Sheets は、ワークブックに含まれるすべてのシートを意味します。
      For Each ws In ThisWorkbook.Sheets は、「このファイル内にあるすべてのシートを順番に変数「Ws」に入れて、1つずつ処理します」という意味です。
  5. Sheets(1).Cells(i, 1).Value = ws.Name
    • シート1の Cells(i, 1) という指定は、「A列」の「i 行目」を指します。
      「i 」が「1」の場合は「A1」、i が2の場合は「A2」になります。
      この行では、そのセルに現在の 「Ws」(ワークシート)の名前を代入しています。
      つまり、最初のワークシート名が「A1」に入力され、次のワークシート名が「A2」に入力されます。
  6. i = i + 1
    • 「i」の値を「1」増やします。
      これにより、次にワークシート名を出力するセルが「A2」から「A3」へと移動します。
      この処理が繰り返され、シート名が1行ずつ順にセルに入力されていきます。
  7. Next Ws
    • この行で、次のワークシートに進むように指示しています。
      Next Ws によって、もう1つのシートが変数「Ws」に代入され、再びループの処理が行われます。
      すべてのシートを順番に処理し終わるまで、このループは繰り返されます。
  8. End Sub
    • サブルーチンの終わりを示します。
      これで「ワークシート名を取得する」というプログラムがすべて終了します。

このコードは、現在開いているワークブック内のすべてのワークシート名を、シート1の「A列」に順番に出力します。
For Each ループを使って、すべてのワークシートを順に処理し、その名前をシートに書き込む実用的な方法です。
このコードを使えば、ワークブック内のシート名を簡単にリスト化できます。

使用例3: シート内のすべてのシェイプを削除する

現在のワークシートにあるすべてのシェイプ(図形)を選択し、削除する方法を紹介します。
ここでは、For Each文を使用して、すべてのシェイプを削除します。

主な使用用途: シート上の図形やオブジェクトを一括で操作したいときに使用します。

Sub シェイプを削除する()
    Dim shp As Shape

    For Each shp In ActiveSheet.Shapes
        shp.Delete
    Next shp

End Sub

処理結果

     【 処理前 】

使用例3の処理前

     【 処理後 】

使用例3の処理結果

コードの動作概要

STEP
変数「shp」を宣言

変数「shp」を Shape 型で宣言し、シート上の各シェイプを一時的に保持します。

STEP
For Eachループを開始

アクティブシート内のすべてのシェイプに対して繰り返し処理を行います。

STEP
シェイプを削除

各シェイプを Delete メソッドで削除します。

STEP
ループ終了

すべてのシェイプが削除され、ループが終了します。

このコードで使用している機能

  • Shapes (図形のオブジェクト)

1行ずつコードを解説

クリック」してコードの詳細解説を見る
  1. Sub シェイプを削除する()
    • この行では、「Subステートメント」を使用して新しいプロシージャ(サブルーチン)を定義しています。
      プロシージャ名は「シェイプを削除する」で、このサブルーチンが実行されると、アクティブなシート上にあるすべてのシェイプを削除する処理が行われます。
  2. Dim shp As Shape
    • ここでは、変数「shp」を Shape 型として宣言しています。
      この変数は、後の For Each ループ内で使用され、シート上に存在する各シェイプ(図形や画像など)を順番に保持するために使われます。
  3. For Each shp In ActiveSheet.Shapes
    • この行では、「For Each」ループが開始されます。
      ActiveSheet.Shapes で、現在アクティブなシート上に存在するすべてのシェイプを取得し、各シェイプを順次変数「shp」に代入しながらループを繰り返します
  4. shp.Delete
    • この行では、現在のシェイプ(shp)を削除する命令が実行されます。
      ループが進むごとに、シート上のすべてのシェイプが削除されます。
  5. Next shp
    • この行では、「For Each」ループが次のシェイプに進むことを示します。
      変数「shp」に次のシェイプが代入され、再びループ内の処理が実行されます。
      シート上のすべてのシェイプに対する処理が終了するまで、このループが繰り返されます。
  6. End Sub
    • この行は、サブルーチン「シェイプを削除する」の終わりを示します。
      すべてのシェイプの削除が完了し、プログラムは次に実行するステップに進みます。

このコードは、アクティブなシート上のすべてのシェイプ(図形、画像など)を順に取得し、削除するシンプルなサブルーチンです。
For Each ループを使用して、各シェイプを順次処理し、削除する動作を実行します。

使用例4: 1次元配列内の要素を、繰り返し計算する

1次元配列内の各要素に対して処理を行う方法を紹介します。
ここでは、配列のすべての要素に「*2」を掛けた値を出力します。

主な使用用途: 配列のデータに対して一括で処理を行いたいときに使用します。

Sub 配列の要素を処理する()
    Dim arr As Variant
    Dim num As Variant

    arr = Array(1, 2, 3, 4, 5)

    For Each num In arr
        Debug.Print num * 2
    Next num

End Sub

処理内容

使用例4の処理結果

コードの動作概要

STEP
配列を宣言

配列「arr」を宣言し、数値の配列(1, 2, 3, 4, 5)を格納します。

STEP
For Eachループを開始

配列「arr」の各要素に対して繰り返し処理を行います。

STEP
値を出力

各要素に2を掛けた結果を Debug.Print で出力します。

STEP
ループ終了

配列内のすべての要素が処理され、ループが終了します。

このコードで使用している機能

1行ずつコードを解説

クリック」してコードの詳細解説を見る
  1. Sub 配列の要素を処理する()
    • Subステートメントを使って、新しいサブルーチン「配列の要素を処理する」を定義しています。
      このサブルーチンは、配列内の各要素に対して処理を実行します。
  2. Dim arr As Variant
    Dim num As Variant
    • ここでは、2つの変数を宣言しています。
      「arr」と「num」のデータ型は「Variant」です。

      「arr」: 配列全体を保持するための変数です。
      配列の中身(複数の値)を一つの変数に格納することができます。

      「num」: 配列内の各要素を順に保持するための変数です。
      For Eachループの中で各要素がこの変数に代入されます。
  3. arr = Array(1, 2, 3, 4, 5)
    • Array関数を使って、数値 1, 2, 3, 4, 5 を持つ配列を作成し、その配列を変数「arr」に代入しています。
      これで、変数「arr」は複数の値(1~5)を保持する「箱」になります。
      配列は、複数のデータを一つにまとめて管理できる便利なデータ構造です。
  4. For Each num In arr
    • For Eachループを使い、配列「arr」内の各要素を順に処理します。

      具体的には、配列内の1番目の要素(1)、2番目の要素(2)、…5番目の要素(5)をnumに代入しながら処理を進めます。
      このループは配列内のすべての要素が処理されるまで繰り返されます。
  5. Debug.Print num * 2
    • ここでは、変数「num」に現在代入されている値(配列の要素)に2を掛け、その結果を出力します。
      出力はVBAのイミディエイトウィンドウに表示されます。
      イミディエイトウィンドウは、デバッグ時に値を確認するためのツールです。
      例えば、1回目のループでは「num」に「1」が代入され、1 * 2 = 2が表示されます。次に2 * 2 = 4が表示される、といった具合に処理されます。
  6. Next num
    • For Eachループを次の要素に進めます。
      配列「arr」のすべての要素が処理されるまでループが続きます。
  7. End Sub
    • サブルーチン「配列の要素を処理する」の終了を示します。
      すべての配列要素に対する処理が完了します。

このサブルーチンは、配列内の数値に対して、それぞれ2を掛けた結果をイミディエイトウィンドウに表示します。
配列の各要素を順番に処理するためにFor Eachループを使用しており、配列の全ての要素が処理された後にループが終了します。

使用例5: 2次元配列の要素を2倍にして出力する

2次元配列にデータを手動で入力し、For Each文を使って各要素を処理する方法を紹介します。
ここでは、配列内の各要素を取り出して、値を2倍にして出力します。

主な使用用途: 2次元配列のデータを一括で処理したい場合に使用します。

Sub TwoDimArrayProcessing()
    Dim twoDimArray(1, 2) As Variant
    Dim element As Variant

    '// 2次元配列に手動でデータを代入
    twoDimArray(0, 0) = 1
    twoDimArray(0, 1) = 2
    twoDimArray(0, 2) = 3
    twoDimArray(1, 0) = 4
    twoDimArray(1, 1) = 5
    twoDimArray(1, 2) = 6

    '// For Each文で2次元配列内の各要素を処理
    For Each element In twoDimArray
        Debug.Print element * 2 '// 各要素を2倍にしてイミディエイトウィンドウに出力
    Next element
End Sub

処理内容

コードの動作概要

STEP
2次元配列 twoDimArray の作成とデータ代入

まず、twoDimArray(1, 2)という2次元配列を作成します。
この配列には、2行3列の要素が入ります。

STEP
For Eachループを開始

次に、For Eachループを使って、2次元配列内の全ての要素に順次アクセスします。
配列の各要素を取り出して、変数 element に格納し、その後処理を実行します。

STEP
各要素を2倍にして出力

Debug.Print element * 2 の部分で、取り出した要素を2倍にして出力します。
これにより、配列内の要素は以下のように処理されます。

STEP
ループ終了

すべての要素に対する処理が終了すると、Next element によってループが終了します。
これにより、2次元配列内の全要素が処理され、イミディエイトウィンドウに出力されます。

このコードで使用している機能

1行ずつコードを解説

クリック」してコードの詳細解説を見る
  1. Sub TwoDimArrayProcessing()
    • この行では、「Subステートメント」を使って新しいプロシージャ(サブルーチン)を定義しています。
      プロシージャ名は「TwoDimArrayProcessing」です。
      このプロシージャが実行されると、指定された一連の操作が実行されます。
  2. Dim twoDimArray(1, 2) As Variant
    • ここでは、2次元配列twoDimArrayを宣言しています。
      twoDimArray(1, 2)は、2行3列の配列を示しており、各要素は Variant 型です。
  3. twoDimArray(0, 0) = 1
    • この行では、配列の最初の要素(行: 0、列: 0)に値「1」を代入しています。
      このようにして、各要素に値を手動で設定します。

      以降のコードも同じようにデータを代入していきます。
  4. For Each element In twoDimArray
    • この行では、「For Each」ループが開始されます。
      配列「twoDimArray」内のすべての要素に順番にアクセスし、変数「element」に格納します。
      その後、ループ内で指定された処理を実行します。
  5. Debug.Print element * 2
    • この行では、変数「element」に格納された配列の各要素に対して、2倍にしてイミディエイトウィンドウに出力します。
  6. Next element
    • この行では、「For Each」ループの次の要素に進むように指示しています。
      すべての要素に対する処理が完了するまで、ループは続きます。
  7. End Sub
    • この行で、サブルーチン「TwoDimArrayProcessing」の終わりを示しています。
      すべての配列要素に対する処理が完了したら、プログラムは次のステップに進みます。

この処理を行うことで、2次元配列内の全ての要素に対して処理を一括で実行し、結果を確認することができます。

使用例6: ループを条件で指定した条件で止める

セル範囲内で特定の値に達したらループを強制終了する方法を紹介します。
このように、ある条件でストップすることも可能です。

主な使用用途: 条件に応じて、早めにループを終了したい場合に使用します。

Sub ループを途中で止める()
    Dim cell As Range

    For Each cell In Range("A1:A10")
        If cell.Value = "終了" Then
            Exit For
        Else
            cell.Value = "処理中"
        End If
    Next cell

End Sub

処理結果

使用例6の処理結果

コードの動作概要

STEP
変数「cell」を宣言

変数「cell」を Range 型で宣言し、セル範囲内の各セルを保持します。

STEP
For Eachループを開始

範囲「A1」から「A10」の各セルに対して繰り返し処理を行います。

STEP
条件をチェック

セルに「終了」と書かれていた場合、Exit For によりループを終了します。

STEP
処理の続行

それ以外の場合はセルに「処理中」と入力します。

STEP
ループ終了

範囲「A1」から「A10」のすべてのセルに対して処理が終了すると、ループが完了します。

このコードで使用している機能

1行ずつコードを解説

クリック」してコードの詳細解説を見る
  1. Sub ループを途中で止める()
    • この行では、VBAのSubステートメントを使って新しいサブルーチン「ループを途中で止める」を定義しています。
      このサブルーチンが実行されると、指定された一連の操作が実行されます。
  2. Dim cell As Range
    • 変数「cell」をRange型として宣言しています。
      Range型の変数は、Excelのセルやセル範囲を指し、個々のセルのデータやプロパティにアクセスできます。
      この変数には、後ほどFor Eachループ内で範囲内の各セルが順に代入されます。
  3. For Each cell In Range(“A1:A10”)
    • For Eachループは、範囲内のすべてのセルに対して1つずつ処理を繰り返します
      Range(“A1:A10”)は、セル範囲「A1」から「A10」までを指定しています。
      cell変数に、範囲内の各セル(A1, A2, …, A10)が順に代入され、そのセルに対する処理が行われます。
  4. If cell.Value = “終了” Then
    • If文で、現在のセル(cell)の値が「終了」かどうかを確認しています。
      cell.Valueは、セルの中にある値を参照します。

      もしセルの値が「終了」であれば、Then以下の処理が実行されます。
  5. Exit For
    • 「Exit For」は、現在のFor Eachループを途中で終了させる命令です。
      セルの値が「終了」である場合、ループの残りのセルを無視してループ全体が終了します。
      これにより、「終了」と書かれたセル以降の処理は実行されません。
  6. Else
    • If文の条件が成立しなかった場合、つまりセルの値が「終了」ではない場合に、Else以下の処理が実行されます。
  7. cell.Value = “処理中”
    • Elseの処理として、セルの値を「処理中」に変更します。

      例えば、セル「A1」の値が「終了」でない場合、そのセルに「処理中」と入力されます。
      この処理は、セルの値が「終了」でない限り、ループ内で繰り返されます。
  8. End If
    • If文の終了を示します。
      ここで条件分岐が完了し、次のセルの処理に進みます。
  9. Next cell
    • Nextは、For Eachループの次のセルに進むための命令です。
      次のセル(例えばA2)が変数「cell」に代入され、再度ループ内の処理が実行されます。
      これが範囲内のすべてのセルに対して繰り返されます。
  10. End Sub
    • ここでサブルーチンが終了します。
      すべてのセルの処理が完了し、ループが終了した後、サブルーチンが終了します。
      この行の処理が終わると、プログラムは次のコードに進みます。

このサブルーチンは、セル範囲「A1」に対して順番に処理を行い、各セルの値が「終了」であれば、ループを途中で止めます。
それ以外のセルには「処理中」と書き込みます。

使用例7: 指定した条件だけ、ループ内の処理をスキップする

セルの値が特定の条件に一致した場合、処理をスキップして次のセルに移る方法を紹介します。

主な使用用途: 特定の条件に該当する要素を飛ばしたい場合に使用します。

Sub ループをスキップする()
    Dim cell As Range

    For Each cell In Range("A1:A10")
        If cell.Value = "スキップ" Then
            GoTo Continue
        Else
            cell.Value = "処理済み"
        End If
Continue:
    Next cell

End Sub

処理結果

使用例7の処理結果

コードの動作概要

STEP
変数「cell」を宣言

変数「cell」を Range 型で宣言し、セル範囲内の各セルを保持します。

STEP
For Eachループを開始

範囲「A1」から「A10」の各セルに対して繰り返し処理を行います。

STEP
条件に一致した場合、処理をスキップ

各セルの値が「スキップ」となっている場合、そのセルの処理をスキップし、次のセルに進みます。

STEP
条件に一致しない場合、セルの値を変更

それ以外の場合はセルに「処理中」と入力します。

STEP
ループ終了

範囲「A1」から「A10」のすべてのセルに対して処理が終了すると、ループが完了します。

このコードで使用している機能

1行ずつコードを解説

クリック」してコードの詳細解説を見る
  1. Sub ループをスキップする()
    • この行で、新しいサブルーチン「ループをスキップする」を定義しています。
      Subステートメントは、VBAにおける一連の処理をまとめたもので、この場合、特定の条件でループ内の処理をスキップする機能を持ちます。
  2. Dim cell As Range
    • 変数「cell」をRange型として宣言しています。
      Range型は、Excelのセルやセル範囲を指し、これによりセルの値やプロパティにアクセスできるようになります。
      この変数「cell」は、後にFor Eachループで範囲内の各セルが順番に代入されます。
  3. For Each cell In Range(“A1:A10”)
    • For Eachループは、指定された範囲「A1」から「A10」内のすべてのセルに対して繰り返し処理を行います。
      変数「cell」に、範囲内のセル(A1からA10まで)が順に代入され、それぞれのセルに対して処理が行われます。
  4. If cell.Value = “スキップ” Then
    • この行では、If文で現在のセル(cell)の値が「スキップ」と等しいかを確認しています。
      もしセルの値が「スキップ」であれば、この条件が成立し、次のThenに続く処理が実行されます。
  5. GoTo Continue
    • GoToステートメントは、コード内の指定された場所にジャンプする命令です。
      この場合、GoTo Continueにより、ラベル「Continue:」の場所にジャンプし、現在のセルの処理をスキップして次のセルに進みます。
  6. Else
    • If文の条件が成立しなかった、つまりセルの値が「スキップ」でない場合に、Elseに続く処理が実行されます。
  7. cell.Value = “処理済み”
    • もしセルの値が「スキップ」でない場合、この行でそのセルに「処理済み」と入力します。

      例えば、セルA1の値が「スキップ」でなければ、A1に「処理済み」と書き込まれます。
  8. Continue:
    • これは「ラベル」と呼ばれるもので、GoToステートメントでジャンプする先を示します。
      もしセルの値が「スキップ」であれば、GoTo Continueによりこの場所にジャンプし、Next cellに進みます。
  9. Next cell
    • この行では、For Eachループが次のセルに進む命令を実行します。
      現在のセルの処理が終わると、次のセル(例えば、A2)がcellに代入され、再びループの処理が行われます。
      これが範囲内のすべてのセルに対して繰り返されます。
  10. End Sub
    • この行はサブルーチン「ループをスキップする」の終了を示します。
      すべてのセルの処理が完了したら、プログラムは次のコードに進みます。

このサブルーチンは、セル範囲「A1」を順に処理し、セルの値が「スキップ」であればそのセルの処理をスキップします。
それ以外のセルには「処理済み」と書き込みます。
GoToステートメントを使うことで、条件に応じたセル処理のスキップが可能です。

スポンサーリンク

この記事のまとめ

「For Each文」は、配列やセル範囲、オブジェクトのコレクションに対して繰り返し処理を行う際に非常に便利です。

カウンタ変数を使わずに直感的に処理を行えるため、コードの可読性も向上します。

ポイントのおさらい

  • VBAのFor Each文を使った繰り返し処理を理解する
    • VBAの「For Each文」は、配列やセル範囲、ワークシートのようなコレクションのすべての要素に対して、一括で繰り返し処理を行うための構文です。
      For文と異なり、ループの回数を指定する必要がなく、データ全体に対して順次処理を適用したい場合に便利です。

      For Each文は、データのカウントが不要な分、シンプルで直感的なコードを書くことができます。
      たとえば、セル範囲やワークシートのオブジェクトに対して同じ処理を繰り返す際に利用します。

      ⇒ 「For Each文とは?」もう一度見る。
  • For Each文の動作順序と処理の順番を把握する
  • For Each文でループを途中で抜ける方法を確認する
  • For Each文を使用する際の注意ポイントを確認する
  • セルや配列に対する処理を効率化する
    • 配列の各要素やセル範囲、シート上のシェイプなどを一括で処理する「For Each文」の使い方を紹介しました。
      繰り返し処理を活用し、業務の効率を上げましょう。

      ⇒ 「For Each文の使用例」もう一度見る。

この記事の使用例を実践していくことで、VBAのFor Each文を使って、より効率的に繰り返し処理を行えるようになります。
最初はコードをコピペして実行し、少しずつ自分で書けるようにしていきましょう。

あわせて読みたい
サイトマップ このページは、本サイトの記事を分かりやすくまとめました。ぜひご覧ください。 目次 「VBA」を見る 「Officeスクリプト」を見る 「ワークシート関数」を見る 「Python...
スポンサーリンク
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次