繰り返し処理
今回学ぶのは繰り返し処理だ。
前回やった変数は値を自由に出し入れできるが、繰り返し処理を併せて使えば合計を求めるのに使える。
また、データの中から検索文字と合致するのもを見つける時にも使える。
繰り返し処理はいくつかあるが、ここではFor文を解説する。
For文
VBAのFor文の構文は以下のようになる。
For カウンタ変数 = 初期値 To 最終値 Step 間隔
繰り返す処理
Next カウンタ変数
For文では、カウント用のカウンタ変数を用意する必要がある。また、For文は必ず Next と対になる。Next がないとエラーとなる。
カウンタ変数は、整数型の変数で、名前は何でも良い。(但し、命名ルールはある。)
繰り返す処理では、カウンタ変数が初期値からスタートして、Next まで進むと折り返して、カウンタ変数が増加する。
増加量は Step の 間隔で指定できるが、1 ずつ増加するのであれば省略できる。2 を指定すれば 2つずつ増加し、-1とすれば逆方向に繰り返す処理事もできる。但し、その場合は初期値>最終値となるようにしなければうまく行かない。
具体例を見ていこう。
Sub testFor()
Dim i As Long
For i = 1 To 5
Debug.Print i
Next i
End Sub
最初にカウンタ変数を定義している。一般的によく使われるのが i で、これはC言語に由来すると思われる。(インクリメントの i )
次にFor文でカウンタ変数の初期値を 1 、最終値を 5 にしている。1つずつ増加するのであれば、殆どの場合あStep は省略する。
このプログラムでは、繰り返し処理は、i の値をイミディエイトウィンドウに表示するようにしている。
Next でカウンタ変数を増加して再び For文に戻る、最終値でなければ繰り返し処理を実行し、最終値より大きくなるようであれば、処理を終了する。実際に実行すると以下のようになるはずだ。

i を 1つおきに進めるには、For文の最後に Step 2 を付ける。
Sub testFor2()
Dim i As Long
For i = 1 To 5 Step 2
Debug.Print i
Next i
End Sub
(イミディエイトウィンドウに表示された値は、残るので消しておこう。)
実行すると今度は、以下のように表示される。

i を逆方向に進める事もできる。その場合は、初期値と最終値を逆にして、Step -1 とする。
Sub testFor3()
Dim i As Long
For i = 5 To 1 Step -1
Debug.Print i
Next i
End Sub
実行すると以下のようになる。

次は、1~5 までの数字を足していくプログラムを書いてみよう。
Sub testTotal()
Dim i As Long, total As Long
For i = 1 To 5
total = total + i
Next i
Debug.Print "合計は、" & total
End Sub
このプログラムでは、新たに total という変数を用いて合計値を求めている。
ここで重要なのが、以下の部分になる。
total = total + i
この式を詳しく見てみよう。
式の評価
= の式は右辺から左辺に代入されるというのは以前話した通りだ。
この理屈からいくと、 total + i を total に代入している事になる。
total 自身を total に代入するのはおかしな感じがするが、実はこれが成立する。
Sub testTotal()
Dim i As Long, total As Long
For i = 1 To 5
total = total + i
Debug.Print total
Next i
Debug.Print "合計は、" & total
End Sub
代入が行われるのは、右辺の式を評価した後に左辺に代入する事になっている。
つまり total + i とした後に、あらためて total に代入しているわけだ。

分かりやすいようにFor文の途中に、Debug.Print total として途中経過を表示するようにしてみた。
実行すると、結果は以下のようになる。

