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