【VBA】セルの値に応じて行を自動で色分けする方法(コピペOK)

VBA

この記事でできること

Excelの表で「完了」「未対応」「対応中」などのステータスに応じて、行の色を手作業で塗り分けていませんか? VBAを使えば、コードをコピペして実行するだけで、指定列の値に応じて行全体が自動で色分けされます。この記事では、最小限のコード(Select Case+RGB関数)から、設定シートで色ルールを管理する実務版まで解説します。

  • 対象:ステータス列の値を見て手動で行を塗っている人、VBAが初めての人
  • 所要時間:コピペ → 実行まで約5分(目安)

完成イメージ(Before / After)

Before(実行前)

A B C
1 タスク名 ステータス 担当者
2 報告書作成 完了 田中
3 データ入力 未対応 鈴木
4 会議準備 対応中 佐藤
5 資料印刷 完了 田中
6 備品発注 未定 鈴木

すべての行が白背景。色分けなし。

After(実行後)

A B C 背景色
1 タスク名 ステータス 担当者 (ヘッダー:色なし)
2 報告書作成 完了 田中 薄い緑
3 データ入力 未対応 鈴木 薄い赤
4 会議準備 対応中 佐藤 薄い黄
5 資料印刷 完了 田中 薄い緑
6 備品発注 未定 鈴木 色なし

B列の値に応じて、行全体の背景色が自動で変わる。


条件付き書式との違い

「条件付き書式でもできるのでは?」という疑問はもっともです。使い分けの目安は以下の通り。

比較項目 条件付き書式 VBA
設定の手軽さ GUIで直感的に設定可能 コードの貼り付けが必要
条件の数 増えると管理が煩雑 Select Case や設定シートで整理しやすい
設定の変更 各セル・範囲ごとに修正が必要 設定シートを1箇所変更すれば全体に反映
他のブックへの適用 手動でコピーが必要 マクロをコピーすれば再利用可能
動的な範囲対応 範囲の再設定が必要な場合がある 最終行を自動検出して処理

条件が3つ以下で固定なら条件付き書式で十分。条件が増える・頻繁に変わる・複数ブックで使い回すならVBAが向いている。

注意: 条件付き書式とVBAの色分けを同時に使うと、条件付き書式が優先され意図しない表示になる場合がある。どちらか一方に統一すること。


実行前の準備

バックアップを取る

既存のデータが入っているExcelファイルで実行する場合は、先にファイルをコピーしてバックアップを取ること。VBAで背景色を変更すると、手動で塗っていた色も上書きされる。Ctrl+Z(Undo)はVBA実行後には効かない場合がある。

Excelをマクロ有効ブック(.xlsm)で保存する

  1. Excelを開く(新規でも既存でもOK)
  2. 「ファイル」→「名前を付けて保存」
  3. ファイルの種類を 「Excel マクロ有効ブック (*.xlsm)」 に変更して保存

.xlsx のままだとマクロが保存されない。必ず .xlsm にすること。


手順(コピペ → 実行まで約5分)

VBE(コードを書く画面)を開く

Alt + F11 キーを押すとVBE(Visual Basic Editor)が開く。

一般的にはAlt + F11で開けるが、企業のセキュリティ設定でVBAが無効化されている場合は、IT部門に確認すること。

標準モジュールを挿入する

  1. VBEのメニュー「挿入」→「標準モジュール」をクリック
  2. 右側に白い画面(コードウィンドウ)が表示される

