Excel-VBAでプログラムを実装する上で必ず使用すると言ってもいい、「For Next」「Do Until」文の2つがあります。
これらはどちらも、「ループ処理」ともいわれ、何度も同じ処理を繰り返す時に用いられるVBAの構文です。
しかし、実際にこれらを使用してもどちらを使用すればよいのか、わからない方も多いのでは?
そこで、このFor Next文とDo Until文の使い分け方・処理速度について解説していこうと思います。
For文とDo Until文の違いとは
ループ処理には、主に2つの記述方法があります。
【ループ処理】
- For Next
- Do Until
の2つの記述方法あります。
どちらも同じような処理を何度も繰り返すために利用される構文ですが、どちらを利用しても返ってくる答えは同じです。
そのため、For Next と Do Until文の違いというを、記述の仕方が異なるという点だけをしっかり理解しておいて下さい。
最終的な結果は、どちらを活用しても同じですので、お間違えの無いように。
For Next文とDo Until文の使い分けの仕方
それでは、このFor Next と Do Until文は、どのような場合に使い分けを行ったらよいのでしょうか?
2つの使い分け方について
実は、一昔前のOfficeでは、For Next文の中にFor Next文を記述するのは、3つまでが限界で、それ以上はエラーになってしまっていました。しかし今は、Officeの性能がグレードアップしたことで、それほど使い分けをしなくても良くなってきました。
なので、どちらで記述しても間違えではありません。
「一つの構文の中ででFor Next文のを何度も利用することができるのか」という点については、下記を参照ください。
【Excel-VBA】For Next文の中にForNext 文は何回書ける?ループ処理の書き方
あえて分けるなら、自分の好みで使用用途を切り分けよう!
【ループ処理の使用用途の切り分け】
- Do Until文の場合は ⇒「その処理が○○になるまで」
- For Next文の場合は ⇒「その処理が○○と○○の間は」
終わりを指定するかしないかで使い分けるのが理想
このような形で切り分けをしてもよいでしょう。
【ループ処理の使い分けの一例】
- Do Until文は終わりの指定が不要
- For Next文は終わりを指定する必要性がある
但し、これはあくまで「こうするとよい」という理由だけで、特にどちらを使ったからと言って、それが悪いわけではありません。
どちらでも処理は動作しますので、上手に使い分けをしていきましょう。
ちなみに私は、ソースの大半はFor Next文で記述しますので、この辺は好みの部分や処理速度が大きく影響してきます。
ループ処理の記述の仕方の違い
まず、このループ文の記述の仕方にはどんな違いがあるのでしょうか?
同じループ処理であるにも関わらず、コーディングが微妙に異なります。
下記の記述では、カウント数を900000000に設定して、それが何秒間で処理が終わるかを計測したものです。
For Next文のソース記述方法
こちらの記述は、900000000回処理を流した時に何秒後に処理が終わるかを計測したものです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | '------------------------------- 'For文(9秒) '------------------------------- Sub test1() Dim a(1) As Variant Dim intNo As Long a(0) = Time For intNo = 1 To 900000000 Next a(1) = Time MsgBox a(0) MsgBox a(1) End Sub |
Do Until文のソース記述
そして、Do Until文とほとんどソースは変更しなくて平気ですが、一部その値をカウントアップしていく処理は自分で記述する必要性があります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | '------------------------------- 'Do Until 文(20秒) '------------------------------- Sub test2() Dim a(1) As Variant Dim intNo As Long intNo = 0 a(0) = Time Do Until intNo = 900000000 intNo = intNo + 1 Loop a(1) = Time MsgBox a(0) MsgBox a(1) |
For Next文と Do Until文の処理速度計測結果
実際に、この同じ処理をFor Next文と Do Until文で処理時間を計測した結果下記のような結果が算出されました。
・処理速度が早いのは「For Next文」
【2つの計測結果の比較】
このように、Do Until文では、約22秒かかっていたのに対して、 For Next文では、7秒程しかかかっていません。
圧倒的にFor Next文の方が処理速度が速いことがわかりますよね。
この要因として、おそらくDo Until文はカウントする際にカウントアップで数値を変数intNoに入れる計算処理が走ることで、メモリーを消費しているため、ここで処理に差が生まれることが想定されます。
まとめ
For Next文と Do Until文は、同じループ処理とした記述ですが、変数の格納等によってもその処理速度に大きな影響を与えることがわかりました。
あなたは、仕組みを実装する上で、どんなことを創造しながら、仕組みを作りますか?
エンドユーザーの利便性を考えた上で、処理速度という問題は、重要視するべく非常に大切な問題です。
こうしたことも考慮しながら、仕組みづくりを実装できるととてもいいですね。