はじめに
VBAで処理を書いていると、ForやFor Eachを使ったループ処理をよく書きます。
その中で「特定の条件のときだけ処理をスキップしたい」と思い、
他の言語で使っていたcontinueを使おうとして、
VBAには存在しないことに気づきました。
本レポートでは、
VBAにはなぜcontinueがないのか、
そして どのように書き換えるのが現実的かを整理します。
continueとは何か
continueは、多くのプログラミング言語に存在する制御文で、
現在のループ処理を中断し、次のループへ進むために使われます。
例えば、次のようなコードです。
#python for i in range(10): if i % 2 == 0: continue print(i)
この場合、偶数のときは処理を飛ばし、奇数のみが出力されます。
このような書き方に慣れていると、VBAでも同じことをしたくなります。
VBAにはなぜcontinueがないのか
VBAにはcontinueに相当する制御文が用意されていません。
これは、VBAが比較的古い言語設計をベースにしているためです。
VBAでは、ループ制御として以下が用意されています。
- Exit For
- Exit Do
どちらも「ループを抜ける」ためのものであり、
「次のループへ進む」ための構文は用意されていません。
その代わり、VBAでは
条件分岐で処理を書くことを前提とした設計になっています。
VBAでの代替手法
① Ifで処理を囲む(最も一般的)
最もシンプルで、可読性も高い方法です。
For i = 1 To 10
If i Mod 2 <> 0 Then
Debug.Print i
End If
Next
処理を実行したい条件だけをIfで囲むことで、
結果的にcontinueと同じ動きになります。
② GoToを使う方法
VBAにはGoToが存在するため、
次のループへ強制的にジャンプさせる書き方も可能です。
For i = 1 To 10
If i Mod 2 = 0 Then
GoTo ContinueLabel
End If
Debug.Print i
ContinueLabel:
Next
動作としてはcontinueに近いですが、
可読性が下がりやすいため、多用はおすすめできません。
どの書き方を使うべきか
基本的には、
① Ifで処理を囲む方法が最もおすすめです。
- シンプルで読みやすい
- VBAらしい書き方
- 保守しやすい
GoTo は「どうしても処理を飛ばしたい」場面に限定し、
基本は使わない方針にするのが無難です。
ただし、エラー処理用途の GoTo については、例外として許容されることが多いです。
まとめ
- VBAにはcontinueは存在しない
- 代わりにIfによる条件分岐で制御する
- エラー処理用途の GoTo は例外として許容される
VBAは他言語と比べると独特な仕様も多いですが、
その前提を理解した上で書くことで、
読みやすく安定したコードを書くことができます。