🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

Excel VBA の ColorIndex — 56 色パレットと、色が思ったとおりに出ない理由

|

Excel VBA の ColorIndex — 56 色パレットと、色が思ったとおりに出ない理由

TL;DRColorIndex色ではありません。それは 座席番号 — ブックが所有する パレットへの 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)、 FontBorders、グラフ系列 — は、Color プロパティと ColorIndex プロパティの 両方 を公開しています。両者は同じピクセルを指しますが、まったく異なる 2 つの数の体系を通してです。そして両者を混同することは、VBA で「なぜ色が違うのか」という最も よくあるバグそのものです。本記事は、その 2 つのうち古いほう — パレットインデックス — を扱います。 それが本当は何なのかを理解すれば、色が違って見える一連の問題が説明できるからです。

この記事で学べること

  • 考え方の軸 — ColorIndex は 56 席の劇場の座席番号であって、色ではない
  • ほとんどの色違いを防ぐ 1 つのルール — .Color.ColorIndex は別々の数の空間
  • パレットの罠 — なぜ同じインデックスが別のブックでは違って表示されるのか
  • .Color では表現できない 2 つの特別な値 — xlNonexlColorIndexAutomatic
  • 色を読み戻す、そして .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 プロパティに、あるいはその逆に 読み込ませることは、コンパイルして動いたとしても常にバグです。

パレットの罠:なぜインデックスは別の環境で違って表示されるのか

これが座席番号モデルの本当のコストです。ColorIndexActiveWorkbook.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 の活用

ColorColorIndex の分かれ方は、まさにコンパイルして、動いて、それから意図しない色を生む たぐいの細部です — 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 は、特別な値 xlNonexlColorIndexAutomatic、レガシーパレットの上に意図的に作られたブックに合わせるとき、 そして「このセルは塗られているか」の読み取り(= xlNone)のために取っておきます。

検証環境

動作確認: Excel 365 (Windows 11), VBA 7.1 — 最終確認 2026-09-08。

関連ガイド: VBA RGB · VBA Conditional Formatting · VBA Cell Color · VBA Font · VBA Borders