Excel VBAのDo Loop文とは
繰り返し処理をするための仕組みです。ある「条件」を満たしている間だけ、同じ処理を何度も実行します。条件の書き方によって「いつ判定するか」や「いつ終わるか」が変わります。
4つの基本パターン
Do While … Loop(最初に条件をチェック)
- 意味: 条件が真(True)の間、繰り返す
- 特徴: 最初から条件が偽(False)なら、1回も実行されない
'例: B2が空になるまで下に見ていく
Dim r As Long
r = 2
Do While Cells(r, "B").Value <> ""
Debug.Print Cells(r, "B").Value
r = r + 1
Loop
VBDo … Loop While(最後に条件をチェック)
- 意味: まず1回処理してから、条件が真なら続ける
- 特徴: 必ず1回は実行される
'例: 1回は必ずメッセージを出す
Dim count As Integer
count = 0
Do
Debug.Print "実行回数: " & count
count = count + 1
Loop While count < 3
VBDo Until … Loop(最初に条件をチェック、逆の考え方)
- 意味: 条件が真(True)になる「まで」繰り返す(つまり条件が偽の間続ける)
- 特徴: 条件が最初から真なら、1回も実行されない
'例: 合計が100以上になるまで足し続ける
Dim total As Long
Dim i As Long
total = 0
i = 1
Do Until total >= 100
total = total + i
i = i + 1
Loop
Debug.Print "合計: " & total, "回数: " & i - 1
VBDo … Loop Until(最後に条件をチェック、逆の考え方)
- 意味: 1回処理してから、条件が真になるまで続ける
- 特徴: 必ず1回は実行される
'例: 入力値が10以上になるまで加算
Dim n As Long
n = 7
Do
n = n + 1
Loop Until n >= 10
Debug.Print "最終値: " & n
VBWhile と Until の使い分け
- While: 「条件が真の間続ける」=続ける条件をそのまま書く
- Until: 「条件が真になるまで続ける」=止めたい条件を書く
- 覚え方: 「続けたい条件 → While」「止めたい条件 → Until」
初心者は「止めたい状態」をはっきり書けるなら Until、「続けたい間」を素直に書けるなら While が読みやすくなります。
つまずきやすいポイントと回避策
- 無限ループに注意:
条件がずっと変わらないと止まりません。
例)ループ内で行番号やカウンタを必ず更新する。
'悪い例(rが変わらない)
Do While Cells(r, "B").Value <> ""
Debug.Print Cells(r, "B").Value
Loop
'良い例(rを更新)
Do While Cells(r, "B").Value <> ""
Debug.Print Cells(r, "B").Value
r = r + 1
Loop
VB- 条件の向きの取り違え:
「=」「<>」「>=」などの比較を勘違いしない。
例)Until total >= 100 は、「100以上になったら止める」という意味。 - 終了の合図を早めに考える:
どんなときに止めるか(セルが空/上限値/見つかったら)を最初に決めると、設計ミスが減ります。
例題で身につける
例題1: 特定の文字を含む行だけ数える
- 目的: B列のデータのうち「OK」を含むセルの数を数える
- 考え方: 空セルに当たるまで下へ進む。1行ずつ判定してカウント。
Sub CountOK()
Dim r As Long
Dim cnt As Long
r = 2 '見出しの次の行から
cnt = 0
Do While Cells(r, "B").Value <> ""
If InStr(1, Cells(r, "B").Value, "OK") > 0 Then
cnt = cnt + 1
End If
r = r + 1
Loop
MsgBox "OKの件数: " & cnt
End Sub
VB- ポイント:
開始位置を決める、終了条件(空セル)を明確にする、カウンタ更新を忘れない。
例題2: 合計が閾値に達するまで足す
- 目的: C列の数値を上から順に足し、合計が500以上で止める
- 考え方: 「止めたい条件」を Until で書くと読みやすい
Sub SumUntil500()
Dim r As Long
Dim total As Long
r = 2
total = 0
Do Until total >= 500 Or Cells(r, "C").Value = ""
total = total + Cells(r, "C").Value
r = r + 1
Loop
MsgBox "合計: " & total & "(行数: " & r - 2 & ")"
End Sub
VB- ポイント:
複合条件(合計到達 or データ終端)で安全に止められる。
例題3: 値が見つかるまで探す(必ず1回は動かす)
- 目的: D列から「Target」を探し、見つかったら行番号を表示
- 考え方: 少なくとも1回は処理したい → Do … Loop Until
Sub FindTarget()
Dim r As Long
Dim found As Boolean
r = 2
found = False
Do
If Cells(r, "D").Value = "" Then Exit Do
If Cells(r, "D").Value = "Target" Then
found = True
Exit Do
End If
r = r + 1
Loop Until found
If found Then
MsgBox "見つかった行: " & r
Else
MsgBox "見つかりませんでした"
End If
End Sub
VB- ポイント:
Exit Do を使うと、見つかった瞬間に抜けられて高速。
よく使う実践パターン
- 行走査(B列の末尾まで):
ループ条件は「セルが空でない間」
Dim r As Long: r = 2
Do While Cells(r, "B").Value <> ""
'処理
r = r + 1
Loop
VB- 上限回数で守る(保険):
無限ループ対策に最大回数を設ける
Dim i As Long: i = 0
Do While 条件
'処理
i = i + 1
If i > 10000 Then
MsgBox "回数上限で停止"
Exit Do
End If
Loop
VB- 途中でスキップ(条件に合わないとき):
条件に合わない行は早めに次へ
If Cells(r, "B").Value = "" Then
r = r + 1
GoTo NextLoop '推奨はIfで囲う/Continue的に書く
End If
'…処理…
NextLoop:
VB推奨は GoTo を避け、If で囲んで分岐させる書き方です。
最後に(選び方の指針)
- 最初に判定したい → Do While / Do Until
- 必ず1回は動かしたい → Do … Loop While / Until
- 止めたい条件が明確 → Until、続けたい条件が素直 → While
- 無限ループ対策 → カウンタ更新 + 上限回数 or 終了条件の複合化
必要なら、あなたの実データ構成(列・開始行・止めたい条件)を教えてください。目的に合わせて最小のコードに落とし込みます。
