Kurz gesagt — Das
.Coloreiner Zelle ist kein Farbname; es ist eine einzige Zahl.RGB(r, g, b)ist die Funktion, die drei Kanäle (je 0 bis 255) in diese Zahl packt. Der Haken ist die Reihenfolge:RGBbaut sie als Rot niedrig, Blau hoch (r + g*256 + b*65536), was die Umkehrung eines Web-Hex ist. Ein direkt eingefügtes#4472C4als.Color = &H4472C4vertauscht also Rot und Blau und gibt Ihnen die falsche Farbe. Bauen Sie Farben immer mitRGB(...), und wenn Sie Hex nutzen müssen, denken Sie daran, dass die Bytes rückwärts stehen.
' RGB packt drei Kanaele in ein Long:
Range("A1").Interior.Color = RGB(68, 114, 196) ' ein bestimmtes Blau, auf jedem Rechner korrekt
' Das Web-Hex #4472C4 ist dasselbe Blau - aber NICHT roh einfuegen:
Range("A2").Interior.Color = &H4472C4 ' FALSCH: das ist #C47244 (Rot und Blau vertauscht)
Range("A3").Interior.Color = RGB(&H44, &H72, &HC4) ' RICHTIG: das Hex in Kanaele aufteilen
Jede Farbeigenschaft in Excel VBA — Zellfüllung (Interior),
Font, Borders, Registerfarbe, Diagrammreihe — nimmt
dieselbe Art Wert: eine 24-Bit-Zahl. RGB ist, wie Sie ihn bauen, und zu verstehen, was diese Zahl
ist, erklärt eine ganze Familie von „die Farbe ist fast richtig, aber falsch"-Bugs, besonders wenn ein
Hex-Code von einer Website oder aus einem Markenleitfaden im Spiel ist.
Was Sie lernen
- Das mentale Modell —
.Colorist eine Zahl, undRGBist der Packer - Die Falle, die jeden erwischt — die Zahl wird als
BGRgespeichert, umgekehrt zum Web-Hex - Die
vb*-Farbkonstanten, und was sie über die Byte-Reihenfolge verraten - Eine Farbe zurücklesen und in Rot, Grün und Blau zerlegen
- Warum das Farbmodell über Füllungen, Schriften, Rahmen und Diagramme hinweg identisch ist
- Das Urteil — definieren Sie Ihre Palette einmal als benannte Konstanten
Das mentale Modell: eine Zahl, drei Kanäle
Eine Farbe auf dem Bildschirm sind drei Regler: wie viel Rot, wie viel Grün, wie viel Blau, jeder von
0 bis 255. RGB(r, g, b) nimmt diese drei Regler und faltet sie zu einer Ganzzahl (einem Long), die
Excel auf dem Objekt speichert. RGB(0,0,0) ist Schwarz (alle Regler aus), RGB(255,255,255) ist Weiß
(alle an), RGB(255,0,0) ist reines Rot. An der Farbe selbst ist nichts Geheimnisvolles — die
Überraschung steckt ganz darin, wie die drei Regler in eine Zahl gepackt werden, und dort wohnt der
Bug.
Die wichtigste Regel: die Zahl ist BGR, nicht RGB
Hier ist die Formel, die RGB tatsächlich verwendet:
RGB(r, g, b) = r + g * 256 + b * 65536
Lesen Sie das genau: Rot ist das niedrigste Byte, Blau das höchste. Hexadezimal ist der
gespeicherte Wert &HBBGGRR, nicht &HRRGGBB. Eine Webfarbe wie #4472C4 bedeutet Rot 44, Grün
72, Blau C4 in RGB-Reihenfolge — aber Excel speichert sie in BGR-Reihenfolge. In dem Moment
also, in dem Sie ein Web-Hex direkt in .Color einfügen, haben Sie den Rot- und den Blaukanal
vertauscht:
Range("A1").Interior.Color = &H4472C4 ' Excel liest das als BGR: R=C4, G=72, B=44 -> ein Orangerot
Das ist kein Rundungsfehler; es ist eine völlig andere Farbe, und es ist der Hauptgrund, warum eine
Markenfarbe „im Makro falsch aussieht", obwohl sie im CSS in Ordnung war. Die zuverlässige Lösung ist,
Excel überhaupt nie ein gepacktes Hex zu geben — geben Sie ihm die drei Kanäle und lassen Sie RGB sie
packen:
Range("A1").Interior.Color = RGB(&H44, &H72, &HC4) ' korrekt: die Kanaele bleiben in den richtigen Reglern
Wenn Sie wirklich ein Literal speichern müssen, drehen Sie es zu &HC47244 um. Aber das Hex in
RGB(...) aufzuteilen ist klarer und lässt sich unmöglich verkehrt herum machen — das ist die
Gewohnheit, die sich zu bilden lohnt.
Die vb-Konstanten, und was sie beweisen
VBA bringt eine Handvoll benannter Farbkonstanten mit. Sie sind praktisch für die Grundfarben, und sie bestätigen leise die Byte-Reihenfolge:
Debug.Print vbRed ' 255 = RGB(255, 0, 0) -> Rot ist das niedrige Byte
Debug.Print vbGreen ' 65280 = RGB(0, 255, 0)
Debug.Print vbBlue ' 16711680 = RGB(0, 0, 255) -> Blau ist das hohe Byte
vbRed = 255 ist der verräterische Hinweis: wäre Rot das hohe Byte, wäre reines Rot 16711680. Es
gibt nur acht dieser Konstanten (vbBlack, vbWhite, vbRed, vbGreen, vbBlue, vbYellow,
vbMagenta, vbCyan), sie sind also gut für eine schnelle Grundfarbe, aber kein Ersatz für eine echte
Palette. Für alles Markenbezogene schreiben Sie es mit RGB(...) aus.
Eine Farbe zurücklesen und zerlegen
.Color zu lesen gibt Ihnen das gepackte Long. Um die drei Kanäle herauszuholen, kehren Sie das
Packen um — Rot ist der Rest, Blau das Oberste:
Dim c As Long: c = Range("A1").Interior.Color
Dim r As Long, g As Long, b As Long
r = c Mod 256
g = (c \ 256) Mod 256
b = c \ 65536
Debug.Print r, g, b ' die drei urspruenglichen Kanaele
Die praktische Erkenntnis für Vergleiche: vergleichen Sie ein gespeichertes .Color nie gegen ein
rohes Hex-Literal, das Sie getippt haben — vergleichen Sie es gegen RGB(...), das genau so packt, wie
Excel es tat. If .Interior.Color = RGB(68,114,196) zu prüfen ist korrekt;
If .Interior.Color = &H4472C4 ist der BGR-Bug in umgekehrter Richtung.
Ein Farbmodell, überall
Der Lohn dafür, das einmal zu lernen: es ist überall, wo eine Farbe auftaucht, dieselbe Zahl.
Derselbe RGB(...)-Wert funktioniert bei:
ws.Range("A1").Interior.Color = RGB(68, 114, 196) ' Fuellung
ws.Range("A1").Font.Color = RGB(255, 255, 255) ' Text
ws.Range("A1").Borders.Color = RGB(0, 0, 0) ' Rahmenlinien
ws.Tab.Color = RGB(68, 114, 196) ' Blattregister
Es gibt kein objektspezifisches Farbformat, das Sie neu lernen müssten. Füllung, Schrift, Rahmen,
Register, Diagrammreihe — alle nehmen das eine 24-Bit-Long. Deshalb zahlt es sich aus, das Packen
einmal richtig hinzubekommen: die Lösung und die Gewohnheit übertragen sich auf jedes gefärbte Ding im
Objektmodell. (Die ältere ColorIndex-Eigenschaft ist die Ausnahme — ein Paletten-Platz, nicht diese
Zahl; siehe VBA ColorIndex.)
Das Urteil: benennen Sie Ihre Palette einmal
RGB(255, 242, 204) über hundert Zeilen zu verstreuen ist der Weg, auf dem ein Bericht mit drei leicht
verschiedenen „Goldtönen" endet. Definieren Sie die Palette einmal, am Kopf des Moduls, als benannte
Konstanten — dann hat die Farbe einen Namen, lebt an einem Ort und ist trivial zu ändern:
Private Const CLR_HEADER As Long = 4759559 ' RGB(68,114,196) einmal gepackt
Private Const CLR_WARN As Long = 13551615 ' RGB(255,199,206)
Oder halten Sie sie als RGB(...) in einem kleinen Helfer. So oder so gilt dieselbe Regel, die
generell für Konstanten gilt: ein Wert, der etwas bedeutet, sollte einen
Namen haben und nicht neu getippt werden. Bauen Sie mit RGB, speichern Sie an einem Ort, und die
BGR-Falle kann nie zuschnappen, weil Sie nie ein gepacktes Hex von Hand schreiben.
Wie ExcelMaster hilft
Die BGR-Umkehrung ist ein wirklich fieser Bug, weil der Code gültig ist und die Farbe bloß falsch —
ein Markenblau, das als Orange ausgeliefert wird, ein Vergleich, der nie passt, weil er ein rohes Hex
gegen einen BGR-Wert prüft. Er kostet einen Nachmittag genau deshalb, weil nichts einen Fehler
meldet.
ExcelMaster lässt Sie eine Farbe so
angeben, wie Sie sie tatsächlich haben — „nimm #4472C4", „mach es zu unserem Markengrün",
„255, 242, 204" — und es schreibt RGB(...) mit den Kanälen in den richtigen Reglern, nie ein
byteweise umgedrehtes Hex. Bitten Sie es, „Zellen hervorzuheben, die zur Kopfzeilenfarbe passen", und
es vergleicht gegen RGB(...), nicht gegen ein rohes Literal, sodass der Abgleich wirklich
funktioniert. Wenn Sie eine Farbe wiederverwenden, hebt es sie in eine benannte Konstante. Sie behalten
die Arbeitsmappe und den Code, abzüglich des Nachmittags mit vertauschten Kanälen.
Häufig gestellte Fragen
Wie funktioniert die RGB-Funktion in VBA?
RGB(red, green, blue) nimmt drei Kanäle, jeder von 0 bis 255, und gibt eine einzige Long-Zahl
zurück, die Excel als Farbe nutzt: RGB(255, 242, 204) ist ein sanftes Gold. Intern berechnet es
red + green*256 + blue*65536, die Zahl ist also eine 24-Bit-Farbe, die Sie jeder Farbeigenschaft
zuweisen können — Interior.Color, Font.Color, Borders.Color und so weiter.
Warum ist meine Farbe falsch, wenn ich einen Hex-Code in VBA verwende?
Weil Excel Farben in BGR-Reihenfolge speichert (Blau hohes Byte, Rot niedriges Byte), was die
Umkehrung eines Web-Hex wie #RRGGBB ist. .Color = &H4472C4 zuzuweisen liest es als BGR und
vertauscht Rot und Blau. Teilen Sie das Hex stattdessen in Kanäle auf — .Color = RGB(&H44, &H72, &HC4)
— oder drehen Sie das Literal zu &HC47244 um.
Wie wandle ich eine Hex-Farbe in VBA in RGB um?
Teilen Sie das Hex in seine drei Byte-Paare und übergeben Sie sie an RGB: für #4472C4 schreiben Sie
RGB(&H44, &H72, &HC4). Das hält jeden Kanal im richtigen Regler und vermeidet die
BGR-Byte-Reihenfolge-Falle, in die Sie tappen, wenn Sie das gepackte Hex direkt .Color zuweisen.
Wie hole ich die Rot-, Grün- und Blau-Werte aus einer Farbe zurück?
Lesen Sie das gepackte Long aus .Color und zerlegen Sie es dann: r = c Mod 256,
g = (c \ 256) Mod 256, b = c \ 65536. Weil Excel den Wert als BGR speichert, ist Rot das niedrige
Byte und Blau das hohe — das kehrt genau um, was RGB gepackt hat.
Was sind die vb-Farbkonstanten in VBA?
VBA bietet acht benannte Konstanten — vbBlack, vbWhite, vbRed, vbGreen, vbBlue, vbYellow,
vbMagenta, vbCyan —, jede gleich einem RGB(...)-Wert (vbRed = 255 = RGB(255,0,0)). Sie sind
praktisch für Grundfarben, aber für jede bestimmte oder markenbezogene Farbe nehmen Sie RGB(r, g, b),
damit Sie alle drei Kanäle steuern.
Getestet in
Getestet in: Excel 365 (Windows 11), VBA 7.1 — zuletzt geprüft am 08.09.2026.
Verwandte Anleitungen: VBA ColorIndex · VBA Zellfarbe · VBA Font · VBA Bedingte Formatierung · VBA Konstante
