Wie prüfe ich mit VBA, ob die Schriftfarbe einer Zelle (in Excel) rot ist?

3 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Es gibt vor allem eine Möglichkeit, wie du dir solche Fragen selbst beantworten kannst:

Zeichne ein Makro auf - das geht in älteren Versionen über Menü "Extras" -> "Makros" -> "Makro aufzeichnen...", in neueren Versionen über den Ribbon-Bereich "Entwicklertools" ein Symbol aus einem dunkelblauen kleinen Kreis. Die Standardeinstellung für Makronamen und -kommentar kannst du beibehalten.

Wenn die Makroaufzeichnung läuft, nimmst du die gewünschten (zu setzenden und/oder abzufragenden) Formatierungen vor.

Danach beendest du die Makro-Aufzeichnung.

Im Entwicklungsbereich findest du ein neues Modul und hierin ein Makro mit dem vorgeschlagenen Namen.

In diesem Makro findest du sowohl die zu verwendenden Eigenschaften als auch die betreffenden Werte für dieser Eigenschaften.

In diesem Fall findest du z. B.

Sub Makro1()
Selection.Font.ColorIndex = 7
With Selection.Font
'...
.Strikethrough = True
'...
End With
End Sub

D. h. die Farbe "rot" bedeutet, dass die Eigenschaft Cell.Font.ColorIndex den Wert 7 hat und "durchgestrichen", dass die Eigenschaft Cell.Font.Strikethrough den Wert True hat.

(Wo im aufgezeichneten Makro "Selection" steht, setzt du die betreffende(n) Zelle(n) ein.)

Woher ich das weiß:Berufserfahrung – Software-Entwickler

sehe ich auch so, aber kleine Korrektur:

Colorindex 7  ist magenta RGB(255;0;255), rot ist 3: RGB(255;0;0)

1
@Iamiam

Stimmt - hab eins zu tief geklickt bei der Farbauswahl :-\

1

Es gibt die Schrifteigenschaft Farbe (allgemein nur über VBA zugänglich, im Einzelfall auch über Schriftfarbe - weitere Farben - Benutzerdefiniert -RGB-Werte)

in VBA für die ausgewählten Zellen im Direktfenster:

  • Sub SchriftfarbenDerAuswahl()
  • Dim c
  • For each c in Selection
  • Debug.print c.address &" Schriftfarbe RGB-Wert: " & c.Font.color
  • next
  • end sub

Der Wert von RGB(rot;grün;blau) ist Rotwert + Grünwert*2^8 + Blauwert*2^16

Das ist nicht ganz einfach rückzurechnen, übrigens in LO/OO leichter als in xl, da dort die Fkt Basis nicht nur bis 511 geht, wie in xl, sondern bis 2^48 RGB-Zahl in C4):

  • R = =DEZIMAL(RECHTS(BASIS(C4;2;24);8);2)
  • G = =DEZIMAL(TEIL(BASIS(C4;2;24);9;8);2)
  • B = =DEZIMAL(LINKS(BASIS(C4;2;24);8);2)

Es gibt aber auch die Zelleigenschaft "Farbe" , die bedeutet irreführenderweise) nur, dass negative Zahlen rot dargestellet werden:
=ZELLE("Farbe";A1)

müsste sich in VBA mit NumberFormat oder NumberFormatLocal.Color = True abfragen lassen. (nicht getestet)

Hier noch eine Liste der 56 Farben und RGB-Zahlen in xl97, die dem Colorindex zugeordnet sind, vllt kann das jemand brauchen:

