繰り返し【Do Until】
今回の記事では、前回の【Do While】と似たもので【Do Until】を紹介したいと思います。が、まずは前回の練習問題の答えから
前回の答え
練習問題1.ExcelのA列、どこでもいいので好きな文字を入れてください。
2.自分でDoを使ってA列に入れた文字の上まで何かの文字を入れて繰り返しをしてみてください。
という問題でしたね。
正解のコードはこちらです。
Sub DoWhile()
Dim s As Integer
s = 1
Do While Cells(s, 1).Value <> "↑ここまで↑"
Cells(s, 1).Value = "まだ?"
s = s + 1
Loop
End Sub
では解説していきます。Dim s As Integer
s = 1
ここは何度も説明しているのでわかりますよね?わからない方は変数宣言【Dim】を確認してください。
Do While Cells(s, 1).Value <> "↑ここまで↑"
ここがポイントです。
s行目、1列目のセルの値が「↑ここまで↑」ではない間、繰り返しますよ
という事になります。
もしValue <> "↑ここまで↑"をValue = "↑ここまで↑"にしてしまった場合、セルの値が「↑ここまで↑」の間、処理をするということになりますので、「特定の文字が入ったセルまで、何か文字を入れてください」という今回の問題では不正解になります。
s = s + 1
これはセルの行数を変更する為、変数の値を変えてあげるという処理になります。
今回の答えはA列に「↑ここまで↑」以外の文字があっても、その文字まで繰り返す、という意味でこういう答えにしましたが、単純に「空白のセルの間」という処理にする場合は下記の様にコードを変えてあげることで処理が出来ます。
Sub DoWhile()
Dim s As Integer
s = 1
Do While Cells(s, 1).Value = ""
Cells(s, 1).Value = "まだ?"
s = s + 1
Loop
End Sub
この様に、赤文字の部分を変更してあげる事で「空白の間、処理を実行します」という内容に変わるので、文字が入っていたら繰り返しが終了します。ここまでは大丈夫でしょうか?
VBAを始めたばかりでは難しいとは思いますが、何度も失敗しながら練習して、マスターしてくださいね。
Do Until
では本題の【Do Until】の解説に入りたいと思います。まずはコードの例を見てください。
例)
Sub DoUntil()
Dim s As Integer
s = 1
Do Until s > 10
Cells(s, 1).Value = s
s = s + 1
Loop
End Sub
Dim s As Integer
s = 1
ここは上記でも説明したように、何度も説明しているので、変数宣言【Dim】をご覧ください。Do Until s > 10
ここは「sに代入されてる値が10より大きくなるまで繰り返す」という処理になります。
Untilは、○○になるまで処理を実行というステートメントになります。
Cells(s, 1).Value = s
s = s + 1
こちらは前回の繰り返し【Do While】と同じで「s行目、1列目のセルにsに代入された値を入れる」「sの値を今のsの値+1する」という処理になります。
最後に【Loop】 で閉じて、【Do Until】に戻って処理を実行するかの条件を確認します。
前回のWhileと今回のUntilの違いですが、Whileは前回の練習問題の解説でも説明したように、「〇〇の間、処理を実行します」 という意味になります。
ですが、Untilは「〇〇になるまで、処理を実行します」という意味になるのです。
つまり、【Do Until s > 10】と【Do While s <= 10】は同じ処理を実行します。Untilの場合、「sが10より大きくなるまで=sが11になったら終了」
Whileの場合、「sが10までの間=sが11になったら終了」
という意味になります。
なのでどちらのステートメントを使っても、結果は同じになります。
ただ、例えば「○○の範囲を繰り返し」という時にはWhileを「○○になるまでは繰り返し」という時にはUntilを、という様に自分なりの使い分けを考えてみるのもいいかもしれませんね。
また、前回の繰り返し【Do While】でも説明したようにDoの後にUntilを付けた場合、処理実行前に条件を確認します。
Loopの後にUntilを付けた場合、処理実行後に条件を確認します。
最後に
最後におまけです。前回の練習問題の「特定の文字が入ったセルまで、何か文字を入れてください」という問題を今回解説したUntilを使用して解答した場合、どういうコードになるかを解説します。
Sub 解答()
Dim s As Integer
s = 1
Do Until Cells(s, 1).Value = "↑ここまで↑"
Cells(s, 1).Value = "まだ?"
s = s + 1
Loop
End Sub
この様に、繰り返しの条件が【Do Until Cells(s, 1).Value = "↑ここまで↑"】となります。上でも解説している様に、Untilの場合、「○○になるまで」という意味なので、【s行目、1列目のセルの値が「↑ここまで↑」になるまで繰り返し】という処理をします。