TL;DR —
ColorIndexは 色ではありません。それは 座席番号 — ブックが所有する パレットへの 1 から 56 のインデックスです。.Colorは絶対的な色を指し、.ColorIndexは スロット を指します。そして、そのスロットに誰が座っているかは、ブックが変われば変わり得ます。 だからこそ、同じインデックスが自分の環境ではゴールドに、同僚の環境ではマスタードに見えるのです。 新しいコードでは.Color = RGB(...)で絶対的な色を設定しましょう。ColorIndexは、.Colorでは表現できない 2 つのもの —xlNone(塗りなし)とxlColorIndexAutomatic— のため、そして 古いパレットベースのブックに合わせるために取っておきます。
' 2 つの異なる数の空間。混ぜてはいけません。
Range("A1").Interior.ColorIndex = 6 ' パレットのスロット 6 -> 黄色 (たいていは)
Range("A2").Interior.Color = RGB(255, 255, 0) ' 絶対的な色 -> 黄色、常に
' ColorIndex だけが表現できる 2 つの特別な値:
Range("A3").Interior.ColorIndex = xlNone ' 塗りを完全に消す
Range("A4").Font.ColorIndex = xlColorIndexAutomatic ' Excel に判断を任せる (黒いテキスト)
Excel で色を持つあらゆるオブジェクト — セルの塗り(Interior)、
Font、Borders、グラフ系列 — は、Color プロパティと
ColorIndex プロパティの 両方 を公開しています。両者は同じピクセルを指しますが、まったく異なる
2 つの数の体系を通してです。そして両者を混同することは、VBA で「なぜ色が違うのか」という最も
よくあるバグそのものです。本記事は、その 2 つのうち古いほう — パレットインデックス — を扱います。
それが本当は何なのかを理解すれば、色が違って見える一連の問題が説明できるからです。
この記事で学べること
- 考え方の軸 —
ColorIndexは 56 席の劇場の座席番号であって、色ではない - ほとんどの色違いを防ぐ 1 つのルール —
.Colorと.ColorIndexは別々の数の空間 - パレットの罠 — なぜ同じインデックスが別のブックでは違って表示されるのか
.Colorでは表現できない 2 つの特別な値 —xlNoneとxlColorIndexAutomatic- 色を読み戻す、そして
.Colorで塗ったセルに対する.ColorIndexが非可逆な理由 ColorIndexが今も正しい道具である場面と、.Colorを選ぶべき場面
考え方の軸:座席番号であって、色ではない
56 の番号付き座席がある劇場を思い浮かべてください。ColorIndex = 6 は「黄色」を意味しません。
「座席 6 に座っている誰か」を意味します。既定のブックではたまたま座席 6 に黄色が座っているので、
黄色が組み込まれているように見えます。でも座席表 — ブックの色パレット — は ブック のもので
あり、割り当て直せます。座席 6 に別の色を移せば、ColorIndex = 6 に設定したすべてのセルが、
コードが何も触れないまま一斉に変わります。
対照的に、.Color は座席番号ではまったくありません。Interior.Color = RGB(255, 255, 0) は実際の
色をセルに書き込みます。参照もなければ、座席表もなく、割り当て直すものは何もありません。この
違い — スロット 対 絶対値 — がすべてであり、ブックがマシンやテーマをまたいで移動したとき、
2 つのプロパティがこれほど違う振る舞いをする理由です。
最も大事なルール:2 つの数の空間、決して混ぜない
ほとんどの色違いを生む間違いはこれです。.Color と .ColorIndex はまったく異なる範囲の数値を
受け取り、一方にとって有効な数値は、もう一方にとっても 有効で — しかも別の意味を持ちます。
Range("A1").Interior.Color = 6 ' Color 空間: 6 = RGB(6,0,0) -> ほぼ黒
Range("A1").Interior.ColorIndex = 6 ' Index 空間: スロット 6 -> 黄色
6 と打つとき「ほぼ黒」を意図する人はいませんが、.Color = 6 はまさにそれを、静かに返します。
直し方はトリックではなく規律です。自分がどちらの空間にいるかを決めて、そこにとどまる。 行が
.Color なら、右辺は RGB(...) の値か vb* 定数です。行が .ColorIndex なら、右辺は 1 から 56 の
整数(または下記の特別な値)です。.Color の値を ColorIndex プロパティに、あるいはその逆に
読み込ませることは、コンパイルして動いたとしても常にバグです。
パレットの罠:なぜインデックスは別の環境で違って表示されるのか
これが座席番号モデルの本当のコストです。ColorIndex は ActiveWorkbook.Colors(n) への参照なので、
それが生み出す色は、そのパレットと同じだけしか安定しません。座席を動かすものは 2 つあります。
- カスタマイズされたパレットを持つテンプレート から作られたブックは、いくつかのスロットに既に
別の色を持っています。あなたの
ColorIndex = 10は、自分のファイルでは深い緑でも、相手の ファイルでは濁ったオリーブかもしれません。 - コードはパレットを直接書き換えられ(
ActiveWorkbook.Colors(10) = RGB(...))、さらに現代の テーマカラー がその上に別の再マッピング層を重ねます。
だから、レポートのヘッダーを ColorIndex = 37 で塗るマクロは、書いたマシンでは完璧に見えても、
クライアントのマシンでは微妙にずれます — 同じコード、同じインデックス、違う座席表です。
.Color = RGB(...) にこの失敗はありません。パレットに何も尋ねないからです。色がどこでも同じに
見えなければならないとき、それが決め手になります。絶対的な色は持ち運べますが、パレット
インデックスは持ち運べません。
2 つの特別な値:xlNone と xlColorIndexAutomatic
ColorIndex にしかできない仕事が 1 つあり、それがこれを残しておく正直な理由です。.Color は
1,600 万色のどれでも表現できますが、「色なし」は表現できません。2 つの負の定数がその隙間を
埋めます。
Range("A1").Interior.ColorIndex = xlNone ' -4142: 塗りが一切ない (グリッド線が透ける)
Range("A1").Font.ColorIndex = xlColorIndexAutomatic ' -4105: 自動 (テーマに応じた白地に黒)
xlNone は塗りを 消す 正しい方法です — 白く塗るのではなく、本当に空にします(白い塗りも
塗りのうちです。VBA Cell Color を参照)。xlColorIndexAutomatic は
フォントの既定です。「Excel の自動色が何であれそれ」を意味し、テーマに追随し、暗い背景では
理にかなって反転します — ベタ書きの RGB(0,0,0) にはできないことです。どちらにも .Color の
等価物はないので、ここは ColorIndex が単なるレガシーの荷物ではない唯一の場所 — この仕事の
ための唯一の道具です。
色を読み戻す:ColorIndex は非可逆
読み取りは、2 つの空間が二度目にあなたを噛む場所です。セルが 絶対的な 色で塗られている場合、
その ColorIndex を尋ねてもきれいな答えは返りません — Excel は 最も近いパレットスロット を
返し、正確な色を捨ててしまいます。
Range("A1").Interior.Color = RGB(200, 215, 240) ' 特定の淡い青
Debug.Print Range("A1").Interior.ColorIndex ' 近いスロット番号 - あなたの色ではない
Debug.Print Range("A1").Interior.Color ' 設定した正確な 24 ビット値
読み取りのルールは、書き込みのルールを鏡写しにしたものです。書いたのと同じプロパティで
読み戻す。 .Color で設定したなら .Color で比べます(BGR として格納されるので、RGB(...) と
比べます — VBA RGB を参照)。.ColorIndex をテストするのは、スロット を明確に
気にするときだけ — たとえば、塗られていないセルを検出する If .Interior.ColorIndex = xlNone で、
これは ColorIndex がまさに正しい唯一の読み取りです。
ColorIndex が今も正しい道具である場面
「常に避けよ」ではありません。次のときは ColorIndex に手を伸ばしましょう。
xlNoneまたはxlColorIndexAutomaticが必要なとき — ほかに言い表す方法はありません。- 56 色パレットの上に 作られた ブックに合わせていて、塗りをそのスキームと一緒に意図的に動かし たいとき。
- セルを「塗られているか否か」を尋ねるためだけに読むとき(
= xlNone)。
それ以外のすべて — どの読み手にも同じに見えなければならないレポート、ブランドカラー、あとで
比較するもの — には .Color = RGB(...) を設定します。モデルが明確になれば判断は単純です。
座席番号は 1 つの劇場の中では便利でも、その外では無意味です。 絶対的な色が既定であり、パレット
インデックスは意図的で限定的な選択です。
ExcelMaster の活用
Color 対 ColorIndex の分かれ方は、まさにコンパイルして、動いて、それから意図しない色を生む
たぐいの細部です — 6 がほぼ黒と読まれ、ヘッダーがクライアントのコピーで色合いを変え、
ColorIndex の読み取りがあなたの色を静かにパレットスロットへ丸める。どれもエラーになりません。
ただ、あとで間違って見えるだけです。
ExcelMaster なら、欲しい色を
説明するだけで済みます。「ヘッダーを濃い青で塗って」「前回のハイライトを消して」「うちのブランド
グリーンを使って」と言えば、どこでも同じに見える絶対的な色には .Color = RGB(...) を、塗りを
消す という意味なら ColorIndex = xlNone を、テーマに追随すべきフォントには
xlColorIndexAutomatic を書きます。1 行につき 1 つの数の空間にとどまるので、「なぜ色がずれるのか」
というバグが世に出ることはありません。ブックもコードもあなたの手元に残ります。
よくある質問
VBA の Color と ColorIndex の違いは?
.Color は絶対的な 24 ビット値です — Interior.Color = RGB(255,255,0) はどのマシンでも黄色です。
.ColorIndex はブックのパレットへの 1 から 56 のスロット番号で、Interior.ColorIndex = 6 は
「スロット 6 に座っている色が何であれそれ」であり、カスタマイズされたパレットやテーマで変わり
得ます。両者は異なる数値範囲を使うので、一方の値をもう一方に代入してはいけません — .Color = 6
はスロット 6 ではなく、ほぼ黒です。
同じ ColorIndex が別のブックで違って見えるのはなぜ?
ColorIndex はそのブックのパレット(ActiveWorkbook.Colors)への参照であり、パレットはファイル
ごとに異なり得るからです — テンプレートがカスタマイズしていたり、テーマカラーが再マッピングして
いたり。インデックスは安定でも、その背後の色は安定ではありません。色が全員に同じに見えなければ
ならないなら、代わりに絶対的な .Color = RGB(...) を設定しましょう。これはパレットを一切参照
しません。
ColorIndex でセルの塗りを消すには?
Range("A1").Interior.ColorIndex = xlNone を設定します。これは塗りを完全に消すので、グリッド線が
透けて見え、何も印刷されません — セルを白く塗ってなお塗りのままである
Interior.Color = RGB(255,255,255) とは違います。xlNone(値 -4142)は .Color にできない 2 つの
仕事の 1 つで、だからこそ ColorIndex はそのために残す価値があります。
xlColorIndexAutomatic とは?
xlColorIndexAutomatic(値 -4105)は「自動」の色です — Font.ColorIndex では、Excel のテーマに
追随する既定のテキスト色を意味し、たいていは明るい背景で黒、暗い背景では適応します。ベタ書きの
RGB(0,0,0) は適応できないので、これはフォント色の安全な既定です。.Color に等価物はないので、
ColorIndex を通して設定します。
新しい VBA コードでは ColorIndex と RGB のどちらを使うべき?
新しいコードでは .Color = RGB(...) を選びましょう。どのブックでも、どのマシンでも同じに見える
絶対的な色であり、56 スロットではなく 1,600 万色すべてをカバーします。ColorIndex は、特別な値
xlNone と xlColorIndexAutomatic、レガシーパレットの上に意図的に作られたブックに合わせるとき、
そして「このセルは塗られているか」の読み取り(= xlNone)のために取っておきます。
検証環境
動作確認: Excel 365 (Windows 11), VBA 7.1 — 最終確認 2026-09-08。
関連ガイド: VBA RGB · VBA Conditional Formatting · VBA Cell Color · VBA Font · VBA Borders
