Excel VBA 逆引き集 | Exit Do

Excel VBA
スポンサーリンク

Exit Do

Exit DoDo…Loop を途中で抜けるための命令です。
「条件を満たしたら即終了」「最初の一致だけ処理したい」など、無駄な繰り返しを避けて効率化できます。初心者が理解しやすいように、基本構文から実務テンプレートまで整理しました。


基本構文と最短コード

Sub ExitDo_Basic()
    Dim i As Long
    i = 1
    Do While i <= 10
        Cells(i, 1).Value = i
        If i = 5 Then Exit Do
        i = i + 1
    Loop
End Sub
VB
  • ポイント:
    • Exit Do が実行されると、その場でループを終了。
    • 以降の処理はスキップされ、Loop の外へ抜ける。

条件成立で途中終了(検索処理の定番)

Sub ExitDo_Search()
    Dim r As Long
    r = 2
    Do While Cells(r, "A").Value <> ""
        If Cells(r, "A").Value = "東京" Then
            Cells(r, "B").Value = "見つかった!"
            Exit Do
        End If
        r = r + 1
    Loop
End Sub
VB
  • ポイント:
    • 最初の一致だけ処理したいときに便利。
    • 全件探すなら Exit Do を使わず最後まで回す。

複数条件で終了(しきい値チェック)

Sub ExitDo_Threshold()
    Dim r As Long
    r = 2
    Do Until Cells(r, "E").Value = ""
        If Cells(r, "E").Value > 1000000 Then
            Cells(r, "F").Value = "しきい値超過"
            Exit Do
        End If
        r = r + 1
    Loop
End Sub
VB
  • ポイント:
    • 「最初に基準を超えた行」だけ処理して終了。
    • 大量データでも無駄なループを避けられる。

ネストしたループでの Exit Do

Sub ExitDo_Nested()
    Dim r As Long, c As Long
    r = 2
    Do While Cells(r, "A").Value <> ""
        c = 2
        Do While c <= 5
            If Cells(r, c).Value = "NG" Then
                Cells(r, c).Interior.Color = vbRed
                Exit Do   '内側ループだけ終了
            End If
            c = c + 1
        Loop
        r = r + 1
    Loop
End Sub
VB
  • ポイント:
    • Exit Do は「現在のループ」だけ抜ける。
    • 外側のループは続行される。

実務テンプレート

'1) 顧客名を検索して最初の一致だけ処理
Sub FindCustomer()
    Dim r As Long
    r = 2
    Do While Cells(r, "B").Value <> ""
        If Cells(r, "B").Value = "佐藤" Then
            MsgBox "佐藤さんは " & r & " 行目にいます"
            Exit Do
        End If
        r = r + 1
    Loop
End Sub

'2) 空白行に到達したら終了(途中の空白で打ち切り)
Sub StopAtBlank()
    Dim r As Long
    r = 2
    Do
        If Cells(r, "A").Value = "" Then Exit Do
        Cells(r, "C").Value = "処理済"
        r = r + 1
    Loop
End Sub

'3) 最初の「緊急」行を強調して終了
Sub HighlightFirstUrgent()
    Dim r As Long
    r = 2
    Do While Cells(r, "A").Value <> ""
        If Cells(r, "A").Value = "緊急" Then
            Rows(r).Font.Bold = True
            Rows(r).Interior.Color = RGB(255, 199, 206)
            Exit Do
        End If
        r = r + 1
    Loop
End Sub
VB

例題で練習

例題1:最初に金額が30万を超えた行を見つける

Sub Example_FindFirstOver300k()
    Dim r As Long
    r = 2
    Do While Cells(r, "E").Value <> ""
        If Cells(r, "E").Value > 300000 Then
            MsgBox "最初の超過は " & r & " 行目です"
            Exit Do
        End If
        r = r + 1
    Loop
End Sub
VB

例題2:最初のエラーセルを検出して終了

Sub Example_FindErrorCell()
    Dim r As Long
    r = 2
    Do While r <= 100
        If IsError(Cells(r, "C").Value) Then
            Cells(r, "D").Value = "エラーあり"
            Exit Do
        End If
        r = r + 1
    Loop
End Sub
VB

実務の落とし穴と対策

  • Exit Doは「現在のループ」だけ終了: ネスト時は外側まで抜けたいならフラグ変数を使う。
  • 検索と全件処理の違い: 最初の一致だけなら Exit Do、全件処理なら最後まで回す。
  • 無駄なループ削減: 大量データでは Exit Do を入れるだけで速度改善。
  • 条件の明確化: 「終了条件」を必ず書く。曖昧だと意図せず途中で止まる。

タイトルとURLをコピーしました