繰り返し処理(ループ処理)のうちの、『条件を先にみて、それが成立する間、ある処理を実行する」タイプです。
Do While ・・・ Loop文の構文は、こうです。
Do While 条件
繰り返す処理
Loop
ボタンを押すとダイアログを表示して、そこに入力されたものをセルA1に挿入するマクロを作りたいと思います。
つまり、”セルA1が空欄の間、ダイアログを表示することを繰り返す”ということです。
このようになるでしょう。
Do While Range("A1").Value = ""
Range("A1").Value = InputBox("A1に入れる文字を入力して下さい")
Loop
一行ずつ説明します。
Do While Range("A1").Value = ""
セルA1の値が空欄なら・・・、という意味です。
小説などで、「何者だ!!」と、「」に囲まれている文字があれば、登場人物のセリフだとわかります。そういう約束事があるからですが、それと同じく、””(ダブルクォーテーション)は、VBAでは、文字列を囲む記号という約束事があります。この場合、ダブルクォーテーションの間には何もないので、空欄と同じ、と解釈されるのです。
Range("A1").Value = InputBox("A1に入れる文字を入力して下さい")
InputBoxダイアログに入力された文字を、セルA1の値としています。
Loop
Do While ・・・ Loop文の終わりです。
さて、ここで、エクセルは、一行目の「Do While Range("A1").Value = ""」に戻ります。そして、この条件を判断します。
InputoBoxダイアログで何か入力して[OK]ボタンを押していれば、もう表示されません。
何も入力しないと、[OK]ボタンを押そうと、[キャンセル]ボタンを押そうと何度でもInputBoxダイアログが表示されます。
A1~A列の終端セルまでを、「太字で、文字色は赤、セルの背景色をグリーン」に変更します。
言い換えると「A1からセルを見ていって、セルが空欄でなければ、セルの書式を太字・文字色を赤・背景色をグリーン」にする、ということです。空欄になったら、そこで繰り返しは終わります。
コードはこうなるでしょう。
num = 1
Do While Cells(num, 1).Value <> ""
Cells(num, 1).Font.FontStyle = "太字"
Cells(num, 1).Font.ColorIndex = 3
Cells(num, 1).Interior.ColorIndex = 50
num = num + 1
Loop
ちと長いですが、Fontほにゃららのところは覚えなくて良いです。ここはDo While ・・・ Loopの構文を覚えるのが目的です。
一行ずつ説明します。
num = 1
変数numに1をセットしています。
Do While Cells(num, 1).Value <> ""
Cellsプロパティは、「Cells(行,列)」という書式でセルを指定します。
一行目で変数numには1をセットしているので、最初の条件判断時はCells(1,1)と同じです。これはRange("A1")と同義です。
繰り返し処理では、”変数に数字をセットして1ずつ増やしていくこと”と、”セルの指定にCellsプロパティを用いること”は定石です。
Rangeプロパティはセルを”A1”などという文字列で指定しますが、Cellsプロパティは「Cells(行番号,列番号)」と、数字で表現するため、セルやシートなどを順番にみていき、ある処理を施すということをする繰り返し処理とは相性が良いのです。
この場合、可読性(読みやすさ)は下がりますが、利便性は上がります。ぜひ慣れて下さい。
さて、話は戻りますが、この行はセルA1が空欄でなければ・・・、という意味です。比較演算子「<>」はノットイコールの意味です。
Cells(num, 1).Font.FontStyle = "太字"
Cells(num, 1).Font.Size = 11
Cells(num, 1).Font.ColorIndex = 3
セルのフォントの設定をしています。これは[セルを右クリック] → [セルの書式設定] → [フォントタブ] での設定と同じです。
読めば何となくわかると思いますが、フォントのスタイルとサイズと色を指定しています。
Cells(num, 1).Interior.ColorIndex = 50
セルの網掛けの設定をしています。これは[セルを右クリック] → [セルの書式設定] → [パターンタブ] での設定と同じです。
これも読めば何となくわかると思いますが、セルの色を指定しています。
num = num + 1
変数numに1を足します(インクリメント = 増分)。ここで変数numは2になります。そして、2行目の「Do While Cells(num, 1).Value <> ""」に戻り、条件を再度判断します。二回目なら「Cells(2, 1).」(=セルA2)が空欄でなければ・・・、の意味になるわけです。以下、順次1が足されます。つまり、A列のセルを下へ一個一個みていき、空欄のセルが見つかったら(つまり、2行目の「Cells(num, 1).Value <> ""」という条件が成立したら)、そこでループは終わります。
Loop
Do While・・・ Loop文の終端を意味します。