Excel VBAの「While…Wend」文の考え方
「While…Wend」は、条件がTrue(真)の間だけ、同じ処理を何度も繰り返すための書き方です。簡単に言うと「〜の間はずっとやる」という意味。止めるタイミングは「条件がFalse(偽)になったとき」です。
基本の書き方と動き
While 条件式
繰り返したい処理
Wend
VB- 評価のタイミング: ループに入るたびに先頭の「条件式」をチェックします。Trueなら中の処理を実行、終わったらまた条件をチェックします。
- 止まる条件: 条件がFalseになった瞬間にループを抜けます。
- ポイント: 条件が変わらないままだと、ずっとTrueのままで止まらなくなる(無限ループ)。
まずは超シンプルな例
Sub 基本例()
Dim i As Integer
i = 1
While i <= 5
Debug.Print i
i = i + 1
Wend
End Sub
VB- 狙い: 1から5までを表示する。
- コツ: 最後に「i = i + 1」と増やして、いつか条件がFalse(iが6になってi <= 5が成り立たない)になるようにする。
よくあるつまずきと回避法
- 無限ループの原因: 条件を変える処理を忘れる。
- 例)増減やフラグ更新を書かないと、ずっとTrueのままになる。
- 解決の型: 「条件チェック → 処理 → 条件を変える」の3点セットをいつも意識する。
- 見分け方: 実行後に止まらない、VBAが応答しないときは無限ループを疑う。Escキーで中断できることが多い。
少し実用的な例題
例題1: 偶数だけを出力する
Sub 偶数だけ表示()
Dim n As Integer
n = 1
While n <= 10
If n Mod 2 = 0 Then
Debug.Print "偶数:" & n
End If
n = n + 1
Wend
End Sub
VB- 狙い: 1〜10の中から偶数だけを表示。
- ポイント: 条件は「n <= 10」。偶数判定は「n Mod 2 = 0」。
例題2: 合計が100を超えるまで足し続ける
Sub 合計が100を超えるまで()
Dim sum As Integer
Dim x As Integer
sum = 0
x = 1
While sum <= 100
sum = sum + x
Debug.Print "x=" & x & ", sum=" & sum
x = x + 1
Wend
Debug.Print "終了: 合計が100を超えました"
End Sub
VB- 狙い: 合計値が目標に達するまで繰り返す。
- ポイント: ループの最後で「x」を増やすことで、いつかsumが100を超える。
例題3: 空セルに出会うまで下へ読み進める
Sub 空セルまで読み進める()
Dim row As Long
row = 1
While Cells(row, 1).Value <> ""
Debug.Print "A" & row & " = " & Cells(row, 1).Value
row = row + 1
Wend
Debug.Print "空セルに到達: A" & row
End Sub
VB- 狙い: A列の上から順に、空白が出るまで値を読む。
- ポイント: 条件は「セルが空でない間」。空になったら止まる。
While…Wendの「限界」と「おすすめの代替」
- 制限: While…Wendは途中で抜ける「Exit」文が使えません。書き方も単純で柔軟性がない。
- おすすめ: 実務では「Do…Loop」を使うほうが便利。
- 途中終了(Exit Do)が可能
- 条件の位置や意味を選べる(Do While / Do Until、前判定・後判定)
同じ動きをDo…Loopで書く例
Sub DoLoop版()
Dim i As Integer
i = 1
Do While i <= 5
Debug.Print i
i = i + 1
Loop
End Sub
VB- 利点: 必要なら「If 条件 Then Exit Do」で安全に抜けられる。
使い分けの目安
- とにかく簡単に繰り返したい: While…WendでもOK(学習用)。
- 実務や保守性重視: Do…Loopを標準にする。
- 途中で止めたい・柔軟に条件を設定したい: Do…Loop一択。
小さな練習問題
- 問題1: 1から100までで、3の倍数だけを表示してみてください。
- 問題2: A列の最初の10行をチェックして、文字数が5文字以上のセルだけを「長い」と表示してみてください。
- 問題3: 入力値を2倍し続け、1000を超えたら止めるプログラムを書いてみてください。
解答例と解説
問題1: 1から100までで、3の倍数だけを表示
解答例
Sub 三の倍数表示()
Dim i As Integer
i = 1
While i <= 100
If i Mod 3 = 0 Then
Debug.Print i
End If
i = i + 1
Wend
End Sub
VB解説
i Mod 3 = 0は「iを3で割った余りが0」という意味 → 3の倍数判定。- ループ条件は「i <= 100」。
- 毎回
i = i + 1で増やしていくので、最終的に100までチェックできる。
問題2: A列の最初の10行をチェックして、文字数が5文字以上のセルだけ「長い」と表示
解答例
Sub 長い文字列判定()
Dim row As Integer
row = 1
While row <= 10
If Len(Cells(row, 1).Value) >= 5 Then
Debug.Print "A" & row & " は長い: " & Cells(row, 1).Value
End If
row = row + 1
Wend
End Sub
VB解説
Len(文字列)は文字数を返す関数。Cells(row, 1)は「row行目のA列セル」。- 10行目まで繰り返すので、A1〜A10をチェックできる。
問題3: 入力値を2倍し続け、1000を超えたら止める
解答例
Sub 倍々計算()
Dim num As Long
num = 2 ' 初期値を2とする
While num <= 1000
Debug.Print num
num = num * 2
Wend
Debug.Print "終了: " & num & " は1000を超えました"
End Sub
VB解説
- 初期値を2に設定。
num = num * 2で毎回2倍。- 条件は「num <= 1000」。これがFalseになった時点で終了。
- 最後に「1000を超えました」と確認できる。
総まとめ
- While…Wend文は「条件がTrueの間だけ繰り返す」仕組み。
- 必ず条件が変化する処理を入れる(増減や更新)ことで無限ループを防ぐ。
- 実務では「Do…Loop」の方が柔軟だが、学習用にはWhile…Wendで仕組みを理解すると良い。
