【Excel VBA】For~Next文の使い方と実務で役立つ応用テクニック

スポンサーリンク

「同じ処理を何十回も手作業で繰り返している……」

そんな経験、ありませんか? セルに連番を振ったり、データを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

仕組みをかんたんに説明すると、こんな流れになっています。

  1. カウンター変数 i に初期値(ここでは1)が入る
  2. 処理を実行する
  3. Next ii が1つ増える
  4. i が最終値(ここでは10)を超えていなければ、2に戻る
  5. i が最終値を超えたらループ終了

カウンター変数の名前は i が定番ですが、countrow など分かりやすい名前でも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の中でも使用頻度がとても高い構文です。まずはこの記事のサンプルコードをコピーして動かしてみてください。自分で動かしてみると、理解がぐっと深まりますよ。

タイトルとURLをコピーしました