Exit Do
Exit Do は Do…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 を入れるだけで速度改善。
- 条件の明確化: 「終了条件」を必ず書く。曖昧だと意図せず途中で止まる。
