何度でも、何度でも ~繰り返し処理:For next~
立ち上がり呼ぶんですあなたの名前を声が枯れるまで。
今回はいよいよ繰り返し処理の記事を書きます。
タイトルにあるとおり、同じ処理を何度も何度も行うVBAの記述です。
以前書いた変数とif文による条件分岐、そして今回の繰り返し処理は、定型業務の自動化には必須の要点といえるでしょう。
【説明:繰返し処理】
前回の成績判定を例にとりましょう。
通常、講義というからには受講生は複数いるものですね。一人しかいないものはもはや講義とは言いません。また、人数が少ないならばそもそもそんな成績判定ツールを作成する必要はないでしょう。
そう、多「数」の受講生に対して、「条件」に応じた判定を、「繰り返す」必要がある、というのがこういった業務の常でしょう。
それをVBAマクロで実現するための記述のひとつが、「For ~ next 」構文です。
【説明:For ~ next 構文】
For next構文の形は以下の通りです。
For カウント変数 = 始点 to 終点 (step カウント間隔)
繰返す処理
Next 変数
カウント変数とは、繰り返しの範囲を指定するための変数で、事前に宣言しておく必要があります。何でもいいですが、「i」がよく使われます。
この構文を用いると、繰返す処理を行ってNextに到達すると、カウント変数がstepの数だけ増減し、繰返す処理部分が再び実行されます。stepを省略すると変数は1ずつ足されます。カウント変数が終点の数値になると、Nextは実行されず、繰返し処理が修了します。
例文を書いてみましょう。
Dim i
For i = 1 to 10
Cells(1,i) = i * i
Next i
実行すると、1行目に1~10までの二乗がそれぞれ入力されます。
セル番地にカウント変数を入れることによって、繰返す回数ごとに入力セルを変えることもできます。成績判定の例で言えば、リスト内の受講生の成績を順番に入力する、といった感じですね。
【説明:For Nextの入れ子】
if文と同様、For Nextも入れ子にすることができます。こんな感じです。
For i = 1 to 10
For j = 1 to 10
Cells(i, j) = i * j
Next j
Next i
実行すると百マス計算ができます。
ロジックの構造としては、
・iが1のときにjについて1から10までの間繰り返し、
・iを1増やしてj=1 to 10の繰り返し・・・
って感じですね。
エクセルのワークシートは2次元なので、For Nextの入れ子は結構よく使います。
【実践:成績判定(多数)】
おそらく、今まで紹介してきた中で一番実践的なVBAマクロになると思います。
if文のときの設定を引き継ぎまして、以下のようなエクセルファイルを想定します。
・A~D列に受講生の「ID」「氏名」「課題」「得点」がそれぞれ入力されている。先頭行はタイトル行で、データは2行目から下。
・E列に「修了判定」の欄があり、マクロを実行すると判定が入力される。
・判定基準は前回の記事を見てね
では、参りましょう。
sub 一斉成績判定()
Dim task, score, i
For i = 2 to 101 '受講生が100人の場合
task = cells( i, 3) ‘提出なら1、未提出は0として入力する。
score = cells( i,4)
if task = 1 then
if score >= 80 then
cells( i, 5) = “A”
else
if score >= 50 then
cells( i, 5) = "B"
else
cells( i, 5) = "C"
end if
end if
else
cells( i,5) = "未修"
end if
Next i
end sub
こんな感じです。
一番実践的といいましたが何のことはなく、ただFor Next文の中に成績判定のif文を入れ子にして、判定の出力先セルの番地をいじっただけです。
For Next文を使うときは、こんな風に個別のデータにどういう処理をするかをきちんと組んだ後に、出力先のセル番地をカウント変数に変えると効果的に文を記述できます。
さて、ようやく実践的なものが組めましたので、気になる時間を計測してみました。
上記のマクロ、実行すると、約0.2秒で完了します。
もう一度言います。0.2秒です。
念のためもう一回言いましょうか。0.2秒です。
※追記。PCの性能や実行時の作業状態などで変わります。後にやったら.06~.07秒でした。
自分でやったらどれだけかかるか想像してみてください。
おそらく1人分入力するのですら、速くても5秒くらいじゃないでしょうか。
おそらくエクセルに詳しい人なら、こんなん関数使えば良いじゃん、と思うでしょう。それも正しいです。早けりゃ何でも良いんです。
が、より複雑な操作を自動化するとなると、セルに関数を入力する操作では限界があります。そう言った複雑な操作でも、マクロを組めば実装することができます。極論言えばエクセル上で行える操作は何でも出来ます。
初めてこれを組めた時は、そりゃあもう感動しました。これからマクロを組もうかと思ってる人達は、是非この感覚を掴んで頂きたい!と思います。
というわけで今回はここまで。
追伸
この記事なプロシージャをVBEにベタ張りすると、空白が文字列変換されてるらしくすこし変な文が入ったりするので気をつけてください。
習得するためにも、自分でタイプしてみるのをお勧めします。
また、実行時の秒数ですが、PC環境や使用メモリ状況などで変わるようです。先ほどやってみたら0.06~0.07秒でした。 ちなみに私の使っているPCは購入からそろそろ3年経つ化石ノートといっていい部類のものです。一応本文中でも訂正しておきます。