13.04.2023, 18:20
Hi,
bei meinen Versuchen zur Gestaltung eines Diagramms via VBA bin ich auf ein Problem mit der RGB-Berechnung gestoßen:
Dann muss dieser HEX-Wert von rechts betrachtet werden: jeweils zwei Ziffern (hexadezimal: 0-9 oder A-F) entsprechen einer der RGB-Komponenten mit R der am weitesten rechts stehende Wert, G der Wert in der Mitte und B den verbleibenden Stellen am linken Ende (ist B<16 dann nur eine Stelle, ansonsten zwei).
Dementsprechend sind dann
Würde mich mal interessieren, ob es 'geschicktere' Varianten gibt. Insbesondere die falsche Formel auf der oben verlinkten Seite hat mir Einiges an Kopfzerbrechen bereitet...
Gruß,
RaiSta
bei meinen Versuchen zur Gestaltung eines Diagramms via VBA bin ich auf ein Problem mit der RGB-Berechnung gestoßen:
- die VBA-Funktion RGB(R,G,B) (mit R, G, B den Zahlen für Rot, Grün und Blau respektive, jeweils 0 ... 255) liefert einen Farbwert in Excel (z.B. zum Einstellen der Farbe einer Digramm-Linie, etc)
- wenn ich aber jetzt ein Objekt (Linie, Zelle, ...) habe und die R, G und B-Komponenten dessen RGB-Farbwerts ermitteln will (also der 'umgekehrte' Weg...), dann habe ich dafür keine Formel gefunden: z.B. liefert das Attribut "[Objekt].Format.Line.ForeColor.RGB" nur eine dezimale Zahl
- auf der Seite RGB Color Codes Chart steht die Formel: RGB = (R*65536)+(G*256)+B (irgendwo anders habe ich dieselbe Formel ebenfalls gesehen, weiß aber nicht mehr, wo), mit der angeblich der dezimale R-G-B-Wert berechnet wird
- meine Tests haben aber ergeben, dass die Formel FALSCH ist: RGB = R+(G*256)+(B*65536) ergibt den richtigen Wert (dass die Klammern um die Multiplikationen mathematisch überflüssig sind, ist mir bekannt...)
- und die inverse Berechnung (also die Berechnung der dezimalen R, G und B-Werte) kann erfolgen mit
- B = rgb \ x (man beachte die Ganzzahl-Division mit "\" anstelle der 'normalen' Division "/")
- G = (rgb - B*x) \ y (alternativ: (rgb mod x) \ y )
- R = rgb - B*x - G*y (alternativ: (rgb mod x) mod y)
Dann muss dieser HEX-Wert von rechts betrachtet werden: jeweils zwei Ziffern (hexadezimal: 0-9 oder A-F) entsprechen einer der RGB-Komponenten mit R der am weitesten rechts stehende Wert, G der Wert in der Mitte und B den verbleibenden Stellen am linken Ende (ist B<16 dann nur eine Stelle, ansonsten zwei).
Dementsprechend sind dann
- R = Val("&H" & Right(h,2)) (wie gesagt: h ist der HEX-Wert von rgb)
- G = Val("&H" & Mid(h,3-(6-Len(h)),2))
- B = Val("&H" & Left(h, Len(h)-4))
Würde mich mal interessieren, ob es 'geschicktere' Varianten gibt. Insbesondere die falsche Formel auf der oben verlinkten Seite hat mir Einiges an Kopfzerbrechen bereitet...
Gruß,
RaiSta