none
[VBA 全般] ループの途中でプロシージャを直接抜けても大丈夫か? RRS feed

  • 質問

  • 今更、根本的な質問ですが VBA で For や Do などのループの途中でそのループを抜けずに
    Exit Sub や Exit Function などでプロシージャを抜けても大丈夫なのでしょうか。
    それともすべてのループを抜けてからのほうが安全なのでしょうか。
    言語仕様などで決まっていますか?

    ' 単純な例
    Sub test()
        For i = 0 To 2
            If i = 1 Then
                ' これは安全なのか?
                Exit Sub
            End If
        Next
    End Sub


    2020年3月9日 2:34

すべての返信

  • 言語仕様としては問題ないです。

    ただし、実際には問題がある場合がありえます。
    例えば以下のように画面表示できなくした状態でExitSubしてしまうと、その後にユーザーが操作ができなくなる可能性があります。

    Sub test()
        Application.ScreenUpdating = False
        Application.Visible = False
        
        For i = 0 To 2
            If i = 1 Then
                Exit Sub
            End If
        Next
        
        Application.Visible = True
        Application.ScreenUpdating = True
    End Sub
    きちんと後始末した後で抜けるならこのような問題は発生しません。
    Sub test()
        Application.ScreenUpdating = False
        Application.Visible = False
        
        For i = 0 To 2
            If i = 1 Then
                Application.Visible = True
                Application.ScreenUpdating = True
                Exit Sub
            End If
        Next
        
        Application.Visible = True
        Application.ScreenUpdating = True
    End Sub


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 編集済み gekkaMVP 2020年3月9日 3:14
    2020年3月9日 3:13
  • ありがとうございます。
    公式のヘルプのサンプルは見ていませんでした。
    ごくまれに公式のサンプルでも間違った内容や問題のある
    サンプルが書かれていることもあります
    が基本的には
    問題なさそうですね。
    2020年3月9日 4:26