PR

【ExcelVBA】For…Nextで繰り返し処理(Step・ExitForの使い方も解説)

エクセルVBA-ForNext繰り返し-アイキャッチ 繰り返し処理
スポンサーリンク

For…Nextステートメントを使用した繰り返し処理の書き方

基本のFor…Nextステートメントの書き方は下のように書きます。

For counter = start To end
  実行する処理
Next [counter]

counterというのは繰り返し回数をカウントするための変数で数値型の変数であれば名前はなんでも大丈夫です。
よく例文などで使用されるのは「i」ですが、行を繰り返す場合は「row」でもいいですし、分かりやすい変数名でOKです。最後のNextのあとのCounterは省略可能です。

数値型の変数はInteger型Long型がありますが、Integerは最大値が32,767なのでループ処理中にこれを超えてしまうとエラーが発生していまいますので場合によって使い分けてください。

startEndには数値を入れて1~10まで繰り返すなど、開始終了の数値を設定します。
ここも変数にしたり、例えばendを最終行までとしたりすることも可能です。

サンプルマクロを用意しましたので実際にFor…Nextのループ処理を実行してみます。

下のような表があり、2行目から11行目まで数値が入っています。
A列の数値AとB列の数値Bを足して、合計値をC列に出力する処理を作成してみます。

エクセルVBA-ForNext繰り返し-マクロ処理前

サンプルマクロで実行している内容
① カウント用変数の宣言
② 2行目~11行目まで繰り返す
③ A列とB列の値を足してC列に出力する

Sub sample1()

  'カウント用変数の宣言…⓵
   Dim i As Integer
    
    '2行目~11行目まで繰り返す…⓶
    For i = 2 To 11
    
        'A列とB列の値を足してC列に出力する…⓷
        Cells(i, 3) = Cells(i, 1) + Cells(i, 2)
        
    Next
         
End Sub

マクロ実行後、C列に合計値が出力されました。

エクセルVBA-ForNext繰り返し-マクロ処理後

カウント用変数「i」に最初に「2」がセットされ、2行目のA列とB列の値を足してC列に出力します。
そのあとnextで「i」変数が1つカウントアップされ、3行目の処理、4行目の処理…と11行目までを繰り返して終了します。

スポンサーリンク

For…Nextで1行置きに繰り返し実行する方法(Step)

次は数行置きに繰り返し処理を実行したい場合について説明していきます。
(行で説明していますが列に置き換えて考えていただいても同じです。)

例えば下の表のようにセルが結合されていて2行分が1つのセルになっている表があったとします。

エクセルVBA-ForNext繰り返し-マクロ処理前-ステップ

この場合は最初に説明した基本的なFor…Nextの処理では繰り返し処理が作成できないですよね。。
3行目あとを4行目ではなく、3行目⇒5行目⇒7行目⇒9行目と1行飛ばして繰り返し処理を作成する必要があります。

このようにいくつかスキップして繰り返したいときは「Step」という引数を設定します。

カウント変数を+1ずつカウントアップさせたい場合は「Step 1」ですがこれは省略可能なので通常は書きません。

+2ずつカウントアップさせたい場合は「Step 2」、+4ずつカウントアップさせたい場合は「Step 4」という風に設定します。

For counter = start To end Step 2
  実行する処理
Next

サンプルマクロで実行している内容
① カウント用変数の宣言
② 3行目~17行目まで繰り返す(+2ずつカウントアップさせる
③ A列とB列の値を足してC列に出力する

Sub sample2()

 'カウント用変数の宣言…⓵  
 Dim i As Integer
    
    '3行目~17行目まで繰り返す(+2ずつカウントアップさせる)…⓶
    For i = 3 To 17 Step 2
    
        'A列とB列の値を足してC列に出力する…⓷
        Cells(i, 3) = Cells(i, 1) + Cells(i, 2)
        
    Next
         
End Sub

マクロ実行後、3行目~17行目まで合計値が出力されました。

エクセルVBA-ForNext繰り返し-マクロ処理後-ステップ

この場合は3からスタートして+2ずつカウントアップさせているので、3行目⇒5行目⇒7行目…と最後の17行目まで繰り返して終了します。

【応用】引数Stepにマイナス値を設定して大きい数値から順に繰り返す

応用編で引数Stepにはマイナス値を設定することも可能です。
For…Nextループは開始~終了の値を大きい数値~小さい数値に設定して、Stepでマイナス1する、マイナス2するなどを設定しておくと大きい数値から始まり、NextでカウントアップするのではなくStepで指定した分マイナス処理をして繰り返してくれます。

下の例では50からスタートして-1ずつ繰り返していくので50⇒49⇒48…と最後の1まで繰り返しを行います。

For i = 50 To 1 Step -1
  実行する処理
Next

スポンサーリンク

For…Nextループを途中で抜ける(ExitFor)

Forループは開始~終了の数値までを繰り返しますが、途中で何かを判定して処理を抜けることも可能です。

下の表を例にして、2行目から11行目までを繰り返し処理を行いますがA列の数値Aの値が80以上になたったら繰り返し処理を終了する、という風に作成してみます。

エクセルVBA-ForNext繰り返し-マクロ処理前-80まで

サンプルマクロで実行している内容
① カウント用変数の宣言
② 2行目~11行目まで繰り返す
③ A列の値が80以上になったらループ処理を抜ける
④ A列とB列の値を足してC列に出力する

Sub sample3()

 'カウント用変数の宣言…⓵ 
  Dim i As Integer
    
    '2行目~11行目まで繰り返す…⓶
    For i = 2 To 11
    
    ’A列の値が80以上になったらループ処理を抜ける…⓷
        If Cells(i, 1) >= 80 Then
           Exit For
        End If
    
        'A列とB列の値を足してC列に出力する…⓸
        Cells(i, 3) = Cells(i, 1) + Cells(i, 2)
        
    Next
         
End Sub

For…Nextループで1行ずつカウントアップして処理を行う点は同じですが、合計値を計算する前にIf関数を使用してA列の値が80以上かどうかを判定しています。

何かを判定して処理を抜けたい場合はIf関数を使用して判定し、「ExitFor」でループ処理から抜けることが可能です。

’A列の値が80以上になったらループ処理を抜ける…⓷
If Cells(i, 1) >= 80 Then
  Exit For
End If

サンプルマクロを実行すると2行目から処理を開始して9行目に来た時にA列の値が「80」になっているため、「80以上だったら処理を抜ける」の条件に一致し、繰り返し処理が終了しています。

結果を見ると9行目以降は処理がされず、合計値は手前の8行目まで出力されています。

エクセルVBA-ForNext繰り返し-マクロ処理後-80まで
スポンサーリンク

※コードのコピー利用について

・コードのコピーは自由におこなっていただけます。
・気を付けて作成はしていますがコードには誤りがある可能性があります。
・自身の環境で動作確認をしていますが、すべての方の環境で同様に動くことは保証できません。
・データの破損等の責任は負いかねますのでご自身の責任のもとお使いください。

タイトルとURLをコピーしました