[Excel で VBA] For 文による繰り返し

同じ命令を何度も繰り返す際に用いられるのが「For 文」による繰り返しである。
For 文を覚えると、「ある命令を複数回繰り返す」などの処理が簡単に書けるようになる。

For 文

For 文は同じ命令を何度も繰り返す際に用いられる。
例として「『こんにちは』と 5 回 MsgBox で表示するプログラム」から話を始めよう。
意味のない例だと思うかもしれないが、これを理解できないと先に進めない。

VBA で「『こんにちは』と 5 回 MsgBox で表示するプログラム」を実現すると以下のようになる。

Sub prog()
Dim i As Integer

	For i = 1 To 5
		MsgBox "こんにちは"
	Next i
End Sub

さて、上記のプログラムを Excel 上の VBA で実行する方法は 第一回のページで解説したのだった。
このページの指示に従い、上のプログラムをコピーして VBA のプログラム記述欄に貼り付けてみよう。

貼り付け後の状態が下図である。



この状態ができたら、プログラムを実行してみよう。



上図のように、「こんにちは」と表示する MsgBox が現れる。
いつもと違うのは、OK ボタンを一回クリックしてもそれでプログラムが終了しないことである。
想像がつくかもしれないが、この MsgBox は 5 回現れる。すなわち、OK ボタンを五回クリックして初めてプログラムが終了するのである。

上のプログラムで For 文と呼ばれるのは下記の部分である。
変数 i は Integer として定義済みであり、「For i = 1 To 5」と「Next i」の間にはさまれた命令が5回繰り返されるのである。

	For i = 1 To 5
		MsgBox "こんにちは"
	Next i

このとき、変数 i はFor 文の実行中に回数を数えるカウンタのような役割を果たしている。
この変数 i がプログラム実行中にどのように変化するのかを知ることが、For 文の理解に重要である。

そこで、For文の内部における画面表示に、i の値も追加してみよう。
変更すべき MsgBox 文だけ記すと以下のようになる。

		MsgBox i & "番目のこんにちは" 

正しく MsgBox 文を変更したプログラムは下図のようになる。



また、実行したときに現れる MsgBox は以下のようになる。



「1番目の」の部分は、MsgBox の OKボタンをクリックする度に一ずつ増え、最後には「5番目の」と表示される。
すなわち、For 文が命令を5回繰り返す間、変数 i は 1 から 5 まで変化するということである。
それが、「For i = 1 To 5」と「Next i」からなる For 文で実現されることである。
もちろん、i の初期値が 1 で 終了時の値が 5 である。その間はデフォルトで i が 1 ずつ増える。

以上が For 文の基本である。この知識をもとに、簡単な応用を試してみる。
その際、注意して欲しいことが一点ある。それは「これ以後は、For 文の内部に MsgBox 文を書かない」ということである。

For 文の内部とは、「For i = 1 To 5」と「Next i」の間のことである。
ここに MsgBox 文を書くと、OK ボタンを For 文の回数ぶんだけクリックしないとプログラムが終了しないことを体験してもらった。
回数が少ないうちは、For 文内部に MsgBox 文を書くことは For 文の働きを知るための分かりやすい例と言える。

しかしもし、For 文の繰り返し回数が 100 回や 1000 回だったら
OK ボタンを 100 回や 1000 回クリックしなければプログラムが終了しないことは想像できるだろう。
場合によっては Excel を強制終了しなければならなくなる

それを避けるため、「これ以後は、For 文の内部に MsgBox 文を書かない」ことを守って欲しい。


For 文で整数の和を計算

For 文を使ったプログラムの応用例として、 「1 から 10 までの整数の和 s を計算するプログラム」を考えよう。

この問題は、実は数学の公式 s=n(n+1)/2 が分かっているので、わざわざ For 文を使わなくても計算できる。
例えば、1 から 10 までの和は 10×11/2 = 55 である。

しかし、結果が分かっている方が初めての練習問題としては適切であろうから、 当面はこの「1 から 10 までの和の計算」という問題を考えよう。

この問題は

s = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10


と10 個の整数の和を直接書けば答えが計算されることは容易にわかる。

しかし、これが「1 から 100 までの和」、「1 から 1000 までの和」 などの場合はこの記述法ではとても対応しきれない。

この問題をもう少しプログラム的に考えてみよう。
プログラムは、基本的には1命令ずつ実行されるものであるから、
「似た命令の繰り返しで問題をとらえ直す」のが都合良い。

その一例が以下の方法である。

s = 0

s = s + 1
s = s + 2
s = s + 3
s = s + 4
s = s + 5
s = s + 6
s = s + 7
s = s + 8
s = s + 9
s = s + 10


始めに「s = 0」によって s の値を 0 に初期化する。
その後は、「s = s + i」という命令を i が 1 から 10 の範囲で実行している。
これにより s に 1 から 10 の和が格納されるのである。

ただし、「s = s + i」という式の表現は数学では用いられないので違和感がある学生が多いかも知れない。
この式を、「あらかじめ s に 1 が格納された状況で『s = s + 2』を実行した場合」を例に解説したのが下図である。



この式は、右辺の s + 2 (すなわち 1 + 2 = 3) が先に計算され、その後でその結果の 3 が左辺の s に格納される、と考えるとよい。
すなわち、右辺の計算が先で左辺への格納が後、ということである。

さて、以上の考え方を For 文にまとめ、VBA で実行出来る形にすると以下のようになる。
「s = s + i」が i が 1 から 10 まで変化しながら 10 回繰り返されるようプログラムされている。
それにより 1 から 10 までの和が計算されるのである。

Sub prog()
Dim i As Integer
Dim s As Long

	s = 0

	For i = 1 To 10
		s = s + i
	Next i

	MsgBox "sの値は" & s & "です"
End Sub

For 文の仕組みにより、i が 1 から 10 まで変化するわけであるから、 「s = s + i」という命令により、i を s に足し込んでいっているのである。

なお、和 s は大きな値になることがあり得るので、 -32768 ~ 32767 までしか表現できない Integer ではなく、
-2147483648~2147483647の整数を表現できる Long 型とした。

このプログラムを VBA で実行するには、まず先程のプログラムを下記のように「Option Explicit」を残して削除し、



下記のように新しいプログラムを貼り付ければよい。



実行すると以下の MsgBox が現れ、確かに 1 から 10 までの和 55 が計算されていることがわかる。



練習として、以下も実行してみよ。



←条件文の書き方For 文の続き/While 文による繰り返し→

Excel で学ぶ Visual Basic for Applications (VBA)に戻る