Excel VBA

Excel VBA | while文: 使いこなして効率アップ!

2024年5月15日

本ページはプロモーションが含まれています

vba_while文アイキャッチ画像

whileは、指定された条件が満たされている間、指定した処理を繰り返し実行する制御構造です。

Sub ExampleWhileLoop()
    Dim i As Integer
    i = 1
    
    While i <= 5
        Debug.Print "Count: " & i
        i = i + 1 ' iをインクリメントして、条件を変更する
    Wend
End Sub

while文に関する主な疑問や問題点について、いくつかの観点から挙げてみます。

  1. 無限ループの危険性while文が条件を満たし続ける場合、意図しない無限ループに陥る可能性。
  2. 初期条件と更新while文の初期条件の設定や、ループ内での条件更新の設定方法は?
  3. 条件式の評価: 条件式が真偽どちらでも良い場合、ループが一度も実行されない可能性は?
  4. ループ内での変数スコープ: 外部からの変数の参照について。

この記事ではこれらについても詳しく解説します。

while文の基本構文

ポイント

While文は、プログラム内で特定の条件が満たされている間、ある一連の処理を繰り返し実行するための制御構造です。

条件が真(True)の間、処理が続きますが、条件が偽(False)になると、処理が終了します。

つまり、「〜する間は」という意味で、条件が満たされている限り繰り返し処理を行う命令と言えます。

以下はwhile文の基本構文です。

条件式がTrueの場合、Whileブロック内の処理が実行されます。
Wendは、Whileループの終了を示すために使われます。
条件式がFalseになるか、プログラムがWendに到達すると、Whileループは終了します。

While 条件式
    ' 条件式が真の場合に実行される処理
Wend

while文の簡単な例

以下の例では、変数 i が1から5までの値を出力します。

Sub WhileExample()
    Dim i As Integer
    i = 1
    
    While i <= 5
        MsgBox "i の値は " & i
        i = i + 1
    Wend
End Sub

コードの解説

  1. 変数の初期化i = 1
    • 最初に、整数型の変数 i を1で初期化します。これは、後でループのカウンタとして使用されます。
  2. 条件の評価While i <= 5
    • While文の開始に到達すると、条件式が評価されます。この場合、i の値が5以下であるかどうかが確認されます。
  3. 条件の評価結果による処理の実行MsgBox "i の値は " & i
    • 条件が真の場合、ループ内の処理が実行されます。この例では、ループ内で i の値がメッセージとして表示されます。
  4. カウンタの更新i = i + 1
    • ループ内の処理が終了した後、i の値が1増加します。これにより、次の反復での i の値が更新されます。
  5. 条件の再評価While i <= 5
    • ループ内の処理が終了した後、再び条件が評価されます。この時点で、i の値が5以下であれば、次の反復が行われます。
  6. ループの継続
    • 条件が真のままである限り、上記のステップが繰り返されます。つまり、条件が満たされる間は、ループが継続されます。
  7. 条件が偽になった場合の終了Wend
    • 条件が偽になると、ループは終了し、次のコードが実行されます。

実行結果

i の値は 1
i の値は 2
i の値は 3
i の値は 4
i の値は 5

無限ループの危険性

無限ループが発生する主な条件3点について説明します。

  • 終了条件の不備
  • 誤った条件の設定
  • 条件式の永遠の真

終了条件の不備

以下の例では、iが常に1で初期化され、While i > 0の条件が常に満たされるため、ループが終了しません。

' 終了条件が設定されていない例
Dim i As Integer
i = 1

While i > 0  ' iが常に0より大きい条件
    Debug.Print i
    ' iの値が更新されないため、条件が満たされ続ける
Wend

誤った条件の設定

以下の例では、countが10から始まり、While count < 20の条件が満たされるため、countが0になってもループが継続し、無限に減算が続きます。

' 条件式が誤って設定されている例
Dim count As Integer
count = 10

While count < 20  ' countが20未満である条件
    Debug.Print count
    count = count - 1  ' countを減算するが、ループ条件が満たされる
Wend

条件式の永遠の真

以下の場合、flagTrueで初期化され、その値が変更されない限り、While flagの条件が常に真であり、無限にループが実行されます。

' 条件式が常に真の例
Dim flag As Boolean
flag = True

While flag  ' flagが常にTrueである条件
    Debug.Print "Looping..."
    ' flagがFalseに変更されないため、ループが無限に続く
Wend

