Developer

【ExcelVBA】Do Loopステートメント①
2022.01.10
Lv1

【ExcelVBA】Do Loopステートメント①

繰り返し処理

繰り返し処理とは同じ処理を繰り返して行わせることを言います。
処理が繰り返される回数は決まった数の場合もあれば、ある条件を満たすまで繰り返すといったように決まっていない場合もあります。
例としてExcelを使ってなんらかのデータを処理しなければならない場合を考えてみましょう。
あるシートにデータが格納されていて、各行のデータに同じ計算などをして加工する必要があるとします。
数行のデータであれば、1つ1つの行に対して処理を書いても大した手間ではないかもしれません。
しかし何千行とあるデータに対して、処理を1つずつ書いていくのは効率的ではありません。
そういった同じ処理を何度も繰り返すような必要がある際に使用されるのが繰り返し処理となります。
データが存在している間、処理を繰り返すといったようにある条件に基づいて処理を繰り返させます。
繰り返し処理はこれまでに紹介した条件分岐と同様にVBAに限らず、プログラムで非常によく使われるものですので、使いこなせるようにしましょう。
そこで今回は繰り返し処理に関して説明します。

繰り返し処理のためのステートメント

条件分岐を行うためのステートメントはすでにFor Next処理が登場しています。
これ以外にもDo Loopステートメントがあります。
条件分岐の時、IFとSelect Caseはどちらを使ってもほぼ同じことができますといいましたが、For NextとDo Loopに関してもどちらを使用してもほぼ同じことが可能です。
For Nextで書かれた処理をDo Loopで書くこともできますし、その逆も可能です。
すこし違いがありFor Nextは条件の判定の後、処理が行われる前判定でしたが、Do Loopは条件式の各位置により、前判定にも後判定にもできます。
ではDo Loopステートメントの書式についてまず前判定から見ていきましょう。

・前判定

Do While 条件
	処理
Loop

Do Until 条件
	処理
Loop

Doの後に条件を書くことで前判定となります。
Do Loopでは条件を指定する際に、WhileもしくはUntilを使って指定します。
Whileは指定した条件に該当している間、処理を繰り返すようにしたい際に使用します。
まず条件の判定が入り、Whileの場合は条件を満たしている場合に処理が繰り返されます。
Untilは指定した条件に当てはまらない間、処理を繰り返すようにしたい際に使用します。
どちらを使用するにしてもまずは条件の判定から入る形になるため、条件によっては一度も処理が行われない可能性があります。

次に後判定の構文を見てみましょう。
・後判定

Do
	処理
Loop While 条件

Do
	処理
Loop Until 条件

Loopの後ろにWhileやUntilを書くことで後判定となります。
まずは処理が行われてそのあと条件のチェックが行われる形となります。
条件に該当するか同課に関係なく、必ず処理が1回は実行されることになります。

サンプルコード

ではDo Loopのサンプルコードを見てみましょう。
A列に記載されているデータを足し算していきます。ただしマイナスの数値が来た時点で処理を終了することにします。

違いを確認するためにWhileを使用した前判定、Untilを使用した前判定の順にみていきましょう。

・Whileを使用した前判定

Sub VBA基礎第34回_1()
    
    Dim sum As Integer
    Dim i As Integer
    sum = 0
    i = 0
   
    'データを読み込んでいきマイナスの値が出てくるまで足し算しする
    Do While Cells(1 + i, 1) >= 0
        sum = sum + Cells(1 + i, 1)
        i = i + 1
    Loop
    
    'sumを表示
    
    MsgBox "合計は" & vbCrLf & sum
       
End Sub

実行結果は以下のようになります。

Whileで Cells(1 + i, 1) = 0 と指定しています。whileは条件を満たしている間継続されます。
マイナスが来るまで繰り返すということはプラスの数の間繰り返えせばいいということになります。。
よって条件のところにセルの値が0以上であればと記述します。
9、14、5は加算され-8の時点で終了となります。
同様の処理をUntilを使用して書いてみます。

・Untilを使用した前判定

Sub VBA基礎第34回_2()
    
    Dim sum As Integer
    Dim i As Integer
    sum = 0
    i = 0
   
    'データを読み込んでいきマイナスの値が出てくるまで足し算しする
    Do Until Cells(1 + i, 1) < 0
        sum = sum + Cells(1 + i, 1)
        i = i + 1
    Loop
    
    'sumを表示
    
    MsgBox "合計は" & vbCrLf & sum
       
End Sub

先ほどのwhileとは条件のところが異なります。
Untilは条件を満たさない間繰り返すので、マイナスを満たさない間繰り返すという記述をすればよいことになります。
そこで条件としてはセルの値がマイナスであることを指定する必要があるため、 Cells(1 + i, 1) < 0 となります。

・後判定
先ほどの処理の条件の部分を後ろにもっていけば後判定になるでしょうか。
Whileの場合で見てみましょう。

Sub VBA基礎第34回_3()
    
    Dim sum As Integer
    Dim i As Integer
    sum = 0
    i = 0
   
    'データを読み込んでいきマイナスの値が出てくるまで足し算しする
    Do
        sum = sum + Cells(1 + i, 1)
        i = i + 1
    Loop While Cells(1 + i, 1) >= 0
    
    'sumを表示
    
    MsgBox "合計は" & vbCrLf & sum
       
End Sub

条件のところをLoopのところに移動させたコードになっています。
実行すると結果は同じになります。前判定と同じで28となります。
しかし1つ目の数値を9から-9に変えてみると結果が異なります。

VBA基礎第34回_1()とVBA基礎第34回_2()のコードは実行すると以下のようになります。

いきなりマイナスの数値なので最初の判定で偽となってしまうため、処理は全く行われず終了します。そのため合計は0となります。
しかしVBA基礎第34回_3()は以下のような結果になります。

これは判定が後にあるため、最初の-9は足し算が行われてしまい次の数値はプラスの数なのでそのまま処理が進んでしまいます。

このように後判定は、必ず処理が1度行われてしまうため、処理を一度も行わないようなケースでは使えないことになります。
使いわけに関してですが、処理を一度も行わないことがあり得る場合は前判定を使い、処理を一度は行う必要があるものの以降の繰り返しは条件次第というときは後判定を使うというような形になります。
個人的には前判定の方が使用する機会がだいぶ多い気がするため、まずはそちらを使いこなせるようになって、必要に応じて後判定のような別の書き方を使うという形でよいかと思います。

まとめ

繰り返し処理とは同じ処理を繰り返して行わせることを言い、For NextステートメントやDo Loopステートメントなどがあります。
Do Loopでは条件を指定する際に、WhileやUntilを使用します。また条件の記述位置によって前判定と後判定どちらも記述できます。

確認問題

以下の「○○○」に当てはまる文言を解答してください。

・繰り返し処理とは同じ処理を繰り返して行わせることをいいFor Nextや○○〇ステートメントなどがあります。

・条件を指定する際に、○○〇や○○〇を使用します。

答え


・繰り返し処理とは同じ処理を繰り返して行わせることをいいFor NextやDo Loopステートメントなどがあります。
・条件を指定する際に、WhileやUntilを使用します。

次回は、「Do Loopステートメント②」です。

 

連載目次リンク

ExcelVBA 入門 連載目次