制御構文とステートメントのDo LoopとFor Each Next は、VBA コード組み立てで、回数を決められないループ処理を行いたい時に利用します。
非常に重要なので、しっかり使えるようになりましょう。
以前の記事でも書いたように、エクセルを使った業務で、「ループの処理」コードは重要な実行処理部分です。
今回は、このもう一つの「ループの処理」である「実行回数が限定されないループ処理」を行うコードについて説明します。
こんにちは、じゅんぱ店長(@junpa33)です。
コンテンツ
VBA 回数不定のループ処理はDo LoopとFor Each
ループ処理はコード組み立てで、最も重要な構造です。
ご存じのようにループ処理は同じ計算を何回も行うというわけですが、
ループを終わる判断(命令)はどうなっているのでしょうか?
もし、その命令が間違っていれば、あの恐ろしい「無限地獄」に陥ってしまう事になります。
「For~Next」は以前に説明しましたが、このステートメントは「いつまで」を明記しないと動かない仕組みでした。
今回の「Do Loop」は終了条件としては、「いつまで」ではなく「✖✖の条件に合った時」となります。
ですので、1回でループが終わるかもしれませんし、100回続くかもしれませんし、0回かもしれません。
「永遠に」は嫌ですが、条件の設定が肝になってきます。
Do Loop の使い方には4種類の構文があります。
For Each は、ループの回数指定の要らないFor Next 文になります。
- 条件を満たす間はループする。(While)Do Loop の使い方
- 条件を満たされるまではループする。(Until)Do Loop の使い方
- 入れ子のDo Loop の使い方
- ループ回数指定の要らないFor Eachの使い方
説明に進む前に、例題のベースとする内容(プロシージャー)を解説しておきます。
セルA1からJ10まで使います。この100個のセルに1から99までの数字がランダムに表示されます。
Int関数についてはこの記事を参考にしてください。

Rnd関数についてはこの記事を参考にしてください。

Sub ループテスト() Dim N As Integer, x As Integer, y As Integer For x = 1 To 10 For y = 1 To 10 N = Int(Rnd * 100) Cells(x, y).Value = N Next y Next x End Sub
条件を満たす間はループする。(While)Do Loop の使い方
While は「条件を満たしている間」という意味です。条件を満たさなくなったときにループを抜け出します。
「Activecell」の使い方については、関連記事のこちらを参考にしてください。
Do While …Loop という構文を使う
この構文の場合は、ループ処理に入っていく前に条件の判断を行います。
A列のデータに対してループ処理を行います。
Sub DoWhile_Loop()
Cells(1, 1).Select
Do While ActiveCell.Value > 0 And ActiveCell.Value < 70
ActiveCell.Interior.ColorIndex = 6
ActiveCell.Offset(1).Select
Loop
End Sub
結果を見るとセルA3で値が70より大きくなっていますので、ループから抜け出すことになりました。
Do …Loop Whileという構文を使う
この構文の場合は、ループ処理の後で条件の判断を行います。
同じくA列のデータに対してループ処理を行います。
違いはなに?
「もしA1の値が53でなく73だったら。」
セルA!の値がいきなり条件式に引っかかってきます。
例題1のパターン「Do While …Loop」の場合は、最初にもう条件を満たしていませんので、0回のループ処理で終了します。

例題2のパターン「Do …Loop While」の場合は、条件の判断は1回ループ処理してからですので、セルA!の値は無視されます。次の条件判断で終了します。

条件を満たされるまではループする。(Until)Do Loop の使い方
Until は「条件を満たされるまで」という意味です。条件が満たされるとループを抜け出します。
Do Until …Loop という構文を使う
この構文の場合は、ループ処理に入っていく前に条件の判断を行います。
A列のデータに対してループ処理を行います。
Do …Loop Until という構文を使う
この構文の場合は、ループ処理の後で条件の判断を行います。
A列のデータに対してループ処理を行います。
入れ子のDo Loop の使い方
Do While …Loop を使った入れ子構造を作る
Whileを使った入れ子を作ります。
条件設定ミスで無限ループにならないように注意が必要です。
このケースは、空白セルにも条件設定を行うようにしましょう。
Do Until …Loop を使った入れ子構造を作る
Untilを使った入れ子を作ります。
Sub DoUntil入れ子()
Dim y As Integer
y = 1
Do While y < 11
Cells(1, y).Select
Do Until ActiveCell.Value <= 0 Or ActiveCell.Value > 70
ActiveCell.Interior.ColorIndex = 6
ActiveCell.Offset(1).Select
Loop
y = y + 1
Loop
End Sub
実行結果は、A列からJ列まで、1行目は条件判断がされません。2行目から順に 値 <= 0 または 値 > 70 の条件を満たせばループ処理を終了します。
もし「 値 <= 0 」の条件を記述しなければ、I列は2行目以降が「値が70以下」ですので、条件のストッパーがなくなり無限ループに陥ることになります。
ループ回数指定の要らないFor Eachの使い方
回数を指定しないループ処理のステートメントで、Do Loop の他にも、
「For Each …Next 」のステートメントがあります。
例題として同様にセルの値が 70 よりも小さいセルを黄色に着色します。
回数不定のループ処理 Do LoopとFor Eachまとめ
Do Loop は、条件の判断で処理を終了します。
ですので、条件設定の不備があると無限ループというエラーに陥ってしまいます。細心の注意が必要ということです。
コード組み立ての中で、何かの条件に合うものが出てきたときに、
ループから抜け出せるので、その分次の処理に速く入れるということがあります。
処理データ量が多い時は特に有効だと思います。
For Each は、範囲内のすべてを処理をすれば終了します。
処理データ量が多い時は、全て処理完了しないとループを抜けませんので、もたついた処理の感覚になる時があるかもしれません。
自分的には、実際の使用においては、そこまでの大量のデータ量を扱うこともあまりないので、
「For Next」系のループでコード組を行う事が多いかと思います。
(もたつきも体感レベル程度ですので...)
エクセルVBAのステートメントを学習する
ステートメントは、エクセルVBAコード組み立ての上で、重要な要素となります。
ステートメントをよく知らないと、ほぼコード編成をすることが出来ません。
ですので、基本のステートメントは必ず使えるようにしてお行きましょう。
短期間でエクセルVBAの独学習得を目指したいなら
エクセルVBAを独学する独習方法は、学習者それぞれ十人十色、多種多様と思われます。
けれども、
出来るだけ効率よく学習するためには、いくつかの大切なポイントがあります。
独学でもVBA習得の中級クラスに達するのはそんなに難しいことではありません。
先人が行った勉強方法をあなたがそのまま利用すればよいということです。
独習のための大切な7つのポイントは、上記記事にて解説しています。
独習によるVBA習得のキーワードは、
出来るだけ多くの実例に触れること!
です。
正直、VBAの学習について自分の周りの仕事(業務)からだけ実例を得るのでは効率良い習熟は無理です。
ハッキリ言って、
本当に短い期間でVBA習得を成功させたいなら、今使っている参考書が良書かどうかを判断し、新ツールとしてオンライン学習も取り入れて行うことが、
手っ取り早く短期間習得できるというのは間違いないでしょう。
このサイトでよく使うVBAのコードのトピックを纏めています。
今回の記事はここまでです。 最後までご覧いただき有難うございました。