では Excel VBA の Do / Loop 系(繰り返し処理) を、プログラミング初心者向けに かみくだいて、図やステップ、例題(+解答)をたっぷり付けて説明します。まずは基本の動き→具体例→よくある落とし穴→練習問題(解答つき)の順で行きます。
Do / Loop のイメージ
- 「ある条件が続く間、同じ処理を何度も繰り返す」ための構文。
- 大事な選択:先に条件を確認してから実行するか、まず一回実行してから条件を確認するか。
簡単なフローチャート(ASCII):
(先に条件チェック型) (後で条件チェック型)
[条件を評価] [処理を実行]
/ \ |
True False [条件を評価]
| -> 実行 -> ループ -> True/False
処理
|
Loop終了
基本パターン(4つ)と意味
Do While 条件…Loop
→ 条件が True の間ずっと繰り返す。最初に条件を評価する(条件 False なら 0 回)。Do…Loop While 条件
→ 処理を 最低1回は実行して、そのあと条件を評価。条件 True なら繰り返す。Do Until 条件…Loop
→ **条件が True になるまで(=条件が False の間)**繰り返す。最初に条件を評価する。Do…Loop 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
VBDo 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
VBExit Doはループを即時抜ける命令。Do…Loop内で使えます。
無限ループの注意(重要)
ループ内で「条件が変わらない」または「終了条件に到達できない」状況だとプログラムが止まらなくなります。よくあるミス:
- カウンタ(
iやr)を増やし忘れる - 条件の符号(
>と<)を間違える
解決法: - デバッグで
Debug.Printを使ってループ回数を確認する - 安全のために最大回数で強制終了するガードを入れる(例:
If loopCount > 10000 Then Exit Do)
よくある質問(FAQ)
- Q
ForループとDoループ、どっちを使うべき? - A
要素が「何回」繰り返すか最初に分かる(例:1〜10 回)は
Forが簡単。条件で止めたい(例:空セルが出るまで)はDo系が適している。
- Q
Do WhileとDo 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問題3Do ... 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学んだらやって欲しいこと(練習のコツ)
- 実際に小さな表を作って、上のサンプルを実行してみる(値を変えて挙動を確かめる)。
Debug.Printを頻繁に使って、ループ中の変数の値をイミディエイトウィンドウで確認する。Exit Doとカウンタの増減忘れに注意する。無限ループにハマったらEscで中断する(Excel が応答しない場合はタスクマネージャで終了することもあるので注意)。
