VBAにはcontinueがない?代替手法を整理してみた

技術情報
技術情報

はじめに

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は他言語と比べると独特な仕様も多いですが、
その前提を理解した上で書くことで、
読みやすく安定したコードを書くことができます。

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