今回はプログラミングで必ず通る道の一つ、「ループ処理」の解説です
Excelにおいては「一行ずつ~」とか「シートを左から~」など順番に処理をする場合や「一番下の行になるまで~」のように条件を満たすまで繰り返し処理を行うことが多くあります
各言この記事では、VBAのループ処理について、初心者にもわかりやすく丁寧に解説していきます
ループ処理とは
ループ処理とは、”指定条件の間“や”条件を満たすまで“繰り返し実行する仕組みのことです
例えば、セルA1からA10までの値を順番に読み取る、リストの中から条件に合うデータだけを抽出する、などの場面で使われます
VBAにはいくつかのループ構文があり、目的や処理対象に応じて使い分けることが重要です
For Next について
For Nextは、指定した回数だけ繰り返すループ処理の中では基本的かつ他の言語でも多く使われる処理です
VBAでは
For {変数} To {初期値} To {上限} [Step {加算数}] ・・・処理・・・ Next [{変数}]
の形で記載し、{変数}は数値になるので必然的にLong型やInteger型などを選択することに
※[]内は省略可能
↓↓のサンプルコードは、1から10までの数字をカウンター変数を使って順番に表示します
Dim i As Long
For i = 1 To 10
Debug.Print i
Next i
Stepで増減を調整
Stepは指定しなければ1が適用されますが、負の値含め指定すると変動幅を調整できます
例えば「奇数行だけ~」などの制御であれば Step 2 を指定することで条件分岐しなくても奇数だけのループが実現できます
For i = 1 To 10 Step 2
Debug.Print i ' ---1,3,5,7,9
Next i
For Each Next について
For Each Nextは、コレクション(複数の要素を持つオブジェクト)を対象にしたループです
For Each {変数} In {オブジェクト} ・・・処理・・・ Next [{変数}]
で記載しますがこちらは変数をVariant型で指定するのがVBAでのお作法
活用シーンはオブジェクトを取り扱う際が多いと思うのですが、覚え始めの頃はオブジェクト自体そこまで利用しないと思うので個人的には中級者以上向けかなと思っています
↓のサンプルでは、A1からA10までのセルの値を順番に表示します
For Eachは、対象の要素数が不定の場合や、オブジェクトを扱うときに特に有効です
Dim cell As Range
For Each cell In Range("A1:A10")
Debug.Print cell.Value
Next cell
配列などFor Nextで代替できる(時もある)
VBAにはLBound、UBoundでインデックスの最小値と最大値を取得することができます
配列であればインデックスを順番に指定すれば代替になるのでこの方法でOK
↓↓はどちらも同じ結果になります
Dim sample As Variant
Dim v As Variant
sample = Array("a", "b", "c", "d", "e")
For Each v In sample
Debug.Print v
Next
Dim i As Long
For i = LBound(sample) To UBound(sample)
Debug.Print sample(i)
Next
Do Loop について
Do Loopは、条件に応じて繰り返すループです
繰り返しの終了条件を柔軟に設定できるため、より複雑な処理に向いていてFor Nextならサンプルの通りDo Loopでの代替も可能
Do ・・・処理・・・Loop
だけですが細々あるので以降詳細です
Whileを使う場合
Whileは「条件が真の間、繰り返す」という意味です
これが一番の基本形というか、Do Loopの8割くらいはこの記載になるはず
Dim i As Integer
i = 1
Do While i <= 10
Debug.Print i
i = i + 1
Loop
Untilを使う場合
Untilは「条件が偽の間、繰り返す」という意味で、Whileと逆の考え方になります
あえてUntilを使うシーンはあまりないと思うので誰かが書いたプログラムを読み解くための知識程度に
Dim i As Integer
i = 1
Do Until i > 10
Debug.Print i
i = i + 1
Loop
Doの後ろ・Loopの後ろ、どちらでも条件指定可能
Doの後ろにWhile/Untilを記載するのが基本形ですが、Loopの後ろでも動作します
初回は無条件で処理をする場合には便利ですが、条件で何とかなるケースがほぼだと思うのでこちらも知識程度に
Do While i <= 10
' 処理
Loop
Do
' 処理
Loop While i <= 10
条件分岐とExitでループを抜ける場合
While/Untilを使わなくてもIfやSelect Caseの条件分岐の中でExit Doを使えば、条件に応じてループの途中で抜けることができます
が、条件に合致しないと無限ループに陥ることもあるのであまり推奨はしていません
Do
If 条件 Then Exit Do
' 処理
Loop
While WendはDo While Loopと同じ
古い構文でWhile WendはなるものがあってDo While Loopと同じ動作をします
あえて使う必要もないのでこれまた知識程度に
Dim i As Integer
i = 1
While i <= 10
Debug.Print i
i = i + 1
Wend
Exitを使った途中抜け
途中でも紹介しましたがExit For/Doで途中抜けすることもできます(他の言語ではbreakが多いです)
このコードは、1〜4までを表示し、5でループを終了します
For i = 1 To 10
If i = 5 Then Exit For
Debug.Print i
Next i
他言語にあるContinueについて
他の言語にはcontinueというキーワードがあり、「その回の処理をスキップして次のループへ進む」ことができます
VBAにはcontinueがありませんが、GoToを使って似たような動作を実現できます
このコードは、5のときだけ処理をスキップしますがGotoは可読性が下がるため、使用は最小限に留めるのがベター
For i = 1 To 10
If i = 5 Then GoTo Skip
Debug.Print i
Skip:
Next i
まとめ
ループ処理はVBAの基礎中の基礎ですが、奥が深く、使いこなすことで業務効率が劇的に向上しますので是非マスターしましょう!
構文 | 用途・特徴 |
---|---|
For Next | 回数が決まっている繰り返し処理に最適 |
For Each | コレクションやセル範囲などの要素を順に処理 |
Do While/Until | 条件に応じた柔軟な繰り返し処理が可能 |
Exit For/Do | 条件に応じてループを途中で抜ける |
Goto | continueの代替として処理スキップに使用可能 |
コメント