繰り返しの処理のやり方が分からない。
For-NextやDo-Loopなど、いろいろあってどれをどう書くかごっちゃになる。
そもそも、いつどれを使えばいいかよくわからない。
今回紹介するループ処理は、VBAの中で最も重要と言っても過言ではない処理方法です。ループ処理が使えるからこそ、VBAで業務を時短でき、業務が効率化できるようになります。基本の処理とはいえ、常に使う最重要な考え方となります。
しかしながら、VBAのループ処理には様々な種類があり、それぞれ書き方や用途が違います。初心者のうちは、いつどれを使えばいいのかわからないことが、多い内容です。
今回はそんなループ処理について、初心者が覚えておくべき一つのコードを重点的に解説していきたいと思います。
この記事で、ループ処理の考え方やコードを理解して、VBAを使った効率化を目指してください!
目次
初心者が覚えるのはコレだけでいい!
様々な書き方があるループ処理ですが、初心者が覚えるのは「For~Next」だけでOKです。
なお、ループ処理については、For~Nextのほかに、Do~LoopとFor~Eachの2種類があります。それぞれの用途は次の通りです。
For~Next | 繰り返しの回数が決まっている場合のループ処理 |
Do~Loop | 繰り返しする条件を指定するループ処理 |
For~Each | 配列を使用する場合のループ処理 |
適材適所で使うことで、コードをすっきりさせたり、処理を早くできたりとメリットがあることは確かです。ですが初心者はまず、形が悪くても動くVBAを作ることを目的にするべきです。実際、個人利用のVBAでは、コードが少し汚くても問題なく使用できます。
また、For~Nextでできない処理は基本的にありません。私自身、これまで様々なVBAを作ってきましたが、Do~Loopは使ったことがありません。For~Nextで十分に処理できます。
なので初心者の方は「For~Next」を中心に学び、実践してみることをお勧めします。
コードの形が完璧でなくても、大切なのは動作するVBAを作り出すことです。
書き方の紹介
For~Nextの書き方は次のような形になります。
For 変数 = スタートの数 To ゴールの数
– 処理 —
Next 変数
これで変数の値が、スタートの数からゴールの数まで一つずつ増えながら繰り返されます。
詳しくはサンプルを使って解説します。
※変数の考え方についてはコチラ!
サンプルと使い方
以前作成した、「OutLook一斉送信VBA」を例に解説します。
このVBAでは、宛先・CC・件名・本文が書かれたリスト通りに、メールを作成しています。以下のようなエクセルのリストを使って、VBAで繰り返しの処理を行っています。
VBAでは、この表の内容通りに、上から順番にメールを作成する処理を行っています。この処理を「ループ処理」と言い、For~Nextで動作させることができます。
具体的には、2行目のメールを作ったら、3行目のメールを作って、次に4行目…という風に1行ずつ順番に処理を行っていきます。
これを先ほどの公式に当てはめると、次の形になります。
For i = 2 to Maxrow
※ i 行目のメールを作成する処理
Next i
このループ処理では、iという変数に2~Maxrow(最終行)の数が順番に入っていきます。
2行目のメールを作成する処理が終われば、Next iに入ってiが3になり、次に3行目のメールを作成する処理が始まります。それが終われば、iが4になり4行目の処理を行い、次に5行目、6行目と、iの数が変化することで、処理する行が一つずつ下がっていき、繰り返しのループ処理が行われます。
事前にMaxrowなどで、ゴールとなる値を決めることで、スタートからゴールまで繰り返すコードを組むことができます。(※実際のコードについては、ChatGPTで作成した別記事をご確認ください)
※Maxrow/最終行の取得についてはコチラ!
【応用】ループの中にループを作る
応用となりますが、ループ処理の中にループ処理を作ることができます。
少しややこしいですが使う場面も多いため、サンプルを使って解説します。サンプルとして、データシートの検索を行うVBAを作成しました。
動作としては、会員Noを書いて検索ボタンを押すと、青部分に該当データが表示されるというVBAです。このVBAでは検索用シートのほかにデータの入ったシートがあり、データシートの中から会員NOが一致する情報を抽出しています。
今回のVBAの動作は、分解すると次のようになります。
①データシートの会員Noを上から順番に、一致しているか確認する
②一致していれば、右に書いてあるものを転記していく
この時、①で上から下に動く縦のループ処理を行い、一致したら②で左から右に動く横のループ処理を行っています。
この②のループ処理は、①のループで一致した行数を使って行います。つまり、①のループ処理中に行う処理となり、ループ処理の中で行うループ処理という形になります。
書き方としては、このような形になります。
For = i 2 to Maxrow
※ i 行目の会員Noが検索対象と同じかどうかを確認
※一致していた場合
For x = 2 to 5
※x 列目を転記する(2~5列・B~E列が転記される)
Next x
Next i
このように、縦のループの中で横に移動する場合などに使用されるのが、「ループの中にループを作る処理」になります。
少しややこしいですが、使う場面の多いコードになる為、ぜひ活用してみてください。
※実際のコード
Sub kensaku()
'変数宣言
Dim I As Long
Dim y As Long
Dim Target As String
Dim MacroSheet As Object
Dim DataSheet As Object
Dim Maxrow As Long
'シートの代入
Set MacroSheet = Worksheets("Macro")
Set DataSheet = Worksheets("DataSheet")
'ターゲット/Maxrowの代入
Target = MacroSheet.Range("A3")
Maxrow = DataSheet.Range("A1").End(xlDown).Row
'ループ処理
For I = 2 To Maxrow
If DataSheet.Range("A" & I) = Target Then
For x = 2 To 5
MacroSheet.Cells(3, x) = DataSheet.Cells(I, x)
Next x
End If
Next I
End Sub
【応用】途中で抜けるときはとりあえずExit
先ほどの会員NOを探すVBAでは、会員Noが一度見つかっても最終行まで検索を続けてしまいます。VBAの内容によっては、この不要な検索が原因で動作が重くなることもあります。
そもそもこのVBA、一度会員NOが見つかったら、ループ処理をやめれば問題がありませんよね。そういった時に使うのがExitです。
Exitを入れることで、ループ処理を途中でやめることができます。今回の場合、検索NOが見つかり、転記が終わればループから出たいので、転記のコードの後ろに、Exitを入れます。
今回はForから抜けたいので、Exitの後ろにForをつけて、「Exit For」と入力します。
'ループ処理
For I = 2 To Maxrow
If DataSheet.Range("A" & I) = Target Then
For x = 2 To 5
MacroSheet.Cells(3, x) = DataSheet.Cells(I, x)
Next x
<strong><span class="marker-under">Exit For</span></strong>
End If
Next I
なお、Exitは後ろにSubをつければこのVBA自体を終了させることもできます。ループ処理を抜け出す方法は、Exit以外にもGO TOという方法もありますが、Exit Forで抜けられるということだけ覚えていれば基本的に問題はありません。
【応用】「1ずつ上げる」以外はStepで
これまでのループ処理はすべて、スタートの値からゴールの値まで、値を1ずつ増やしていくという処理をしてきました。
ただ、1つ飛ばし(2ずつ増やす)や1つずつ減らしていく場合は、Stepを使って指示を行います。
For 変数 = スタートの数 To ゴールの数 Step 増やす(減らす)数
– 処理 —
Next 変数
変更する部分は1行目の「For」の部分のみです。具体的には以下のような書き方になります。
1つ飛ばし(2ずつ増やす)場合
→For 変数 = スタートの数 To ゴールの数 Step 2
1ずつ減らす場合
→For 変数 = スタートの数 To ゴールの数 Step -1
確認はステップインを活用!
最後に完成したコードは、ステップインで確認を行いましょう。ステップインは一行ずつコードを実行する方法で、For~Nextでどのように変数が変わっているかを、目で見て確認することができます。
確認方法はVBAの標準モジュールの画面で、実行したいVBAのsubの中をどこかクリックして、「F8」を押します。
そこからF8を押すたびに、一行ずつコードが実行されていきます。
コード実行中にマウスのカーソルを、変数の部分に充てると、今その変数に何が入っているかを見る事もできる為、動作の確認にはうってつけの機能です。
動作が止まらなくなったらまず「Esc」
コードを実行すると、無限ループなどによって動作が止まらなくなることがあります。
その時の強制終了方法は次の二つです。
①「Esc」を押す。
②それでも止まらなければ、タスクマネージャーから強制終了させる
おおよそのキーボードの左上にある、Escキーを押すことで、VBAの動作を停止させることができます。いつまでたっても動作が終わらなかったり、無限ループに入っている状態の時は、まずEscキーを入力してみてください。
それでも止まらない場合は、タスクマネージャーから強制終了させる以外に方法がありません。データが消えてしまうことにもなりますので、VBA実行前には必ず保存するように心がけましょう。
さいごに
今回はループ処理の解説として、For~Nextの使い方を紹介しました。
他のサイトや教本では、Do~LoopとFor~Nextを場面ごとに使い分けることが推奨されていることが殆どです。中には、すべてFor~Nextでコードを書くことが邪道のように扱われていることもあります。
ですが動きは同じですし、できないことはありません。特に初心者の場合は、きれいでわかりやすいコードを入念に書くよりも、動くコードをたくさん書く方が、スキルアップや効率化につながます。そもそもどれだけ注意をしていても、初心者のうちからきれいなコードなんて組めません。
最低限の知識で、動くコードをたくさん書くことが、VBA習得の一番の近道です。
これらを踏まえたおすすめの勉強法についても紹介していますので、是非合わせて確認してみてください!
コメント