初心者のためのExcelマクロ超入門(絶対できるVBA開発)

マクロがまったくわからない人のためにエクセルマクロやVBAについてできるだけわかりやすく書いています。Twitter:@shuhhohhey

初心者のためのExcel(エクセル)マクロVBA入門-プログラミングの基礎8~制御構文(繰り返し)

繰り返し処理はプログラミングのキモ!

やっと繰り返しの構文です。これやらずしてプログラミングは語れません。
Excelで一番多く行っていることは、おそらく「同じことを繰り返す作業」です。
もっとも簡単なものなら、1から順番にナンバリングをするとか、日付を順番にセルに入力するなどですね。
このあたりであれば、マウスのドラッグ一発で問題ないですが、ちょっと複雑な作業を「繰り返す」場合もあります。
例えば、いろんな商品の在庫表があって、商品番号と在庫の表があります。

f:id:drumer2sh:20130725100204p:plain

その表を更新するために売れた商品の在庫を引きますが、それをするには・・・

・商品番号を探して(検索して)
・その商品の在庫から売れた数を引いて入力する

という作業を・・・「売れた商品の種類の数」だけ繰り返します。

これ、、、手でやると思うと、ぞっとしません?
売れた商品の種類が1000種類あったら1000回繰り返すんでしょうか?
プログラムならこういう作業もわずか数秒ですべて行ってくれます。1000件程度の繰り返し処理なら、1秒以下です。
この繰り返し処理をプログラミングでは「ループ処理」と言います。
このループ処理はどの言語でも必ずあります。っていうかないとプログラミング言語として成り立ちません。
「for文」「Do Loop文」などがあります。

プログラミング言語は大体「英語」っぽい

前回でもそうですが、プログラミングって言葉自体は英語っぽいので意外と大丈夫じゃないですか?
この辺の抵抗感がなくなるといいですよね。他にもいろいろと制御文がありますが、大体は英単語そのものか、それに近い形だったりします。プログラミング言語の抵抗感の1つが何が書いてあるかわからない。ですが英語だったら何とかなりませんか?しかも簡単な英単語がほとんどです。

For Next文

前回と同じように一般的な書き方を見てましょう。こうなります。

For 変数 = 初期値 To 終了値 Step ステップ値

	処理A
	
Next

となります。この辺りでちょっと拒否反応が出た方。正解です(笑)この構文結構ごちゃごちゃしてますよね。忘れちゃう場合は、何度でもネットで検索しましょう。そのうち覚えます。
これで、処理Aを変数が初期値から終了値になるまで、ステップ値分繰り返してくれます。またステップ値は省略すると1となります。

For Next文を分解

例を書いた方が早いですね。さっそく例を挙げます。

例)

For i = 1 to 10

	Sheet1.cells(i, 1).value = i

Next

さて、これが例なんですが、いかがでしょうか?書いてしまうと結構シンプルに見えませんか?実行すればセルA1からA10までに数字が1から10まで順番に入ります。
変数iの値が1から始まって10になるまで真ん中のSheet1.Cells(i, 1).Value = iを「繰り返し」実行します。Nextで、iの値が1つ増えます。iは数値ですからCellsプロパティの行の指定にも使われていますね。Rangeでこれをやろうとするとかなり面倒なことになります。座標指定のメリットが大きいですよね。

覚える構文は2つで十分

このほかにも繰り返しには結構な種類がありますが、とりあえずは2つ!

この2つを覚えてしまえば問題ありません。そうです、たった2つです。よかったですね。さて、さっきに書いた、For ~ Nextですが、同じことをDo ~ Loopで書くとこうなります。

i = 1

Do While i < 11

	Sheet1.cells(i, 1).value = i
	i = i + 1

Loop

一番の違いはFor文ではi=i+1と変数に1を足す処理がなかったですがDo Loop文にはあります。For文ではNextステートメントで自動的にiに1加算されますが、Do Loopではそれがないためです。
For文の場合は、繰り返す回数が決まっている場合や、繰り返しの変数…上の例でいうとiですね。これを間の処理で利用しやすい場合によく使われます。
Do Loopの場合はずっと繰り返す処理である特定の条件の場合に処理を終える(ループを抜ける)場合によく使います。

繰り返しをさらに繰り返す「ネスト」

ここまで来たら、ネストも覚えてしまいましょう。ネストとは「入れ子」の意味なんですが、要するに繰り返しの中に繰り返しを入れてしまうことです。

例えば、100行100列のセルすべてに値を入力したい場合はどうでしょう?
100回繰り返す必要があります?いえいえ、100行を100列回ですから10000回繰り返す必要があるわけです。そんな場合はどうするのか?

For i = 1 to 100

	For j = 1 to 100

		sheet1.cells(i, j).value = j
	
	Next
	
Next

となります。Cells(i, j)に注目です。iは行でjが列ですね。これはどういう動きをするかというと・・・

  1. :i=1の時、j=1から100まで繰り返す
  2. :セルがi行、j列目の値をjにする
  3. :i=2の時、j=1から100まで繰り返す
  4. :セルがi行、j列目の値をjにする

・・・

・・・

・・・

最終的にi=100の時、j=1から100まで繰り返す。セルがi行、j列目の値をjとなります。これで一気に100*100のセルに値を入れることができるわけです。今回は数字なので、それこそオートフィルとコピペで出来てしまいますが、これが、もっと複雑な文字列や値だったら・・・
このように、制御構文を使うことで、非常に時間がかかる作業を一瞬でおこなうことができるようになります。Forの中にForを入れてさらにその中にForを・・・ということもできます。

繰り返しのネストには注意が必要

ただし・・・このForのネスト。気を付けなければいけません。あまり、たくさんネストすると、パフォーマンス低下の原因となります。ネストは多くても3つまでとして、それより多くなるような場合は、何か別の実現方法を考えましょう。

次回は、さらにつっこんで、「オブジェクト」についてです!
概念のお話なのでなんとか、分かりやすく説明できるようにします。


かしこ