初心者のためのExcel エクセルマクロVBA入門-制御構文(For文)
処理を繰り返すFor~Next文
さて、今日はいよいよ繰り返し構文です。前回も出ていましたが、For~Next文というものになります。これはForとNextとの間に書いた命令文を繰り返す、制御構文です。
基本的な書式は
For 変数 = 最初の数 To 最後の数
処理
Next
となります。処理の中には複数の命令文を書いても構いませんし、Forの中で前回やった条件分岐のIF文やSelect文も勿論使えます。さらに言えばFor文の中でさらにFor文を書くことも可能です。この辺は後でちょっとやりますが、とにかくForとNextとの間を繰り返すということが今回の最大のポイントです。
Forの後にある変数は、カウンタと呼ばれる類のもので、最初の数から最後の数まで変数が1ずつ増えていきます。この変数にはよくiとかjとかkとかlが使われます。この辺は以前変数の回でやりましたよね?
( ゚д゚)?1ずつ増える?
詳しくやりましょう。初心者のために書いていますからね。例を出してみます。
Sub test() Dim i As Long '// 1行目から100行目まで繰り返す For i = 1 To 100 Sheet1.Cells(i, 1).Value = "iの値は" & Cstr(i) & "です" '// 実はここでiが1増えるi = i + 1をしている。 Next End Sub
これはSheet1のA列に1行目から100行目に[iの値は1です]と出力するマクロになっています。変数iは最初はi=1なので1から始まります。当然i=0なら0から始まりますしi=2なら2から始まります。するとForの中の命令は1つだけ。
Sheet1.Cells(i, 1).Value = "iの値は" & Cstr(i) & "です"
ですね。この時の「Cells(i, 1)」はiが1なので、Cells(1, 1)となり、A1を指すことになります。そしてNextで折り返してForに戻ります。この時にiには1がプラスされて、iが2となります。するとCells(2, 1)となりますね。
以下、Cells(3, 1)、Cells(4, 1)というように変わっていくわけです。
このように間に書いた処理に変数iを利用するパターンが多いです。
1ずつじゃなくて2ずつ増やしたいんだよね。
そういう時はStepを使います。
For i = 0 To 100 Step 2
とすると、iは0,2,4,6,8,10・・・と順に2ずつ増えて行きます。
途中で抜けるならExit For
何か繰り返しの途中で処理を抜けてしましたいときはExit Forを使います。例えば・・・・
Sub test() Dim i As Long '// 1行目から100行目まで繰り返す For i = 1 To 100 If Sheet1.Cells(i, 1).Value = "×" MsgBox "×があります" '// もう繰り返さないで処理をやめる Exit For End If '// 実はここでiが1増えるi = i + 1をしている。 Next End Sub
というような感じで使います。
何回繰り返したらいいのかわからないんだけど・・・
すごーく多いのがこのパターンです。というかほぼこのパターンしかないと思います。実務で、データの数が毎回同じってことの方がまれだと思います。では、実際にどれだけ繰り返したらいいのか?を「決める」ための技が実はあります。その代表的なものを教えます。For文の基礎はやってもこれを知らないがために結局使えない・・・わからない。という人が多いと思うんですよね。
上から順に全部のデータ埋まっている場合はCountAで行ける。
For i = 1 To Application.WorksheetFunction.CountA(Sheet1.Colums(1))
この形は以前も出してますね。この例ではシートの中のA列に何個データが入っているか?を返すCountAという関数を使っています。Columnsの引数の数字は列と連動しているので、この形だけ覚えて、最終行を知りたい列の値を指定するようにします。
歯抜けのデータならEndプロパティを使う。
For i = 1 To Sheet1.Cells(Rows.Count, 1).End(xlUp)
CountAを使う方法でもいいですが、こちらの方が万能です。こっちを覚えておけば1個前は忘れてもいいです。いや忘れちゃだめだけど。これは、「Rows.Count」でこのシートの最終行を取得しています。つまりエクセル2003なら65536になりますし、2010なら1048576となります。そこから、Endプロパティを使って上に上がった行。という意味なのです。
試にエクセルのシートで、Ctrl+Endキーを押して、その後でCtrl+↑キーを押してみましょう。最後の行へとカーソルがジャンプするはずです。この機能をVBAで書くとこうなる。ということです。
配列を順番に処理したいならUbound関数
For i = 0 To Ubound(配列名)
これも以前配列の時にちょっと書いていますが、Ubound関数は配列の最大のインデックス数を戻り値として返す関数です。これで配列を1つずつ順番に処理したいときに使えますよね。
この3つ。実質2つかな?これだけ形を覚えておけば、きっとFor文は使えるようになると思います。
Forの入れ子構造
最後にこれもよく使うパターンを教えてFor文は終わりです。「Forの入れ子」というもので、先ほど言ったForの中にForがあるパターンです。さっそくコードを書きますと・・・
Sub test() Dim i As Long, j As Long '// 1行目から100行目まで繰り返す For i = 1 To 100 '// さらに1から100列まで繰り返す。 For j = 1 to 100 Sheet1.Cells(i, j).Value = Cstr((i*100) + j) & "号室" Next Next End Sub
これは、100×100のセルに101号室から102、103、となって1100号室となり、最後は100100号室まで部屋番号を入力マクロです。Forの中にForがあるのがわかると思います。このような構造を「入れ子」といい、かっこいい言葉で言えば「ネスト」という言い方をしています。わかりにくいかもしれませんが、ゆっくり1行ずつ追っていけばそんなに複雑でもありません。
- i = 1 の時にjを1~100まで繰り返す。
- i = 2 の時にjを1~100まで繰り返す。
- i = 3 の時にjを1~100まで繰り返す。
- 以下i = 100 まで
というようにして100×100の合計10000回繰り返すマクロということになります。
( ゚д゚)…たったこれだけで10000回・・・
これを見ればFor文がどれだけ強力か?がわかると思います。繰り返し構文はかなり強力です。しかもマクロですので、この作業をわずか数秒で終わらせることができます。
繰り返し過ぎはご用心
実はこのネスト。3個でも4個でもできますが、たとえばこのプログラムを後2つ入れ子にしたらどうなるでしょうか?
100×100×100×100ですので、100000000回です。つまり1億回繰り返すことになります。さすがに1億回も繰り返したら実行が終わるまで時間がかかってしまいます。繰り返しをネストするときには注意が必要ですし、そもそもそのような構造にしないことが、大切です。
え?じゃあ使ってはいけないの?
そんなことはありませんが、入れ子のし過ぎは注意です。倍々ゲームですから。入れ子でよく使うのは表を読み込む時や表に出力する時なんかに使います。縦×横ですね。こういう場合は大いに使って結構です。おおよそ、ネストは2つまで。くらいにしておくと良いと思います。
次回はIfとSelect Caseと同じように繰り返しにもやっぱり別の文があります。それがDo~Loopです。
今日はここまで!
かしこ