Excel VBA | Do Loop文

VBA
スポンサーリンク

では Excel VBA の Do / Loop 系(繰り返し処理) を、プログラミング初心者向けに かみくだいて、図やステップ、例題(+解答)をたっぷり付けて説明します。まずは基本の動き→具体例→よくある落とし穴→練習問題(解答つき)の順で行きます。

Do / Loop のイメージ

  • 「ある条件が続く間、同じ処理を何度も繰り返す」ための構文。
  • 大事な選択:先に条件を確認してから実行するか、まず一回実行してから条件を確認するか。

簡単なフローチャート(ASCII):

(先に条件チェック型)           (後で条件チェック型)
  [条件を評価]                    [処理を実行]
   /   \                           |
 True  False                     [条件を評価]
  |         -> 実行 -> ループ -> True/False
処理
  |
Loop終了

基本パターン(4つ)と意味

  1. Do While 条件Loop
    条件が True の間ずっと繰り返す。最初に条件を評価する(条件 False なら 0 回)。
  2. DoLoop While 条件
    → 処理を 最低1回は実行して、そのあと条件を評価。条件 True なら繰り返す。
  3. Do Until 条件Loop
    → **条件が True になるまで(=条件が False の間)**繰り返す。最初に条件を評価する。
  4. DoLoop Until 条件
    → 処理を 1回実行してから条件を評価。条件が True になれば終了。

補足:Do Until 条件Do While Not (条件) と同じ意味です(逆の条件を使っているだけ)。

実例1:数値を 5 ずつ引いて 5 以下になったら止める(各パターン)

まずはセル B2 に数値が入っている想定です。

(A) Do While(条件を先にチェック)

Sub Example_DoWhile()
    Dim num As Integer
    num = Range("B2").Value

    Do While num > 5
        Debug.Print "数値 = " & num   ' イミディエイトウィンドウに表示
        num = num - 5
    Loop

    Debug.Print "ループ終了。最終 num = " & num
End Sub
VB
  • 挙動:num > 5 が True のときだけ中身を実行。最初から num <= 5 なら 1 回も処理されない。

(B) Do ... Loop While(最低1回実行)

Sub Example_DoLoopWhile()
    Dim num As Integer
    num = Range("B2").Value

    Do
        Debug.Print "数値 = " & num
        num = num - 5
    Loop While num > 5

    Debug.Print "ループ終了。最終 num = " & num
End Sub
VB
  • 挙動:必ず一回Debug.Print が実行される。セルが 3 なら「3」と出て終了。

(C) Do Until(先に評価、False の間繰り返す)

Sub Example_DoUntil()
    Dim num As Integer
    num = Range("B2").Value

    Do Until num <= 5
        Debug.Print "数値 = " & num
        num = num - 5
    Loop

    Debug.Print "ループ終了。最終 num = " & num
End Sub
VB
  • Do Until 条件Do While Not 条件 と同じ発想です。

(D) Do ... Loop Until(後で評価、最低1回)

Sub Example_DoLoopUntil()
    Dim num As Integer
    num = Range("B2").Value

    Do
        Debug.Print "数値 = " & num
        num = num - 5
    Loop Until num <= 5

    Debug.Print "ループ終了。最終 num = " & num
End Sub
VB

実例2:列の値を下に向かって合計(空セルが出るまで)

セル A1 から下へ値が続いている場合、空セルが現れるまで合計したいときの定番パターン:

Sub SumColumnA()
    Dim r As Long
    Dim total As Double

    r = 1            ' A列の1行目から
    total = 0

    Do While Not IsEmpty(Cells(r, "A").Value)
        total = total + Cells(r, "A").Value
        r = r + 1
    Loop

    MsgBox "合計 = " & total
End Sub
VB
  • ポイント:ループの中で r を増やして、最終的に空セルでループ終了する仕組み。これがないと無限ループになる。

実例3:Exit Do を使う(途中で抜けたいとき)

ループ中に条件が発生したら即終了したい場合:

Sub FindAndStop()
    Dim r As Long
    r = 1
    Do
        If IsEmpty(Cells(r, "A").Value) Then Exit Do
        If Cells(r, "A").Value = "終了" Then
            MsgBox "見つかった行 = " & r
            Exit Do
        End If
        r = r + 1
    Loop
