繰り返し処理(ループ処理)のうちの、『条件を先にみて、それが成立しない間、ある処理を実行する」タイプです。
Do Until ・・・ Loop文の構文は、こうです。
Do Until 条件
繰り返す処理
Loop
クイズマクロを作りましょう。いきなりプログラミングっぽくなりますが、簡単にできます。下記のコードをボタンを押すと動作するようにしてみましょう。
Do Until Range("A1").Value = "東京"
Range("A1").Value = InputBox("日本の首都は?")
Loop
たったの3行です。このクイズは正解の”東京”が入力されるまで、”日本の首都は?”と聞いてきます。
一行ずつ説明しましょう。
Do Until Range("A1").Value = "東京"
セルA1の値が”東京”ではないなら・・・、と言う意味です。よって、次の行は、セルA1の値が”東京”なら、実行されません。Do Until ・・・ Loop文は終わります。
なお、ちょうど対になるDo While・・・ Loop文で同じ意味にしようとすれば、「Do While Range("A1").Value <> "東京"」となります。
Do Untilの方が『セルA1が東京であるという条件が成立しないなら・・・』という意味であるのに対し、Whileの方は、『セルA1が東京でないという条件が成立したら・・・』という意味です。
「意味が一緒なら使い分けはどうするんだ」となりますが、その通りで、この辺り、日本語による作文に似て、センスです。よりそのコードの意図がわかりやすい方を選びましょう。
Range("A1").Value = InputBox("日本の首都は?")
ユーザへ文字の入力を促すInputBoxダイアログを表示し、そこに入力された文字をセルA1に挿入します。
Loop
Do Until ・・・
Loop文の終端です。といっても、あくまで文法上の結びなので、繰り返し(ループ)は、ここで一行目に戻り、再度「Range("A1").Value =
"東京"」という条件が成立していないことを確認しにいきます。
成立していないなら、正解が出ていないので、正解の”東京”が入力されるまで、延々と繰り返し(ループ)します。
A1~A列の終端セルまでを、「太字で、文字色は赤、セルの背景色をグリーン」に変更します。
言い換えると「A1からセルを下に見ていって、セルが空欄でなければ、セルの書式を太字・文字色を赤・背景色をグリーン」にする、ということです。空欄になったら、そこで繰り返しは終わります。
コードはこうなるでしょう。
num = 1
Do Until Cells(num, 1) = ""
Cells(num, 1).Font.FontStyle = "太字"
Cells(num, 1).Font.ColorIndex = 3
Cells(num, 1).Interior.ColorIndex = 50
num = num + 1
Loop
一行ずつ説明します。
num = 1
変数numに1をセットします。
Do Until Cells(num, 1) = ""
セルA1の値が空欄じゃないなら、という意味です。While文なら「Do While Cells(num, 1) <> ""」となります。
Cells(num, 1).Font.FontStyle = "太字"
Cells(num, 1).Font.ColorIndex = 3
セルのフォントの設定をしています。これは[セルを右クリック] → [セルの書式設定] → [フォントタブ] での設定と同じです。
読めば何となくわかると思いますが、フォントのスタイルとサイズと色を指定しています。
Cells(num, 1).Interior.ColorIndex = 50
セルの網掛けの設定をしています。これは[セルを右クリック] → [セルの書式設定] → [パターンタブ] での設定と同じです。
これも読めば何となくわかると思いますが、セルの色を指定しています。
num = num + 1
変数numに1を足します(インクリメント = 増分)。ここで変数numは2になります。そして、2行目の「Do Until Cells(num, 1) = ""」に戻り、条件を再度判断します。二回目なら「Cells(2, 1).」(=セルA2)が空欄でなければ・・・、の意味になるわけです。以下、順次1が足されます。つまり、A列のセルを下へ一個一個みていき、空欄のセルが見つかったら(つまり、2行目の「Cells(num, 1).Value = ""」という条件が成立しなければ)、そこでループは終わります。
Loop
Do While・・・ Loop文の終端を意味します。
とはいえ、あくまでも構文の結びというだけで、実際は二行目の条件を再度見に行くのは前述の通りです。