【VBA】セルの背景色・文字色をRGBで自由に操作する方法(コピペOK)

VBA
スポンサーリンク

記事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「罫線を一括で引く・消す・種類を変える方法」で解説しています。

次にやりたくなること

コメント

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