コードを貼り付けて実行する

  1. 下の「コード(最小版)」をコピーして、コードウィンドウに貼り付ける
  2. コード内の対象列番号( マーク)を確認する(既定はB列 = 2)
  3. Alt + F8 を押す(または VBE上で F5
  4. 「ColorRowsByStatus」を選択して「実行」
  5. シートを確認し、行の色が変わっていることを確認する

コード(最小版) — Select Caseで値を判定して色分け

B列の値に応じて行全体を色分けする。「完了」→ 薄い緑、「未対応」→ 薄い赤、「対応中」→ 薄い黄、それ以外 → 色なし。


Sub ColorRowsByStatus()

    Dim ws As Worksheet
    Dim lastRow As Long
    Dim lastCol As Long
    Dim i As Long
    Dim statusValue As String
    Dim rng As Range

    ' ★ 対象シート名(自分のシート名に書き換える)
    Set ws = Worksheets("Sheet1")

    ' ★ ステータスが入っている列番号(B列 = 2)
    Const STATUS_COL As Long = 2

    ' データの最終行・最終列を取得
    lastRow = ws.Cells(ws.Rows.Count, STATUS_COL).End(xlUp).Row
    lastCol = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column

    ' 画面更新を止めて高速化
    Application.ScreenUpdating = False

    ' 2行目から最終行までループ(1行目はヘッダー)
    For i = 2 To lastRow

        statusValue = Trim(ws.Cells(i, STATUS_COL).Value)
        Set rng = ws.Range(ws.Cells(i, 1), ws.Cells(i, lastCol))

        Select Case statusValue
            Case "完了"
                rng.Interior.Color = RGB(198, 239, 206)  ' 薄い緑
            Case "未対応"
                rng.Interior.Color = RGB(255, 199, 206)  ' 薄い赤
            Case "対応中"
                rng.Interior.Color = RGB(255, 235, 156)  ' 薄い黄
            Case Else
                rng.Interior.ColorIndex = xlNone          ' 色なし
        End Select

    Next i

    ' 画面更新を再開
    Application.ScreenUpdating = True

    MsgBox "色分けが完了しました(" & lastRow - 1 & " 行処理)。", vbInformation

End Sub

対象列の変更方法: ステータスがC列にある場合は Const STATUS_COL As Long = 223 に変更する。D列なら 4

シート名について: コード内の "Sheet1" はシート名(タブに表示される名前)。シート名を変更している場合は、自分のシート名に書き換えること。


コード(実務版) — 設定シートで色を管理

最小版は色のルールがコード内に固定されている。実務では「色を変えたい」「ステータスを追加したい」という要望が出やすい。実務版では、色の設定を別シート(「設定」シート)で管理する。コードを修正せずに、設定シートを変えるだけでルールを変更できる。

設定シートの作成

「設定」という名前のシートを追加し、以下のように入力する。

A B C D
1 R G B
2 完了 198 239 206
3 未対応 255 199 206
4 対応中 255 235 156
  • A列:判定する値(ステータス名)
  • B列:R値(赤 0〜255)
  • C列:G値(緑 0〜255)
  • D列:B値(青 0〜255)

ステータスを追加したい場合は、5行目以降に行を追加するだけでOK。

実務版コード


Sub ColorRowsByStatusFromSetting()

    Dim wsData As Worksheet
    Dim wsSetting As Worksheet
    Dim lastRowData As Long
    Dim lastColData As Long
    Dim lastRowSetting As Long
    Dim i As Long
    Dim j As Long
    Dim statusValue As String
    Dim matched As Boolean
    Dim rng As Range

    ' ★ データがあるシート名(自分のシート名に書き換える)
    Set wsData = Worksheets("Sheet1")

    ' ★ 設定シート名
    Set wsSetting = Worksheets("設定")

    ' ★ ステータスが入っている列番号(B列 = 2)
    Const STATUS_COL As Long = 2

    ' データシートの最終行・最終列を取得
    lastRowData = wsData.Cells(wsData.Rows.Count, STATUS_COL).End(xlUp).Row
    lastColData = wsData.Cells(1, wsData.Columns.Count).End(xlToLeft).Column

    ' 設定シートの最終行を取得(A列基準)
    lastRowSetting = wsSetting.Cells(wsSetting.Rows.Count, 1).End(xlUp).Row

    ' 画面更新を止めて高速化
    Application.ScreenUpdating = False

    ' データシートの2行目から最終行までループ
    For i = 2 To lastRowData

        statusValue = Trim(wsData.Cells(i, STATUS_COL).Value)
        Set rng = wsData.Range(wsData.Cells(i, 1), wsData.Cells(i, lastColData))
        matched = False

        ' 設定シートの2行目から照合
        For j = 2 To lastRowSetting
            If Trim(wsSetting.Cells(j, 1).Value) = statusValue Then
                rng.Interior.Color = RGB( _
                    wsSetting.Cells(j, 2).Value, _
                    wsSetting.Cells(j, 3).Value, _
                    wsSetting.Cells(j, 4).Value)
                matched = True
                Exit For
            End If
        Next j

        ' 設定シートに一致する値がなければ色をクリア
        If Not matched Then
            rng.Interior.ColorIndex = xlNone
        End If

    Next i

    ' 画面更新を再開
    Application.ScreenUpdating = True

    MsgBox "色分けが完了しました(" & lastRowData - 1 & " 行処理)。", vbInformation

End Sub

使い方のポイント:

  • 新しいステータス(例:「保留」)を追加したい → 設定シートの5行目にA列「保留」、B〜D列にRGB値を入力するだけ
  • 色を変えたい → 設定シートのRGB値を書き換えるだけ
  • コードの修正は不要

色をクリア(元に戻す)方法

VBAで塗った色をすべてクリアしたい場合は、以下のコードを使う。このコードも標準モジュールに貼り付けて、Alt + F8 から「ClearColors」を選択して実行する。


Sub ClearColors()
    Worksheets("Sheet1").Cells.Interior.ColorIndex = xlNone
End Sub

VBA実行後はCtrl+Z(Undo)が効かない場合がある。元に戻す可能性がある場合は、実行前にバックアップを取ること。


よくある落とし穴5選

# 症状 原因 対策
1 VBAで色を塗ったのに、別の色で表示される 条件付き書式が設定されており、そちらが優先されている 条件付き書式を削除してからVBAを実行する。「ホーム」→「条件付き書式」→「ルールのクリア」→「シート全体からルールをクリア」
2 一部の行だけ色が変わらない セルの値の前後に空白スペースが含まれている(見た目では分からない) コード内で Trim() を使っているため半角スペースは対応済み。それでも変わらない場合は、セルに全角スペースが含まれている可能性がある。全角スペースは Trim() では除去されないため、セルの値を再入力するか、Replace(値, " ", "") で全角スペースを除去する
3 実行が遅い(数千行以上のデータ) 行ごとにセルを操作するため、データ量に比例して処理時間が増える コード内の Application.ScreenUpdating = False で画面更新を止めているため、通常は問題ない。それでも遅い場合は、対象範囲を限定する
4 手動で塗った色が消えた VBAの Interior.ColorIndex = xlNone で「それ以外」の行の手動色もクリアされる VBA実行前にファイルをコピーしてバックアップを取る。VBAで色を管理する運用に統一するのが理想
5 マクロを保存したのに次回開くと消えている .xlsx で保存してしまった 「名前を付けて保存」→ ファイルの種類を .xlsm に変更する

FAQ

Q1: 条件付き書式とVBA、どちらを使うべき?

条件が3つ以下で固定なら条件付き書式が手軽。条件が4つ以上、頻繁に変わる、設定シートで管理したい場合はVBAが向いている。両方を同時に使うと競合するため、どちらか一方に統一すること。

Q2: データを更新したら自動で色が変わるようにしたい

Worksheet_Change イベントを使えば、セルの値を変更するたびに自動実行できる。ただし大量データでは処理が重くなるため、手動実行(Alt + F8)のほうが安全。自動実行のカスタマイズが必要な場合はココナラで相談可能。

Q3: B列以外の列(例:D列)で判定したい

コード内の Const STATUS_COL As Long = 2 の数値を変更する。D列なら 4、E列なら 5。列番号は A=1, B=2, C=3, D=4 と対応している。

Q4: 行全体ではなく特定の列だけ色を変えたい

コード内の Set rng = ws.Range(ws.Cells(i, 1), ws.Cells(i, lastCol)) を、色を付けたい範囲に変更する。例えばA列〜C列だけなら Set rng = ws.Range(ws.Cells(i, 1), ws.Cells(i, 3)) とする。

Q5: 色だけでなくフォント色や太字も変えたい

Font.Color = RGB(...) でフォント色、Font.Bold = True で太字を設定できる。ただし本記事では背景色のみ扱う。カスタマイズが必要な場合はココナラで相談可能。


まとめ

この記事で、指定列の値に応じてExcelの行全体を自動で色分けできるようになった。

  • 最小版:Select Case で値を判定し RGB で色分け。コードに色ルールを直接記述
  • 実務版:設定シートに値とRGBの対応表を作成。コードを修正せずにルール変更が可能

関連記事:

  • VBAでExcelを操作する入門として「【VBA】フォルダ内のファイル一覧をExcelに自動出力する方法」も参照
  • ファイル操作の自動化に興味がある場合は「【VBA】古いファイルを自動削除する方法」も参照

もっとカスタマイズしたい場合

「複数条件の組み合わせで色分けしたい」「色だけでなく太字・取り消し線も自動変更したい」「データ更新時に自動で色が変わるようにしたい」など、業務に合わせたカスタマイズが必要な場合は、ココナラで相談できます。

相談時に以下の情報があるとスムーズです:

  • Excel のバージョン / OS
  • 入力データの列名(どの列にステータスがあるか)
  • 色分けしたい値と色の対応表
  • データの行数(目安)

あわせて読みたい

コメント

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