1: RGB(0;0;0) = 0, 2: RGB(255;255;255) = 16777215, 3: RGB(255;0;0) = 255, 4: RGB(0;255;0) = 65280, 5: RGB(0;0;255) = 16711680, 6: RGB(255;255;0) = 65535, 7: RGB(255;0;255) = 16711935, 8: RGB(0;255;255) = 16776960, 9: RGB(128;0;0) = 128, 10: RGB(0;128;0) = 32768, 11: RGB(0;0;128) = 8388608, 12: RGB(128;128;0) = 32896, 13: RGB(128;0;128) = 8388736, 14: RGB(0;128;128) = 8421376, 15: RGB(192;192;192) = 12632256, 16: RGB(128;128;128) = 8421504, 17: RGB(153;153;255) = 16751001, 18: RGB(153;51;102) = 6697881, 19: RGB(255;255;204) = 13434879, 20: RGB(204;255;255) = 16777164, 21: RGB(102;0;102) = 6684774, 22: RGB(255;128;128) = 8421631, 23: RGB(0;102;204) = 13395456, 24: RGB(204;204;255) = 16764108, 25: RGB(0;0;128) = 8388608, 26: RGB(255;0;255) = 16711935, 27: RGB(255;255;0) = 65535, 28: RGB(0;255;255) = 16776960, 29: RGB(128;0;128) = 8388736, 30: RGB(128;0;0) = 128, 31: RGB(0;128;128) = 8421376, 32: RGB(0;0;255) = 16711680, 33: RGB(0;204;255) = 16763904, 34: RGB(204;255;255) = 16777164, 35: RGB(204;255;204) = 13434828, 36: RGB(255;255;153) = 10092543, 37: RGB(153;204;255) = 16764057, 38: RGB(255;153;204) = 13408767, 39: RGB(204;153;255) = 16751052, 40: RGB(255;204;153) = 10079487, 41: RGB(51;102;255) = 16737843, 42: RGB(51;204;204) = 13421619, 43: RGB(153;204;0) = 52377, 44: RGB(255;204;0) = 52479, 45: RGB(255;153;0) = 39423, 46: RGB(255;102;0) = 26367, 47: RGB(102;102;153) = 10053222, 48: RGB(150;150;150) = 9868950, 49: RGB(0;51;102) = 6697728, 50: RGB(51;153;102) = 6723891, 51: RGB(0;51;0) = 13056, 52: RGB(51;51;0) = 13107, 53: RGB(153;51;0) = 13209, 54: RGB(153;51;102) = 6697881, 55: RGB(51;51;153) = 10040115, 56: RGB(51;51;51) = 3355443

Die Rückrechnungs-Formel in xl heißt übrigens:

=REST(C4/2^8;1)*2^8&";"&(C4-(GANZZAHL(C4/(2^16)))*2^16-(REST(C4/2^8;1)*2^8))/2^8&";"&GANZZAHL(C4/(2^16))

Die ist zwar auch nicht allzu lang, aber sie erfordert einige Verrenkungen der Gehirnwindungen!

1
Sub marine()


If ActiveCell.Font.ColorIndex = 3 Then
MsgBox ("Ich bin rot")
End If

End Sub

Die Attribute des Textes kannst Du mit dem Makrorekorder rausfinden - Aufzeichnung starten, den Text in einer Zelle bspw. auf Durchgestrichen setzen, Aufzeichnung beenden. Der Rekorder schreibt einen Haufen Kram mit, der unnötig ist, was brauchbares steckt aber auch drin:

Sub Makro1()
'
' Makro1 Makro
'

'
Selection.Font.Strikethrough = True
.Name = "Arial"
.FontStyle = "Standard"
.Size = 10
.Strikethrough = True
.Superscript = False
.Subscript = False
.OutlineFont = False
.Shadow = False
.Underline = xlUnderlineStyleNone
.ThemeColor = xlThemeColorLight1
.TintAndShade = 0
.ThemeFont = xlThemeFontNone
End With
End Sub

Daraus kannst Du dann die Abfrage verkürzt machen
if range("A1").Font.Strikethrough = true then .. (das selection weg, Du sprichst ja eine konkrete Zelle an)

1
@Ninombre

Bei selbst definierten Farben müsste da noch entweder ein

.colorindex = 3 oder ein

.color = 255 (oder = RGB(255, 0, 0) ?) dazukommen bzw das .ThemeColor ersetzen

ausprobieren!

0