VBAのループの書き方は多すぎる
VBAにはループの書き方がいくつもあります。全部で8種類もあります。
○「For – Next」
○「For Each – Next」
○「Do – Loop」
△「Do While – Loop」
×「Do – Loop While」
×「Do Until – Loop」
×「Do – Loop Until」
×「While – Wend」
はっきり言って多すぎです。こんなにいりませんし、使いません。むしろ同じようなループ処理ごとに「ここはDo While、こっちはDo – Loop Until、こっちはWhile -Wend」などのように違う書き方をされると見る方からすると迷惑でしかありません。
覚えるのはFor、For Each、Do-Loopの3つ。おまけでDo While
VBAのループ構文は極端なことを言えばFor Each以外のどれか1つを覚えておけばコーディングの書き方が違うだけでどんなループでも対応可能です。ただ、1つだけで全部をこなそうとするとコーディングが読みにくくなることもあるため、いくつか絞って覚えておけば十分です。
覚えておくのは上に挙げた8つの中で、○をつけているForとFor EachとDo-Loopの3種類でよく、おまけで、△のDo Whileを覚えておけばもう十分です。
覚えられなければFor Eachは覚えなくてもいいのですが、配列やコレクションをループで回す場合にはとても便利です。また、他のループ構文がループカウンタを回す仕組みになっている中で、For Eachだけがループカウンタを使わない仕組みになっているため、ループカウンタ変数自体が不要になるという利点があります。
×を付けた他のは「なんかそういうのがあったな」程度知ってればOKで、覚える必要ありません。覚える必要がない理由は2つあり、1つはほとんど使われないことと、もう1つは書き方が違うだけでやることは同じだからです。
×を付けた下4つは当サイトのサンプルコードでもおそらく使ってないと思います。理由は先に挙げたFor、For Each、Do-Loopがあれば十分で、他のは使う必要がないからです。
各ループの書き方
上に挙げた8つのループをそれぞれ使ったサンプルです。ループ内の処理はイミディエイトウィンドウにループカウンタを出力しているだけです。
どのループ構文の書き方でも、結果は同じになります。
For文だけは直後のFor Each文で使う配列を作成しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
Sub LoopTest() Dim i '// ループカウンタ Dim ar() '// 配列 '// 配列の領域確保 ReDim ar(3) '// For文:0から3までループ For i = 0 To 3 Debug.Print "For : " & CStr(i) '// 配列に格納 ar(i) = i Next '// For Each文:配列全てをループ For Each i In ar Debug.Print "For Each : " & CStr(i) Next Dim iLen '// 配列要素数 iLen = UBound(ar) '// Do文:0から配列要素数までループ i = 0 Do '// 終了条件(配列要素数以上は終了) If i > iLen Then Exit Do End If Debug.Print "Do : " & CStr(i) i = i + 1 Loop '// Do While文:配列要素数より小さい間ループ i = 0 Do While (i <= iLen) Debug.Print "Do While : " & CStr(i) i = i + 1 Loop '// Do - Loop While文:配列要素数より小さい間ループ(必ず1度は処理される) i = 0 Do Debug.Print "Do - Loop While : " & CStr(i) i = i + 1 Loop While (i <= iLen) '// Do Until文:配列要素数より小さい間ループ i = 0 Do Until (i > iLen) Debug.Print "Do Until : " & CStr(i) i = i + 1 Loop '// Do - Loop Until文:配列要素数より小さい間ループ(必ず1度は処理される) i = 0 Do Debug.Print "Do - Loop Until : " & CStr(i) i = i + 1 Loop Until (i > iLen) '// While文:配列要素数より小さい間ループ i = 0 While (i <= iLen) Debug.Print "While - Wend : " & CStr(i) i = i + 1 Wend End Sub |
実行結果
For : 0
For : 1
For : 2
For : 3
For Each : 0
For Each : 1
For Each : 2
For Each : 3
Do : 0
Do : 1
Do : 2
Do : 3
Do While : 0
Do While : 1
Do While : 2
Do While : 3
Do – Loop While : 0
Do – Loop While : 1
Do – Loop While : 2
Do – Loop While : 3
Do Until : 0
Do Until : 1
Do Until : 2
Do Until : 3
Do – Loop Until : 0
Do – Loop Until : 1
Do – Loop Until : 2
Do – Loop Until : 3
While – Wend : 0
While – Wend : 1
While – Wend : 2
While – Wend : 3
実行結果を見て分かるとおり、0から3を出力するという同じ結果をどのループの書き方でも書くことができます。
処理速度は気にしなくていい
たまに、「For文とDo文はどっちが高速か?」、といった話が出ます。
厳密に言えば、For文はインデックスの計算が行われる分遅いのですが、最近のPCであれば差はないんで気にする必要はありません。