VBA 回数不定のループ処理はDo LoopとFor Each

vbadoloopeyecatch

制御構文とステートメントの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 文になります。

例題前提条件

説明に進む前に、例題のベースとする内容(プロシージャー)を解説しておきます。

セルA1からJ10まで使います。この100個のセルに1から99までの数字がランダムに表示されます。

MEMO

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

vbaintfixeyecatchInt・Fix・Abs・Sign関数を使って数値の整数部分を完全分離

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

vbarndeyecatchRnd関数で乱数を取得。使えない戻り値を加工して利用度を上げる

例題のベースのコード
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

vbadoloop001

条件を満たす間はループする。(While)Do Loop の使い方

While は「条件を満たしている間」という意味です。条件を満たさなくなったときにループを抜け出します。

「Activecell」の使い方については、関連記事のこちらを参考にしてください。

vbanameeyecatch新規作成ブックとシート。アクティブ状態でやっておくこと

MEMO

Offsetの使い方についてはこの記事を参考にしてください。

vbaoffseteyecatchOffsetプロパティは指定範囲を移動させる

Do While …Loop という構文を使う

この構文の場合は、ループ処理に入っていく前に条件の判断を行います。

A列のデータに対してループ処理を行います。

例題1
この例題の条件設定がセルの「値が70未満」となっています。値の入力の無いセルも条件を満たしてしまいますので「かつ値が0より大きい」としています。

Do Whileコード
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

vbadoloop002

結果を見るとセルA3で値が70より大きくなっていますので、ループから抜け出すことになりました。

Do …Loop Whileという構文を使う

この構文の場合は、ループ処理の後で条件の判断を行います。

同じくA列のデータに対してループ処理を行います。

例題2

Loop Whileコード
Sub Do_LoopWhile()

    Cells(1, 1).Select

    Do
        ActiveCell.Interior.ColorIndex = 6
        ActiveCell.Offset(1).Select
    Loop While ActiveCell.Value > 0 And ActiveCell < 70

End Sub

vbadoloop003

この場合の結果は「Do While …Loop」 と 「Do …Loop While」では同じになりました。

違いはなに?

「もしA1の値が53でなく73だったら。」

セルA!の値がいきなり条件式に引っかかってきます。

例題1のパターン「Do While …Loop」の場合は、最初にもう条件を満たしていませんので、0回のループ処理で終了します。

vbadoloop004

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

vbadoloop005

条件を満たされるまではループする。(Until)Do Loop の使い方

Until は「条件を満たされるまで」という意味です。条件が満たされるとループを抜け出します。

Do Until …Loop という構文を使う

この構文の場合は、ループ処理に入っていく前に条件の判断を行います。

A列のデータに対してループ処理を行います。

例題3

この例題の条件設定がセルの「値が70より大きい場合」となっています。値の入力の無いセルも条件を満たすようにしますので「または値が0以下」としています。

Do Untilコード
Sub DoUntil_Loop()

    Cells(1, 1).Select
    
    Do Until ActiveCell.Value <= 0 Or ActiveCell.Value > 70
        ActiveCell.Interior.ColorIndex = 6
        ActiveCell.Offset(1).Select
    Loop

End Sub

vbadoloop006

セルA3で条件を満たしましたのでループ処理を抜け出しました。

Do …Loop Until という構文を使う

この構文の場合は、ループ処理の後で条件の判断を行います。

A列のデータに対してループ処理を行います。

例題4

Loop Untilコード
Sub Do_LoopUntil()

    Cells(1, 1).Select

    Do
        ActiveCell.Interior.ColorIndex = 6
        ActiveCell.Offset(1).Select
    Loop Until ActiveCell.Value <= 0 Or ActiveCell > 70

End Sub

vbadoloop007

この場合の結果は「Do Until …Loop」 と 「Do …Loop Until」では同じになりました。

入れ子のDo Loop の使い方

Do While …Loop を使った入れ子構造を作る

Whileを使った入れ子を作ります。

条件設定ミスで無限ループにならないように注意が必要です。

