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

VBA ColorIndex in Excel — die 56-Farben-Palette und warum Ihre Farbe daneben liegt

|

VBA ColorIndex in Excel — die 56-Farben-Palette und warum Ihre Farbe daneben liegt

Kurz gesagtColorIndex ist keine Farbe. Es ist eine Sitznummer — ein Index von 1 bis 56 in eine Palette, die der Arbeitsmappe gehört. .Color benennt eine absolute Farbe; .ColorIndex benennt einen Platz, und wer auf diesem Platz sitzt, kann von einer Arbeitsmappe zur nächsten wechseln. Deshalb sieht derselbe Index auf Ihrem Rechner golden und bei einer Kollegin senffarben aus. Für neuen Code setzen Sie eine absolute Farbe mit .Color = RGB(...); behalten Sie ColorIndex für die zwei Dinge, die .Color nicht ausdrücken kann — xlNone (keine Füllung) und xlColorIndexAutomatic — und um eine alte, palettenbasierte Arbeitsmappe abzugleichen.

' Zwei verschiedene Zahlenraeume. Nicht vermischen.
Range("A1").Interior.ColorIndex = 6           ' Platz 6 der Palette -> Gelb (meistens)
Range("A2").Interior.Color = RGB(255, 255, 0) ' eine absolute Farbe -> Gelb, immer

' Die zwei Sonderwerte, die nur ColorIndex ausdruecken kann:
Range("A3").Interior.ColorIndex = xlNone                 ' die Fuellung ganz entfernen
Range("A4").Font.ColorIndex = xlColorIndexAutomatic      ' "Excel entscheiden lassen" (schwarzer Text)

Jedes farbtragende Objekt in Excel — eine Zellfüllung (Interior), die Font, Borders, eine Diagrammreihe — stellt beide Eigenschaften bereit, eine Color-Eigenschaft und eine ColorIndex-Eigenschaft. Sie zeigen auf dasselbe Pixel, aber durch zwei völlig verschiedene Zahlensysteme, und sie zu verwechseln ist der mit Abstand häufigste „warum ist meine Farbe falsch"-Bug in VBA. Diese Anleitung behandelt die ältere der beiden — den Paletten-Index —, denn zu verstehen, was er wirklich ist, erklärt eine ganze Klasse von Problemen, bei denen Farben unterschiedlich aussehen.

Was Sie lernen

  • Das mentale Modell — ColorIndex ist eine Sitznummer in einem 56-Sitze-Theater, keine Farbe
  • Die eine Regel, die die meisten Farbfehler verhindert — .Color und .ColorIndex sind verschiedene Zahlenräume
  • Die Paletten-Falle — warum ein Index in einer anderen Arbeitsmappe anders erscheinen kann
  • Die zwei Sonderwerte — xlNone und xlColorIndexAutomatic —, die .Color nicht ausdrücken kann
  • Eine Farbe zurücklesen, und warum .ColorIndex auf einer mit .Color gesetzten Zelle verlustbehaftet ist
  • Wann ColorIndex noch das richtige Werkzeug ist, und wann .Color vorzuziehen ist

Das mentale Modell: eine Sitznummer, keine Farbe

Stellen Sie sich ein Theater mit 56 nummerierten Sitzen vor. ColorIndex = 6 bedeutet nicht „Gelb". Es bedeutet „wer auch immer auf Sitz 6 sitzt". In einer Standard-Arbeitsmappe hält Sitz 6 zufällig Gelb, es sieht also aus, als wäre Gelb fest eingebaut. Aber der Sitzplan — die Farbpalette der Arbeitsmappe — gehört der Arbeitsmappe, und er lässt sich neu vergeben. Setzen Sie eine andere Farbe auf Sitz 6, und jede Zelle, die Sie auf ColorIndex = 6 gesetzt haben, ändert sich auf einen Schlag, ohne dass Ihr Code irgendetwas anfasst.

.Color dagegen ist überhaupt keine Sitznummer. Interior.Color = RGB(255, 255, 0) schreibt die tatsächliche Farbe in die Zelle. Es gibt kein Nachschlagen, keine Tabelle, nichts, was neu belegt werden könnte. Dieser Unterschied — Platz gegenüber absolutem Wert — ist die ganze Geschichte, und er ist der Grund, warum sich die beiden Eigenschaften so unterschiedlich verhalten, wenn eine Arbeitsmappe zwischen Rechnern oder Designs wandert.

Die wichtigste Regel: zwei Zahlenräume, niemals vermischt

Hier ist der Fehler, der die meisten falschen Farben erzeugt. .Color und .ColorIndex nehmen Zahlen aus völlig verschiedenen Bereichen an, und eine Zahl, die für die eine gültig ist, ist auch für die andere gültig — und bedeutet dort etwas anderes:

Range("A1").Interior.Color = 6        ' Farbraum: 6 = RGB(6,0,0) -> fast Schwarz
Range("A1").Interior.ColorIndex = 6   ' Indexraum: Platz 6 -> Gelb

