Categories: VBA基礎

EXCEL VBA For Each Next 関数の使い方

For Each Next 関数の使い方

 

●はじめに
ここでは、For Each Next関数の使い方を説明いたします。簡単に言いますと、この関数はループ処理を行う関数です。For Nextと同じループ処理を行いますが、大きな違いとしてFor Next の場合は、繰り返す数値を指定した数で繰り返します。For Each Nextの場合は、同じループ処理ですが繰り返す回数は、コレクションと呼ばれる範囲(例:セルA1~A10)などを指定して繰り返す回数が決まります。

 

●プログラム説明
下記のプログラムは、A1~A10のセルデータをB1~B10に代入するプログラムです。処理内容は同じですが、実際にプログラムとして記述すると、For Nextの場合とFor Each Nextとの場合では、下記の通りになります。

 

For Next の場合

 

Sub Fornext()

    Dim I As Integer
    
    For I = 1 To 10 '1~10を繰り返す(行)
        Cells(I, "B") = Cells(I, "A") 'A(行)⇒B(行)へ転記
    Next I

End Sub

 

For Each Nextの場合

 

Sub ForEach()

    Dim I As Range
    
    For Each I In Range("A1:A10") 'A1~10へ繰り返す
        Cells(I.Row, "B") = I ' A列セル⇒B(行)へ転記
    Next I

End Sub

 

●実行結果
上記のプログラムを実行した結果です。A列の内容がB列に転記されます。For Each NextもFor Next も同じ結果です。

 

●実行前 ※A列に転記する内容を記入します。(クリックして拡大)

 

●実行後 ※A列の内容をB列に転記します。(クリックして拡大)

 

 

●プログラム説明(サンプル②)
続きまして、For Each Next関数を使った下記のサンプルプログラムの説明をいたします。下記のプログラムは、範囲指定したセルに対してのセル番号を表示するプログラムになります。For Each Next関数を使う場合の基本的な使い方のプログラムになります。

 

Sub ForEachNext()

    Dim ADD As Range
    
    For Each ADD In Range("A1:D10")  'ループ処理させる範囲を指定します。A1~D10まで
    
        ADD.Value = ADD.Address(False, False)  '処理を実行しているセルにセル番号を表示させます。 
              'ADD.Value = ADD.Address ⇒この記述ですと「$A$1」で表示されます。
        
    Next ADD
    
End SubMachi

 

●実行結果
実行後、A1~D10までのセル範囲をループさせます。該当するセルにセル番号が表示されます。

 

●実行前 ※空白セルの状態(クリックして拡大)

 

●実行後 ※For Each Next関数を使って処理を実行しました。範囲指定をして処理する場合は、便利です。(クリックして拡大)

 

 

●プログラム説明(サンプル③)
続きまして下記のプログラムは、For Each Nextを実行した時に、指定したセル(コレクション)がどの順番で処理を行うのかを表したプログラムになります。A1~D10にセル番号が登録されています。この指定した範囲は、どのような順番で処理されるのか、F列にセル番号が表示されるプログラムです。

 

Sub ForEachNext2()

    Dim ADD As Range
    Dim I As Integer
    
    I = 1  '1行目を指定します。
    
        For Each ADD In Range("A1:D10")  'ループ処理させる範囲を指定します。A1~D10まで
        
        Cells(I, "F") = ADD  '処理を実行しているセルの内容を”F列”に転記する。
        
        I = I + 1  '転記先(F列)の行に対して+1する。
        
        Next ADD
    
End Sub

 

●実行結果
実行後の赤枠部分を見ていただきたいのですが、F列にA1,B1,C1,D1,A2,B2の順番に記入されているので、For Each ADD In Range(“A1:D10”)を実行した時にA1⇒D1、A2⇒D2の順番で処理する事がわかります。内部の処理順を知ることは、今後、プログラムを作成する際には、とっても重要な事になります。

 

●実行前 ※サンプル②の結果を使い、For Each Nextの処理手順をしらべます。(クリックして拡大)

 

●実行後 ※F列にF1~順番に処理されるセル番号を明記します。For Each Nextの処理手順は、F列の通りになります。(クリックして拡大)

 

 

●プログラム説明(サンプル④)
続いてのサンプルプログラムは、例として担当者・商品別の合計表を作成して、商品データの中に5,000以上のデータが登録されているセルに色を付けます。
(色を付ける条件として、範囲はB2~D10・ 5,000以上のセルに色(水色)を表示させます)

 

Sub ForEachNext3()


    Dim Shohin As Range
    
    For Each Shohin In Range("B2:D10") 'ループ処理させる範囲を指定します。B2~D10まで
    
        If Shohin >= 5000 Then         '5000以上のデータ(セル)に対して色を付ける。
                   Shohin.Interior.ColorIndex = 34
        End If
        
    Next Shohin
    
End Sub

 

●実行結果
実行後、ForEachNext関数を使い、B2~D10の範囲内に5,000以上の数値がある場合は、セルに色(水色)が付きました。

 

●実行前 ※(クリックして拡大)

 

●実行後 ※(クリックして拡大)

 

 

●プログラム説明(サンプル⑤)
続いてのサンプルプログラムは、例して担当者・商品別の合計表を作成しまして、合計値(E列)が15,000以上となる担当者のセル色に色を付けるプログラムになります。
(色を付ける判断として参照する範囲は、E2~E10 実際に色を付けるセルは、該当する担当者A列になります。)

 

Sub ForEachNext4()

    Dim Shohin As Range
    Dim I As Integer
    
    For Each Shohin In Range("E2:E10") 'ループ処理させる範囲を指定します。B2~D10まで
    
        If Shohin >= 15000 Then  '合計値が15000以上の場合、該当する担当者名に色を付ける。
                   I = Shohin.Row  '上記の条件合う場合に行番号を”I”に代入する。
                   Cells(I, "A").Interior.ColorIndex = 3  '担当者のセルに赤色をつける。
        End If
        
    Next Shohin
    
End Sub

 

●実行結果
E列の合計値を見て15,000以上の値に該当する担当者のセルの色を赤くなりました。

 

●実行前 ※下表の表を作成します。(クリックして拡大)

 

●実行後 ※条件に一致した担当者のセルが赤くなりました。(クリックして拡大)

 

 

●プログラム説明
続いてのサンプルプログラムは、複数の支店データを合計データに集計するプログラムです。
(東京支店・大阪支店・名古屋支店・福岡支店のデータを全店舗合計に加算します。

 

Sub For_Each_Add()

    Dim Gokei As Range
    Dim I As Integer
    
    I = 3
    
    Range("B3:B12").ClearContents 'B3~B13の値をクリアする
    
    For Each Gokei In Range("B3:B13") '合計表の範囲を指定します。
    
        Gokei = Cells(I, "E") + Cells(I, "H") + Cells(I + 15, "E") + Cells(I + 15, "H") '各店舗データを合計に集計します。
        I = I + 1  '集計する勘定科目を下に移動します。(加算)
    Next Gokei

End Sub

 

●実行結果
実行後、各支店データを集計して全店舗合計に集計されました。

 

●実行前 ※下表の様な各支店データを用意します。(クリックして拡大)

 

●実行後 ※各支店データが全店舗合計に集計されました。(クリックして拡大)

 

最後まで、ご覧いただきまして誠に有難うございました。
以上で、For Each Nextの説明でした。For Each Nextは、便利な機能なので状況により使い分けて利用して下さい。
また、VBAに関するテクニックや便利な手法などをこのサイトに掲載していきますので、定期的に参照していただけると幸いです。

 

AKIRA