[目次]この記事のコンテンツ一覧
VBAで繰り返し処理を使うには(For Next)
繰り返し処理は何度も似たようなことをするときに、それらを一気呵成に処理してしまいたいときに使います。Excel VBAには何種類かの繰り返し処理がありますが、
ここではFor Nextステートメントをご紹介します。
For Nextステートメントの文法
For カウンタ変数 = start to end Step step
Next カウンタ変数
文法だけ見ると難しそうですが、けっして難しくはありません。ちょっと慣れれば簡単で、便利で、強力なステートメントです。
シンプルで単純なFor Nextステートメントのサンプルコード
まずはFor Next文やプログラミングにおける繰り返し処理の扱いに慣れるために単純で分かりやすいサンプルコードをご紹介します。
このコードの実行結果は以下の通りです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Sub forNextSample1() 'カウンタ変数「i」を定義 Dim i As Long '処理を10回繰り返す。 For i = 1 To 10 Step 1 'A1からA10に連番を入力する。 Cells(i, 1).Value = i Next i End Sub |
VBAに限らず、JavaやPythonといったその他のプログラミング言語にも共通して言えることですが、For文のカウンタ変数には「i, j, k」を用いるという暗黙のルールがあります。このプログラミング界の鉄の掟を破ってしまった場合……….残念ですが、読者様の身の安全は保障しかねます!!というのは冗談です(笑)。
ですが、プログラミングにとって、とても大切な要素の一つに、「可読性」という概念がございます。要は「コードの読みやすさ」のことです。他人から見て読みやすいコードを書くようにいつも心がけることの大切さは、いくら強調しても、強調しすぎることはありません。また、他人だけではなく、「3カ月後の自分が読んだときに、読みやすいコードにしておく工夫」も超重要です。プログラムの行数が増えれば増えるほど、可読性の重要性は増します!
話がそれてしまったので元に戻します。通常、シンプルで単純なループの場合、カウンタ変数には「i」を利用することになっています。そういう掟です。
カウンタ変数とは繰り返し処理において、「何回繰り返すのか」を管理する変数のことです。
ではサンプルコードのFor文の部分を一行ずつ解説していきますね!
1 |
For i = 1 To 10 Step 1 |
カウンタ変数「i」のスタート値とエンド値を「i = 1 To 10」という部分で定義しています。
Step 1という箇所は「1から10まで1ずつカウンタ変数が増加する」という意味です。もしここで、Step 2という具合に指定すると「1、3、5、7、9」と2ずつカウンタ変数が増加します。そのためStepの指定によっては、「i = 1 To 10」となっていても、10回繰り返されるとは限りません。
1 |
Cells(i, 1).Value = i |
CellsはCells(行番号, 列番号)という書式で、セルを指定するプロパティでしたね。Rangeプロパティとは異なり、数値でセルを指定できるので、カウンタ変数との相性が非常に良いです。
Cells(i, 1)という部分では、行番号に「i」を指定しているので、For Nextステートメントが繰り返される度に、「1,2,3,4,5,6,7,8,9,10」という具合に行番号を動的に指定できます。その結果、A1セルからA10セルを順番に参照することになります。
また「.Value = i」となっていますね。こっちのカウンタ変数「i」も1~10まで順次1ずつ増加していくので、A1セルには1、A2セルには2…A10セルには10が入力されます。
ではこのサンプルコードを少し改造してStepに2を指定してみましょう。どんな実行結果になるでしょうか。
[スポンサードリンク]
Stepを2にした場合のFor Nextのサンプルコード
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Sub forNextSample2() 'カウンタ変数「i」を定義 Dim i As Long 'カウンタ変数「i」は2ずつ増加する。 For i = 1 To 10 Step 2 Cells(i, 1).Value = i Next i End Sub |
Stepは2ですから、iの値は「1, 3, 5, 7, 9」と増えていきますね。9の次は11になってしまうので、繰り返される回数は5回です。
実行結果
では上記の実行結果の空白セルを削除してみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
Sub forNextSample3() 'カウンタ変数「i」を定義 Dim i As Long 'A1セルからA10セルを順番に参照する。 For i = 1 To 10 Step 1 'もし空白セルであれば If Cells(i, 1).Value = "" Then '空白セルを削除する。 Cells(i, 1).Delete End If Next i End Sub |
A1からA10まで順番に見ていって、空白のセルにあたったときだけ、そのセルを削除していますね。Ifステートメントがいまいち理解できていない場合は「If文による条件分岐」を参照していただければと思います。
尚、このサンプルコードの実行結果は以下の通りです。ちゃんと狙い通り空白セルを除去できていますね。
[スポンサードリンク]
For Nextステートメントを入れ子にして使うには
お次は慣れるまではちょっと難しく感じるであろうFor Nextステートメントの使い方です。「For Nextの中に、For Nextを入れる」というループ処理です。こういう処理を「入れ子にする」と言います。とりあえずサンプルコードを見てみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
Sub forNextSample4() 'カウンタ変数「i」を定義 Dim i As Long '2つ目のカウンタ変数「j」を定義。 Dim j As Long For i = 1 To 9 Step 1 For j = 1 To 9 Step 1 Cells(i, j).Value = i * j Next j Next i End Sub |
実はこのサンプルプログラムはVBAで掛け算の九九を実行するプログラムなんです。処理の流れを順番に見ていきましょう。
1週目は、iの値は「1」ですね。で、そのまま2つ目の内側のFor Nextステートメントに入ります。この内側のFor Nextステートメントでは、iの値は1のままで、jの値が1~9まで変化します。すると、「Cells(i, j).Value = i * j」は、Cells(1, 1) = 1 * 1, Cells(1, 2) = 1 * 2,
Cells(1, 3) = 1 * 3…Cells(1, 9) = 1 * 9という具合に変化しのます。
つまりA1、B1、C1…I1に1の段の九九の値が、1,2,3…9という順番に入っていきます。そうして、やっと内側のFor Next文を抜けます。
ポイントは外側のループが1周する際に、必ず、内側のループが9週する点にあります。言い換えれば、内側のループが9週することを、9回繰り返すわけです。
念のため、2週目もトレースしてみましょうかね。今度はiの値は2です。で、内側のループに突入し、これを9周すると、内側のループを抜けます。今度の場合、「Cells(i, j).Value = i * j」の具体的な値は、Cells(2, 1) = 2 * 1, Cells(2, 2) = 2 * 2, Cells(2, 3) = 2 * 3…Cells(2, 9) = 2 * 9という順序で推移します。
つまりA2、B2、C2…I2に2の段の九九が2,4,6…18という順序で入っていくという流れです。
ここまでプログラムの流れをトレースすればもうお分かりですよね。最後はA9、B9、C9…に、9の段の九九の値が9、18、27…と入力されていきます。
従って、実行結果は以下の通りです。
ちゃんと九九の表になっていますね。For Next文の入れ子は慣れるまでややこしいのですが、かなり頻繁に使うことになるので、処理の流れをゆっくり、じっくりトレースして、慣れるようにすると、何かと便利です!
[スポンサードリンク]