Do Whileステートメントは、「条件を満たしている間」同じ処理を行うステートメントです。繰り返し処理という点ではFor〜Nextステートメントと同じ繰り返し処理を行いますが、形式が若干違います。今回はDo Whileステートメントについて学んでいきましょう!
Do Whileステートメントの基本形1
Do Whileステートメントの基本形は、以下のようになっています。
「条件式が成立している間」だけ、Do WhileとLoopに囲まれたブロックの処理が繰り返し実行されます。フローチャートで流れを確認してみましょう。
条件式が成立(True)している間は、繰り返し処理が実行されるという流れがわかっていただけたでしょうか?簡単なサンプルコードを実際に動かして確認してみましょう。
1 2 3 4 5 6 7 8 |
Sub 合言葉チェック Dim 合言葉 As String Do While 合言葉 <> "VBA" 合言葉 = Inputbox("合言葉を入力してください。") Loop Msgbox("正しい合言葉が入力されました!") End Sub |
このSubプロシージャを実行すると、「合言葉を入力してください」というダイアログボックスが表示されます。「合言葉 <> “VBA”」の部分が合言葉を判定している条件式です。正しい合言葉(VBA)が入力されるまで、何回でもダイアログボックスが表示されます。
正しい合言葉が入力されると、ダイアログボックスが消えてアラートダイアログが表示されます。
Do While〜Loopステートメントの基本形2
次はDo Whileステートメントの基本形2です。基本形1と違うのは、条件判定が後に来ているということです。基本形1の場合は1回も処理が実行されずにループが終了するということもありますが、基本形2の場合は「必ず1回」は処理が実行されます。
この基本形2ですが、覚える必要はないと思っています(紹介しておいて言うのもなんですが)。基本形1を使えば、基本形2と同じ処理が実現できるからです。
無限ループに注意!
Do While〜Loopステートメントには、注意すべき点があります。条件を満たしている間は処理が処理が実行されるということは、条件が満たしている場合は処理が「永遠」に実行されるということです。
処理が無限に実行されるループのことを一般的に「無限ループ」と言います。無限ループに入ってしまったプログラムは終了することがありません。上のフローチャートで言うと、条件式の判定と実行部分の矢印が永遠にグルグル回転しているという状況です。
1 2 3 4 5 |
Sub 無限ループ Do While True Debug.Print "無限ループ!" Loop End Sub |
無限ループに陥らないようにするには、どこかのタイミングで条件式を満たさないようにするか、Exit Whileステートメントを使ってループを脱出させるなど、何らかの「停止装置」を組み込む必要があります。無限ループはプログラミングに慣れた人でも時々やってしまうミスです。
1 2 3 4 5 6 7 8 9 10 11 12 |
Sub 無限ループ脱出 Dim i As Integer i = 0 Do While True Debug.Print "無限ループ!" i = i + 1 If i <= 100 Then Exit Do End If Loop Debug.Print "無限ループ脱出に成功!" End Sub |
上の例では、無限ループを脱出させるために変数を用いています。変数が100に達したら、Exit Doステートメントでループを脱出します。