この記事でできること
「完了」の行を緑にしたいのに、毎回手作業で色を塗っている。50行、100行と増えてくると、塗り忘れや色の間違いが出てきて、結局やり直し――そんな経験はないだろうか。
この記事を読めば、VBAをコピペして実行するだけで、ステータスに応じた行の色分けが一瞬で完了する。もう1行ずつ塗る必要はない。
VBAが初めてでも大丈夫。コードはすべてコピペOKで、書き換えるのはシート名と列番号だけ。
Excelの表で「完了」「未対応」「対応中」などのステータスに応じて、行の色を手作業で塗り分けていませんか? VBAを使えば、コードをコピペして実行するだけで、指定列の値に応じて行全体が自動で色分けされます。この記事では、最小限のコード(Select Case+RGB関数)から、設定シートで色ルールを管理する実務版まで解説します。
- 対象:ステータス列の値を見て手動で行を塗っている人、VBAが初めての人
- 所要時間:コピペ → 実行まで約5分(目安)
毎週の進捗管理表、手作業で行ごとに色を塗っていた。数十行あると目がチカチカして、正直しんどかった。VBAで自動色分けを組んでからは、ボタンひとつで一瞬。「なんで今まで手でやってたんだろう」と思った。同じ作業で消耗している人に、この方法を届けたい。
—
どんな場面で使う?
- 進捗管理表で「完了」「未対応」「対応中」のステータスに応じて行を色分けしたい
- 在庫管理表で基準値を超えた行を赤く目立たせたい
- 受注一覧で納期が近い案件だけ黄色にしたい
- 毎週のレビューシートで、チェック状況に応じて色を塗り直している
—
完成イメージ(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
自分はこの実務版に切り替えてから、上司に「保留を追加して」と言われても30秒で対応できるようになった。コードを触る必要がないので、VBAに詳しくない同僚にも「設定シートのここを変えてね」と引き継げる。
使い方のポイント:
- 新しいステータス(例:「保留」)を追加したい → 設定シートの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選
自分が初めてこのマクロを動かしたとき、「完了」なのに色が変わらない行があった。見た目は同じ「完了」なのに、よく見るとセルの末尾に全角スペースが入っていた。Excelの表示上は見分けがつかないのでタチが悪い。以来、データ入力時に余計なスペースが入っていないかを先に確認するようにしている。
| # | 症状 | 原因 | 対策 |
|---|---|---|---|
| 1 | VBAで色を塗ったのに、別の色で表示される | 条件付き書式が設定されており、そちらが優先されている | 条件付き書式を削除してからVBAを実行する。「ホーム」→「条件付き書式」→「ルールのクリア」→「シート全体からルールをクリア」 |
| 2 | 一部の行だけ色が変わらない | セルの値の前後に空白スペースが含まれている(見た目では分からない) | コード内で Trim() を使っているため半角スペースは対応済み。それでも変わらない場合は、セルに全角スペースが含まれている可能性がある。全角スペースは Trim() では除去されないため、セルの値を再入力するか、Replace(値, " ", "") で全角スペースを除去する |
| 3 | 実行が遅い(数千行以上のデータ) | 行ごとにセルを操作するため、データ量に比例して処理時間が増える | コード内の Application.ScreenUpdating = False で画面更新を止めているため、通常は問題ない。それでも遅い場合は、対象範囲を限定する |
| 4 | 手動で塗った色が消えた | VBAの Interior.ColorIndex = xlNone で「それ以外」の行の手動色もクリアされる |
VBA実行前にファイルをコピーしてバックアップを取る。VBAで色を管理する運用に統一するのが理想 |
| 5 | マクロを保存したのに次回開くと消えている | .xlsx で保存してしまった | 「名前を付けて保存」→ ファイルの種類を .xlsm に変更する |
VBAで行の色分けが一部だけ反映されないときの対処法
「マクロを実行したのに一部の行だけ色が変わらない」という場合、原因はセルの値の前後に全角スペースが含まれていることが多い。Trim() は半角スペースしか除去しないため、全角スペースが混入すると「完了」と「完了 」が別扱いになる。コード内で Replace(statusValue, " ", "") を追加すれば全角スペースも除去できる。
VBAの色分けが条件付き書式で上書きされるときの対処法
「VBAで色を塗ったのに別の色で表示される」という場合、原因は対象範囲に条件付き書式が設定されていてそちらが優先されていることだ。「ホーム」→「条件付き書式」→「ルールのクリア」→「シート全体からルールをクリア」で条件付き書式を削除してからVBAを実行すれば、意図した色で表示される。
—
FAQ
Q1: 条件付き書式とVBA、どちらを使うべき?
条件が3つ以下で固定なら条件付き書式が手軽。条件が4つ以上、頻繁に変わる、設定シートで管理したい場合はVBAが向いている。両方を同時に使うと競合するため、どちらか一方に統一すること。
Q2: データを更新したら自動で色が変わるようにしたい
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: 色だけでなくフォント色や太字も変えたい
—
まとめ
この記事で、指定列の値に応じてExcelの行全体を自動で色分けできるようになった。
- 最小版:Select Case で値を判定し RGB で色分け。コードに色ルールを直接記述
- 実務版:設定シートに値とRGBの対応表を作成。コードを修正せずにルール変更が可能
関連記事:
- セルの値が変わったら自動で色を塗りたいなら /008 を参照
- 特定の文字を含むセルだけをハイライトしたいなら /010 を参照
- 条件付き書式をVBAで一括設定したいなら /047 を参照
- 入力規則や書式設定をまとめて管理したいなら /067 を参照
- ボタンを配置してワンクリックで実行したいなら /013 を参照
次にやりたくなること
- 条件付き書式をVBAで一括設定する方法 — 条件付き書式をコードで管理したい場合はこちら
- セルの値が変わったら自動実行する方法(Worksheet_Change) — 値を入力した瞬間にリアルタイムで色分けしたい場合はこちら
- マクロをボタン1つで実行する方法 — 色分けマクロをシート上のボタンからワンクリックで実行したい場合はこちら
- 特定の文字を含むセルを検索してハイライトする方法 — ステータスではなくキーワードで対象セルを見つけて色を付けたい場合はこちら
- セルの背景色・文字色をRGBで自由に操作する方法 — RGB値の指定方法や色の選び方をもっと詳しく知りたい場合はこちら
—


コメント