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
この書き方を覚えてからコードが書きやすくなりました。おすすめ!
ExcelVBAに興味をお持ちの方は、こちらの記事もどうぞ!
- これからExcelのマクロを始めたいという方に!簡単な練習問題作りました。
- 私がExcelVBAでよく使う便利なコード・スニペットまとめ
- プログラム初心者さんへ贈る、エラーが起きたら試してみて欲しいこと
- ExcelVBAのクラスモジュールって何?という人向けの使い方まとめ
書籍を執筆しています。
コメントは承認制ですので、反映までしばらくお待ち下さい。(稀にスパムの誤判定にて届かないこともあるようですので、必要な際はお問い合わせからお願い致します。)
YouTubeでQ&Aコンテンツを企画しています
運営しているYouTubeチャンネルで、ご相談やご質問を募集しています。動画のコメントやお問い合わせページからお気軽にご相談をお寄せください。