(3) Do While….Loop
Do While….Loopを使って、D列に1から10までの数を入れるマクロを作ります。これもループに入る前に条件調べる方法です。
Dim I As Integer
I = 0
Range("D1").Select
Do While I < 10 …(1)
ActiveCell.Offset(I, 0).Value = 1 + I
I = I + 1
Loop
(1)だけが変わっています。Until I>9では、「変数Iが9より大きくなるまで」でしたが、Whileでは「変数Iが10より小さい間」という意味になります。
ところで、10以下とするにはどうしたらいいでしょう。「I<=10」とすればいいのです。不等号と等号を上下に重ねて書くことができないので、等号を右にして、横に続けて書けばできあがりです。
(2) Do Until….Loop
Do Until….Loopを使って、C列に1から10までの数を入れるマクロを作ります。これは、ループに入る前に条件を調べる方法です。
Dim I As Integer
I = 0
Range("C1").Select
Do Until I > 9 …(1)
ActiveCell.Offset(I, 0).Value = 1 + I …(2)
I = I + 1
Loop …(3)
(1)と(3)以外は、前回のDo….Loop Untilと全く同じです。ここではループに入る前に(1)で変数Iが10以上か調べています。変数Iの値をいろいろ変えて試してみましょう。変数Iが10以上の場合は、ループに入らずに(3)にとんでしまいます。
(2)は、もちろんCells( )でもできます。ぜひ直してみてください。
2 Do….Loop
(1) Do….Loop Until
Do….Loop Untilを使って、B列に1から10までの数を入れるマクロを作ります。これは、少なくとも 1 回はループを実行した後で条件を調べる方法です。
Dim I As Integer
I = 0
Range("B1").Select
Do
ActiveCell.Offset(I, 0).Value = 1 + I …(1)
又は
Cells(I, 1).Value = 0 + I …(2)
I = I + 1 …(3)
Loop Until I > 9 …(4)
Doの前まではFor….Nextと同じです。(1)でも(2)でも同じようにできますが、(2)にした場合は、変数Iの初期値を1にする必要があります。
Do….Loopの場合、何回までということはありませんから、(3)と(4)でいつまで繰り返すかを設定しています。(3)は、1回毎に変数Iの数は増えていきます。
1回目…I=0+1なので1
2回目…I=1+1なので2 という具合になります。
(4)では、「変数Iが9より大きくなるまで繰り返す。」という意味になります。つまり、変数Iが10になると終了することになります。
いろいろなループを使って、列に1~10までの数字を入れるマクロを作ってみましょう。
1 For….Next
For….Nextを使って、A列に1から10までの数を入れるマクロを作ります。
Sub Macro1()
Dim I As Integer
I=0
Range("A1").Select
For I = 1 To 10 …(1)
Cells(I, 1).Value = 0 + I …(2)
Next
End Sub
(1)のCellsは前にも出てきましたが、セルの番地を表しています。Cells(1,1)はセルA1を、Cells(2,1)はセルA2を示します。したがって、(1)のIは0からではなく、1からにします。
(2)を変更してみましょう。(2)をActiveCell.Offset(I, 0).Value = 1 + Iと変えてみましょう。ActiveCell.Offset(行, 列)は、現在のセルから(行、列)ぶん移動するという命令です。実行してみましょう。セルA1が空白になってしまいました。(1)のI=1が悪いようです。I=0としてみましょう。今度はうまくいきました。I=1だと、最初から1行下へ移動するということになっていたからです。Cellsの場合と、ActiveCell.Offset( )の場合では、(1)の変数Iの初期値を変更する必要があります。
今度はちょっといたずらしてみましょう。先ほどのActiveCell.Offset(I, 0).Value = 1 + Iを2つに分けてみましょう。
ActiveCell.Offset(I, 0).Select
ActiveCell.Value = 1 + I
同じようにいくはずなのが、今度はずいぶん間延びしてしまいました。どうしてでしょう。
最初の変数Iは0なので、移動しません。次は、変数Iが1になるので、一つ下へ移動します。ところがその次は、変数Iが2になるので、二つ下へ移動してセルA4になってしまいます。一つとばし、二つとばし、三つとばしと次々に間が空いていってしまいます。原因は、Selectにあります。Selectは辞書では選択するという意味ですが、選択した結果移動してしまいます。アクティブセルを基準にしてIだけ移動するので、次々に間が空いてしまいます。一方ActiveCell.Offset(I, 0).Value = 1 + Iでは、常にセルA1を基準にしているので、間が空きません。
ループの種類
ループ構造も3種類あります。
○Do…Loopは、回数が決まっていない場合に条件が一致している間(真である限り)、ループを何回でも実行する場合に使います。この中にも、Do While…LoopとDo…Loop While、Do Until…LoopとDo…Loop Untilの4種類があります。
*「真」とは、条件に一致していると思っていればいいでしょう。「真」の反対は「偽」となり、それぞれ「True」と「False」となります。また、前にやったようにオン、オフとしても使われます。
○For…Nextは、今まで何回も使ってきたので、前の方を見てください。
○For Each…Nextは、決められた回数分ループを実行するものではなく、セルの範囲内全てに命令を実行するためのループ構造です。
For Each myCell In Range("B2:C7")
命令
Next