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

・Excelのセル範囲やコレクションに対して、処理を繰り返したい!
・ループの回数を意識せずに、データ全体に対して一括操作をしたい!



その場合は、VBAの「For Each文」を
使用すると解決します!
この記事では、VBAの「For Each文」を使用して、範囲やコレクション内の全要素に対して効率的に繰り返し処理を行う方法を解説します。
「For Each文」は初心者でも直感的に理解でき、配列やセル範囲、オブジェクトのコレクションを扱う際にとても便利です。
使用例はすべてコピペして実行できるので、ぜひ最後までお読みいただき、実践してみてください。
【 この記事の概要 】
よく使う度 | |
難しさ | |
覚えておくと安心度 |
VBAをしっかり学びたいけれど、「どこから始めればいいかわからない」と迷っていませんか?
そんな方には、UdemyのVBA講座がおすすめです。
動画での丁寧な解説や、実践的な学習スタイルで、初心者でも無理なく基礎から応用まで習得できます。
自己学習を進める上で、何度でも繰り返し見返せる講座は非常に心強い味方になりますよ!


\ 自分のペースで学べるVBA講座はこちら /
この記事を読むとできるようになること
この記事を読むことで、以下のことができるようになります。
- 「For Each文」の基本を習得する
- 「For Each文」の注意点を確認し理解する。
- 「For Each文」の使用例を確認する。
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分については、別の記事で詳細を解説しています。
合わせてご覧ください。


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


- 要素
- コレクション内の各要素がこの変数に代入されます。
たとえば、セル範囲「A1」の各セルを順番に処理する場合、そのセルの値が変数に代入されていきます。
- コレクション内の各要素がこの変数に代入されます。
- コレクション
- 配列やRange(セル範囲)などのコレクションを指定します。
配列やセル範囲(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で「セル範囲」を指定する場合のコード具体例
以下のコードでは、セル範囲「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
このコードを実行すると、以下の順番でセルのアドレスが出力されます。


このように、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次元配列の処理結果を解説
このように、1次元配列では要素が一つずつ順番に処理され、ループ処理によって繰り返し操作が簡単に行えます。


2次元配列を使ったFor Each文の具体例
次に、2次元配列に対するFor Each文の使い方を解説します。
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文の注意点
- 配列のデータ型
- For Each文で配列を扱う場合、配列のデータ型に注意が必要です。
特に、Variant型の配列はさまざまなデータ型を保持できるため、For Each文を使う際の柔軟性が高まります。
- For Each文で配列を扱う場合、配列のデータ型に注意が必要です。
- 配列の範囲外エラーは発生しない
- For Each文を使った場合、配列の全要素に自動的にアクセスできるため、For文を使った場合に発生しやすい「配列の範囲外エラー」を気にする必要がありません。
For Eachで処理する際の「セル範囲」と「配列」の違い
- セル範囲
- Excelシート上の特定のセルの範囲を対象に処理を行います。
セル範囲を「For Each」で処理すると、左から右(列方向)、そして上から下(行方向)の順番で進みます。
- Excelシート上の特定のセルの範囲を対象に処理を行います。
- 配列
- 配列は、Excelシートではなくメモリ上に一時的に保存されたデータの集まりです。
配列を「For Each」で処理すると、まず行方向に進み、次に列方向に処理を行います。
このため、セル範囲とは処理の順序が異なります。
- 配列は、Excelシートではなくメモリ上に一時的に保存されたデータの集まりです。
For Each文でループを抜ける方法
VBAで「For Each文」を使用している場合、特定の条件が満たされた時点でループを終了したいことがあります。このようなケースでは、「Exit For」を使うことで簡単にループを抜けることができます。
たとえば、配列やセル範囲を繰り返し処理している最中に、特定の値に達したら処理を終了させたい場合に便利です。次のコードでは、値が「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文」はすべての要素に対して処理を行うため、処理する範囲が広すぎるとパフォーマンスに影響が出る可能性があります。
- オブジェクト変数の型に注意
- 「For Each文」を使う場合、対象となる要素の型を正しく宣言しておくことが重要です。
特に、セル範囲を操作する場合は「Range」型の変数を使うようにしましょう。
- 「For Each文」を使う場合、対象となる要素の型を正しく宣言しておくことが重要です。
For Each文の使用例をご紹介
ここからは、「For Each文」の使用例を紹介します。
どれも実際に動作するコードなので、ぜひ実行してみてください。
VBAをしっかり学びたいけれど、「どこから始めればいいかわからない」と迷っていませんか?
そんな方には、UdemyのVBA講座がおすすめです。
動画での丁寧な解説や、実践的な学習スタイルで、初心者でも無理なく基礎から応用まで習得できます。
自己学習を進める上で、何度でも繰り返し見返せる講座は非常に心強い味方になりますよ!


\ 自分のペースで学べるVBA講座はこちら /
使用例1: 指定したセルに、文字を繰り返し入力。
特定のセル範囲内のすべてのセルに対して繰り返し処理を行う方法を紹介します。
ここでは、範囲内の各セルに「値」を入力します。
主な使用用途: 特定のセル範囲に対して処理を一括で適用したいときに使用します。
Sub セル範囲の値を処理する()
Dim cell As Range
For Each cell In Range("A1:A10")
cell.Value = "処理済み"
Next cell
End Sub
処理結果


コードの動作概要
変数「cell」を Range 型で宣言し、セル範囲内の各セルを一時的に保持します。
範囲「A1」内の各セルに対して繰り返し処理を行います。
各セルに「処理済み」という文字列を入力します。
すべてのセルに対する処理が完了し、ループが終了します。
このコードで使用している機能
1行ずつコードを解説
「クリック」してコードの詳細解説を見る
- Sub セル範囲の値を処理する()
- この行では、「Subステートメント」を使用して新しいプロシージャ(サブルーチン)を定義しています。
プロシージャ名は「セル範囲の値を処理する」で、このサブルーチンが実行されると、指定された一連の操作が実行されます。
- この行では、「Subステートメント」を使用して新しいプロシージャ(サブルーチン)を定義しています。
- Dim cell As Range
- ここでは、変数「cell」を Range 型として宣言しています。
この変数は、後に For Each ループで使用され、セル範囲内の各セルを順番に保持するためのものです。
- ここでは、変数「cell」を Range 型として宣言しています。
- For Each cell In Range(“A1:A10”)
- この行では、「For Each」ループが開始されます。
Range(“A1:A10”) で、セル範囲「A1」を取得し、各セルを変数「cell」に順次代入しながらループ処理を行います。
「For Each」ループは、範囲内のすべてのセルに対して繰り返し処理を行います。
- この行では、「For Each」ループが開始されます。
- cell.Value = “処理済み”
- この行では、現在のセル(cell)の値を「処理済み」に設定しています。
ループが進むごとに、セル範囲「A1」の各セルにこの値が代入されます。
- この行では、現在のセル(cell)の値を「処理済み」に設定しています。
- Next cell
- この行では、「For Each」ループが次のセルに進むことを示します。
変数「cell」に次のセルが代入され、再びループ内の処理が実行されます。
範囲内のすべてのセルに対する処理が終了するまで、このループが繰り返されます。
- この行では、「For Each」ループが次のセルに進むことを示します。
- 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
処理結果


コードの動作概要
変数「Ws」はワークシートを保持し、「i」はセルの行番号を示します。
最初のワークシート名を「A1」セルに出力するために「i」を「1」に設定します。
ThisWorkbook.Sheets からすべてのワークシートを順次取得し、それを「Ws」に代入してループ処理を行います。
ループごとに、1番目のシートの Cells(i, 1) に Ws.Name(現在のワークシート名)を代入し、出力します。
ループごとに「i」を1増やし、次のワークシート名を次のセルに書き込むように設定します。
このコードで使用している機能
1行ずつコードを解説
「クリック」してコードの詳細解説を見る
- Sub ワークシート名をセルに出力する()
- ここで新しいサブルーチン(Sub)を定義しています。
このサブルーチンは、すべてのワークシート名を取得してセルに出力する処理を行います。
- ここで新しいサブルーチン(Sub)を定義しています。
- Dim Ws As Worksheet
Dim i As Long- 「Ws」という変数を Worksheet 型で宣言しています。
これは、ワークブック内の各ワークシートを保持するための変数です。
- 「Ws」という変数を Worksheet 型で宣言しています。
- i = 1
- 行番号カウンタ「i」に「1」を代入します。
これは、最初のワークシート名を出力するセル「A1」に対応しています。
- 行番号カウンタ「i」に「1」を代入します。
- For Each Ws In ThisWorkbook.Sheets
- For Each ループを使って、現在開いているワークブック(Excelファイル)内のすべてのワークシートを順番に調べます。
ThisWorkbook は、今開いているファイル(ブック)のことを指します。
.Sheets は、ワークブックに含まれるすべてのシートを意味します。
For Each ws In ThisWorkbook.Sheets は、「このファイル内にあるすべてのシートを順番に変数「Ws」に入れて、1つずつ処理します」という意味です。
- For Each ループを使って、現在開いているワークブック(Excelファイル)内のすべてのワークシートを順番に調べます。
- Sheets(1).Cells(i, 1).Value = ws.Name
- シート1の Cells(i, 1) という指定は、「A列」の「i 行目」を指します。
「i 」が「1」の場合は「A1」、i が2の場合は「A2」になります。
この行では、そのセルに現在の 「Ws」(ワークシート)の名前を代入しています。
つまり、最初のワークシート名が「A1」に入力され、次のワークシート名が「A2」に入力されます。
- シート1の Cells(i, 1) という指定は、「A列」の「i 行目」を指します。
- i = i + 1
- 「i」の値を「1」増やします。
これにより、次にワークシート名を出力するセルが「A2」から「A3」へと移動します。
この処理が繰り返され、シート名が1行ずつ順にセルに入力されていきます。
- 「i」の値を「1」増やします。
- Next Ws
- この行で、次のワークシートに進むように指示しています。
Next Ws によって、もう1つのシートが変数「Ws」に代入され、再びループの処理が行われます。
すべてのシートを順番に処理し終わるまで、このループは繰り返されます。
- この行で、次のワークシートに進むように指示しています。
- 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
処理結果
【 処理前 】


⇒
【 処理後 】


コードの動作概要
変数「shp」を Shape 型で宣言し、シート上の各シェイプを一時的に保持します。
アクティブシート内のすべてのシェイプに対して繰り返し処理を行います。
各シェイプを Delete メソッドで削除します。
すべてのシェイプが削除され、ループが終了します。
このコードで使用している機能
- Shapes (図形のオブジェクト)
1行ずつコードを解説
「クリック」してコードの詳細解説を見る
- Sub シェイプを削除する()
- この行では、「Subステートメント」を使用して新しいプロシージャ(サブルーチン)を定義しています。
プロシージャ名は「シェイプを削除する」で、このサブルーチンが実行されると、アクティブなシート上にあるすべてのシェイプを削除する処理が行われます。
- この行では、「Subステートメント」を使用して新しいプロシージャ(サブルーチン)を定義しています。
- Dim shp As Shape
- ここでは、変数「shp」を Shape 型として宣言しています。
この変数は、後の For Each ループ内で使用され、シート上に存在する各シェイプ(図形や画像など)を順番に保持するために使われます。
- ここでは、変数「shp」を Shape 型として宣言しています。
- For Each shp In ActiveSheet.Shapes
- この行では、「For Each」ループが開始されます。
ActiveSheet.Shapes で、現在アクティブなシート上に存在するすべてのシェイプを取得し、各シェイプを順次変数「shp」に代入しながらループを繰り返します。
- この行では、「For Each」ループが開始されます。
- shp.Delete
- この行では、現在のシェイプ(shp)を削除する命令が実行されます。
ループが進むごとに、シート上のすべてのシェイプが削除されます。
- この行では、現在のシェイプ(shp)を削除する命令が実行されます。
- Next shp
- この行では、「For Each」ループが次のシェイプに進むことを示します。
変数「shp」に次のシェイプが代入され、再びループ内の処理が実行されます。
シート上のすべてのシェイプに対する処理が終了するまで、このループが繰り返されます。
- この行では、「For Each」ループが次のシェイプに進むことを示します。
- 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
処理内容


コードの動作概要
配列「arr」を宣言し、数値の配列(1, 2, 3, 4, 5)を格納します。
配列「arr」の各要素に対して繰り返し処理を行います。
各要素に2を掛けた結果を Debug.Print で出力します。
配列内のすべての要素が処理され、ループが終了します。
このコードで使用している機能
1行ずつコードを解説
「クリック」してコードの詳細解説を見る
- Sub 配列の要素を処理する()
- Subステートメントを使って、新しいサブルーチン「配列の要素を処理する」を定義しています。
このサブルーチンは、配列内の各要素に対して処理を実行します。
- Subステートメントを使って、新しいサブルーチン「配列の要素を処理する」を定義しています。
- Dim arr As Variant
Dim num As Variant- ここでは、2つの変数を宣言しています。
「arr」と「num」のデータ型は「Variant」です。
「arr」: 配列全体を保持するための変数です。
配列の中身(複数の値)を一つの変数に格納することができます。
「num」: 配列内の各要素を順に保持するための変数です。
For Eachループの中で各要素がこの変数に代入されます。
- ここでは、2つの変数を宣言しています。
- arr = Array(1, 2, 3, 4, 5)
- Array関数を使って、数値 1, 2, 3, 4, 5 を持つ配列を作成し、その配列を変数「arr」に代入しています。
これで、変数「arr」は複数の値(1~5)を保持する「箱」になります。
配列は、複数のデータを一つにまとめて管理できる便利なデータ構造です。
- Array関数を使って、数値 1, 2, 3, 4, 5 を持つ配列を作成し、その配列を変数「arr」に代入しています。
- For Each num In arr
- For Eachループを使い、配列「arr」内の各要素を順に処理します。
具体的には、配列内の1番目の要素(1)、2番目の要素(2)、…5番目の要素(5)をnumに代入しながら処理を進めます。
このループは配列内のすべての要素が処理されるまで繰り返されます。
- For Eachループを使い、配列「arr」内の各要素を順に処理します。
- Debug.Print num * 2
- ここでは、変数「num」に現在代入されている値(配列の要素)に2を掛け、その結果を出力します。
出力はVBAのイミディエイトウィンドウに表示されます。
イミディエイトウィンドウは、デバッグ時に値を確認するためのツールです。
例えば、1回目のループでは「num」に「1」が代入され、1 * 2 = 2が表示されます。次に2 * 2 = 4が表示される、といった具合に処理されます。
- ここでは、変数「num」に現在代入されている値(配列の要素)に2を掛け、その結果を出力します。
- Next num
- For Eachループを次の要素に進めます。
配列「arr」のすべての要素が処理されるまでループが続きます。
- For Eachループを次の要素に進めます。
- 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
処理内容


コードの動作概要
まず、twoDimArray(1, 2)という2次元配列を作成します。
この配列には、2行3列の要素が入ります。
次に、For Eachループを使って、2次元配列内の全ての要素に順次アクセスします。
配列の各要素を取り出して、変数 element に格納し、その後処理を実行します。
Debug.Print element * 2 の部分で、取り出した要素を2倍にして出力します。
これにより、配列内の要素は以下のように処理されます。
すべての要素に対する処理が終了すると、Next element によってループが終了します。
これにより、2次元配列内の全要素が処理され、イミディエイトウィンドウに出力されます。
このコードで使用している機能
1行ずつコードを解説
「クリック」してコードの詳細解説を見る
- Sub TwoDimArrayProcessing()
- この行では、「Subステートメント」を使って新しいプロシージャ(サブルーチン)を定義しています。
プロシージャ名は「TwoDimArrayProcessing」です。
このプロシージャが実行されると、指定された一連の操作が実行されます。
- この行では、「Subステートメント」を使って新しいプロシージャ(サブルーチン)を定義しています。
- Dim twoDimArray(1, 2) As Variant
- ここでは、2次元配列twoDimArrayを宣言しています。
twoDimArray(1, 2)は、2行3列の配列を示しており、各要素は Variant 型です。
- ここでは、2次元配列twoDimArrayを宣言しています。
- twoDimArray(0, 0) = 1
- この行では、配列の最初の要素(行: 0、列: 0)に値「1」を代入しています。
このようにして、各要素に値を手動で設定します。
以降のコードも同じようにデータを代入していきます。
- この行では、配列の最初の要素(行: 0、列: 0)に値「1」を代入しています。
- For Each element In twoDimArray
- この行では、「For Each」ループが開始されます。
配列「twoDimArray」内のすべての要素に順番にアクセスし、変数「element」に格納します。
その後、ループ内で指定された処理を実行します。
- この行では、「For Each」ループが開始されます。
- Debug.Print element * 2
- この行では、変数「element」に格納された配列の各要素に対して、2倍にしてイミディエイトウィンドウに出力します。
- Next element
- この行では、「For Each」ループの次の要素に進むように指示しています。
すべての要素に対する処理が完了するまで、ループは続きます。
- この行では、「For Each」ループの次の要素に進むように指示しています。
- End Sub
- この行で、サブルーチン「TwoDimArrayProcessing」の終わりを示しています。
すべての配列要素に対する処理が完了したら、プログラムは次のステップに進みます。
- この行で、サブルーチン「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
処理結果


コードの動作概要
変数「cell」を Range 型で宣言し、セル範囲内の各セルを保持します。
範囲「A1」から「A10」の各セルに対して繰り返し処理を行います。
セルに「終了」と書かれていた場合、Exit For によりループを終了します。
それ以外の場合はセルに「処理中」と入力します。
範囲「A1」から「A10」のすべてのセルに対して処理が終了すると、ループが完了します。
このコードで使用している機能
1行ずつコードを解説
「クリック」してコードの詳細解説を見る
- Sub ループを途中で止める()
- この行では、VBAのSubステートメントを使って新しいサブルーチン「ループを途中で止める」を定義しています。
このサブルーチンが実行されると、指定された一連の操作が実行されます。
- この行では、VBAのSubステートメントを使って新しいサブルーチン「ループを途中で止める」を定義しています。
- Dim cell As Range
- 変数「cell」をRange型として宣言しています。
Range型の変数は、Excelのセルやセル範囲を指し、個々のセルのデータやプロパティにアクセスできます。
この変数には、後ほどFor Eachループ内で範囲内の各セルが順に代入されます。
- 変数「cell」をRange型として宣言しています。
- For Each cell In Range(“A1:A10”)
- For Eachループは、範囲内のすべてのセルに対して1つずつ処理を繰り返します。
Range(“A1:A10”)は、セル範囲「A1」から「A10」までを指定しています。
cell変数に、範囲内の各セル(A1, A2, …, A10)が順に代入され、そのセルに対する処理が行われます。
- For Eachループは、範囲内のすべてのセルに対して1つずつ処理を繰り返します。
- If cell.Value = “終了” Then
- If文で、現在のセル(cell)の値が「終了」かどうかを確認しています。
cell.Valueは、セルの中にある値を参照します。
もしセルの値が「終了」であれば、Then以下の処理が実行されます。
- If文で、現在のセル(cell)の値が「終了」かどうかを確認しています。
- Exit For
- 「Exit For」は、現在のFor Eachループを途中で終了させる命令です。
セルの値が「終了」である場合、ループの残りのセルを無視してループ全体が終了します。
これにより、「終了」と書かれたセル以降の処理は実行されません。
- 「Exit For」は、現在のFor Eachループを途中で終了させる命令です。
- Else
- If文の条件が成立しなかった場合、つまりセルの値が「終了」ではない場合に、Else以下の処理が実行されます。
- cell.Value = “処理中”
- Elseの処理として、セルの値を「処理中」に変更します。
例えば、セル「A1」の値が「終了」でない場合、そのセルに「処理中」と入力されます。
この処理は、セルの値が「終了」でない限り、ループ内で繰り返されます。
- Elseの処理として、セルの値を「処理中」に変更します。
- End If
- If文の終了を示します。
ここで条件分岐が完了し、次のセルの処理に進みます。
- If文の終了を示します。
- Next cell
- Nextは、For Eachループの次のセルに進むための命令です。
次のセル(例えばA2)が変数「cell」に代入され、再度ループ内の処理が実行されます。
これが範囲内のすべてのセルに対して繰り返されます。
- Nextは、For Eachループの次のセルに進むための命令です。
- 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
処理結果


コードの動作概要
変数「cell」を Range 型で宣言し、セル範囲内の各セルを保持します。
範囲「A1」から「A10」の各セルに対して繰り返し処理を行います。
各セルの値が「スキップ」となっている場合、そのセルの処理をスキップし、次のセルに進みます。
それ以外の場合はセルに「処理中」と入力します。
範囲「A1」から「A10」のすべてのセルに対して処理が終了すると、ループが完了します。
このコードで使用している機能
1行ずつコードを解説
「クリック」してコードの詳細解説を見る
- Sub ループをスキップする()
- この行で、新しいサブルーチン「ループをスキップする」を定義しています。
Subステートメントは、VBAにおける一連の処理をまとめたもので、この場合、特定の条件でループ内の処理をスキップする機能を持ちます。
- この行で、新しいサブルーチン「ループをスキップする」を定義しています。
- Dim cell As Range
- 変数「cell」をRange型として宣言しています。
Range型は、Excelのセルやセル範囲を指し、これによりセルの値やプロパティにアクセスできるようになります。
この変数「cell」は、後にFor Eachループで範囲内の各セルが順番に代入されます。
- 変数「cell」をRange型として宣言しています。
- For Each cell In Range(“A1:A10”)
- For Eachループは、指定された範囲「A1」から「A10」内のすべてのセルに対して繰り返し処理を行います。
変数「cell」に、範囲内のセル(A1からA10まで)が順に代入され、それぞれのセルに対して処理が行われます。
- For Eachループは、指定された範囲「A1」から「A10」内のすべてのセルに対して繰り返し処理を行います。
- If cell.Value = “スキップ” Then
- この行では、If文で現在のセル(cell)の値が「スキップ」と等しいかを確認しています。
もしセルの値が「スキップ」であれば、この条件が成立し、次のThenに続く処理が実行されます。
- この行では、If文で現在のセル(cell)の値が「スキップ」と等しいかを確認しています。
- GoTo Continue
- GoToステートメントは、コード内の指定された場所にジャンプする命令です。
この場合、GoTo Continueにより、ラベル「Continue:」の場所にジャンプし、現在のセルの処理をスキップして次のセルに進みます。
- GoToステートメントは、コード内の指定された場所にジャンプする命令です。
- Else
- If文の条件が成立しなかった、つまりセルの値が「スキップ」でない場合に、Elseに続く処理が実行されます。
- cell.Value = “処理済み”
- もしセルの値が「スキップ」でない場合、この行でそのセルに「処理済み」と入力します。
例えば、セルA1の値が「スキップ」でなければ、A1に「処理済み」と書き込まれます。
- もしセルの値が「スキップ」でない場合、この行でそのセルに「処理済み」と入力します。
- Continue:
- これは「ラベル」と呼ばれるもので、GoToステートメントでジャンプする先を示します。
もしセルの値が「スキップ」であれば、GoTo Continueによりこの場所にジャンプし、Next cellに進みます。
- これは「ラベル」と呼ばれるもので、GoToステートメントでジャンプする先を示します。
- Next cell
- この行では、For Eachループが次のセルに進む命令を実行します。
現在のセルの処理が終わると、次のセル(例えば、A2)がcellに代入され、再びループの処理が行われます。
これが範囲内のすべてのセルに対して繰り返されます。
- この行では、For Eachループが次のセルに進む命令を実行します。
- End Sub
- この行はサブルーチン「ループをスキップする」の終了を示します。
すべてのセルの処理が完了したら、プログラムは次のコードに進みます。
- この行はサブルーチン「ループをスキップする」の終了を示します。
このサブルーチンは、セル範囲「A1」を順に処理し、セルの値が「スキップ」であればそのセルの処理をスキップします。
それ以外のセルには「処理済み」と書き込みます。
GoToステートメントを使うことで、条件に応じたセル処理のスキップが可能です。
この記事のまとめ
「For Each文」は、配列やセル範囲、オブジェクトのコレクションに対して繰り返し処理を行う際に非常に便利です。
カウンタ変数を使わずに直感的に処理を行えるため、コードの可読性も向上します。
ポイントのおさらい
- VBAのFor Each文を使った繰り返し処理を理解する
- VBAの「For Each文」は、配列やセル範囲、ワークシートのようなコレクションのすべての要素に対して、一括で繰り返し処理を行うための構文です。
For文と異なり、ループの回数を指定する必要がなく、データ全体に対して順次処理を適用したい場合に便利です。
For Each文は、データのカウントが不要な分、シンプルで直感的なコードを書くことができます。
たとえば、セル範囲やワークシートのオブジェクトに対して同じ処理を繰り返す際に利用します。
⇒ 「For Each文とは?」もう一度見る。
- VBAの「For Each文」は、配列やセル範囲、ワークシートのようなコレクションのすべての要素に対して、一括で繰り返し処理を行うための構文です。
- For Each文の動作順序と処理の順番を把握する
- セル範囲に対してFor Each文を使った場合、処理は「列方向」に進んでいき、その後「行方向」に移ります。
これにより、範囲の処理順序を意識する必要があります。
⇒ 「セル範囲に対する処理順序」もう一度見る。
- セル範囲に対してFor Each文を使った場合、処理は「列方向」に進んでいき、その後「行方向」に移ります。
- For Each文でループを途中で抜ける方法を確認する
- ループの中で特定の条件を満たした場合、ループを抜けるために「Exit For」を使用します。
これにより、無駄な処理を省略し、処理速度を向上させることが可能です。
⇒ 「For Each文でループを抜ける方法」もう一度見る。
- ループの中で特定の条件を満たした場合、ループを抜けるために「Exit For」を使用します。
- For Each文を使用する際の注意ポイントを確認する
- VBAのFor Each文を使用する際は、配列やセル範囲などのサイズや、オブジェクト変数の型に気をつけましょう。
⇒ 「For Each文を使う際の注意ポイントについて」もう一度見る。
- VBAのFor Each文を使用する際は、配列やセル範囲などのサイズや、オブジェクト変数の型に気をつけましょう。
- セルや配列に対する処理を効率化する
- 配列の各要素やセル範囲、シート上のシェイプなどを一括で処理する「For Each文」の使い方を紹介しました。
繰り返し処理を活用し、業務の効率を上げましょう。
⇒ 「For Each文の使用例」もう一度見る。
- 配列の各要素やセル範囲、シート上のシェイプなどを一括で処理する「For Each文」の使い方を紹介しました。
この記事の使用例を実践していくことで、VBAのFor Each文を使って、より効率的に繰り返し処理を行えるようになります。
最初はコードをコピペして実行し、少しずつ自分で書けるようにしていきましょう。

