Wie prüfe ich mit VBA, ob die Schriftfarbe einer Zelle (in Excel) rot ist?
Hallo, wie oben schon beschrieben. Ich versuche mich zur Zeit an VBA und möchte nun eine Funktion, die prüft, ob die Schriftfarbe eines Textes in einer Zelle rot ist. Gibt es hier eine passende Funktion? Falls das jemand weiß, noch eine weitere Frage: Dasselbe wie oben, nur möchte ich auch noch prüfen, ob der Text in einer Zelle durchgestrichen ist. Gibt es hierzu etwas passendes?
3 Antworten
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.)
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!
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)
sehe ich auch so, aber kleine Korrektur:
Colorindex 7 ist magenta RGB(255;0;255), rot ist 3: RGB(255;0;0)