VBAで100行のデータを一括処理する(繰り返し処理の実践)

VBAの真価は「繰り返し処理」にあります。手作業なら1時間かかる100行のデータ処理を、数秒で終わらせるFor文とIf文の使い方を、実際に動くコードで解説します。

繰り返し処理とは

VBAで繰り返し処理を行うには For〜Next 構文を使います。「2行目から100行目まで、1行ずつ同じ処理をする」という動きを作れます。

For i = 2 To 100
    ' ここに処理を書く
Next i

i は「今何行目を処理しているか」を示す変数です。2から始まって、Next のたびに1ずつ増えて100になったら終わります。

まず試すサンプル:空白行を色で目立たせる

以下のコードを標準モジュールに貼り付けて実行してみてください。A列にデータが入ったシートで動かすと効果がわかります。

Sub 空白行を色付け()

    Dim ws As Worksheet
    Dim i As Long
    Dim lastRow As Long

    Set ws = ActiveSheet

    ' A列のデータが入っている最終行を取得
    lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

    ' 2行目から最終行まで繰り返す
    For i = 2 To lastRow

        ' A列が空白だったら行全体を黄色にする
        If ws.Cells(i, 1).Value = "" Then
            ws.Rows(i).Interior.Color = RGB(255, 255, 0)
        Else
            ' 空白でなければ色を消す
            ws.Rows(i).Interior.ColorIndex = xlNone
        End If

    Next i

    MsgBox "処理完了! " & lastRow - 1 & " 行を確認しました。"

End Sub

コードの解説

最終行の自動取得

lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

「100行まで処理する」と固定値を書くと、データが増減したときに毎回直す必要があります。この書き方で「A列のデータが入っている一番下の行番号」を自動取得できます。

ws.Rows.Count はシートの最大行数(Excelでは約100万行)、.End(xlUp) はその位置から上方向にデータを探す操作です。Ctrl + ↑ キーと同じ動きです。

If文で条件分岐

If ws.Cells(i, 1).Value = "" Then
    ' 空白のときの処理
Else
    ' 空白でないときの処理
End If

If〜Then〜Else〜End If は「もし〜なら〜、そうでなければ〜」という条件分岐です。Else 以降は省略できます。

セルの指定方法:CellsとRangeの違い

ws.Cells(i, 1)   ' i行目の1列目(A列)
ws.Range("A2")   ' A2セルを固定で指定

Range("A2") は固定のセルを指定するときに使います。繰り返し処理の中で「行番号を変化させながらセルを指定する」ときは Cells(行番号, 列番号) が便利です。

実務的なサンプル:ステータスに応じて転記する

A列に「担当者名」、B列に「ステータス」(完了/未完了)が入ったリストから、「完了」のデータだけをSheet2に転記するコードです。

Sub 完了データを転記()

    Dim ws1 As Worksheet  ' 転記元
    Dim ws2 As Worksheet  ' 転記先
    Dim i As Long
    Dim lastRow As Long
    Dim copyRow As Long   ' 転記先の次の行

    Set ws1 = Worksheets("Sheet1")
    Set ws2 = Worksheets("Sheet2")

    lastRow = ws1.Cells(ws1.Rows.Count, 1).End(xlUp).Row
    copyRow = 2  ' Sheet2の2行目から書き始める

    ' Sheet2の既存データをクリア(1行目のヘッダーは残す)
    If ws2.Cells(2, 1).Value <> "" Then
        ws2.Rows("2:" & ws2.Rows.Count).ClearContents
    End If

    ' Sheet1を1行ずつ確認
    For i = 2 To lastRow

        ' B列が「完了」だったらSheet2にコピー
        If ws1.Cells(i, 2).Value = "完了" Then
            ws1.Rows(i).Copy Destination:=ws2.Rows(copyRow)
            copyRow = copyRow + 1
        End If

    Next i

    MsgBox "転記完了! " & copyRow - 2 & " 件を転記しました。"

End Sub

このコードを動かすには、Sheet1とSheet2が必要です。Sheet1のA列に担当者名、B列に「完了」または「未完了」を入力してから実行してください。

よく使う繰り返しパターン

全セルの値を別の値に変換する

' C列の値が「〇」だったら「対応済み」に変換する
For i = 2 To lastRow
    If ws.Cells(i, 3).Value = "〇" Then
        ws.Cells(i, 3).Value = "対応済み"
    End If
Next i

連番を自動で振る

' A列に1から始まる連番を振る
For i = 2 To lastRow
    ws.Cells(i, 1).Value = i - 1
Next i

複数条件の組み合わせ

' B列が「未完了」かつC列が今日より前(期限切れ)だったら赤くする
For i = 2 To lastRow
    If ws.Cells(i, 2).Value = "未完了" And ws.Cells(i, 3).Value < Date Then
        ws.Rows(i).Interior.Color = RGB(255, 200, 200)
    End If
Next i

複数の条件をANDで繋ぐと「〜かつ〜」、ORで繋ぐと「〜または〜」になります。

まとめ

繰り返し処理の基本は For i = 開始 To 終了If〜End If の組み合わせです。最終行を自動取得する End(xlUp).Row を覚えると、データ量が変わっても対応できる汎用的なコードが書けます。まずはサンプルを動かして、条件や処理の部分を自分の業務に合わせて書き換えてみてください。