Excel VBA | Do Loop文

VBA
スポンサーリンク

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
VB

Do … Loop While(最後に条件をチェック)

  • 意味: まず1回処理してから、条件が真なら続ける
  • 特徴: 必ず1回は実行される
'例: 1回は必ずメッセージを出す
Dim count As Integer
count = 0
Do
    Debug.Print "実行回数: " & count
    count = count + 1
Loop While count < 3
VB

Do 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
VB

Do … Loop Until(最後に条件をチェック、逆の考え方)

  • 意味: 1回処理してから、条件が真になるまで続ける
  • 特徴: 必ず1回は実行される
'例: 入力値が10以上になるまで加算
Dim n As Long
n = 7
Do
    n = n + 1
Loop Until n >= 10
Debug.Print "最終値: " & n
VB

While と 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 終了条件の複合化

必要なら、あなたの実データ構成(列・開始行・止めたい条件)を教えてください。目的に合わせて最小のコードに落とし込みます。

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