Niemand meint „fast Schwarz", wenn er 6 tippt, aber .Color = 6 gibt genau das, stillschweigend. Die Lösung ist Disziplin, kein Trick: entscheiden Sie, in welchem Raum Sie sind, und bleiben Sie dort. Steht in der Zeile .Color, dann ist die rechte Seite ein RGB(...)-Wert oder eine vb*-Konstante. Steht dort .ColorIndex, dann ist die rechte Seite eine ganze Zahl von 1 bis 56 (oder ein Sonderwert von unten). Einen .Color-Wert in eine ColorIndex-Eigenschaft zu lesen, oder umgekehrt, ist immer ein Bug — selbst wenn es kompiliert und läuft.

Die Paletten-Falle: warum der Index anderswo anders erscheint

Das ist der eigentliche Preis des Sitznummer-Modells. Weil ColorIndex ein Nachschlagen in ActiveWorkbook.Colors(n) ist, ist die erzeugte Farbe nur so stabil wie diese Palette. Zwei Dinge verschieben die Sitze:

  • Eine Arbeitsmappe, die aus einer Vorlage mit angepasster Palette entstand, hat in manchen Plätzen bereits andere Farben. Ihr ColorIndex = 10 ist in Ihrer Datei vielleicht Tannengrün und in deren ein trübes Oliv.
  • Code kann die Palette direkt umschreiben (ActiveWorkbook.Colors(10) = RGB(...)), und moderne Designfarben fügen obendrauf eine weitere Umsetzungsschicht hinzu.

Ein Makro, das Berichtsköpfe mit ColorIndex = 37 füllt, sieht also auf dem Rechner, auf dem es geschrieben wurde, perfekt aus und auf dem des Kunden subtil daneben — gleicher Code, gleicher Index, anderer Sitzplan. .Color = RGB(...) kennt diesen Fehlermodus nicht, weil es die Palette nie etwas fragt. Wenn eine Farbe überall identisch aussehen muss, ist das das entscheidende Argument: eine absolute Farbe reist mit, ein Paletten-Index nicht.

Die zwei Sonderwerte: xlNone und xlColorIndexAutomatic

Es gibt eine Aufgabe, die nur ColorIndex erledigen kann, und sie ist der ehrliche Grund, es zu behalten. .Color kann jede der 16 Millionen Farben ausdrücken — aber es kann „keine Farbe" nicht ausdrücken. Zwei negative Konstanten füllen diese Lücke:

Range("A1").Interior.ColorIndex = xlNone                ' -4142: gar keine Fuellung (Gitternetz scheint durch)
Range("A1").Font.ColorIndex = xlColorIndexAutomatic     ' -4105: automatisch (Schwarz auf Weiss, je nach Design)

xlNone ist der korrekte Weg, eine Füllung zu entfernen — wirklich leer, nicht weiß gestrichen (eine weiße Füllung ist immer noch eine Füllung; siehe VBA Zellfarbe). xlColorIndexAutomatic ist der Font-Standard: er bedeutet „was auch immer Excels automatische Farbe ist", die dem Design folgt und auf dunklen Hintergründen sinnvoll umschlägt, wo ein fest verdrahtetes RGB(0,0,0) es nicht täte. Keiner hat ein .Color-Äquivalent, das ist also die eine Stelle, an der ColorIndex nicht bloß Altlast ist — es ist das einzige Werkzeug für die Aufgabe.

Eine Farbe zurücklesen: ColorIndex ist verlustbehaftet

Beim Lesen beißen die beiden Räume ein zweites Mal. Wurde eine Zelle mit einer absoluten Farbe gefüllt, gibt die Abfrage ihres ColorIndex keine saubere Antwort zurück — Excel liefert den nächstgelegenen Paletten-Platz, der die exakte Farbe wegwirft:

Range("A1").Interior.Color = RGB(200, 215, 240)   ' ein bestimmtes sanftes Blau
Debug.Print Range("A1").Interior.ColorIndex        ' eine nahe Platznummer - NICHT Ihre Farbe
Debug.Print Range("A1").Interior.Color             ' der exakte 24-Bit-Wert, den Sie gesetzt haben

Die Regel fürs Lesen spiegelt die Regel fürs Schreiben: lesen Sie mit derselben Eigenschaft zurück, mit der Sie geschrieben haben. Haben Sie .Color gesetzt, vergleichen Sie .Color (gegen ein RGB(...), da es als BGR gespeichert wird — siehe VBA RGB). Prüfen Sie .ColorIndex nur, wenn Sie sich ausdrücklich für den Platz interessieren — etwa If .Interior.ColorIndex = xlNone, um eine ungefüllte Zelle zu erkennen, was das eine Lesen ist, bei dem ColorIndex genau richtig ist.

Wann ColorIndex noch das richtige Werkzeug ist

Es heißt nicht „immer vermeiden". Greifen Sie zu ColorIndex, wenn:

  • Sie xlNone oder xlColorIndexAutomatic brauchen — es gibt keinen anderen Weg, sie zu sagen.
  • Sie eine Arbeitsmappe abgleichen, die auf der 56-Farben-Palette gebaut wurde, und Ihre Füllungen absichtlich mit ihrem Schema wandern sollen.
  • Sie eine Zelle nur lesen, um zu fragen „gefüllt oder nicht" (= xlNone).

