| Wo andere mit 2 Systemen auskommen (RGB-Farben, Index-Farben), braucht der IT-Marktführer viele. | Dieses Chaos dürfte historisch begründet sein. Immerhin kann man sich für neue Entwicklungen viel davon ersparen. |
VBA
|
Visual Basic for Applications |
| Color | 'umgekehrte' RGB-Farbwerte in einer 'Long'-Variablen (für Shapes) |
| ColorIndex | 57 willkürliche Index-Farben (für Zellen, Texte, ...) |
| SchemeColor | 81 Index-Farben für Shapes - ColorIndex mit Wiederholungen |
| QBColor | 16 Index-Farben mit Nostalgie-Wert |
| VGA & WebSafe | Verschiedene Farb-Listen für die gleichen Farben |
| Programmierung | Beispiele für die Verwendung von Farben mit VBA |
| Links |
Ausgewählte
|
Color |
|||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||
|
Die VBA-Eigenschaft Color bezeichnet einen 24-Bit RGB Farbwert.
Jede der 3 Farben (Kanäle) wird mit 8 Bit dargestellt, kann daher Werte 0..255
(#00..FF) annehmen. Diese Kombination ergibt ca. 17 Millionen
verschiedene Farben. VBA verwendet für die Eigenschaft Color Worte vom Typ Long. Der Vorteil liegt darin, alle 3 RGB-Komponenten in einer einzigen Zahl zu codieren. Allerdings kann man mit dieser Zahl nicht rechnen, sie muss für jede Anwendung in ihre Bestandteile zerlegt werden. Außerdem benötigt der Typ Long 33% mehr Speicherplatz als 3 Bytes.
|
BGRIn diesem Web werden VBA-Color Werte zur Unterscheidung mit der Abkürzung BGR angegeben:BGR = (B * 256 + G) * 256 + R
♦ Details und Beispiele zur Programmierung mit Color im Kapitel ↓ Programmbeispiele' dieser Seite. Objekt-Klassen wären wesentlich besser geeignet, Farbe in einer einzigen Variablen zu codieren. ♣ Achten sie bei Verwendung von VBA-Color auf den richtige Variablen-Type Long, sonst kann ein Teil der Farb-Information verloren gehen. |
||||||||||||||||||||||||||||||||||||||||||||||
Color-(BGR)-Anwendung |
|
Beispiel Word:Die Textverarbeitung des IT-Marktführers verwendet eine Tabelle von 58 Farb-Konstanten. Die Konstanten entsprechen VBA Color-Daten im BGR-Format.Die Anzahl 58 spricht dafür, dass damit auch eine interne Tabelle von ↓ ColorIndex-Farben verknüpft ist, die ähnlich wie bei Excel mit 6 Bit ↔ 64 Zeilen auskommt. Die Farben der Liste sind zum größten Teil identisch mit den Excel ↓ ColorIndex Farben, allerdings befinden sich darunter keine Dubletten. Tipp: Sortieren sie mit Klick auf die Überschrift, wählen sie eine Farbe zur Live-Anzeige (oben) mit Klick auf das Farbmuster. |
|
Shapes:Shapes sind geometrische Objekte (z.B. Rechtecke, Ovale, Pfeile, ...). Sie werden mit RGB-Farben formatiert.Wählen sie Menü und zeichnen sie einige Rechtecke und Ovale in ein Arbeitsblatt. |
Mit Rechtsklick wird ein shape formatiert, allerdings ist der Weg zu RGB-Farben mühsam: Menü Hinweis: Entgegen einer verbreiteten Ansicht können Excel-Zellen nur mit ↓ Index-Farben (s.u.) formatiert werden. |
ColorIndex |
|
Beispiel Excel:Das Kalkulations-Programm des IT-Marktführers verwendet eine → Palette von 57 ausgewählten Farben. Die Konstanten entsprechen VBA Color-Daten im BGR-Format.Die Anzahl 58 spricht dafür, dass damit auch eine interne Tabelle von ColorIndex-Farben verknüpft ist, die ähnlich wie bei Word mit 6 Bit ↔ 64 Zeilen auskommt. Die Farben der Liste sind zum größten Teil identisch mit den Word ColorIndex Farben, allerdings befinden sich darunter keine Dubletten. Tipp: Sortieren sie mit Klick auf die Überschrift, wählen sie eine Farbe zur Live-Anzeige (oben) mit Klick auf das Farbmuster. Farb-Tabelle (Palette, Color Lookup Table, CLUT) Die Tabelle definiert eine begrenzte Auswahl von Farben aus der Menge der 17 Mio RGB-Farben. • Der Vorteil liegt darin, dass man zur Angabe dieser Index-Farben nur max. 8 Bit = 1 Byte braucht und nicht 24 Bit = 3 Byte für die volle Angabe der RGB-Daten. • Allerdings muss die Software bei jeder Anwendung einer ColorIndex-Farbe ihre RGB-Daten in der Tabelle nachschlagen (lookup). Rechts die ColorIndex Farb-Tabelle von Excel (ohne Gewähr !): Links die Index-Zahl, danach die Farb-Daten. In einigen Fällen beziehen sich mehrere ColorIndex-Nummern auf die gleiche Farbe. |
|
|
Die Idee von Index-Farben (indizierte Farben) entstand,
um bei der Verwendung von Farben Speicherplatz und Rechenleistung zu sparen. ♦ Details zu → Index-Farben. Farb-Tabelle: (Palette, Color Lookup Table, CLUT) ist eine Tabelle, die in jeder der max. 256 Zeilen eine Index-Farbe definiert. Zur Definition einer Index-Farbe werden dir RGB-Grundfarben verwendet. Daher kann jede einzelne der max. 256 Index-Farben aus dem großen Vorrat der ca. 17 Millionen RGB-Farben (Kapitel ↑ Color auf dieser Seite) ausgewählt werden. |
|
Beispiel Excel:Die Farbtabelle von Excel enthält z.B. derzeit 59 Zeilen. Die Zeilen-Nummer benötigt nur 6 Bit (2^6=64) an Stelle der 24 Bit für RGB-Farben. Dafür muss jedes Programm mit Hilfe der Index-Nr in der Farb-Tabelle den 24-Bit FarbWert 'nachschlagen' (lookup).• Dieses Verfahren ist gut geeignet, wenn es darum geht 'abzählbare' Farben darzustellen wie z.B. in einer üblichen Geschäftsgrafik (Säulen, Balken, Kreise, ...). • Index-Farben sind ungeeignet zur Darstellung von Bildern mit 'unendlich' vielen Farben wie z.B. Portraits oder Landschaften. Mit den einzelnen Objekten wird nicht die Farbe gespeichert, sondern der Farb-Index.
Wenn eine Definition in der Farb-Tabelle geändert wird, dann bedeutet das
eine automatische Farb-Änderung aller Objekte mit
der entsprechenden Index-Nr !
In M$-Excel verfügt jedes Dokument (!) über eine eigene Farb-Tabelle,
die bei der erstmaligen Erstellung eine Kopie der Standard-Werte erhält.
Sie können probeweise eine Index-Farbe für ein Dokument ändern:
(verwenden sie ein wertloses Demo-Dokument !) Extras | Optionen |
Farbe | Ändern
|
Beispiele für Index-Farben: • Alle gängigen Betriebssysteme verwenden Index-Farben für System-Objekte wie z.B. Fenster, Menüs, Rollbalken, etc. Die Farben dieser Tabelle werden meist als system-colors bezeichnet, sie sind für jedes System und teilweise auch je nach Version unterschiedlich. • Das Grafik-Format GIF verwendet Index-Farben. Es ist daher für Geschäftsgrafik, Logo, etc. gut geeignet, nicht jedoch für Portraits oder Landschaften. • Das Grafik-Format PNG kann ebenfalls Index-Farben verwenden, allerdings optional auch volle RGB-Farben. • Excel-Zellen verwenden ausschließlich Index-Farben, und zwar sowohl für die Schrift-Farbe als auch für die Hintergrund-Farbe. Wenn man die Farbe einer Zelle auf eine RGB- ↑ Color-Farbe setzt, dann erhält man zwar keine (!) Fehlermeldung, die Farbe wird jedoch tatsächlich auf die 'nächstliegende' Index-Farbe gesetzt. ♦ Details und Beispiele im Kapitel ↓ VBA-Programmierung von Farben auf dieser Seite. ♦ Für die gezeigte Tabelle wurden die Live-Daten der Farben mit einem VBA-Sub erzeugt und exportiert, von einem → PHP Script-Programm übernommen, daraus eine Webseite erzeugt und in diese Webseite → eingebettet. |
SchemeColor |
|
| SchemeColor definiert eine Liste von 81 indizierten Farben für Shape-Objekte. Aus unbekannten Gründen enthält diese Liste die gleichen (!) Farben wie ColorIndex, jedoch zum Teil mehrfach und in anderer Reihenfolge. | Ich habe keine Hinweis gefunden, wozu neben der Eigenschaft ColorIndex eine praktisch gleichwertige Eigenschaft SchemeColor verwendet werden sollte. SchemeColor wird daher nur der Vollständigkeit halber angeführt. |
QBColor |
|
| QBColor definiert eine Liste von 16 indizierten Farben, identisch mit den 'klassischen' → VGA-Farben. Alle QBColor-Farben sind in der IndexColor-Liste enthalten, und zwar QBColor 0..15 in IndexColor 1..16, allerdings in ganz anderer Sortierung, ohne eine einzige übereinstimmende Index-Zahl. | QBColor scheint ebenso wie SchemeColor überflüssig. |
VBA Programm-Beispiele |
|
|
Das Lesen von Farb-Werten ist relativ einfach: Setzen sie für die Beispiele die Hintergrund-Farbe einer Excel-Zelle, z.B. ein helles ● Rot in Zelle A1. Tragen sie die Funktionen als Formel in beliebige andere Zellen ein und verwenden sie als Argument die Adresse A1, z.B. =vba_colorindex(A1)
Funktion vba_colorindex liest die Index-Nr, d.h. jene Zahl, unter welcher die betreffende Farbe in der Farbtabelle (Color Lookup Table, CLUT) ihres Dokuments eingetragen ist. Das Ergebnis ist nomalerweise die Zahl 3, da ● Rot als Index-Farbe Nr. 3 verwendet wird (Sie können das allerdings ändern). Funktion vba_color liest die VBA_Eigenschaft Color vom Typ Long mit der Zusammensetzung R + 256 * (G + 256 * B). Das Ergebnis ist für ● Rot immer die Zahl 255. Funktion vba_color_hexrgb liefert den hexadezimalen → CSS-Farbcode der Hintergrund-Farbe. Das Ergebnis ist für ● Rot immer der Text (String) FF0000 |
Function vba_colorindex(zelle As Range) As Integer
vba_colorindex = zelle.Interior.ColorIndex
End FunctionFunction vba_color(zelle As Range) As Long vba_color = zelle.Interior.Color
End FunctionFunction vba_color_hexrgb(zelle As Range) As String Dim hm As String
hm = Hex(zelle.Interior.Color)
End Function
hm = Right("000000" & hm, 6) vba_color_hexrgb = Right(hm, 2) & Mid(hm, 3, 2) & Left(hm, 2) |
|
Die Funktionen vba_rgb_r, vba_rgb_g, vba_rgb_b liefern die
dezimalen Werte der 3 Farb-Kanäle (jeweils 0..255). Dafür habe ich keine
Standard VBA-Funktion gefunden, daher rechts unverbindliche Beispiele für die
Selbst-Programmierung. Um den CSS-Farbcode in RGB-Syntax zu erhalten, geben sie z.B. diese Formel in eine Zelle ein:
= "rgb(" & vba_rgb_r(A1) & "," &
vba_rgb_g(A1) & "," & vba_rgb_b(A1) & ")"
Um an Stelle der Hintergrund-Farbe die Schrift-Farbe einer Zelle zu erhalten, verwenden sie zelle.Font.Color an Stelle von zelle.Interior.Color. |
Function vba_rgb_r(zelle As Range) As Integer
Dim c As Long
c = zelle.Interior.Color
End Functionvba_rgb_r = c Mod 256 Function vba_rgb_g(zelle As Range) As Integer Dim c As Long
c = zelle.Interior.Color
End Functionc = c \ 256 vba_rgb_g = c Mod 256 Function vba_rgb_b(zelle As Range) As Integer Dim c As Long
c = zelle.Interior.Color
End Function
c = c \ 256 \ 256 vba_rgb_b = c Mod 256 |
|
Das Schreiben / Ändern von Farben ist leider mit
VBA-Funktionen nicht erlaubt. Man kann dazu ein Sub verwenden, kann jedoch aus dem Excel-Programm keine Argumente (gewünschte Farbe und Adresse) an das Sub übergeben. Daher wurde ein umständlicher Weg gewählt: Geben sie die Farb-Werte für Rot, Grün und Blau (Zahlen 0..255) in die Zellen C1, C2, C3 ein und starten sie das Sub (Befehl Extras | Makro | Makros | cell_bg_set). Das Sub stellt in Zelle A1 die programmierte Farbe ein, z.B. Cyan für 0, 255, 255. Die Berechnung des VBA-Farbwerts erfolgt mit Funktion RGB() oder mit eigener Formel (mit Kommentar abgeschaltet). |
Sub cell_bg_set()
Schreiben von Index-Farben (nur intern verwendbar):
Dim r, g, b As Integer Dim vbacol As Long
r = Range("C1").Value 'R
End Sub
g = Range("C2").Value 'G b = Range("C3").Value 'B 'vbacol = r + 256 * (g + 256 * b)
vbacol=RGB(r,g,b)Range("A1").Interior.Color = vbacol
Sub cell_colorindex_set(rnam, fi, bi)
Aufruf: Setzt Index-Farben: gelbe Schrift auf blauem Grund
Dim r As Range
Set r = Range(rnam)
End Sub
r.Font.ColorIndex = fi r.Interior.ColorIndex = bi Call cell_colorindex_set("A1", 6, 5)
|
|
Shapes haben keine 'Adresse' und lassen sich daher nicht
wie Zellen adressieren. Jedes Shape erhält bei der Erzeugung einen Namen.
Markieren sie das Shape, dann erscheint ganz links oben sein Name, z.B. Ellipse 3.
Geben sie einen eigenen eindeutigen Namen ein und quittieren sie mit der
Return-Taste. Unter diesem Namen ist das Shape adressierbar. Rechts Beispiele für ein Shape mit dem seltenen Namen Test, entweder auf dem aktuellen Arbeitsblatt, oder explizit auf einem Blatt namens Farbe. |
' Shape-RGB-Farbe lesen
vbacolor = ActiveSheet.Shapes("Test").Fill.ForeColor.RGB
' Shape-RGB-Farbe schreiben
Sheets("Farbe").Shapes("Test").Fill.ForeColor.RGB = RGB(128,128,0)
|
| Rechts Beispiele für das Lesen und Schreiben von SchemeColor - Index-Farben. |
' Shape-SchemeColor lesen
vbacolor = ActiveSheet.Shapes("Test").ForeColor.SchemeColor
' Shape-SchemeColor schreiben
Sheets("Farbe").Shapes("Test").ForeColor.SchemeColor = 6
|
| Ein Beispiel für die (überholte) Anwendung von QBColor. |
vbacolor = QBColor(12)
Range("A1").Interior.Color = vbacolor |
|
|
| MyPS - Excel & VBA & Color: Zahlreiche Mini-Artikel zum Thema Farbe | |
|