Kurz gesagt —
ColorIndexist keine Farbe. Es ist eine Sitznummer — ein Index von 1 bis 56 in eine Palette, die der Arbeitsmappe gehört..Colorbenennt eine absolute Farbe;.ColorIndexbenennt 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 SieColorIndexfür die zwei Dinge, die.Colornicht ausdrücken kann —xlNone(keine Füllung) undxlColorIndexAutomatic— 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 —
ColorIndexist eine Sitznummer in einem 56-Sitze-Theater, keine Farbe - Die eine Regel, die die meisten Farbfehler verhindert —
.Colorund.ColorIndexsind verschiedene Zahlenräume - Die Paletten-Falle — warum ein Index in einer anderen Arbeitsmappe anders erscheinen kann
- Die zwei Sonderwerte —
xlNoneundxlColorIndexAutomatic—, die.Colornicht ausdrücken kann - Eine Farbe zurücklesen, und warum
.ColorIndexauf einer mit.Colorgesetzten Zelle verlustbehaftet ist - Wann
ColorIndexnoch das richtige Werkzeug ist, und wann.Colorvorzuziehen 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 = 10ist 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
xlNoneoderxlColorIndexAutomaticbrauchen — 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