このケースは、空白セルにも条件設定を行うようにしましょう。

例題5

Do While 入れ子コード
Sub DoWhile_Loop入れ子()

Dim y As Integer

y = 1

Do While y < 11

    Cells(1, y).Select 

    Do While ActiveCell.Value > 0 And ActiveCell.Value < 70
          ActiveCell.Interior.ColorIndex = 6
          ActiveCell.Offset(1).Select
    Loop
    
    y = y + 1
    
Loop

End Sub

実行結果は、A列からJ列まで、1行目から順に 0<値<70 の範囲内でループ処理を行っていきます。

vbadoloop008

Do Until …Loop を使った入れ子構造を作る

Untilを使った入れ子を作ります。

例題6

Do 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以下」ですので、条件のストッパーがなくなり無限ループに陥ることになります。

vbadoloop009

ループ回数指定の要らないFor Eachの使い方

回数を指定しないループ処理のステートメントで、Do Loop の他にも、

「For Each …Next 」のステートメントがあります。

例題として同様にセルの値が 70 よりも小さいセルを黄色に着色します。

例題7

For Each コード
Sub ForEach()

Dim MyRange As Range

For Each MyRange In Range("A1:J10")
    If MyRange.Value < 70 Then
        MyRange.Interior.ColorIndex = 6
    End If
Next MyRange

End Sub

実行結果として、For Each は範囲内のセル全てについて条件判断を行っていきます。

セルJ10までループ処理を行って終了します。

vbadoloop010

回数不定のループ処理 Do LoopとFor Eachまとめ

Do Loop は、条件の判断で処理を終了します。

ですので、条件設定の不備があると無限ループというエラーに陥ってしまいます。細心の注意が必要ということです。

コード組み立ての中で、何かの条件に合うものが出てきたときに、

ループから抜け出せるので、その分次の処理に速く入れるということがあります。

処理データ量が多い時は特に有効だと思います。

For Each は、範囲内のすべてを処理をすれば終了します。

処理データ量が多い時は、全て処理完了しないとループを抜けませんので、もたついた処理の感覚になる時があるかもしれません。

自分的には、実際の使用においては、そこまでの大量のデータ量を扱うこともあまりないので、

「For Next」系のループでコード組を行う事が多いかと思います。

(もたつきも体感レベル程度ですので...)

エクセルVBAのステートメントを学習する

ステートメントは、エクセルVBAコード組み立ての上で、重要な要素となります。

ステートメントをよく知らないと、ほぼコード編成をすることが出来ません。

ですので、基本のステートメントは必ず使えるようにしてお行きましょう。

短期間でエクセルVBAの独学習得を目指したいなら

エクセルVBAを独学する独習方法は、学習者それぞれ十人十色、多種多様と思われます。

けれども、

出来るだけ効率よく学習するためには、いくつかの大切なポイントがあります。

独学でもVBA習得の中級クラスに達するのはそんなに難しいことではありません。

先人が行った勉強方法をあなたがそのまま利用すればよいということです。

独習のための大切な7つのポイントは、上記記事にて解説しています。

重要ワード

独習によるVBA習得のキーワードは、

出来るだけ多くの実例に触れること!

です。

正直、VBAの学習について自分の周りの仕事(業務)からだけ実例を得るのでは効率良い習熟は無理です。

ハッキリ言って、

本当に短い期間でVBA習得を成功させたいなら、今使っている参考書が良書かどうかを判断し、新ツールとしてオンライン学習も取り入れて行うことが、

手っ取り早く短期間習得できるというのは間違いないでしょう。

このサイトでよく使うVBAのコードのトピックを纏めています。

エクセルVBA最速理解で必要な知識を集めよう!

今回の記事はここまでです。   最後までご覧いただき有難うございました。

<記事内容についての告知>VBAコードの記述記事においては、その記述には細心の注意をしたつもりですが、掲載のVBAコードは動作を保証するものではりません。 あくまでVBAの情報の一例として掲載しています。 掲載のVBAコードのご使用は、自己責任でご判断ください。 万一データ破損等の損害が発生しても当方では責任は負いません