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初学でほかの言語を知らないときは私もそんな方法があるとは全く知らずIFブロックを駆使していたのですが、「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 を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

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