
Contents
この記事でできること
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)で保存する
- Excelを開く(新規でも既存でもOK)
- 「ファイル」→「名前を付けて保存」
- ファイルの種類を 「Excel マクロ有効ブック (*.xlsm)」 に変更して保存
.xlsx のままだとマクロが保存されない。必ず .xlsm にすること。
手順(コピペ → 実行まで約5分)
VBE(コードを書く画面)を開く
Alt + F11 キーを押すとVBE(Visual Basic Editor)が開く。
一般的にはAlt + F11で開けるが、企業のセキュリティ設定でVBAが無効化されている場合は、IT部門に確認すること。
標準モジュールを挿入する
- VBEのメニュー「挿入」→「標準モジュール」をクリック
- 右側に白い画面(コードウィンドウ)が表示される
コードを貼り付けて実行する
- 下の「コード(最小版)」をコピーして、コードウィンドウに貼り付ける
- コード内の対象列番号(
★マーク)を確認する(既定はB列 = 2) - Alt + F8 を押す(または VBE上で F5)
- 「ColorRowsByStatus」を選択して「実行」
- シートを確認し、行の色が変わっていることを確認する
コード(最小版) — 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 = 2 の 2 を 3 に変更する。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
- 入力データの列名(どの列にステータスがあるか)
- 色分けしたい値と色の対応表
- データの行数(目安)

コメント