【VBA入門】ループ処理をマスターしよう!

本ページはプロモーションが含まれています

今回はプログラミングで必ず通る道の一つ、「ループ処理」の解説です

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条件に応じてループを途中で抜ける
Gotocontinueの代替として処理スキップに使用可能

コメント

タイトルとURLをコピーしました