「同じ処理を何十回も手作業で繰り返している……」
そんな経験、ありませんか? セルに連番を振ったり、データを1行ずつチェックしたり。手作業だと時間がかかるうえにミスも起きやすいですよね。
でも大丈夫です。VBAの For~Next文 を使えば、繰り返し処理をたった数行のコードで自動化できます。この記事では基本構文から実務で使えるテクニックまで、まとめて解説していきますね。
VBA For~Next文とは?
For~Next文は、VBAで 「決まった回数だけ処理を繰り返す」 ための構文です。
たとえば「1行目から100行目まで同じ処理をしたい」というとき、100回コードを書く必要はありません。For~Next文を使えば、カウンター変数が自動で増えながら、指定した回数だけ処理を実行してくれます。
VBAにはいくつかのループ構文がありますが、For~Next文は 繰り返す回数がはっきり決まっているとき に一番使いやすい構文です。
VBA For~Next文の基本構文と書き方
基本構文
For~Next文の書き方はこちらです。
Sub sample()
Dim i As Long
For i = 1 To 10
'--- ここに繰り返したい処理を書く ---
Next i
End Sub
仕組みをかんたんに説明すると、こんな流れになっています。
- カウンター変数
iに初期値(ここでは1)が入る - 処理を実行する
Next iでiが1つ増えるiが最終値(ここでは10)を超えていなければ、2に戻るiが最終値を超えたらループ終了
カウンター変数の名前は i が定番ですが、count や row など分かりやすい名前でもOKです。ただし、数値型(Long型またはInteger型)で宣言する のがポイントです。
ちなみに変数の型は Long がおすすめです。Integer は扱える範囲が-32,768~32,767までですが、Long なら約21億まで対応できるので、大きなデータでも安心ですよ。
Stepで増減値を変更する
通常、カウンター変数は1ずつ増えていきますが、 Step を使うと増減の幅を自由に変えられます。
' 2行おきに処理する(1, 3, 5, 7, 9行目)
Sub sample_step()
Dim i As Long
For i = 1 To 9 Step 2
Cells(i, 1).Interior.Color = RGB(255, 255, 200)
Next i
End Sub
カウントを減らすことも可能です。その場合は 初期値を最終値より大きくする のを忘れないでくださいね。
' 10から1に向かってカウントダウン
Sub sample_countdown()
Dim i As Long
For i = 10 To 1 Step -1
Cells(i, 1).Value = i & "番目"
Next i
End Sub
注意点として、Step に 0 を指定すると無限ループになります。エラーにはならず延々と処理が続いてしまうので、うっかり書かないように気をつけましょう。
Exit Forで途中終了する
ループの途中で「もうこれ以上繰り返す必要がない」という場面もありますよね。そんなときは Exit For を使います。
' A列から「合計」というセルを探して、見つけたらループ終了
Sub sample_exit_for()
Dim i As Long
For i = 1 To 1000
If Cells(i, 1).Value = "合計" Then
MsgBox i & "行目に「合計」が見つかりました"
Exit For
End If
Next i
End Sub
大量のデータを処理するとき、目的のデータが見つかった時点でループを抜ければ、処理時間を大幅に短縮 できます。地味ですが、実務ではかなり重宝するテクニックです。
VBA For文の実務で使えるサンプルコード
ここからは、実際の業務で使えるサンプルを紹介していきます。
セルに連番を振る
一番シンプルな使い方です。指定した範囲に連番を入力します。
Sub 連番を振る()
Dim i As Long
For i = 1 To 20
Cells(i, 1).Value = i
Next i
End Sub
このコードを実行するとA1~A20セルに1~20の連番が入ります。「RangeとCellsの使い分け」を理解しておくと、For文と組み合わせてセルの指定がもっと柔軟にできるようになりますよ。
条件に合うデータだけ処理する
For文とIf文を組み合わせると、条件に合ったデータだけを処理できます。これは実務で特に使う場面が多いパターンです。
' B列が「未処理」の行だけC列に「要対応」と入力
Sub 条件付き処理()
Dim i As Long
For i = 2 To 100
If Cells(i, 2).Value = "未処理" Then
Cells(i, 3).Value = "要対応"
End If
Next i
End Sub
ちょっと応用すると、条件に合う行だけ色を付けたり、別シートにコピーしたりといった処理にも広げられます。
VBA For文のネスト(入れ子)で表を一括処理する
For文の中にさらにFor文を入れることを ネスト(入れ子) と呼びます。ちょっとむずかしく見えますが、やっていることはシンプルです。
外側のFor文が 行 を、内側のFor文が 列 を担当する、というイメージで考えてみてください。
' 5行 × 3列の表すべてに値を入力する
Sub ネストの例()
Dim i As Long
Dim j As Long
For i = 1 To 5 '行のループ
For j = 1 To 3 '列のループ
Cells(i, j).Value = i & "行" & j & "列"
Next j
Next i
End Sub
実行すると、A1~C5のセルに「1行1列」「1行2列」……といったテキストが入ります。
ネストを使った実務的な例も見てみましょう。たとえば、表の中で空白セルを見つけて「未入力」と表示するマクロです。
' 表内の空白セルに「未入力」と表示
Sub 空白チェック()
Dim i As Long
Dim j As Long
For i = 2 To 50 '2行目から50行目まで
For j = 1 To 5 'A列からE列まで
If Cells(i, j).Value = "" Then
Cells(i, j).Value = "未入力"
Cells(i, j).Interior.Color = RGB(255, 200, 200)
End If
Next j
Next i
End Sub
ネストするときのポイントは、外側と内側で別の変数名を使う ことです。外側が i なら内側は j、さらにネストするなら k を使うのが一般的です。同じ変数名を使うとエラーになるので注意してくださいね。
VBA For文でよくあるエラーと対処法
For文を使っていると遭遇しがちなエラーをまとめました。
| エラー内容 | 原因 | 対処法 |
|---|---|---|
| 処理が終わらない(無限ループ) | Step に 0 を指定している | Step の値を1以上(または-1以下)にする |
| ループが一度も実行されない | 初期値 > 最終値になっている(Step が正の値のとき) | 初期値と最終値の大小関係を確認する |
| 「Next に対応する For がありません」 | For と Next の対応がずれている | ネスト時は内側から順に Next を閉じる |
| 「オーバーフロー」エラー | カウンター変数が Integer 型で範囲超え | 変数を Long 型に変更する |
特に「ループが一度も実行されない」パターンは気づきにくいバグです。Step -1 を使うときに初期値と最終値を逆にし忘れるケースがよくあるので、気をつけましょう。
For~Next・Do Loop・For Eachの使い分け
VBAには For~Next 以外にもループ構文があります。それぞれの特徴を整理しておくと、場面に応じて最適な構文を選べるようになりますよ。
| 構文 | 向いている場面 | 特徴 |
|---|---|---|
| For~Next | 繰り返す回数が決まっているとき | カウンター変数で回数を制御 |
| Do Loop | 条件を満たすまで(または満たす間)繰り返したいとき | 回数が事前に分からなくてもOK |
| For Each | シートやセル範囲などのコレクションを順番に処理したいとき | オブジェクトを1つずつ取り出せる |
たとえば「A列の最終行まで処理したいけど、データ件数が毎回変わる」という場合は、Do Loopの方が向いています。
また、ワークブック内の全シートに同じ処理をかけたい場合は、For Each~Nextが便利です。
状況に応じて使い分けられると、コードがぐっとスッキリしますよ。
まとめ
この記事では、VBAのFor~Next文について基本から応用まで解説しました。
ポイントをおさらいしておきましょう。
- For~Next文は 回数が決まった繰り返し処理 に最適
- Step で増減幅を変更、Exit For で途中終了できる
- ネスト を使えば行と列の二重ループで表全体を処理できる
- 無限ループやオーバーフローなど、よくあるエラーの原因を知っておくと安心
- Do Loop・For Eachとの使い分けで、より適切なループ構文を選べる
For文はVBAの中でも使用頻度がとても高い構文です。まずはこの記事のサンプルコードをコピーして動かしてみてください。自分で動かしてみると、理解がぐっと深まりますよ。
