VBAの勉強を始めてみた

色々試しています。

多重ループを一気に抜けるには?(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 For
                End 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 を多用すれば、スパゲッティのようにコードが絡み合い、可読性が下がってしまうことでしょう。

どれが正統なやり方なの?って思いますが、組織で決まったお作法(指針?)などがあれば、それに従い、個人レベルであれば本やネットを参考に汎用性やメンテナンス性を高めたり、ミスを防いだりするための、個人ルールを構築するって感じでしょうか。
うーん。まだまだ知らないことが多くありそうですが・・・・・・、「お作法」の存在を気にしすぎて、自由な発想が妨げられないようにもしたい今日この頃であります。