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

VBA RGB-Funktion in Excel — wie eine Farbe zu einer Zahl wird (und die BGR-Falle)

|

VBA RGB-Funktion in Excel — wie eine Farbe zu einer Zahl wird (und die BGR-Falle)

Kurz gesagt — Das .Color einer 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: RGB baut sie als Rot niedrig, Blau hoch (r + g*256 + b*65536), was die Umkehrung eines Web-Hex ist. Ein direkt eingefügtes #4472C4 als .Color = &H4472C4 vertauscht also Rot und Blau und gibt Ihnen die falsche Farbe. Bauen Sie Farben immer mit RGB(...), 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 — .Color ist eine Zahl, und RGB ist der Packer
  • Die Falle, die jeden erwischt — die Zahl wird als BGR gespeichert, 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