TL;DR — セルの背景色は、その
Interiorオブジェクトに宿ります。Range("A1").Interior.Color = RGB(255, 242, 204)です。これは 塗り層 — テキストの背後の ペンキ — であり、すべての書式設定と同じく、変えるのは見た目であって値ではありません。誰もが つまずくことが 2 つあります。1 つ目、塗りを消すのはInterior.ColorIndex = xlNoneであり、 これは白く塗ることとは 違います。2 つ目、そしてより重要なこと。色はデータではありません。SUMもSUMIFもそれを見られないので、塗りの色で「approved」を意味させているブックは、どの 数式も読めない場所にカテゴリを保存していることになります。
' ヘッダー行全体を淡いゴールドの塗りでハイライトする。
Dim ws As Worksheet: Set ws = ThisWorkbook.Worksheets("Sales")
ws.Range("A1:F1").Interior.Color = RGB(255, 242, 204)
' 塗りを完全に消す (白ではなく "No Fill" に戻す)。
ws.Range("A2:F2").Interior.ColorIndex = xlNone
セルを色で塗ることは、Excel で最も多く自動化される作業の 1 つで、その色モデルは
Font 層とまったく同じものを共有します — 同じ Color 対 ColorIndex の
分かれ方です。本記事は、塗りについて何が違うのかに焦点を当てます。正しく消す方法、そして 色の
付いたセルは装飾であって情報ではない という、より大きな考えです。それが腑に落ちれば、「黄色い
セルを合計するには?」という質問はひとりでに答えが出ます — 合計しません、データを直すのです。
この記事で学べること
- 考え方の軸 —
Interiorはテキストの背後にある塗り層 RGBで塗りの色を設定し、xlNone(白ではない)で消す- 最も大事なルール — 色は何のデータも持たず、どの数式も読めない
- 古びるループなしで条件によってハイライトする
Unionで離れた多くの範囲を素早く塗る- 塗りの色を読み戻す、そして
xlNoneの落とし穴
考え方の軸:Interior は塗り層
セルには 3 つの視覚的な層があり、それぞれ自分のオブジェクトを通して届きます。テキスト
(Font)、その背後の塗り(Interior)、そして数値がどう表示されるか
(NumberFormat)です。Interior は真ん中の層 — 書き物の背後の壁の
ペンキです。主なプロパティは Color で、Font とまったく同じ色モデルを使います。あらゆる色には
RGB(r, g, b)、従来の 56 スロットのパレットには ColorIndex です。
色モデルを共有しているので、フォントの記事と同じルールがここでも当てはまります。.Color = RGB(...) で設定し、.Color と .ColorIndex を決して混同しない。Interior.Color = 6 はほぼ黒の
RGB(6,0,0)、Interior.ColorIndex = 6 は黄色です。1 つの数の空間にとどまりましょう。
塗りを消す:xlNone は白ではない
ここが塗り固有の最初の罠です。背景を消すのに、画面上では同じに見えるのに実は違う 2 つのものが あります。
ws.Range("A1").Interior.Color = RGB(255, 255, 255) ' 白く塗る
ws.Range("A1").Interior.ColorIndex = xlNone ' 塗りを消す (No Fill)
まっさらなシートでは両方とも白く見えるので、同じだと思いがちです。違います。白い塗りも塗りの
うちです — グリッド線を隠し、白いブロックとして印刷され、Interior.Pattern = xlSolid を報告
します。xlNone は塗りがまったくないことを意味します。グリッド線が透けて見え、何も印刷されず、
セルは書式設定が本当に空です。範囲をリセットするとき — たとえば、新しいハイライトを当てる前に
前回のハイライトを消すとき — ほとんどの場合、白ではなく xlNone が欲しいはずです。白く塗るのは
後で表面化するバグで、印刷物の上や色の付いたシートの上で、白いブロックが突然目立つのです。
最も大事なルール:色はデータではない
これは、きれいなブックと脆いブックを分ける考えです。**塗りの色は何の値も持ちません。*どの数式も
それを読めません。SUM は黄色いセルを、白いセルとまったく同じように足します。SUMIF、
COUNTIF、IF に「ハイライトされている」を判定する演算子はありません。だから色に何かを意味*
させた瞬間 — ゴールドのセルは承認済み、赤い行は期限切れ、緑は支払い済み — あなたは計算エンジンが
見られない場所にカテゴリを保存したことになります。
' "approved" が重要なら、それは色ではなく値に属する。
ws.Range("H2").Value = "Approved" ' 数式はこれを読める
ws.Range("A2:H2").Interior.Color = RGB(198, 239, 206) ' 色は結果であって、源ではない
実践的なルールはこうです。**意味をセルに置き、色はそれに従わせる。**ステータス列を追加し、そこに
「Approved」や「Overdue」と書き込み、塗りをそこから駆動します(理想は下記の条件付き書式です)。
そうすれば COUNTIF(Status, "Overdue") が効き、フィルターが効き、ピボットが効きます — そして色は、
実際に存在する値の視覚的なこだまにすぎません。.Interior.ColorIndex をループで使って「色で合計
する」ことに手を伸ばす人はいて、実際できはします。でも、それが必要になること自体が、そのカテゴリは
最初から本物の値であるべきだった、というほぼ確実なサインです。
条件によるハイライト:古びるループではなくルールを使う
フォント色とちょうど同じで、素朴なループで条件から塗りの色を駆動すると、データが変わった瞬間に 腐る 1 回きりのスナップショットができます。
' スナップショットのみ - 編集のたびに再実行が必要。
Dim c As Range
For Each c In ws.Range("B2:B1000")
If c.Value < 0 Then c.Interior.Color = RGB(255, 199, 206)
Next c
生きた値に追随すべき色には、条件付き書式のルールを一度設定して、Excel に永遠に再評価させましょう。
With ws.Range("B2:B1000").FormatConditions
.Delete
.Add(Type:=xlCellValue, Operator:=xlLess, Formula1:="0").Interior.Color = RGB(255, 199, 206)
End With
直接の Interior.Color ループは、静的なハイライトのために取っておきましょう — これから凍結
して書き出す 1 回きりのレポートです。シートが編集されても正しいままであるべきものには、
FormatCondition が正しい道具です。これはフォント層と同じ判断であり、一度体に入れておく価値が
あります。ループはスナップショットを塗り、ルールは生き続ける。
Union で多くの範囲を素早く塗る
1 つの範囲の塗りを設定するのは一瞬です。散らばった数百のセルをループで 1 つずつ塗るのは遅いです。
代入のたびに Excel への別々の往復が発生するからです。セルを Union で 1 つの範囲にまとめて、一発で
塗りましょう。
Dim target As Range, c As Range
For Each c In ws.Range("B2:B1000")
If c.Value < 0 Then
If target Is Nothing Then Set target = c Else Set target = Union(target, c)
End If
Next c
If Not target Is Nothing Then target.Interior.Color = RGB(255, 199, 206)
ループは依然としてどのセルかを決めますが、高価な部分 — 実際に塗りを当てること — は、1,000 回
ではなく Union 全体に対して 1 回だけ起きます。(連続したブロックなら Union はまったく不要
です。Range 全体を 1 文で塗るだけです。)あらゆる書式設定の層に共通する一般ルールはこうです。
ループで決め、範囲に当てる。
塗りの色を読み戻す
Interior.Color を読むと、設定した 24 ビット値が返ります(内部では BGR として格納されるので、
生の整数を読むより RGB(...) と比べましょう)。1 つ注意すべきは「塗りなし」の場合です。
Debug.Print ws.Range("A1").Interior.ColorIndex ' 塗りがないときは -4142 (xlNone)
Debug.Print ws.Range("A1").Interior.Color ' 白い塗りなら 16777215 - "white" に見えて "empty" ではない
セルが塗られていないかどうかを知りたいなら、Color の値ではなく Interior.ColorIndex = xlNone
をテストしましょう — 明示的に白いセルは有効な Color を返し、色ベースのチェックを欺くからです。
これは、先ほどの「白は xlNone ではない」ルールの、読み取り側のこだまです。
ExcelMaster の活用
セルの塗りは、縁が現れるまでは単純に見えます。xlNone 対 白、本当はルールであるべきだった
ハイライトのループ、どの数式も読めないカテゴリとして使われる色、そして這うように遅い 1 セルずつの
ループ。そのどれもが静かなバグです — 古びたハイライト、「色で合計する」という回避策、遅いマクロ。
ExcelMaster なら、結果を説明
するだけで済みます。「期限切れの行をハイライトして」「ヘッダーに色を付けて、先月の色を消して」と
言えば、静的な処理には Interior.Color = RGB(...) を、色がデータに従うべきときには
FormatCondition を書き、白く塗る代わりに xlNone で消し、範囲全体に一度に当てます。そして
「承認済みの注文にフラグを立てて」と頼めば、まずステータスを本物の列に入れます — だから色は、数式が
実際に数えられる何かを意味します。ブックもコードもあなたの手元に残ります。
よくある質問
Excel VBA でセルの背景色を設定するには?
Range("A1").Interior.Color = RGB(red, green, blue) を使います — たとえば淡いゴールドなら
RGB(255, 242, 204)。Interior は塗りのオブジェクトで、Color はあらゆる色をカバーする 24 ビットの
RGB 値を取ります。Interior.ColorIndex = n(1 から 56 のパレットスロット)は、古いパレットベースの
ブックに合わせるときだけ使い、2 つの数の空間を混ぜないでください。
VBA でセルの塗りの色を消すには?
Range("A1").Interior.ColorIndex = xlNone を設定します。これは塗りを完全に消すので、グリッド線が
透けて見え、何も印刷されません。Interior.Color = RGB(255,255,255) を設定するとセルを白く塗る
だけで、これも塗りのうちであり、印刷物や色の付いたシートの上では違う振る舞いをします。ハイライトを
リセットするには xlNone を使いましょう。
VBA で色によってセルを SUM したり数えたりできますか?
SUM、SUMIF、COUNTIF ではできません — これらの数式は塗りの色をまったく見られません。VBA の
ループで Interior.Color や Interior.ColorIndex を 1 セルずつ調べることはできますが、それが必要な
こと自体が、カテゴリは本物の値であるべきだというサインです。「Approved」や「Overdue」をステータス列に
入れて、それを数えましょう。色は値の視覚的なこだまにしましょう。
シートを編集するとハイライトが古くなるのはなぜ?
For Each ... Interior.Color のループは 1 回きりのスナップショットを当てるだけで、値が変わっても
再実行されないからです。データに追随すべき塗りの色には、Range(...).FormatConditions.Add で条件付き
書式のルールを追加しましょう。Excel が自動で再評価します。直接の塗りのループは、凍結するつもりの
静的なレポートのときだけ使いましょう。
VBA で散らばった多くのセルを素早く塗るには?
ループの中で Union を使って 1 つの Range を組み立て、見つけるたびに各セルを塗る代わりに、その
結合された範囲に対して .Interior.Color を一度だけ設定します。塗りを Union 全体に一度当てれば、
セルごとの別々の往復を避けられます。連続したブロックなら Union は飛ばして、範囲全体を 1 文で
塗りましょう。
検証環境
動作確認: Excel 365 (Windows 11), VBA 7.1 — 最終確認 2026-08-11。
関連ガイド: VBA Font · VBA NumberFormat · VBA Range · VBA With · VBA For Loop
