VBAの繰り返し処理中に次のループへスキップしたいとき

VBAの繰り返し処理中に次のループへスキップしたいとき

VBAでそこそこコードを書いている方なら特に珍しい話題ではないと思うのですが、そういえば書いたことがなかったなと思って。覚えておくとめちゃめちゃ使い勝手が良いです!


動画版もあります

動画でも解説してます。テキストよりそっちのほうが好きという方はこちらからどうぞ!

「処理のスキップ」を組み込む

プログラムで条件と処理の関係性を考えていると、「○○だったらこれをやる」という、「やる」前提で考えてしまいがちなのですが、逆を取って、「○○じゃなかったら、やらない」という書き方にしてみると、入れ子が減ったり読みやすいコードになることも結構あるんですよね。

プロシージャだったら

条件1に合致したら処理1をして、そのあと条件2に合致したら処理2をして…、という処理を以下のように書くとIfブロックが入れ子になって階層が深くなっていきます。

Sub sample()
  
  If 条件1 Then
    処理1
    
    If 条件2 Then
      処理2
    End If
    
  End If
  
End Sub

こういった場合、条件1に合致しなかったらExit、条件2に合致しなかったらExit、とその都度Subを抜ける書き方にしたほうが読みやすくなります。

Sub sample()

  If Not 条件1 Then
    Exit Sub
  End If
  
  処理1
  
  If Not 条件2 Then
    Exit Sub
  End If
  
  処理2
  
End Sub

ループだと

繰り返し処理中での条件分岐、大変ですよね。特に条件が多くて複雑なときなどは、ループの終点まで続く大きなIFブロックが出来てしまったり…。可読性をよくするには、できるだけIfブロックは短く、ネスト(入れ子構造)は少なくしたいところ。

かと言ってNot条件で Exit For してしまうとループの外に抜けてしまうんですよね。しかしループの次にスキップしたいだけで、ループは抜けたくないということもある…!

Sub sample()
  
  Dim i As Long
  For i = 1 To 100
    If Not 条件1 Then '条件1に合致しない場合
      Exit For
    End If
    処理1
  Next i '←今回の処理はスキップして次のループに行きたいからこっちにジャンプしたい!
  
  'Exitするとここにジャンプしちゃう
  
End Sub

こういった場合、ほかの言語では CONTINUE という便利な文があって、実行すると処理をスキップして次のループの先頭に行ってくれます。

VBAにはこの構文がないのですが、「CONTINUE」というラベルを作っておいてそこにジャンプさせる、という方法で似たようなことを実現できます。(ラベルの名前は何でもOKですが、他言語で「CONTINUE」といえばループのスキップ、という一般認識があるので、同じ名前にしておいたほうが可読性がよいと思います。)

例にすると、こんな感じ。

Sub sample()
  
  Dim i As Long
  For i = 1 To 100
    If Not 条件1 Then '条件1に合致しない場合
      GoTo CONTINUE '「CONTINUE」というラベルにジャンプ
    End If
    処理1
CONTINUE: '←ここにジャンプするので次のループへ行ける
  Next i
  
End Sub

この書き方を覚えてからコードが書きやすくなりました。おすすめ!

公開日:2022/06/27

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

コメントは承認制ですので、反映までしばらくお待ち下さい。(稀にスパムの誤判定にて届かないこともあるようですので、必要な際はお問い合わせからお願い致します。)

YouTubeでQ&Aコンテンツを企画しています

運営しているYouTubeチャンネルで、ご相談やご質問を募集しています。動画のコメントやお問い合わせページからお気軽にご相談をお寄せください。