多重ループを一気に抜けるには?(Tips-3)
VBAの勉強を始めて、これまでに学んだことや、思いついたアレやコレをメモっておきます。
タイトルのとおりですが、コーディングしていると、入れ子になったループの中から一気に抜け出したい場面があります。
しかし、下記のように、一番内側のループの中で Exit For しても、ループを抜けるのは該当の For ~Next だけで、外側のループまでは抜けることができません。
Sub test()
For i = 1 To 10
For j = 1 To 10
For k = 1 To 10
If k = 5 Then
Exit For
End If
Next k
Next j
Next i
End Sub
こういうとき私は、初心者モード全開で、GoTo を乱用するのですが、
Sub test()
For i = 1 To 10
For j = 1 To 10
For k = 1 To 10
If k = 5 Then
GoTo skip
End If
Next k
Next j
Next i
skip:
End Sub
ネットでいろいろ調べていると、可読性が下がるとか、うんぬんとかであまり好まれていないようです。
じゃあどうすればいいのさっ!?ということで、別の方法を学んでみました。
Exit For と一緒に、外側のループ終了条件も満たしてあげる方法
Sub test() For i = 1 To 10 For j = 1 To 10 For k = 1 To 10 If k = 5 Then i = 10 j = 10
Exit ForEnd If Next k Next j Next i End Sub
フラグを True にし、フラグが True なら条件分岐で外側のループも Exit For する方法
Sub test()
For i = 1 To 10
For j = 1 To 10
For k = 1 To 10
If k = 5 Then
flag = True
Exit For
End If
Next k
If flag Then Exit For
Next j
If flag Then Exit For
Next i
End Sub
他にもいろいろあると思いますケド、初心者的には、ぱっと見、GoTo が一番わかりやすいように思えるのは気のせい?
でも、一つのコードの中で GoTo を多用すれば、スパゲッティのようにコードが絡み合い、可読性が下がってしまうことでしょう。
どれが正統なやり方なの?って思いますが、組織で決まったお作法(指針?)などがあれば、それに従い、個人レベルであれば本やネットを参考に汎用性やメンテナンス性を高めたり、ミスを防いだりするための、個人ルールを構築するって感じでしょうか。
うーん。まだまだ知らないことが多くありそうですが・・・・・・、「お作法」の存在を気にしすぎて、自由な発想が妨げられないようにもしたい今日この頃であります。