【VBA】ForやWhileで次のループ処理へスキップする方法

ForやWhileなどのループ処理の途中でループの先頭に戻って次のループ処理を開始したいことがあると思います。様々なプログラミング言語で、continueという名前でそのような機能が実装されているのですが、残念ながらVBAにはありません。

この記事ではVBAでcontinueと同じことをする方法を紹介します。

GoToステートメントを使用する

continue機能を実現するためにGoToステートメントを使用します。

GoToステートメントとは、プロシージャ内の指定行に無条件で分岐させるというものです。
構文:GoTo 行ラベル

ループ処理の最終行より一つ前の行に「行ラベル」を定義しておき、continueさせたい場所にGoTo文を記述して、分岐先には定義しておいた行ラベルを指定するという方法で実現できます。

サンプルコード

実際にcontinue機能を実現したサンプルコードを作成しました。

Dim dat(3) As Long
dat(0) = 10
dat(1) = 60
dat(2) = 40
dat(3) = 100

Dim i As Long

For i = 0 To UBound(dat)
    If (dat(i) < 50) Then
        ' 条件に合致しない場合は行ラベルcontinueへ移動させて次のループへ。
        GoTo continue
    End If

    Debug.Print dat(i)

' ↓Nextの直前に行ラベルを用意しておく。この後は何も処理が無いのですぐに次のループに移る。  
continue:
Next

Long型の配列を用意し、その要素をループで回して値が50以上のものをイミディエイトウィンドウに出力するというものです。

値が50未満の場合はGoToステートメントで行ラベル「continue」の位置へ移動させて、すぐに次のループに移るようにしています。

GoToステートメント使用上の注意点

プロシージャ内に複数のループ処理があり、それぞれcontinue処理を行いたい場合はループ処理の数だけcontinue用の行ラベルが必要になります。(ループ内でcontinueを使用しないのであれば不要です。)

そのような場合にGoToで指定する行ラベルを間違えると無限ループになってしまったり、予期しない動作になるので注意しなければなりません。

’2重ループの場合の例
Dim i As Long, j As Long
For i = 1 To 10
    If (条件式) Then
        GoTo continue1    ' 間違えてcontinue2を指定しないように。
    End If

    ' 何か処理
    
    For j = 0 To 3
        If (条件式) Then
            GoTo continue2    ' 間違えてcontinue1を指定しないように。
        End If
 
        ' 何か処理
 
continue2:        ' 内側のループでcontinueするためのラベル
    Next

continue1:    ' 外側のループでcontinueするためのラベル
Next

行ラベルを分かりやすく命名しておけば間違いを起こしにくくなると思います。

まとめ

continueが使用できるとネストが深くなるのを防ぐことができ、ソースコードが読みやすくなります。

一般的にGoToステートメントの使用はスパゲッティコードを生みやすくすると言われているので拒否反応を示す方もいると思いますが、結局は使い方次第です。今回のような使い方では非常に有用なので、ためらわず使用すべきだと私は思います。

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