Do~Loop文を使った繰り返し処理
EXCEL VBAの基本コードを紹介しています。初心者の方が順番に読んでくだけでVBAの基礎コードが理解出来るようになればなと思って、短めの記事で進めて行きたいと思います!
今回は、”Do~Loop文を使った繰り返し処理”について紹介します!
繰り返し処理
EXCELシートのデータを扱っていると、ある場所からある場所まで同じ処理を繰り返し行う必要がある場合があると思います。
そのような場合、プログラミングを行うことで、大量の同じ処理を自動的に繰り返して行うことが出来るようになります。※ループ処理と言います。
A1セルからA10000セルまで同じ処理を繰り返すなど、人間が人力でやったらものすごい時間がかかる作業などを一瞬で行えるように、プログラミング言語には”繰り返し処理”の構文があります。
“Do~Loop文”は、いくつかある”繰り返し処理”の構文の一つになります。
Do~Loop文
Do~Loop文には、書き方によって4つの種類があります。
- Do While 条件式 ~ Loop
- Do ~ Loop While 条件式
- Do Until 条件式 ~ Loop
- Do ~ Loop Until 条件式
になります。
「While 条件式」「Until 条件式」は繰り返し処理の終了の条件を表しているのですが、書く場所によって微妙に終わり方が異なりますので一つずつ説明したいと思います。
While
「While」を使った終了条件は、「◯◯の間は」という意味なので、条件的には「True」のうちは継続という意味になります。
「While 条件式」を上(Doの次)に書くと、処理的にはループの最初に条件判断を行う流れになります。
処理の流れを図で表すと、次のような感じですね。
Do~Loop文の処理がスタートされると、まず「While 条件式」での条件判定が行われます。条件式が”False”だと処理は終了。条件式が”True”の間は、処理が繰り返し行われるという流れですね。
次の処理で具体的に考えてみましょう。
【処理】
変数xを設定する(初期値は0)
変数xが100以下の場合は継続
処理するごとにxを1増加させる
変数xをイミディエイトウィンドウに表示
コードにすると次のようになります。
Sub test()
Dim x As Integer: x = 0
'Do ~ Loop文
Do While x <= 100
x = x + 1 'xを1増加させる
Debug.Print x
Loop
End Sub
xが「101」になった時点で、Do~Loop文(ループ)から抜ける予定なので、イミディエイトウィンドウの最後の出力は「101」になるはずですね。(100のときが処理の最後で、1プラスされて101になる)
やってみます。
イミディエイトウィンドウに「101」までが表示されました^_^
「While 条件式」を下(Loopの後)に書くと、処理的にはループの最後に条件判断を行う流れになります。
処理の流れを図で表すと、次のような感じですね。
Do~Loop文の処理がスタートされると、まず最初に1回目の処理が行われます。その後、条件式での条件判定が行われ、条件式が”False”だと処理は終了。条件式が”True”の間は、処理が繰り返し行われるという流れですね。
次の処理で具体的に考えてみましょう。
【処理】
変数xを設定する(初期値は0)
処理するごとにxを1増加させる
変数xをイミディエイトウィンドウに表示
変数xが100以下の場合は継続
コードにすると次のようになります。
Sub test()
Dim x As Integer: x = 0
'Do ~ Loop文
Do
x = x + 1 'xを1増加させる
Debug.Print x
Loop While x <= 100
End Sub
これも先程と同じですね。xが「101」になった時点で、Do~Loop文(ループ)から抜ける予定なので、イミディエイトウィンドウの最後の出力は「101」になるはずですね。(100のときが処理の最後で、1プラスされて101になって抜ける)
やってみます。
イミディエイトウィンドウに「101」までが表示されました^_^
何が違うのか?
大きな違いは、最初の一回の処理ですね。
「Do」の後(上)に”While 条件式”が書かれた場合は、最初の1回目の前に条件が”False”になれば処理は一度もされません。
しかし、「Loop」の後(下)に”While 条件式”を書いた場合は、とりあえず最初の1回は処理が行われます。
これ結構使い分けのポイントです。
Until
「Until」を使った終了条件は、「◯◯になるまでは」という意味なので、条件的には「False」のうちは継続という意味になります。
基本的には、”While 条件式”と同じですが、継続の判定が”False”になります。
「Until 条件式」を上(Doの次)に書くと、処理的にはループの最初に条件判断を行う流れになります。
処理の流れを図で表すと、次のような感じですね。
Do~Loop文の処理がスタートされると、条件式での条件判定が行われます。条件式が”True”だと処理は終了。条件式が”False”の間は、処理が繰り返し行われるという流れですね。
次の処理で具体的に考えてみましょう。
【処理】
変数xを設定する(初期値は0)
変数xが100より大きくなるまで継続
処理するごとにxを1増加させる
変数xをイミディエイトウィンドウに表示
コードにすると次のようになります。
Sub test()
Dim x As Integer: x = 0
'Do ~ Loop文
Do Until x > 100
x = x + 1 'xを1増加させる
Debug.Print x
Loop
End Sub
xが「101」になった時点で、Do~Loop文(ループ)から抜ける予定なので、イミディエイトウィンドウの最後の出力は「101」になるはずですね。102になる処理は行われません。
やってみます。
イミディエイトウィンドウに「101」までが表示されました^_^
「Until 条件式」を下(Loopの後)に書くと、処理的にはループの最後に条件判断を行う流れになります。
処理の流れを図で表すと、次のような感じですね。
Do~Loop文の処理がスタートされると、まず最初に1回目の処理が行われます。その後条件式での条件判定が行われ、条件式が”True”だと処理は終了。条件式が”False”の間は、処理が繰り返し行われるという流れですね。
次の処理で具体的に考えてみましょう。
【処理】
変数xを設定する(初期値は0)
処理するごとにxを1増加させる
変数xをイミディエイトウィンドウに表示
変数xが100より大きくなるまで継続
コードにすると次のようになります。
Sub test()
Dim x As Integer: x = 0
'Do ~ Loop文
Do
x = x + 1 'xを1増加させる
Debug.Print x
Loop Until x > 100
End Sub
これも先程と同じですね。xが「101」になった時点で、Do~Loop文(ループ)から抜ける予定なので、イミディエイトウィンドウの最後の出力は「101」になるはずですね。
やってみます。
イミディエイトウィンドウに「101」までが表示されました^_^
何が違うのか?
Untilの場合も大きな違いは、最初の一回ですね。
「Do」の後(上)に”Until 条件式”が書かれた場合は、最初の1回目も条件がTrueになれば処理はされません。
しかし、「Loop」の後(下)に”Until 条件式”を書いた場合は、とりあえず最初の一回は処理が行われます。
無限ループ
Do~Loop文など、ループ処理を行うときは「無限ループ」に注意する必要があります。
例えばこんなコードです。
Sub test()
Dim x As Integer: x = 0
'Do ~ Loop文
Do While x < 100
x = x * 2 'xに2を掛ける
Debug.Print x
Loop
End Sub
何が問題でしょうか?
このコードの場合、変数xの初期値に「0」を設定しているので、処理で「x = x * 2」を何度行っても結果は「0」です。
つまり、永遠に「x<100」の状態が続いてしまうので、無限ループになってしまいます。
無限ループに陥ってしまった場合は、「Escキー」を押すことで、プログラムを強制的にストップさせることができます。出てきた画面で「Debug」ボタンを押して、その後「■」停止ボタンで、プログラムを終了させてください。
Excelの警告メッセージが出た場合は、プログラムを終了させることでも止められます。
実行動画
繰り返し処理のプログラムは思わぬ挙動を引き起こすことが多々ありますので、条件式はしっかりとチェックをしてプログラムを動かしましょう!!
まとめ
Do~Loop文による繰り返し処理(ループ処理)を説明しました。いかがでしたでしょうか?次回も別の繰り返し処理を紹介します!
コメント