ous">

小さな在庫管理

在庫管理導入からシステム作成まで詳細解説!

VBA 繰り返し処理 For Each Next ステートメントについて詳細解説! [VBA技術解説#13]

VBAには For Next ステートメント や Do Loop ステートメント など、繰り返し処理の方法がいくつかあります。その中でも For Each Next ステートメント は、コレクションや配列を扱う場面で特に力を発揮します。インデックス管理が不要で、対象の要素を順番に処理できるため、コードの可読性と保守性が向上します。

本記事では、VBAでの繰り返し処理に使用する、For Each Nextステートメントの使用方法を詳しく解説します。

基本構文から、コレクション・配列を対象とした記述方法まで、具体例を交えながら紹介していきます。

*For Each NextステートメントはFor Each文とも呼ばれますが、この記事ではFor Eachと表記します。


VBA技術解説

For Each Next ステートメントの構文

コレクション

基本構文

コレクション内の各オブジェクトを、順に変数に格納しながら処理を繰り返します。
※コレクションとは、オブジェクトの集合体のことです。

For_Each _Next 構文

Dim 変数 as Object

For 変数 Each In コレクション
    処理1
Next [変数]

取り出したオブジェクトを格納する変数は、オブジェクト型で宣言します。また、宣言自体は省略可能です。
なお、[変数] も省略可能です。
 

セル

範囲指定されたセルに対する、繰り返し処理を例示していきます。
処理サンプルを準備します。

処理実行用サンプル
サンプル

For_Each_Next 例

Sub セル()
Dim r As Range
Dim s As String

For Each r In Range("A1:A5")
    s = s & "+" & r.Value
Next

MsgBox s

End Sub

サンプルコードでは、セル範囲:A1〜A5の各セルを、順に変数 r に取り込みます。各セルの値を取り出し、変数 s に ”+” で結合する処理を実行します。
繰り返し回数は、5回となります。

各セルの数値が ”+” で結合され、表示されます。

実行結果
 

ワークシート

ワークシートオブジェクトに対する、繰り返し処理を例示していきます。
処理サンプルを準備します。

処理実行用サンプル
サンプル

For_Each_Next 例

Sub シート()
Dim ws As Worksheet
Dim s As String

For Each ws In ThisWorkbook.Worksheets
    s = s & "+" & ws.Name
Next

MsgBox s

End Sub

サンプルコードでは、ブックの各シートを、順に変数 ws に取り込みます。各シートのシート名を取り出し、変数 s に ”+” で結合する処理を実行します。
繰り返し回数は、3回となります。

各シートの名称が ”+” で結合され、表示されます。

実行結果
 

配列

基本構文

配列内の各要素を、順に変数に格納し、処理を繰り返します。

For_Each _Next 構文

Dim 変数 as Variant

For 変数 Each In 配列
    処理1
Next [変数]

取り出した要素を格納する変数は、Variant型で宣言します。また、宣言自体は省略可能です。
なお、[変数] も省略可能です。
 

1次元配列

1次元配列に対する、繰り返し処理を例示していきます。

For_Each_Next 例

Sub 1次元配列()
Dim ary(3) As Variant

ary(0) = "佐藤"
ary(1) = "鈴木"
ary(2) = "田中"
ary(3) = "中村"

Dim a As Variant
Dim s As String

For Each a In ary
    s = s & "+" & a
Next

MsgBox s

End Sub

サンプルコードでは、配列の要素を、順に変数 a に取り込みます。各要素の値を取り出し、変数 s に ”+” で結合する処理を実行します。
繰り返し回数は、4回となります。

処理実行結果
実行結果
 

2次元配列

2次元配列に対する、繰り返し処理を例示していきます。

For_Each_Next 例

Sub 2次元配列()
Dim ary(1, 1) As Variant

ary(0, 0) = "佐藤"
ary(0, 1) = "鈴木"
ary(1, 0) = "田中"
ary(1, 1) = "中村"

Dim a As Variant
Dim s As String

For Each a In ary
    s = s & "+" & a
Next

MsgBox s

End Sub

サンプルコードでは、配列の要素を、順に変数 a に取り込みます。各要素の値を取り出し、変数 s に ”+” で結合する処理を実行します。
繰り返し回数は、4回となります。

処理実行結果
実行結果
 

2次元配列の取り出し順序

サンプルコードで見られるように、For Each を使用した2次元配列の要素の取り出し順序には特徴があります。実際には、VBAの内部処理により、行優先順で要素が取り出されます
そこで、意図した順番で取り出したい場合は、For Next を使うと、明示的に行・列の順序を制御できます。

For_(For_Next)_Next 例

Sub 二次元配列()
Dim ary(1, 1) As Variant

ary(0, 0) = "佐藤"
ary(0, 1) = "鈴木"
ary(1, 0) = "田中"
ary(1, 1) = "中村"

Dim i As Long
Dim j As Long
Dim s As String

For i = 0 To UBound(ary, 1)
    For j = 0 To UBound(ary, 2)
        s = s & "+" & ary(i, j)
    Next j
Next i

MsgBox s

End Sub

サンプルコードでは、配列の要素を、任意の順番で取り込みます。各要素の値を取り出し、変数 s に ”+” で結合する処理を実行します。
繰り返し回数は、4回となります。

処理実行結果
実行結果
 

その他の繰り返し処理

For Next ステートメント

Do Loop ステートメントは、繰り返し回数が不明な場合に使用しますが、繰り返し回数が明確な場合は、For Next ステートメントが適しています。
For Next を使うことで、指定した回数だけ処理を繰り返すことができ、コードの可読性や管理性も向上します。

下記の記事では、VBAでの繰り返し処理に使用する、For Next ステートメントの基本構文や応用例について詳しく解説しています。ぜひ参考にしてください。

Do Loop ステートメント

For Next ステートメントは、繰り返し回数が明確な場合に使用しますが、繰り返し回数が不明な場合は、Do Loop ステートメントが適しています。
Do Loop を使うことで、条件にあわせて処理を繰り返すことができ、コードの可読性や管理性も向上します。

下記の記事では、VBAでの繰り返し処理に使用する、Do Loop ステートメントの基本構文や応用例について詳しく解説しています。ぜひ参考にしてください。

 

技術解説まとめに戻る