Für alles andere — einen Bericht, der für jeden Leser gleich aussehen muss, eine Markenfarbe, alles, was Sie später vergleichen werden — setzen Sie .Color = RGB(...). Das Urteil ist einfach, sobald das Modell klar ist: eine Sitznummer ist bequem innerhalb eines Theaters und bedeutungslos außerhalb. Absolute Farbe ist der Standard; der Paletten-Index ist eine bewusste, enge Wahl.

Wie ExcelMaster hilft

Die Trennung von Color und ColorIndex ist genau die Art Detail, das kompiliert, läuft und dann eine Farbe erzeugt, die Sie nicht gemeint haben — 6 als Fast-Schwarz gelesen, ein Kopf, der auf der Kopie des Kunden den Ton wechselt, ein ColorIndex-Lesen, das Ihre Farbe still auf einen Paletten-Platz rundet. Nichts davon meldet einen Fehler; es sieht nur später falsch aus.

ExcelMaster lässt Sie die gewünschte Farbe beschreiben — „fülle die Kopfzeile dunkelblau", „lösche die Hervorhebungen des letzten Laufs", „nimm unser Markengrün" — und es schreibt .Color = RGB(...) für absolute Farben, die überall gleich aussehen, ColorIndex = xlNone, wenn Sie die Füllung entfernen meinen, und xlColorIndexAutomatic für Schrift, die dem Design folgen soll. Es bleibt pro Zeile in einem Zahlenraum, sodass der „warum ist meine Farbe daneben"-Bug nie ausgeliefert wird. Sie behalten die Arbeitsmappe und den Code.

Häufig gestellte Fragen

Was ist der Unterschied zwischen Color und ColorIndex in VBA?

.Color ist ein absoluter 24-Bit-Wert — Interior.Color = RGB(255,255,0) ist auf jedem Rechner Gelb. .ColorIndex ist eine Platznummer von 1 bis 56 in die Palette der Arbeitsmappe; Interior.ColorIndex = 6 ist „welche Farbe auch immer auf Platz 6 sitzt", was eine angepasste Palette oder ein Design ändern kann. Sie nutzen verschiedene Zahlenbereiche, weisen Sie also nie den Wert der einen der anderen zu — .Color = 6 ist fast Schwarz, nicht Platz 6.

Warum sieht derselbe ColorIndex in einer anderen Arbeitsmappe anders aus?

Weil ColorIndex ein Nachschlagen in der Palette dieser Arbeitsmappe ist (ActiveWorkbook.Colors), und die Palette zwischen Dateien abweichen kann — eine Vorlage kann sie anpassen, oder Designfarben können sie neu belegen. Der Index ist stabil, aber die Farbe dahinter nicht. Wenn eine Farbe für jeden identisch aussehen muss, setzen Sie stattdessen ein absolutes .Color = RGB(...), das die Palette nie befragt.

Wie entferne ich eine Zellfüllung mit ColorIndex?

Setzen Sie Range("A1").Interior.ColorIndex = xlNone. Das entfernt die Füllung vollständig, sodass Gitternetzlinien durchscheinen und nichts gedruckt wird — anders als Interior.Color = RGB(255,255,255), das die Zelle weiß streicht und immer noch eine Füllung ist. xlNone (Wert -4142) ist eine der zwei Aufgaben, die .Color nicht kann, weshalb es sich lohnt, ColorIndex dafür zu behalten.

Was ist xlColorIndexAutomatic?

xlColorIndexAutomatic (Wert -4105) ist die „automatische" Farbe — für Font.ColorIndex bedeutet es die Standard-Textfarbe, die Excels Design folgt, typischerweise Schwarz auf hellem Hintergrund und auf dunklem angepasst. Es ist der sichere Standard für Schriftfarbe, weil ein fest verdrahtetes RGB(0,0,0) sich nicht anpassen kann. Es gibt kein .Color-Äquivalent, Sie setzen es also über ColorIndex.

Sollte ich für neuen VBA-Code ColorIndex oder RGB verwenden?

Bevorzugen Sie .Color = RGB(...) für neuen Code: es ist eine absolute Farbe, die in jeder Arbeitsmappe und auf jedem Rechner gleich aussieht, und es deckt alle 16 Millionen Farben ab statt 56 Plätze. Reservieren Sie ColorIndex für die Sonderwerte xlNone und xlColorIndexAutomatic, für das absichtliche Abgleichen einer Arbeitsmappe, die auf der alten Palette gebaut wurde, und für das „ist diese Zelle gefüllt"-Lesen (= xlNone).

Getestet in

Getestet in: Excel 365 (Windows 11), VBA 7.1 — zuletzt geprüft am 08.09.2026.

Verwandte Anleitungen: VBA RGB · VBA Bedingte Formatierung · VBA Zellfarbe · VBA Font · VBA Borders