エクセルマクロVBAでは、ForNext文を頻繁に使います。
実際、このFor next文を自在に使えると、マクロで出来ることの幅が広がります。
このページではVBAでの自動化に必須であるForNext文について、事例を使って紹介していきます。
目次
- 1 VBAのForNext文とは
- 2 ForNext文1|VBAでの繰り返しの基本形
- 3 ForNext文2|条件分岐「If文」との組み合わせ
- 4 ForNext文3|2つ以上の複数のForを入れ子(ネスト)にする
- 5 ForNext文4|自動取得した最終行までプログラムを繰り返す
- 6 ForNext文5|「スキップして抜ける」「次に進む」
- 7 ForNext文6|Step-1で逆からカウントダウンで繰り返す
- 8 ForNext文7|Stepの数を変えて複数カウントアップする
- 9 ForNext文8|配列との組み合わせ
- 10 ForNext文9|シートを全て繰り返す
- 11 ForNextを実践でつかう
- 12 Excel VBAについて詳しく理解したいなら
VBAのForNext文とは
VBAで使用されるFor next文は以下の構文で示されます。
1 2 3 4 |
'一般式 For カウンター = 開始 To 終了 繰り返し処理したい内容 Next |
上記のプログラムは「”開始”から”終了”まで、”繰り返し処理したい内容”を実行する」ということです。
この基本構文をもとに事例を使って、解説していきます。
紹介するForNextの事例
事例2|For Next文でカウントアップ
事例3|For Next文とIf文の組み合わせ
事例4|For Next文とIf文とカウントアップ
事例5|For Next文の2つ以上(複数)の組み合わせ
事例6|For Next文で最終行を自動取得する
事例7|For Next文を1度スキップしてループ省略(Continue)
事例8|For Next文から抜けて次に進む(Exit For)
事例9|For Next文をStep-1(逆順に後ろから回す)
事例10|For Next文をStep 3 (3つずつ足す)
事例11|For Next文をLboundとUboundで回す
事例12|For Next文をworksheet.countで回す
それでは、一つずつ紹介していきます。
ForNext文1|VBAでの繰り返しの基本形
VBAで繰り返しプログラムの基本を紹介します。
事例2|For Next文でカウントアップ
以下でプログラムの解説をします。
事例1|For Next文で文字列を入力
ForNext文を使って、「セルA1」から「セルA10」まで文字列「a」を入力する事例です。
1 2 3 4 5 6 |
Sub Sample1() Dim i As Long For i = 1 To 10 Range("A" & i).Value = "a" Next End Sub |
マクロ実行前
マクロ実行後
重要なのは4行目の 「For = i 1 to 10」と5行目の「Range(“A” & i).Value」です。
まず、4行目が i=1,2,3,・・・,10と加算しながら繰り返すプログラムを意味します。
一方、5行目の Range(“A” & i).Value はセルAi の値を意味します。
したがって、4行目と5行目を組み合わせると、セルA1、セルA2、・・・セルA10と増やすことができます。
その結果、「セルA1からセルA10まで”a”を入力する」となります。
事例2|For Next文でカウントアップ
ForNext文を使って数値をカウントアップしていく事例を紹介します。
ForNext文を使って、「セルA1」から「セルA10」まで i を入力する事例です。
i は1から10まで1ずつ増えていくので、セルA1には1、セルA2には2といったように、セル行数と出力される値が同時に増えていきます。
1 2 3 4 5 6 7 8 |
Option Explicit Sub Sample2() Dim i As Long For i = 1 To 10 Range("A" & i).Value = i Next End Sub |
重要なのは、5行目の「Range(“A” & i).Value = i」です。
左辺が「セルA1、セルA2、・・・セルA10」と繰り返しが進むと同時に、右辺も「i = 1,2,・・・10」と繰り返します。
したがって、「セルA1には”1″を入力」、「セルA2には”2″を入力」・・・「セルA10には”10″を入力」となります。
マクロ実行前
マクロ実行後
ForNext文2|条件分岐「If文」との組み合わせ
「For next文」と「If文」の組み合わせについて解説します。
For next文を実践で使う場合、IF文と組み合わせて使うことは非常に多いです。ぜひ覚えておくことをお勧めします。
事例4|For Next文とIf文とカウントアップ
以下でプログラムの解説をします。
事例3|For Next文とIf文の組み合わせ
2で割ったときの余りが 0(2の倍数)ならば、A列に”a”を出力するプログラムです。
1 2 3 4 5 6 7 8 9 10 |
Option Explicit Sub Sample3() Dim i As Long For i = 1 To 10 If i Mod 2 = 0 Then Range("A" & i).Value = "a" End If Next End Sub |
重要なのは、5行目の「If i Mod 2 = 0 Then」です。
これは、「もし、i を2で割ったときの余りが 0(2の倍数)ならば」という意味です。
したがって、2の倍数ならば、6行目の「Range(“A” & i).Value = “a”」が実行されます。
逆に2の倍数でないならば、6行目の「Range(“A” & i).Value = “a”」が実行されません。
マクロ実行前
マクロ実行後
補足|Modとは、余りを示す演算子
Sample3の5行目の「Mod」は余りを示す演算子です。
「10 Mod 2」であれば余りは0です。2で割ると、5と余り0だからです。
一方で、「3 Mod 2」であれば、余りは1です。2で割ると、余りが1になるからです。
つまり5行目の「If i Mod 2 = 0 then」とは、2で割り切れるなら「True」で、6行目が実行されます
逆に、2で割り切れないなら「False」で、6行目が実行されません。
事例4|For Next文とIf文とカウントアップ
2で割ったときの余りが 0(2の倍数)ならば、A列に数値を入れるプログラムです。
ただし、A列に入る数値をカウントアップ(+1)させます。
1 2 3 4 5 6 7 8 9 10 11 12 |
Option Explicit Sub Sample4() Dim i As Long, k As Long k = 1 For i = 1 To 10 If i Mod 2 = 0 Then Range("A" & i).Value = k k = k + 1 End If Next End Sub |
重要なのは、5行目の「k=1」と10行目の「k=k+1」です。
5行目でk=1と設定しておかないと、k=0と自動で認識されてしまいます。
10行目は、8行目の「If i Mod 2 = 0 Then」でTrueの場合に実行されます。
したがって、事例4では i が2で割り切れる数字になるたびに、kに1ずつ加算されていきます。
ただし、5行目でk=1としているので、k=1からのスタートになります。
マクロ実行前
マクロ実行後
ForNext文3|2つ以上の複数のForを入れ子(ネスト)にする
次にFor next文を2つ以上入れる場合について紹介します。
For next文の中に、For next文が入ってきます。
以下でプログラムの解説をします。
事例5|For Next文の2つ以上(複数)の組み合わせ
ForNextを2つ組み合わせて、かけ算九九表を作ります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
'プログラム0|変数宣言の指定 Option Explicit 'プログラム1|プログラム開始 Sub Sample5() 'プログラム2|変数設定 Dim i As Long, k As Long 'プログラム3|1つ目のForNext For i = 1 To 9 'プログラム4|2つ目のForNext For k = 1 To 9 'プログラム5|i×kのセルに出力 Cells(i, k).Value = i * k 'Range("A" & i).Offset(0, k - 1).Value = i * k Next Next 'プログラム6|プログラム終了 End Sub |
上記のプログラムは以下で詳しく解説しています。
ForNext文4|自動取得した最終行までプログラムを繰り返す
ここまで、i=1 to 10と繰り返しの回数が分かっている事例を紹介してきました。
しかし実際の業務で使うときは、繰り返しの数が分かっているとは限りません。
むしろ多くの場合、繰り返しの数は分かっていません。
そこで、繰り返しの回数を自動で決定するプログラムを紹介します。
以下でプログラムの解説をします。
事例6|For Next文で最終行を自動取得する
エクセルのA列のデータが記載されている最終行を自動取得し、その最終行まで処理を行うプログラムです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
'プログラム0|変数宣言の指定 Option Explicit 'プログラム1|プログラム開始 Sub Sample6() 'プログラム2|変数設定 Dim i As Long, cmax As Long 'プログラム3|最終行を取得 cmax = Range("A65536").End(xlUp).Row 'プログラム4|1~cmaxまで繰り返し処理 For i = 1 To cmax 'プログラム5|B列にiを出力 Range("B" & i).Value = i Next 'プログラム6|プログラム終了 End Sub |
上記のプログラムは以下で詳しく解説しています。
ForNext文5|「スキップして抜ける」「次に進む」
事例8|For Next文から抜けて次に進む(Exit For)
以下でプログラムの解説をします。
事例7|For Next文を1度スキップしてループを省略する(Continueと同じ)
VBA以外のプログラムを書くと、continueというスキップ機能を使うことができます。
Continueを使うと、for文のような繰り返し処理の途中でループをスキップし、ループの先頭(次のループ)から実行する処理することができます。
例えば、偶数のとき処理をしたくないとします。
i=1~10まで処理を行うとき、2,4,6,8,10で処理をスキップし、奇数のときのみ処理を行うように処理を組むことができるのです。
しかし、VBAにはContinueの機能がありません。
ただVBAでは疑似的にContinueを作ることで対応することができます。以下で、その方法を紹介します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
'プログラム0|変数宣言の指定 Option Explicit 'プログラム1|プログラム開始 Sub Sample7() 'プログラム2|変数設定 Dim i As Long 'プログラム3|1~5まで繰り返し処理 For i = 1 To 5 'プログラム4|iが偶数(2で割り切れる)の場合、処理をスキップしContinueへ If i Mod 2 = 0 Then GoTo Continue End If Debug.Print i 'プログラム5|A列へiを出力 Range("A" & i).Value = i 'プログラム6|GoTo Continue(プログラム4)の行先 Continue: Next 'プログラム7|プログラム終了 End Sub |
上記のプログラムは以下で詳しく解説しています。
事例8|For Next文から抜けて次に進む(Exit For)
Continueは一度のスキップですが、For next文から抜け出したいときがあります。
そのときは、Exit Forを使います。
例えば、i が4を越えたらFor Nextを止めたいとします。
その場合は、以下のプログラムを使います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
'プログラム0|変数宣言の指定 Option Explicit 'プログラム1|プログラム開始 Sub Sample8() 'プログラム2|変数設定 Dim i As Long 'プログラム3|i=1~5まで繰り返し処理 For i = 1 To 5 'プログラム4|iが4のとき、ForNextを抜ける If i = 4 Then Exit For End If 'プログラム5|A列へiを出力 Range("A" & i).Value = i Next 'プログラム6|プログラム終了 End Sub |
上記のプログラムは以下で詳しく解説しています。
ForNext文6|Step-1で逆からカウントダウンで繰り返す
ここまで、数字がカウントアップされる例を紹介してきました。
カウントアップとは、i = 1,2,・・・というように数字が増えていくパターンです。
しかし、場合によってはカウントダウンを使いたいときもあります。
例えば、i = ・・・2,1というように数字が減っていくパターンです。
実際、行を削除していく場合はカウントダウンを使います。
ここでは、以下の事例を紹介します。
以下でプログラムの解説をします。
事例9|For Next文をStep-1する(逆順に後ろから回す)
Step-1という方法で5行目から1行目に向かって、行を削除していくプログラムです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
'プログラム0|変数宣言の指定 Option Explicit 'プログラム1|プログラム開始 Sub Sample9() 'プログラム2|変数設定 Dim i As Long 'プログラム3|i=5~1まで繰り返し処理 For i = 5 To 1 Step -1 'プログラム4|iが偶数(2で割り切れる)の場合に処理を実行 If i Mod 2 = 0 Then 'プログラム5|行を削除 Rows(i).Delete End If Next 'プログラム6|プログラム終了 End Sub |
上記のプログラムは以下で詳しく解説しています。
ForNext文7|Stepの数を変えて複数カウントアップする
ここまで、数字が1ずつ増やしたり減らしたりする例を紹介してきました。
しかし、1以外の数字で増やしたり減らしたりするこも可能です。
例えば、i = 1,4,7,10・・・というように3ずつ増やすパターンです。
以下でプログラムの解説をします。
事例10|For Next文をStep 3する(3つずつ足す)
セルA1、セルA4、セルA7、セルA10と3つずつ増やして、それぞれのセルに数値を出力するプログラムです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
'プログラム0|変数宣言の指定 Option Explicit 'プログラム1|プログラム開始 Sub Sample10() 'プログラム2|変数設定 Dim i As Long, k As Long 'プログラム3|初期値を設定 k = 1 'プログラム4|0~10の範囲で3の倍数のときのみ処理 For i = 0 To 10 Step 3 Debug.Print i 'プログラム5|A列に値を出力 Range("A" & k).Value = i 'プログラム6|kをカウントアップ k = k + 1 Next 'プログラム7|プログラム終了 End Sub |
上記のプログラムは以下で詳しく解説しています。
ForNext文8|配列との組み合わせ
ここまで「For i = 1 to 10」のように、1から10までの数字を使ってきました。
しかし配列と組み合わせてFor next文を使うと、このような数字を入力する必要がなくなります。
それは、LboundやUboundといった配列に含まれる数を取得できる関数があるからです。
UBound関数|配列内の終わりの要素番号
正確に言うと、LBound関数は指定した配列で使用できる最も小さいインデックス番号を返します。
一方、UBound関数は指定した配列で使用できる最も大きいインデックス番号を返します。
For next文では、LBound関数とUBound関数は使うことで数字を入れることなく繰り返し処理を行うことができます。
事例11|For Next文をLboundとUboundで回す
ここでは、「”あ”, “い”, “う”, “え”, “お”, “か”, “き”, “く”, “け”, “こ”」の10コの要素を含む配列に対して、LboundとUboundとFor nextをどのように組み合わせるか解説をします。
具体的には、配列の各要素をセルA1からセルA10に出力していきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
'事例11|For Next文をLboundとUboundで回す 'プログラム0|変数宣言の指定 Option Explicit 'プログラム1|プログラム開始 Sub Sample11() 'プログラム2|変数設定 Dim i As Long Dim myarray As Variant 'プログラム3|配列の設定 myarray = Array("あ", "い", "う", "え", "お", "か", "き", "く", "け", "こ") 'プログラム4|配列の各要素を処理 For i = LBound(myarray) To UBound(myarray) Debug.Print i, myarray(i) 'プログラム5|A列に値を出力 Range("A" & i + 1).Value = myarray(i) Next 'プログラム6|プログラム終了 End Sub |
上記のプログラムは以下で詳しく解説しています。
補足|二次元配列をForNextで処理
二次元配列の行と列を全て処理するプログラムを紹介します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
'プログラム0|変数宣言の指定 Option Explicit 'プログラム1|プログラム開始 Sub Sample12() 'プログラム2|変数設定 Dim i As Long, j As Long Dim myrange As Variant 'プログラム3|配列の設定 myrange = Range("A1:E10") 'プログラム4|配列の1次元目の各要素を処理 For i = LBound(myrange, 1) To UBound(myrange, 1) 'プログラム5|配列の2次元目の各要素を処理 For j = LBound(myrange, 2) To UBound(myrange, 2) Debug.Print "i:" & i, "j:" & j, myrange(i, j) 'プログラム6|A列に値を出力 Range("A12").Offset(i - 1, j - 1).Value = myrange(i, j) Next Next 'プログラム7|プログラム終了 End Sub |
上記のプログラムは以下で詳しく解説しています。
ForNext文9|シートを全て繰り返す
ここまでセルに対する繰り返し処理の事例を紹介してきました。
しかしFor next文で処理できるのは、セルだけではありません。
他にも多くの対象を繰り返し処理できます。
例えば、ワークシートです。エクセルブック内のシートを繰り返し処理できるのです。
以下でプログラムの解説をします。
事例12|For Next文をworksheet.countで回す
For next文では、worksheets.countというワークシート数を取得する方法を使うことができます。
これを使えばシート数を自分で計算することなく、プログラムが自動でシート数を読み取って処理を行ってくれます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
'プログラム0|変数宣言の指定 Option Explicit 'プログラム1|プログラム開始 Sub Sample13() 'プログラム2|変数設定 Dim i As Long 'プログラム3|1番目のシートから最後のシートまで処理 For i = 1 To Worksheets.Count 'プログラム4|シート名を出力 Range("A" & i).Value = Worksheets(i).Name Next 'プログラム5|プログラム終了 End Sub |
上記のプログラムは以下で詳しく解説しています。
ForNextを実践でつかう
ここまで、VBAでの自動化に必須であるForNext文について事例を使って解説をしてきました。
ただこの記事では初心者に分かりやすく説明するために、敢えて簡単な事例を使いました。
しかし仕事では、ここまでシンプルなFor next文を使うことは少ないかもしれません。
以下の記事では、より実践的な事例のプログラムを公開しています。
ぜひここで学んだ内容を定着させる意味でも、勉強してみてください。
Excel VBAについて詳しく理解したいなら
VBAを活用すると、仕事を効率化できる幅を広げることができます。
たとえば私が実際にVBAを活用して効率化してきた作業は以下の記事で紹介しています。
興味がある人は以下の記事もご覧ください。
動画でも解説しています。
エクセルマクロVBAで出来ることを15の事例で紹介|日常業務をラクにするヒントを見つけよう!
(音声が小さいので、ボリュームを上げてご覧いただければと思います)
VBAの勉強方法
私はプログラミング初心者からVBAを勉強を始めて少しずつレベルアップしていきました。
成長の過程は以下で紹介しています。
学習の過程では、意識すべきポイントがあります。
自分のレベルに合わせて、少しずつレベルアップしていくとより効果的に学ぶことができます。
以下のページで事例や動画を使いながら、エクセルマクロについて勉強できます。
上記のリンクでは、体系的にマクロを勉強できますので、興味がある人はご覧ください。