End Sub
VB
  • Exit Do はループを即時抜ける命令。DoLoop 内で使えます。

無限ループの注意(重要)

ループ内で「条件が変わらない」または「終了条件に到達できない」状況だとプログラムが止まらなくなります。よくあるミス:

  • カウンタ(ir)を増やし忘れる
  • 条件の符号(><)を間違える
    解決法:
  • デバッグで Debug.Print を使ってループ回数を確認する
  • 安全のために最大回数で強制終了するガードを入れる(例:If loopCount > 10000 Then Exit Do

よくある質問(FAQ)

Q
For ループと Do ループ、どっちを使うべき?
A

要素が「何回」繰り返すか最初に分かる(例:1〜10 回)は For が簡単。条件で止めたい(例:空セルが出るまで)は Do 系が適している。

Q
Do WhileDo Until の違いが混乱する
A

Do While 条件 は「条件が True の間」繰り返す。Do Until 条件 は「条件が True になるまで(=条件が False の間)」繰り返す。直感的には While は “続ける条件”、Until は “終了する条件” と覚えるとわかりやすいです。

練習問題(初心者向け) — 解答付き

問題1
セル B2 にある数値から 3 ずつ引いて、数値が 0 以下になったら終了。処理中に値をイミディエイトに出力するマクロを書け。
解答1(模範)

Sub Q1()
    Dim n As Integer
    n = Range("B2").Value

    Do While n > 0
        Debug.Print n
        n = n - 3
    Loop

    Debug.Print "終了 最終 n = " & n
End Sub
VB

問題2
A列に値が1行ずつ入っている。空セルが見つかるまで、その合計を MsgBox で表示するマクロを作れ。
解答2

Sub Q2()
    Dim r As Long, total As Double
    r = 1: total = 0

    Do While Not IsEmpty(Cells(r, "A").Value)
        total = total + Cells(r, "A").Value
        r = r + 1
    Loop

    MsgBox "合計 = " & total
End Sub
VB

問題3
Do ... Loop While を使って、最初に必ず Debug.Print で「開始」と表示し、A1 の値を 1 ずつ増やして A1 が 10 より大きくなったら終了するマクロを書け。
解答3

Sub Q3()
    Debug.Print "開始"
    Do
        Range("A1").Value = Range("A1").Value + 1
    Loop While Range("A1").Value <= 10
End Sub
VB

問題4(応用)
列Aに商品名、列Bに個数が入っている。個数が 0 の行に到達したら処理を止め、それまでの売り上げ(個数×単価。単価は C1 に入っている)を合計表示するマクロを作れ。
解答4

Sub Q4()
    Dim r As Long, total As Double, unitPrice As Double
    r = 1
    total = 0
    unitPrice = Range("C1").Value

    Do While Not IsEmpty(Cells(r, "A").Value)
        If Cells(r, "B").Value = 0 Then Exit Do
        total = total + Cells(r, "B").Value * unitPrice
        r = r + 1
    Loop

    MsgBox "売上合計 = " & total
End Sub
VB

問題5(ガードを入れる)
配列読み込みで安全にするため、最大ループ回数 10000 を超えたら強制終了するガードを付けよ(例:A列の値を読み込む処理)。
解答5

Sub Q5()
    Dim r As Long, loopCount As Long
    r = 1: loopCount = 0

    Do While Not IsEmpty(Cells(r, "A").Value)
        ' 処理
        r = r + 1
        loopCount = loopCount + 1
        If loopCount > 10000 Then
            MsgBox "エラー: ループ回数が多すぎます。処理を中断します。"
            Exit Do
        End If
    Loop
End Sub
VB

学んだらやって欲しいこと(練習のコツ)

  1. 実際に小さな表を作って、上のサンプルを実行してみる(値を変えて挙動を確かめる)。
  2. Debug.Print を頻繁に使って、ループ中の変数の値をイミディエイトウィンドウで確認する。
  3. Exit Do とカウンタの増減忘れに注意する。無限ループにハマったら Esc で中断する(Excel が応答しない場合はタスクマネージャで終了することもあるので注意)。
タイトルとURLをコピーしました