無限ループが発生すると、プログラムが予期せず停止したり、全体の処理がフリーズすることがありますので注意が必要です。

while文の初期条件と更新の設定方法

while文を使用する際に、初期条件の設定とループ内での条件更新が適切に行われているかどうかは、正しいプログラムの動作に重要な影響を与えます。

初期条件の設定

while文の初期条件は、ループが開始する前に評価されます。
この条件は、ループがいつ終了するかを決定します。
初期条件を適切に設定することで、予期しない無限ループを避けることができます。

以下の例では、i の初期値が1であり、While i <= 10 の条件が満たされる間、ループ内の処理が繰り返し実行されます。
i が10を超えると条件が偽になり、ループが終了します。

Dim i As Integer
i = 1

While i <= 10
    ' ループ内の処理
    Debug.Print i
    i = i + 1  ' 条件更新: iをインクリメントしてループの終了条件を変更する
Wend

ループ内での条件更新

while文の中で条件を適切に更新することも重要です。
条件更新を行わない場合、ループが永遠に続いたり、条件が一度も満たされないループになる可能性があります。

ループ内での条件更新は、次のような形で行われます。

i = i + 1  ' iの更新: 条件を満たすための変更

まとめ

  • 初期条件: ループの開始前に条件を適切に設定する。
  • 条件更新: ループ内で条件を適切に更新して、ループの終了条件を変更する。
  • 無限ループの回避: 初期条件と条件更新を適切に行うことで、無限ループのリスクを低減する。

while文の条件式の評価

条件式が真偽どちらでも良い場合、while文のループが一度も実行されない可能性があります。
これは、ループの実行が条件式の評価に依存するためです。

条件式が常に偽の場合

以下の例では、初期値として i が10で設定されていますが、条件式 i > 100 は常に偽となるため、ループが一度も実行されません。
すなわち、ループの開始時点で条件が満たされないため、ループ内の処理がスキップされます。

Dim i As Integer
i = 10

While i > 100  ' iが100より大きい場合の条件式、この場合は常に偽
    Debug.Print i
    i = i + 1
Wend

条件式が常に真の場合

以下の場合、初期値として i が1で設定されていますが、条件式 i <= 0 は常に偽となるため、同様にループが一度も実行されません。
条件が最初から満たされていないため、ループ内の処理はスキップされます。

Dim i As Integer
i = 1

While i <= 0  ' iが0以下の場合の条件式、この場合は常に偽
    Debug.Print i
    i = i + 1
Wend

ループ内での変数スコープ

while文内で定義された外部からの変数の参照について説明します。

外部からの変数の参照

while文内では、外部で定義された変数にもアクセスすることができます。
ただし、その変数のスコープによって挙動が異なります。

外部で定義された変数がループ内で更新される場合

外部で定義された変数が while文内で更新される場合、その変更はループ外でも有効です。

以下の例では、total という変数がwhile文の外で定義され、ループ内で更新されています。
ループが終了した後も、total の最終的な値は保持され、外部で利用することができます。

Dim total As Integer
total = 0
Dim i As Integer
i = 1

While i <= 5
    total = total + i
    i = i + 1
Wend

Debug.Print "Total: " & total  ' totalはwhile文の外でも有効

外部で定義された変数がループ内で参照される場合

外部で定義された変数が while文内で参照される場合も、その変数の最新の値が反映されます。

以下の例では、ループ内で x が減算されていますが、その影響はループの外でも見えます。
while文内での参照は常に最新の値が使用されます。

Dim x As Integer
x = 10
Dim i As Integer
i = 1

While i <= x
    Debug.Print "Iteration: " & i
    i = i + 1
    x = x - 1  ' 外部で定義された変数の値を変更
Wend

Debug.Print "Outside while loop, x: " & x  ' xはwhile文の外でも最新の値が反映される

まとめ

  • 条件を満たし続ける場合、意図しない無限ループに陥る可能性があり、プログラムがフリーズしたり処理が停止したりする問題が発生する。
  • 初期条件はループが始まる前に設定され、ループ内での条件更新はループが正しく終了するために重要。
  • 条件式が真偽どちらでも良い場合、ループは一度も実行されない可能性がある。条件式が初めから条件を満たさない場合、ループ内の処理はスキップされる。
  • 外部で定義された変数は、while文内で参照および更新されることができ、その変更はループの外でも反映される。

Follow me!

-Excel VBA
-,

PAGE TOP