お疲れ様です!
VBAを使用していて、いまいち「For Each文」の意味が分からない。。。
このように悩んでいませんか?
この記事では、VBAの「For Each文」を使用して、範囲やコレクション内の全要素に対して効率的に繰り返し処理を行う方法を解説します。
「For Each文」は初心者でも直感的に理解でき、配列やセル範囲、オブジェクトのコレクションを扱う際にとても便利です。
使用例はすべてコピペして実行できるので、ぜひ最後までお読みいただき、実践してみてください。
【 この記事の概要 】
よく使う度 | |
難しさ | |
覚えておくと安心度 |
この記事を読むとできるようになること
この記事を読むことで、以下のことができるようになります。
For Each文とは?
VBAの「For Each文」は、コレクションや配列の各要素に対して繰り返し処理を行うための構文です。
Excelのセル範囲やワークシート、ブック内のオブジェクトなど、複数の要素を1つずつ処理する際に非常に便利です。
「For Each文」を使うことで、各要素に順次アクセスし、個別に処理を行うことができます。
「For文」と異なり、ループの回数やカウンタ変数を意識する必要がないため、直感的かつミスが少ないコードを記述できます。
以下に、VBAで使用できる主要なループ処理を一覧でまとめました。
繰り返し処理の種類
引用元:VBA For文の基礎から応用まで|繰り返し処理をマスターする完全ガイド
繰り返し処理の種類 説明 For文 事前に決められた回数だけ繰り返し処理を行います。
固定回数のループに適しており、範囲内で連続した処理を行う際に便利です。For Each文 配列やコレクション内の各要素に対して順次処理を行います。
全要素にアクセスする場合に便利で、シートのセル範囲や
オブジェクトのコレクションに対してよく使用されます。Do While文 指定された条件がTrueの間、処理を繰り返します。
条件に基づいてループを制御したい場合に使用され、
繰り返し回数が不定のケースに適しています。Do Until文 指定された条件がTrueになるまで処理を繰り返します。
Do While文とは逆の条件で動作し、条件が満たされるまで処理を続けます。While…Wend文 指定された条件がTrueである間、処理を繰り返します。
Do While文に似ていますが、よりシンプルなループ処理に使用されます。Do Loop While文 処理を少なくとも1回は実行し、その後、指定された条件がTrueで
あれば繰り返します。
最初に必ず1回処理が行われる点が特徴です。Do Loop Until文 処理を少なくとも1回実行した後、指定された条件がTrue
になるまで繰り返します。
条件が満たされるまで必ず1回は処理が行われます。
For Each文の基本構文
- 要素
- コレクション内の各要素がこの変数に代入されます。
たとえば、セル範囲「A1」の各セルを順番に処理する場合、そのセルの値が変数に代入されていきます。
- コレクション内の各要素がこの変数に代入されます。
- コレクション
- 配列やRange(セル範囲)などのコレクションを指定します。
配列やセル範囲(Range)、ワークシートの集合体などがコレクションとして扱われます。
- 配列やRange(セル範囲)などのコレクションを指定します。
この構文を使えば、配列やセル範囲などのすべての要素に対して処理を行うことができます。
セル範囲に対する処理順序
Excelのセル範囲(Range)に対してFor Each文を使った場合、データの処理は「列方向」に進んでいきます。
その後、「行方向」に1つセルを下にずらし、再度「列方向」に進みます。
つまり、最初に列を基準にセルを処理し、次に行方向へ移動します。
このため、セル範囲の取得順序には注意が必要です。
具体例
以下のコードでは、セル範囲「A1」の各セルに対して、そのセルのアドレスを出力します。
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文を使う際の注意ポイント
- 1. 配列やセル範囲などのサイズに注意
- 「For Each文」はすべての要素に対して処理を行うため、処理する範囲が広すぎるとパフォーマンスに影響が出る可能性があります。
対象範囲が適切なサイズであることを確認しましょう。
- 「For Each文」はすべての要素に対して処理を行うため、処理する範囲が広すぎるとパフォーマンスに影響が出る可能性があります。
- 2. オブジェクト変数の型に注意
- 「For Each文」を使う場合、対象となる要素の型を正しく宣言しておくことが重要です。
特に、セル範囲を操作する場合は「Range」型の変数を使うようにしましょう。
- 「For Each文」を使う場合、対象となる要素の型を正しく宣言しておくことが重要です。
For Each文の使用例
ここからは、「For Each文」の使用例を紹介します。
どれも実際に動作するコードなので、ぜひ実行してみてください。
使用例1: 指定したセルに、文字を繰り返し入力。
特定のセル範囲内のすべてのセルに対して繰り返し処理を行う方法を紹介します。
ここでは、範囲内の各セルに「値」を入力します。
主な使用用途: 特定のセル範囲に対して処理を一括で適用したいときに使用します。
Sub セル範囲の値を処理する()
Dim cell As Range
For Each cell In Range("A1:A10")
cell.Value = "処理済み"
Next cell
End Sub
- STEP1変数「cell」を宣言
変数「cell」を Range 型で宣言し、セル範囲内の各セルを一時的に保持します。
- STEP2For Eachループを開始
範囲「A1」内の各セルに対して繰り返し処理を行います。
- STEP3セルに値を入力
各セルに「処理済み」という文字列を入力します。
- STEP4ループ終了
すべてのセルに対する処理が完了し、ループが終了します。
処理結果
このコードで使用している機能
詳細解説
- 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
- STEP1変数「Ws」と「i」を宣言
変数「Ws」はワークシートを保持し、「i」はセルの行番号を示します。
- STEP2i を「1」に初期化する
最初のワークシート名を「A1」セルに出力するために「i」を「1」に設定します。
- STEP3For Each ループを開始
ThisWorkbook.Sheets からすべてのワークシートを順次取得し、それを「Ws」に代入してループ処理を行います。
- STEP4ワークシートの名前をセルに出力
ループごとに、1番目のシートの Cells(i, 1) に Ws.Name(現在のワークシート名)を代入し、出力します。
- STEP5次のセルに進む
ループごとに「i」を1増やし、次のワークシート名を次のセルに書き込むように設定します。
処理結果
このコードで使用している機能
詳細解説
- Sub ワークシート名をセルに出力する()
- ここで新しいサブルーチン(Sub)を定義しています。
このサブルーチンは、すべてのワークシート名を取得してセルに出力する処理を行います。
- ここで新しいサブルーチン(Sub)を定義しています。
- Dim Ws As Worksheet
Dim i As Long- 「Ws」という変数を Worksheet 型で宣言しています。
これは、ワークブック内の各ワークシートを保持するための変数です。
「i」 は Long 型で宣言されており、シート1のセルの行番号を管理するために使用されます。
- 「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
- STEP1変数「shp」を宣言
変数「shp」を Shape 型で宣言し、シート上の各シェイプを一時的に保持します。
- STEP2For Eachループを開始
アクティブシート内のすべてのシェイプに対して繰り返し処理を行います。
- STEP3シェイプを削除
各シェイプを Delete メソッドで削除します。
- STEP4ループ終了
すべてのシェイプが削除され、ループが終了します。
処理結果
【 処理前 】
⇒
【 処理後 】
このコードで使用している機能
- Shapes (図形のオブジェクト)
詳細解説
- 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: 配列内の要素を、繰り返し計算する
配列内の各要素に対して処理を行う方法を紹介します。
ここでは、配列のすべての要素に「*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
- STEP1配列を宣言
配列 arr を宣言し、数値の配列(1, 2, 3, 4, 5)を格納します。
- STEP2For Eachループを開始
配列 arr の各要素に対して繰り返し処理を行います。
- STEP3値を出力
各要素に2を掛けた結果を Debug.Print で出力します。
- STEP4ループ終了
配列内のすべての要素が処理され、ループが終了します。
処理内容
このコードで使用している機能
- 配列
詳細解説
- 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: ループを条件で指定した条件で止める
セル範囲内で特定の値に達したらループを強制終了する方法を紹介します。
このように、ある条件でストップすることも可能です。
主な使用用途: 条件に応じて、早めにループを終了したい場合に使用します。
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
- STEP1変数「cell」を宣言
変数「cell」を Range 型で宣言し、セル範囲内の各セルを保持します。
- STEP2For Eachループを開始
範囲「A1」から「A10」の各セルに対して繰り返し処理を行います。
- STEP3条件をチェック
セルに「終了」と書かれていた場合、Exit For によりループを終了します。
- STEP4処理の続行
それ以外の場合はセルに「処理中」と入力します。
- STEP5ループ終了
範囲「A1」から「A10」のすべてのセルに対して処理が終了すると、ループが完了します。
処理結果
このコードで使用している機能
詳細解説
- 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」に対して順番に処理を行い、各セルの値が「終了」であれば、ループを途中で止めます。
それ以外のセルには「処理中」と書き込みます。
使用例6: 指定した条件だけ、ループ内の処理をスキップする
セルの値が特定の条件に一致した場合、処理をスキップして次のセルに移る方法を紹介します。
主な使用用途: 特定の条件に該当する要素を飛ばしたい場合に使用します。
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
- STEP1変数「cell」を宣言
変数「cell」を Range 型で宣言し、セル範囲内の各セルを保持します。
- STEP2For Eachループを開始
範囲「A1」から「A10」の各セルに対して繰り返し処理を行います。
- STEP3条件に一致した場合、処理をスキップ
各セルの値が「スキップ」となっている場合、そのセルの処理をスキップし、次のセルに進みます。
- STEP4条件に一致しない場合、セルの値を変更
それ以外の場合はセルに「処理中」と入力します。
- STEP5ループ終了
範囲「A1」から「A10」のすべてのセルに対して処理が終了すると、ループが完了します。
処理結果
このコードで使用している機能
詳細解説
- 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文を使って、より効率的に繰り返し処理を行えるようになります。
最初はコードをコピペして実行し、少しずつ自分で書けるようにしていきましょう。