記事ID: 067
タイトル: 【VBA】セルの背景色・文字色をRGBで自由に操作する方法(コピペOK)
カテゴリ: セル操作
一次キーワード: VBA セル 色 RGB 取得 設定
想定読者: ColorIndexの番号を毎回調べている初心者。セルの色をVBAで操作したい人
検索意図: VBAでセルの背景色・文字色をRGB値で自由に設定・取得する方法を知りたい
読者の悩み(1文): ColorIndexの番号を毎回調べるのが面倒で、好きな色を自由に指定できなくて地味にストレス
読了後にできること(1文): RGB関数でセルの背景色・文字色を自由に設定・取得でき、ステータス別の自動色分けもコピペで動く
前提条件:
- Excel版: Excel 2016以降 / Microsoft 365
- OS: Windows 10/11
- 保存形式: .xlsm(マクロ有効ブック)
- 貼り付け場所: 標準モジュール
- 実行方法: マクロ実行(F5)またはボタン割り当て
更新日: 2026-03-11
この記事でできること
VBAでセルの背景色・文字色をRGB値で自由に設定・取得できるようになる。ステータス別の自動色分けもコピペで動く。
- 対象:進捗管理表のセルを毎週手作業で塗っている人、VBAが初めての人
- 所要時間:コピペ → 実行まで3分
どんな場面で使う?
- 進捗管理表のステータス色分け — 「完了=緑」「遅延=赤」「対応中=黄」を毎週50〜100行、1セルずつ手塗りしている。目視確認→右クリック→塗りつぶし→色選択、を延々繰り返す地獄
- 報告書のセル書式統一 — 複数人が入力した共有Excelの色がバラバラ。「赤で塗って」と言っても人によって微妙に違う赤。RGB値で統一したい
- 会社のブランドカラーの正確な指定 — 「ロゴの青を使って」と言われたがColorIndexに会社の青(#336699)は存在しない。RGB値で正確に指定する方法がわからない
- セルの色で条件分岐・集計 — 「赤く塗ったセルだけ合計したい」「色ごとに件数を数えたい」。色の判定条件をコードで正確に指定したい
- 前任者のマクロの改修 — ColorIndexで書かれた色指定を、より直感的なRGB値に書き換えたい
完成イメージ
実行前:
| A | B | C | D | |
|---|---|---|---|---|
| 1 | ステータス | タスク名 | 担当者 | 期限 |
| 2 | 完了 | 報告書作成 | 田中 | 3/10 |
| 3 | 進行中 | データ入力 | 鈴木 | 3/15 |
| 4 | 未着手 | 会議準備 | 佐藤 | 3/20 |
| 5 | 完了 | 資料印刷 | 田中 | 3/12 |
| 6 | 未着手 | 備品発注 | 鈴木 | 3/25 |
すべての行が白背景。ステータスを目で追わないと進捗がわからない。
実行後:
| A | B | C | D | 背景色 | |
|---|---|---|---|---|---|
| 1 | ステータス | タスク名 | 担当者 | 期限 | (ヘッダー:色なし) |
| 2 | 完了 | 報告書作成 | 田中 | 3/10 | 薄い緑 RGB(200,255,200) |
| 3 | 進行中 | データ入力 | 鈴木 | 3/15 | 薄い黄 RGB(255,255,200) |
| 4 | 未着手 | 会議準備 | 佐藤 | 3/20 | 薄い赤 RGB(255,200,200) |
| 5 | 完了 | 資料印刷 | 田中 | 3/12 | 薄い緑 RGB(200,255,200) |
| 6 | 未着手 | 備品発注 | 鈴木 | 3/25 | 薄い赤 RGB(255,200,200) |
A列のステータスに応じて、行全体の背景色が自動で変わる。一目で進捗状況がわかる。
—
自分も以前、毎週の進捗管理表でステータス列を見ながら1行ずつ手で色を塗っていた。「完了」を見つけたら緑、「遅延」を見つけたら赤、「対応中」なら黄色。50行ある表を上から下まで、右クリック→セルの書式設定→塗りつぶし→色を選択→OK。これを50回。毎週金曜の午後30分がこれだけで消えていた。しかも途中で「あれ、この行さっき塗ったっけ?」と分からなくなって2回塗る行が出てくる。正直、一番やりたくない業務だった。
VBAでRGB関数を使った自動色分けを覚えてからは、ボタン1つで50行が一瞬で色分けされるようになった。「手で塗っていたのは何だったんだ」と本気で思った。しかもRGB値で色を指定するから、毎回同じ色になる。手塗りのときは微妙に違う緑を塗ってしまって「色がバラバラで見にくい」と上司に言われたこともあったが、それもなくなった。
同じように「毎週の色塗りが苦行」と感じている人が、この記事で一気にラクになればうれしい。
セルの値に応じた色分けの基本は、セルの値に応じて行を自動色分けする方法 でも解説しています。本記事ではRGB関数の使い方にフォーカスします。
—
基本:背景色をRGBで設定する
まずは最もシンプルな例。セルの背景色をRGB関数で設定します。
Sub 背景色をRGBで設定する()
' A1セルの背景色を赤にする
Range("A1").Interior.Color = RGB(255, 0, 0)
' A2:C2の背景色を薄い緑にする
Range("A2:C2").Interior.Color = RGB(200, 255, 200)
' A3:C3の背景色を薄い黄にする
Range("A3:C3").Interior.Color = RGB(255, 255, 200)
End Sub
ポイント:
Interior.Colorは背景色を設定するプロパティRGB(赤, 緑, 青)の3つの値はそれぞれ 0〜255 の範囲で指定する- 0 が「その色なし」、255 が「その色が最大」
- RGB(255, 0, 0) = 赤、RGB(0, 0, 255) = 青、RGB(255, 255, 0) = 黄
- 範囲を変えたい場合は
Range("A1")をRange("A1:F20")のように変更するだけでOK
セルの書式をまとめて変更する方法は、記事023「セルの書式を一括変更する方法」も参考にしてください。
—
文字色をRGBで設定する
文字色は Font.Color プロパティで設定します。
Sub 文字色をRGBで設定する()
' A1セルの文字色を赤にする
Range("A1").Font.Color = RGB(255, 0, 0)
' A2セルの文字色を青にする
Range("A2").Font.Color = RGB(0, 0, 255)
' 背景色が濃い場合は文字色を白にすると見やすい
Range("A3").Interior.Color = RGB(0, 0, 128) ' 紺色の背景
Range("A3").Font.Color = RGB(255, 255, 255) ' 白い文字
End Sub
ポイント:
Font.Colorは文字色を設定するプロパティ- 背景色が濃い場合は文字色を白
RGB(255, 255, 255)にすると見やすくなる - 背景色と文字色を同じにすると文字が見えなくなるので注意(落とし穴で後述)
—
セルの色を取得する(RGB値を読み取る)
セルに設定されている色を取得するには .Interior.Color(背景色)や .Font.Color(文字色)を読み取ります。ただし、返り値はRGB(r,g,b)の形式ではなく Long型の整数値 です。
Sub セルの色を取得する()
Dim cellColor As Long
cellColor = Range("A1").Interior.Color
' Long値をR, G, Bに分解する
Dim r As Long, g As Long, b As Long
r = cellColor Mod 256
g = (cellColor \ 256) Mod 256
b = cellColor \ 65536
MsgBox "R=" & r & ", G=" & g & ", B=" & b
End Sub
ポイント:
Interior.Colorの戻り値はR + G * 256 + B * 65536のLong値。RGB値が1つの整数に詰め込まれている- 256 = 1色分の段階数(0〜255で256段階)。各色が256段階ずつ区切られているため、Mod 256(256で割った余り)で各色を取り出せる
Mod 256でR(赤)を取り出す\ 256 Mod 256でG(緑)を取り出す(\はVBAの整数除算)\ 65536でB(青)を取り出す(65536 = 256 x 256)- 文字色を取得する場合は
Font.Colorを同様に分解する
—
よく使う色のRGB値一覧表
よく使うRGB値をまとめました。コードにコピペして使ってください。
| 色名 | RGB値 | 用途例 |
|---|---|---|
| 赤 | RGB(255, 0, 0) |
エラー表示、未対応 |
| 緑 | RGB(0, 128, 0) |
完了、承認済み ※1 |
| 青 | RGB(0, 0, 255) |
リンク風、情報 |
| 黄 | RGB(255, 255, 0) |
注意、進行中 |
| 白 | RGB(255, 255, 255) |
背景色(※ 塗りつぶしなしとは異なる) |
| 黒 | RGB(0, 0, 0) |
文字色デフォルト |
| グレー | RGB(200, 200, 200) |
ヘッダー行の背景 |
| 薄い赤 | RGB(255, 200, 200) |
背景色として見やすい赤(実務向き) |
| 薄い緑 | RGB(200, 255, 200) |
背景色として見やすい緑(実務向き) |
| 薄い黄 | RGB(255, 255, 200) |
背景色として見やすい黄(実務向き) |
| 薄い青 | RGB(200, 220, 255) |
背景色として見やすい青(実務向き) |
| オレンジ | RGB(255, 165, 0) |
警告、要確認 |
| 紺色 | RGB(0, 0, 128) |
ヘッダーの背景(文字は白に) |
※1: Excelの「標準の色」の緑は RGB(0, 176, 80) です。RGB(0, 128, 0) はやや暗めの緑になります。Excelの色パレットに合わせたい場合は RGB(0, 176, 80) を使ってください。
実務のコツ: 背景色に原色(赤・青・緑)をそのまま使うと画面がきつくなります。薄い色(パステルカラー) を使うと実務の表が見やすくなります。上の表で太字にした色がおすすめです。
—
色をクリア(リセット)する
設定した色を元に戻す(クリアする)方法です。
Sub 色をクリアする()
' 背景色をクリア(塗りつぶしなしに戻す)
Range("A1:D10").Interior.ColorIndex = xlNone
' 文字色をデフォルト(自動=黒)に戻す
Range("A1:D10").Font.ColorIndex = xlAutomatic
End Sub
ポイント:
- 背景色のクリアは
.Interior.ColorIndex = xlNone(塗りつぶしなし) - 文字色のリセットは
.Font.ColorIndex = xlAutomatic(自動=黒) - 「白塗り」と「塗りつぶしなし」は違います。
.Interior.Color = RGB(255, 255, 255)は「白で塗る」であって「塗りつぶしなし」ではありません。印刷時に白い塗りつぶしが出ることがあるため、色のクリアには必ず.ColorIndex = xlNoneを使ってください - シート全体をリセットしたい場合は
Cells.Interior.ColorIndex = xlNoneで一括クリア
—
実務版:ステータス列の値に応じて行を自動色分けする
A列の「ステータス」の値(完了/進行中/未着手)に応じて、行全体の背景色を自動で色分けするマクロです。
ステータス列の値に応じて行全体を色分けするマクロを作ってからは、進捗管理表の見やすさが格段に上がりました。「誰が何を残しているか」が一目でわかるので、朝会での確認もスムーズになりました。
※ 既存の背景色が上書きされます。重要な色設定がある場合はファイルのバックアップを取ってから実行してください。
Sub ステータス別に行を色分け()
' --- 設定 ---
Dim statusCol As Long
statusCol = 1 ' ステータス列(A列=1)
Dim headerRow As Long
headerRow = 1 ' ヘッダー行
' --- 準備 ---
Dim ws As Worksheet
Set ws = ActiveSheet
Dim lastRow As Long
lastRow = ws.Cells(ws.Rows.Count, statusCol).End(xlUp).Row
Dim lastCol As Long
lastCol = ws.Cells(headerRow, ws.Columns.Count).End(xlToLeft).Column
' データがない場合は終了
If lastRow <= headerRow Then
MsgBox "データがありません。", vbExclamation
Exit Sub
End If
' --- 処理速度の最適化 ---
Application.ScreenUpdating = False
' --- いったん既存の色をクリア ---
' ※ 元の背景色は復元できません
ws.Range(ws.Cells(headerRow + 1, 1), ws.Cells(lastRow, lastCol)).Interior.ColorIndex = xlNone
' --- ステータスに応じて色分け ---
Dim i As Long
For i = headerRow + 1 To lastRow
Dim rowRange As Range
Set rowRange = ws.Range(ws.Cells(i, 1), ws.Cells(i, lastCol))
Select Case ws.Cells(i, statusCol).Value
Case "完了"
rowRange.Interior.Color = RGB(200, 255, 200) ' 薄い緑
Case "進行中"
rowRange.Interior.Color = RGB(255, 255, 200) ' 薄い黄
Case "未着手"
rowRange.Interior.Color = RGB(255, 200, 200) ' 薄い赤
Case Else
' 上記以外は色なし(クリア済みなのでそのまま)
End Select
Next i
' --- 後処理 ---
Application.ScreenUpdating = True
MsgBox lastRow - headerRow & " 行の色分けが完了しました。", vbInformation
End Sub
最終行の取得方法について詳しくは、記事032「データの最終行・最終列を正確に取得する方法」を参照してください。
カスタマイズ方法:
- ステータスの値を変更する場合:
Case "完了"の部分を実際のデータの値に書き換える(例:Case "済",Case "OK") - 色を変更する場合:
RGB(200, 255, 200)の値を上の「よく使う色のRGB値一覧表」から選んで書き換える - ステータス列を変更する場合:
statusCol = 1を変更する(B列なら2、C列なら3) - ヘッダーが2行ある場合:
headerRow = 2に変更する - ※ ステータス列に空白セルがあっても
Case Elseで色なしになるため問題ありません
全シートに同じ色設定を一括で適用する場合は、記事015「複数シートを一括処理する方法」のループ処理を組み合わせてください。
—
落とし穴
| # | 症状 | 原因 | 対策 |
|---|---|---|---|
| 1 | RGB値を設定したのにColorIndexで読み取ると意味不明な数値が返る | Interior.Color(Long値)とInterior.ColorIndex(整数0〜56)は別のプロパティ。RGB値をColorIndexでは正しく読み取れない |
色の取得には .Color を使う。ColorIndexはRGB値の取得には使わない |
| 2 | 文字色を変えたら文字が消えた(ように見える) | 背景色と文字色が同じRGB値になり、白地に白文字や同色の文字になった | 背景色と文字色の組み合わせを確認する。テスト時は MsgBox Range("A1").Font.Color で文字色を確認 |
| 3 | VBAで背景色を設定したのに表示が変わらない | 条件付き書式が設定されていて、VBAの色より条件付き書式が優先されている。またはシートが保護されていて書式変更がブロックされている | VBAで色を設定する前に Cells.FormatConditions.Delete で条件付き書式を削除するか、どちらか一方に統一する。シート保護の場合は保護を解除してから実行する |
| 4 | 大量のセルに色を設定すると処理が遅い | 1セルずつ Interior.Color を設定すると画面更新のたびに描画処理が走る |
Application.ScreenUpdating = False を処理前に設定し、処理後に True に戻す |
| 5 | .Interior.Color = RGB(255,255,255) で色をクリアしたつもりが印刷時に白い塗りつぶしになる |
RGB(255,255,255)は「白で塗る」であって「塗りつぶしなし」ではない | 背景色のクリアには .Interior.ColorIndex = xlNone を使う |
VBAでセルの背景色を変更したのに色が変わらないときの対処法
「Interior.Color = RGB(...) を実行したのにセルの色が変わらない」という場合、原因は条件付き書式が優先されているか、シートが保護されているのどちらかだ。条件付き書式はVBAで設定した背景色よりも優先して表示されるため、条件付き書式が設定されている範囲ではVBAの色変更が見た目に反映されない。対処法は、VBAで色を設定する前に Range("A1:D100").FormatConditions.Delete で条件付き書式を削除するか、条件付き書式とVBAの色分けのどちらか一方に統一すること。自分も最初これに気づかず「コードは間違ってないのになぜ色が変わらないんだ」と30分悩んだ。シート保護の場合は ws.Unprotect で保護を解除してから実行する。
VBAでセルの色をRGB値で取得できないときの対処法
「Interior.Color で色を取得したら、RGB値ではなく意味不明な大きい数字が返ってきた」という場合、それは正常な動作だ。Interior.Color の戻り値はLong型の整数(R + G×256 + B×65536)であり、RGB(r,g,b)の形式ではない。RGB値に分解するには本記事の「セルの色を取得する」セクションのコードを使って Mod 256 で分解する。自分も最初「8421504って何色?」と混乱したが、分解してみたら RGB(128, 128, 128) =グレーだった。なお、Interior.ColorIndex はRGB値とは別の色番号体系(0〜56)なので、RGB値の取得には使えない。
VBAでステータスに応じた自動色分けが一部の行だけ動かないときの対処法
「自動色分けマクロを実行したのに、一部の行だけ色が変わらない」という場合、原因はステータス列の値に見えないスペースや改行が混入していることが多い。「完了 」(末尾にスペース)と「完了」は別の文字列として扱われるため、Select Caseで一致しない。対処法は、比較前に Trim(ws.Cells(i, statusCol).Value) でスペースを除去すること。セル内改行が入っている場合は Replace(値, vbLf, "") で改行も除去する。データの前処理については 空白行・空白セルを一括で削除する方法 も参考になる。
—
FAQ
Q1: ColorIndexとColor(RGB)はどちらを使うべき?
Color(RGB)を推奨します。ColorIndexは56色しか使えず番号を覚える必要がありますが、RGB関数なら約1677万色を直感的に指定できます。会社のブランドカラーなど正確な色指定が必要な場合はRGB一択です。ColorIndexは古いコードとの互換性が必要な場合のみ使いましょう。
Q2: セルの色を取得してRGB値として表示するには?
.Interior.Color でLong値を取得し、以下の計算で分解します。
r = cellColor Mod 256
g = (cellColor \ 256) Mod 256
b = cellColor \ 65536
本記事の「セルの色を取得する」セクションにコピペで使えるコードがあります。
Q3: RGB値を調べるにはどうすればいい?
Excelの「セルの書式設定」→「塗りつぶし」→「その他の色」→「ユーザー設定」タブにRGB値が表示されます。また、会社のブランドガイドラインやWebデザインツールからRGB値を取得することもできます。Google検索で「カラーピッカー」と検索しても便利です。
Q4: 全シートに同じ色設定を一括で適用するには?
For Each ws In ThisWorkbook.Worksheets でループし、各シートの範囲に色を設定します。詳しくは記事015「複数シートを一括処理する方法」を参照してください。
Q5: VBAの色分けと条件付き書式はどう使い分ける?
条件が3つ以下で固定なら条件付き書式がGUIで設定できて手軽です。条件が多い・頻繁に変わる・複数ブックで使い回すならVBAが向いています。詳しくは記事047「条件付き書式をVBAで操作する方法」も参考にしてください。ただし、VBAの色分けと条件付き書式を同時に使うと条件付き書式が優先されるため、どちらか一方に統一しましょう。
—
まとめ
- 背景色の設定:
Range("A1").Interior.Color = RGB(r, g, b) - 文字色の設定:
Range("A1").Font.Color = RGB(r, g, b) - 色の取得:
Range("A1").Interior.ColorでLong値を取得し、Mod演算で R/G/B に分解 - 色のクリア: 背景色は
.Interior.ColorIndex = xlNone、文字色は.Font.ColorIndex = xlAutomatic - 実務版: ステータス列の値に応じて行全体を自動色分け
RGB関数を使えば、ColorIndexの番号を調べる手間なく、好きな色を直感的に指定できます。まずは基本のコードをコピペして、自分のExcelファイルで試してみてください。
条件付き書式をVBAで操作する方法は、記事047「条件付き書式をVBAで操作する方法」で解説しています。
セルの罫線をVBAで一括設定する方法は、記事068「罫線を一括で引く・消す・種類を変える方法」で解説しています。
—
次にやりたくなること
- 条件に応じた色分けをもっと深く知りたい → セルの値に応じて行を自動色分けする方法 ― 複数条件での色分けパターン
- 条件付き書式もVBAで操作したい → 条件付き書式をVBAで一括設定・解除する方法 ― カラースケールやデータバーも対応
- 色分け後にデータを条件で絞り込みたい → オートフィルタでデータを絞り込み・解除する方法 ― ステータス別に表示を切り替え
- 色分けの処理時間を計測したい → マクロの処理時間を計測して高速化のボトルネックを見つける方法 ― 大量データの色分けが遅いとき
- 色分けマクロをボタンで実行したい → マクロをボタン1つで実行する方法 ― 毎週のルーティンをワンクリックに


コメント