エクセル マクロで繰り返し処理【For Next】文の使い方・記述方法、基本と応用

'●回数指定の繰り返し処理
For i = 1 To 100
    '繰り返しする処理を記述
Next i

'●オブジェクト内の個数全てを繰り返し処理
For Each sh In Worksheets
    Debug.Print sh.Name
Next

End Sub

エクセル関数では、できない処理の代表として、繰り返し処理ですが、今回は、エクセルマクロ(VBA)での繰り返し処理、「For Next」「For Each Next」文の紹介をします。

エクセルマクロ(VBA)繰り返し処理は「For Next」だけではなく、「Do loop」や「Do While loop」でも可能です。

「Do loop」や「Do While loop」については、こちら()で紹介しています。*****

white clouds

◆注意事項

繰り返し処理をする事に関して、必ず気をつけなければいけない事があります。

それは無限ループです。

「For Next」と「Do loop」どちらにも言えますが、「Do loop」の方が無限ループさせやすいです。

無限ループさせてしまったら、ほぼ確実にエクセルマクロが固まり「応答なし」になります。

実行前に保存していなかったら、絶望ですね。

無限ループさせないように細心の注意を払い、ステップ実行(F8キー)などで必ず、確認してください。

それでも不安な方は、次のコードを繰り返し処理内に入れると、「Ctrl」+「Pause」( 「Ctrl」+「Break」 )で、コードの中断ができやすくなり、エクセルマクロの「応答なし」の対策ができます。

If i Mod 500 = 0 Then DoEvents

「DoEvents」の詳細はこちら(マクロ「応答なし」回避)をご覧ください。

ステップ実行(F8キー)や「Ctrl」+「Pause」( 「Ctrl」+「Break」 )を紹介しましたが、他にもショートカットキーを知りたい方は、こちら(マクロショートカットキー)ご覧ください。
便利なものを抜粋してます。

◆基本編

回数を指定する繰り返し処理

'●回数指定の繰り返し処理
For i = 1 To 100
    '繰り返しする処理を記述
Next i

エクセル マクロで、指定回数の繰り返し処理「For Next」の使い方は
「For 変数 = 初期値 To 繰り返しする回数」という形になっています。

当然、変数の「初期値」、「繰り返しする回数」は変数での指定もできます。

「指定回数の繰り返し処理」でも、途中で終了したい方は、下記をご覧ください。

'●回数指定の繰り返し処理を途中終了する
For i = 1 To 100
    a = a + 1
    If a >= 50 Then Exit For
Next i

「For Next」文の中に「Exit For」と記述すれば、その繰り返し処理は途中終了します。

さらに「IF」文と組み合わせて、条件分岐させれば、特定のタイミングで、繰り返し処理の途中終了が実現できます。

「IF」文の詳細はこちら(VBAのIF文)をご覧ください。

オブジェクト内の個数分、全てを繰り返し処理

'●オブジェクト内の個数全てを繰り返し処理
For Each sh In Worksheets
    Debug.Print sh.Name
Next

エクセル マクロで、オブジェクト内の個数分を繰り返し処理する場合は
「For Next」の間に「Each」を記述する必要があります。

「For Each Next」の使い方は
「For Each 仮格納する変数 In オブジェクト変数」という形になっています。

「数値」は一切使えず、全て変数での指定となります。

「仮格納する変数」とは、「For Each Next」繰り返し処理内で使用するために
繰り返し処理毎に、「オブジェクト変数」のデータが1つずつ格納される変数です

「オブジェクト変数」とは、複数のデータが格納可能なデータ型の変数です。

上記コードは、ワークシートの名前を全部イミディエイトウィンドウに書き込みます。

イミディエイトウィンドウとは?

「オブジェクト内の個数分を繰り返し処理する場合」でも、途中終了は可能です。

'●オブジェクト内の個数全てを繰り返し処理を途中終了する
For Each sh In Worksheets
    Debug.Print sh.Name
    If sh.Name = "Sheet3" Then Exit For
Next

「For Next」文と同様に「Exit For」と記述すれば、その繰り返し処理は途中終了します。

「IF」文の詳細はこちら(VBAのIF文)をご覧ください。

◆応用編

「For Next」の中に「For Next」で2重ループ(入れ子)させる

'●二重ループ
For i = 1 To 100
    For j = 1 To 10
        Cells(i, j) = i & " ," & j
    Next j
Next i

こうすれば、セル上の行と列方向で繰り返し処理することができますね。

当然、二次元配列でもできます。

VBA高速化の基本である配列について知りたい方は、こちら(VBAの配列)の記事をご覧ください

「For Next」のインクリ数(繰り返し一回に増える値)を可変させる

For i = 1 To 10
    i = i + 1
Next

当然、これでもいいですが、なんかしっくりきませんよね。

For i = 1 To 10 Step 2
    
Next

「Step」でいくつずつ可変させるか指定することができます。

「For Next」での「Step」は「-」マイナスの値も指定することができます。

地味に、たまに使うので、頭の片隅に入れておいてください。

◆まとめ

繰り返し処理の基本となりますので、「For Next」は必ず、マスターしましょう。

「For Each Next」を紹介しましたが、初心者の方はとりあえずは回数指定し、必要な時に抜ける「For Next」でいいかなと個人的には思っています。

途中で抜ければ、やっていることは変わりません。

当然、「For Each Next」の方がコードはキレイで可読性も上がります

ですが、「For Each Next」指定する「オブジェクト変数」につまづきエラーが出たり、何回目のループか知ることができません。

「For Next」で覚えるのが手一杯であれば、「For Next」だけでもいいと思います。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です