ゆんの業務改善ブログ

①生産性向上 ②業務改善 ③自動化 について情報発信しています。VBAプログラムは本当の初心者から他のアプリケーションを呼び出して使う上級者的な使い方まで幅広いレベルで解説していきます。

VBA Do ~ Loopで繰り返しを自在に操る

今回はVBAでDo Loopを使って繰り返しをする方法を解説します。この記事はFor ~ Nextの繰り返しは使ったことがあるものの、Do ~Loopには馴染みが薄いという方を読者に想定しています。

目次

Do ~ Loop を自在に使いこなす

VBAのDo ~ Loopステートメントは自由度の高い繰り返しが可能な制御構文です。さっそく使い方について見ていきましょう。

Do ~ Loopの文法

キホンの4通り

結論から入ります。とりあえずこの4つ、しかも特に上の2つだけ知っておけばOKです。

  • Do While ~ Loop型
Sub DoLoopの繰り返し1()
    
    Dim n As Long
    
    Do While n < 10
        'ここに繰り返す処理
        Debug.Print n '結果:0~9まで表示される
        n = n + 1
    Loop
    
End Sub

まず、条件式のWhileがDoの横に来ているパターンです。While以下の条件が成り立つ間、Do ~ Loopの中身が繰り返されます。ポイントは、条件の中身が判定されてからDo ~ Loopの中身が繰り返されるところです。そのため、今回の例ではn = 10の時は繰り返しの中身が実行されず10がイミディエイトウィンドウに表示されません。

  • Do Until ~ Loop型

次にWhileのところにUntilキーワードを使う場合を見ていきます。上の例と下の例2つだけマスターすればとりあえず、OKです。

Sub DoLoopの繰り返し2()
    
    Dim n As Long
    
    Do Until n >= 10
        'ここに繰り返す処理
        Debug.Print n
        n = n + 1
    Loop
    
End Sub

Untilは「~まで」という意味です。条件を満たさない状態からループが始まり、Until以降の条件を満たすようになるとループを修了します。こちらも条件の中身が判定されたからDo ~ Loopの中身が実行されるかどうかが決まります。

  • Do ~ Loop While型

条件式はLoopの横に書くこともできます。

Sub DoLoopの繰り返し3()
    
    Dim n As Long
    
    Do
        'ここに繰り返す処理
        Debug.Print n
        n = n + 1
    Loop While n < 10
    
End Sub

F8で一行ずつ実行してみるとよくわかりますが、とりあえずDo ~ Loopの中身を実施して、その後、条件式の判定が行われています。今回の例では実行結果は変わりません。しかし、カウントアップする値をセルの行番号にしているときなど、条件式を前にするか後にするかによって、中身が実行されるかどうかが変わる場合があります。

  • Do ~ Loop Until型

条件式をLoopの横に着けるパターンのUntil型です。

Sub DoLoopの繰り返し4()
    
    Dim n As Long
    
    Do
        'ここに繰り返す処理
        Debug.Print n
        n = n + 1
    Loop Until n >= 10
    
End Sub
これがDo ~ Loopの魅力、WhileもUntilも書かない

以上で基本的なDo ~ Loopの使い方は網羅したのですが、条件式を書かないことも可能です。そしてこれこそが、Do ~ Loopのメリットです。

Sub DoLoopの繰り返し5()

    Dim n As Long
    
    Do
        'ここに繰り返す処理
        Debug.Print n
        n = n + 1
        
        If n >= 10 Then
            Exit Do
        End If
        
    Loop

End Sub

Doの横にも、Loopの横にも条件式がありません。その代わり、Do ~ Loopの中にIf文でループを抜ける時の条件を記述して、Exit Doでループを抜けています。If文でループを抜ける条件を記述することができるので、複雑な条件を設定することができます。

For ~ Nextより自由度の高いDo ~ Loop

おなじ繰り返しの制御構文に、For ~ Nextステートメントがあります。こちらはカウント用の変数が一度決めた値になるまで繰り返すという制御構文です。カウントの幅はStepキーワードを使って変更することができますが、ある値になるまで繰り返す、というように、繰り返しの条件の設定の仕方自体に縛りがあります。

一方 Do ~ Loopステートメントはあらかじめループを終える条件をDoのあとやLoopの後の条件式の部分に設定しなくても、Exit Doステートメントを使って自由なタイミングでループを抜けることができます。まさに自在にループを抜けるタイミングを設定することができるため、複雑な処理をしたい時にとても便利です。

例えば、ワークシートの操作で不要な行を削除する、といったような時にはFor ~ Nextでループするよりも、Do ~ Loopで繰り返すほうがやりやすいでしょう。行を削除すると行番号がずれるからです*1

Do ~ Loopの使い方 まとめ

  • Do ~ Loopには基本の4通りの書き方がある
  • WhileもLoopも書かずに、実行内容の中にIf文でループを抜ける条件を設定すると細かい処理が可能となる
  • For ~ Nextでは記述しにくい処理もDo ~ Loopでは簡単に書ける場合がある

Do ~ Loopをマスターしてより自由度の高い繰り返しを実装していきましょう!

<お知らせ>
Excel VBAでクラスやオブジェクトの概念と使い方を丁寧に解説し、ワンランク上の実力を目指すガイドが電子書籍になりました。この本で本物の実力を身に付けて一皮むけてみませんか?
books.rakuten.co.jp

*1:不要な行の削除ではなく、必要な行を別シートに転記の方が望ましい場合が多いように思います。しかし、Do ~ Loopの使い勝手の良さを理解してもらう為に、不要な行を削除することを例として取り上げまし