For文の1回目は、i = 1 で total の初期値は 0 となる。
実は数値型の変数は宣言した段階で、値は 0 で初期化されている。
なので、 total = total + i は、 1 = 0 + 1 となって、最初に 1 が表示されている。
2行目以降は、以下のように続いていく。
3 = 1 + 2
6 = 3 + 3
10 = 6 + 4
15 = 10 + 5
For文を抜けた後も total の値は残っていて最後に、以下のように表示される。
合計は、15
今回のようにFor文の内部で、Debug.Print を使って変数の中身を表示してみるのは覚えておくと良いだろう。
For文で思うようにいかない場合は、こんな感じで確認して原因を探す。
コメント
VBAではプログラムコード中にメモ(コメント)を書く機能があって、(’)アポストロフィから行末までは、プログラムとして実行されなくなる。
この機能を使えば、プログラムの要所にメモ書きを残す事ができる。
また、仮に書いたプログラムをコメントにして無効化するという使い方もよく使われる。
この事を「コメントアウト」と言う。
例をあげてみよう。
Sub testTotal()
Dim i As Long, total As Long
For i = 1 To 5
total = total + i '合計値を計算
'Debug.Print total
Next i
Debug.Print "合計は、" & total
End Sub
これは先程のコードだが、3行目はプログラムの内容を説明するコメントとして使っている。
コメントは書きすぎると煩雑になるので、気を付けたいポイントを明示的に書き残す感じで使う。
4行目に関しては、最初にアポストロフィを付けて、Debug.Print total を無効化している。
このようにコメントとして無効化し外す(アウトする)ことをコメントアウトと言う。
コメントアウトは、プログラムの更新などで変更を分かりやすくするなど前の記述を残しつつ無効化したい場合などに使用したりする。
ブレークポイント
デバッグ作業(不具合を見つける作業)では、プログラムを途中で止めて変数の値を確認するのが基本となる。
その途中で止める位置をブレークポイントと言う。
For文などで繰り返し処理をしていると、途中で変数が自分の思った通りの値になっているか確認したい事が良くある。
ブレークポイントの設置は簡単で、止めたい場所のコードウインドウの左側をクリックすれば良い。
プログラムコードに色が付き、左側に●印が表示される。

変数の宣言部分と空白行はブレークポイントは設置できないので注意しよう。
コメントアウトした所も空白行扱いとなりブレークポイントは設置できない。
では上記のようにブレークポイントを設置して実行してみよう。

実行すると、ブレークポイントの位置でプログラムが停止する。
この時、下のローカルウインドウに変数の値が表示されるので確認してみよう。
(ローカルウインドウが表示されていない場合は、メニューの「表示」にある「ローカルウインドウ」をクリックすると表示される。)
ローカルウインドウでは、i と total は両方とも 0 であることが確認できる。
現段階で停止しているのは、For文を実行する手前なので、i は 0 になる。total に関しても一度も値が代入されていない状態で 0 になっていることがわかる。
では、この状態から1行づつプログラムを実行してみよう。
1行づつプログラムを実行する事をステップ実行という。
ステップ実行するには、F8キーを押す。一回押すと以下のようになるはずだ。

この状態でローカルウインドウを確認してみよう。
For文が1回実行されたので、i は 1 になっている。total は 0 のままだ。黄色の部分は、まだ実行されていない点に注意してほしい。
F8キーを押していくと、Next で For文に戻るのが確認できるだろう。
ローカルウインドウを観察していけば、変数の値が変更されていく様子が確認できる。こうやって変数の値の変化の様子を確認していくのがデバッグ作業の基本だ。
尚、F8 キーでなく、F5キー(実行)を押すと、次のブレークポイントで停止するか最後まで処理が進む。
今回の場合は、For文の繰り返しだけブレークポイントで停止する事になるだろう。色々と試して動作を確認してみると良いだろう。
まとめ
今回は、For文、コメント、ブレークポイントの使い方を解説してみた。
どれもVBAで頻繁に使うので、読んだだけで出来たという気にならずに是非VBEで動作させて確認して欲しい。
できれば、値を変更するなどプログラムを変更して動作確認すれば知識や経験値が増していくと思う。
初心者のうちは特にVBEの扱いに慣れる事が重要になる。
プログラムコードを書いて、ブレークポイントを設置してステップ実行しながら変数の値を確認するという一連の作業を日常としよう!
また、プログラムコードを書くとき、処理がわかりやすくなるように、For文の内部は字下げするようにしよう。
次は条件分岐のIf文を取り上げる。もちろんブレークポイントとステップ実行で動作確認しながら解説していく。
コメント