VBAでループ処理を行うには【For,While】

Excel VBA

ループ処理

ループ処理とは、特定の条件下で同じ処理を繰り返すことを言います。 ループ処理用のステートメントは、VBAでは数種類用意されていますが、主だったよく使われるものをご紹介したいと思います。

For Nextステートメント

整数型の、カウンタ用の変数を用意して使うステートメントになります。 ひとまず構文を見て、それからご説明したいと思います。

Dim 変数 as integer
For 変数 = 範囲1 To 範囲2
    繰り返したい処理
Next 変数

このような構文になります。 「For」の後に続く条件が正であれば、処理が実行されることになります。

この「For」構文の特徴は、自動で変数が加算されていくことですね。 この場合の整数型の変数は、「ループカウンター」と呼ばれる使い方になります。 変数の値が範囲1と範囲2に収まっている間は、処理が繰り返されることになります。

それでは、例文を見ていきましょう。

Sub LoopMessage()
    Dim i As Integer
    For i = 0 To 30
        If i = 28 Then  'ループカウンターが28の時だけメッセージを出す
            MsgBox (i)
        End If
    Next i
End Sub

ループカウンターが28になった時だけメッセージを出し、ループを抜けるコードになります。

ループカウンターのリセット

また、ループカウンターは「For Nextステートメント」に入ると、自動で範囲1の値が代入されます。 重要なデータを格納していても上書きされてしまうため、ループカウンター用の変数を用意する方が無難となります。

Exit Forステートメント

ループの中で、ループを抜けたい時に使うステートメントです。 基本的には条件に一致した場合に抜けられるように記述します。

先程のコードで、メッセージを出したらループを抜けるように「Exit For」を入れてみます。

Sub LoopMessage()
    Dim i As Integer
    For i = 0 To 30
        If i = 28 Then  'ループカウンターが28の時だけメッセージを出す
            MsgBox (i)
            Exit For    'メッセージを出したらループを抜け出す
        End If
        If i = 30 Then  'このIf条件は、手前で抜けるため正にはならない
            MsgBox ("確認用")
        End If
    Next i
End Sub

このコードを実行すると、「i」が30になる前にループを抜けているため、「確認用」のメッセージは表示されません。

Stepステートメント

ループカウンターは基本的に1ずつ加算されていきますが、「Stepステートメント」を使うことにより加算される数値を変えることができます。

構文を見てみましょう。

Dim 変数 as integer
For 変数 = 範囲1 To 範囲2 Step 数値
    繰り返したい処理
Next 変数

このように、範囲の指定の後に「Stepステートメント」で数値を指定することになります。

それでは例を見てみましょう。 「Exit For」の例文とほぼ同じですが、「Step 3」だけ追加したものになります。

Sub LoopMessage()
    Dim i As Integer
    For i = 0 To 30 Step 3   'Step 3 で、カウンタは3の倍数になる
        If i = 28 Then      '3の倍数ではないため正にならない
            MsgBox (i)
            Exit For
        End If
        If i = 30 Then      'こちらは3の倍数のため正になる
            MsgBox ("確認用")
        End If
    Next i
End Sub

このコードを実行すると、「確認用」のメッセージが出ます。 Stepの数値にはマイナスの値も指定することができ、その場合は「範囲1 > 範囲2」となるようにします。 ループカウンターは範囲1の値が初期値となるので、「範囲1 < 範囲2」となっていると、すぐにループを抜けてしまいます。

Do Loopステートメント

「For Next」はループカウンターを使い、カウンタが範囲から出ることでループから抜けます。 ですが「Do Loop」ステートメントは、条件によってループするか抜けるかが決まります。 構文自体は似ていますが、条件の出し方で「While」と「Until」という、2つのステートメントを使い分けることになります。

Do Whileステートメント

「Do Whileステートメント」は、条件が正であればループが続きます。

まずは構文を見ていきましょう。

Do While 条件
    繰り返したい処理
Loop

このように構文自体はシンプルです。

「Do Whileステートメント」を使ったコードの例を記述してみます。

Sub DoWhileMessage()
    Dim i As Integer
    i = 0              '変数の初期化
    Do While i <= 30
        If i = 28 Then
            MsgBox (i)
            Exit Do
        End If
        i = i + 1       'ループカウンターとして1ずつ加算する
    Loop
End Sub

コードの内容としては、「For Next」の例文と同じことをしています。 ループカウンターを30まで回し、28の時にメッセージが表示されます。

ここで大事なことは、ループカウンターを加算していくコードを記述していることです。 「i = i + 1」の1行がなければ、「i」はずっと0のままであり、ループは永久に続いてしまいます。 永久ループに陥ってしまった場合の対処は後述していますが、「Do Loopステートメント」には必ず終了条件を満たすよう気を付ける必要があります。

Do Untilステートメント

「Do While」は条件が正である限り続くループですが、「Do Until」は条件が正になるまでループが続きます。 つまり、「Do Until」は条件が負である間ループを続けるステートメントです。

まずは構文を見ていきましょう。

Do Until 条件
    繰り返したい処理
Loop

構文は、ほぼ「Do While」ステートメントと同じです。

それでは、「Do Until」を使ったコード例を記述してみます。

Sub DoWhileMessage()
    Dim i As Integer
    i = 0               '変数の初期化
    Do Until i > 30     'iが30を越えたらループ終了
        If i = 28 Then
            MsgBox (i)
            Exit Do
        End If
        i = i + 1       'ループカウンターとして1ずつ加算する
    Loop
End Sub

このコード例も、「Do While」での例と全く同じことをしています。 条件の部分だけを比較してみると、こうなります。

Do While i <= 30
Do Until i > 30

どちらもループカウンターが30を越えたらループが終了する条件です。 こうして比べてみると、条件の部分は真逆であることがわかりますね。 条件をイメージしやすい方、後から確認してわかりやすい方を選んで記述することになります。

無限ループに入ってしまった時の対処

ループ処理は少ないコードで大量の処理を行える、非常に便利で効率のいい処理です。 ですがループの終了条件をうまく作れていないと、余計な処理をしてしまったり、最悪の場合は無限にループし続けることもあります。

そうした場合の強制終了の仕方を、何通りかご説明します。

ESCキーを押して処理を中断する

マクロ実行中は、ESCキーを押すことでメニューウインドウが表示され、中断することができます。

スクリーンショットの画面

自動的に生成された説明

タスクマネージャから強制終了する

Excel自体がフリーズしている状態では、ESCキーを押しても反応しないことがあります。 そういった場合は、Excelを強制的に終了するしかありません。 CtrlキーとAltキーを押しながらDeleteキーを押して、タスクマネージャからExcelを強制終了します。

今回のまとめ

この頁ではループ処理についてのご説明をしました。 次回からは、以前使った出勤簿をマクロ化するプログラムを作成したいと思います。

コメント

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