Excel VBA | While…Wend

VBA
スポンサーリンク

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で仕組みを理解すると良い。
VBA
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました