Excel VBA Zellen färben, wenn best. Wert in anderer Zelle
Servus,
ich habe durch die Arbeit vermehrt mit Excel VBA und Makro zu tun, meine Aufgabe besteht darin, dass ich ein Makro erstellen soll, das Daten aus mehreren Dokumenten zu einem monatlichen Bericht zusammenstellt.
Ich bin schon recht weit, jetzt fehlts am Feinschliff, ich habe in Spalte A Werte von FF58200 bis FF59625. Ist der Wert in einer Zelle zwischen FF58200 und FF58425 ist, so sollen in den Spalten E und F diese Zellen Gelb gefärbt werden, sofern sie zwischen FF58430 und FF 58650 sind Grün.
Das Problem dabei ist, dass ich absolut keine Wenn-Funktion hinbekomme.
Könnt ihr mir helfen?
Danke vielmals :D
2 Antworten
Als Problem könnte noch auftauchen, dass Du
=HEXINDEZ("FF59625")
brauchst, da xl nur Dezumalzahlen nach Größe vergleicht.
Formel ohne Makro (bedingte Formatierung, Formel verwenden, Formel ist (ifür A1):
=und(HEXINDEZ(A1)<Hexindez("FF59625");HEXINDEZ(A1)>Hexindez("FF58200"))
Format: Gelber HiGr
entspr. für grün als erster (zuletzt eingegebener?) Bedingung (engeres Intervall, ich glaube mit "Anhalten", musst du ausprobieren)
Das Format kannst du per Formatpinsel von Blattkopf zu Blattkopf übertragen (Blattkopf = Schnittecke Spaltenbuchstaben-Zeilennummer links oben)
Im Prinzip lässt sich deine Anforderung auch ohne VBA erfüllen und zwar mit der Bedingten Formatierung. Schaue dir mal den angehängten Screenshot an.
Du kannst mit UND und WENN oder weiteren Bedingungen die Bedingung beliebig erweitern.

Da hast du recht, das Problem ist, dass es ein generelles Makro zur Umwandlung sein soll, es muss also via VBA passieren.
Was meinst du mit "generell"? Was sind die freien Parameter?
Generell im Sinne von, dass es jeden Monat ein File gibt, mit selben Aufbau, das mit dem Makro fertiggestellt werden soll. Die Werte von Spalte A variieren, die Werte in den Spalten D bis H variieren ebenso, je nach dem Wert in sagen wir A22 sollen E und F gefärbt werden.
Also mal A22 als Basis, mal A5, mal Ax, verstehe ich das richtig?
Dann ist dein Problem, dass du eine Regel finden musst, wie du die Formatierungsbasis identifizieren kannst. Das hat zunächst einmal nichts mit der Frage zu tun, ob du das in VBA oder Excel lösen kannst.
in VBA ist die Hintergrundfarbe InteriorColor. Die deutschen Funktionen programmierst du auf Englisch. Zum Beispiel ist WENN = IF.
Der Makrorekorder kann dir bei der Arbeit helfen.
Okay, danke, dann schau ich mal was ich rausbekomme, bei weiteren Fragen meld ich mich wieder. Und danke nochmals :D
Ich gebe zu, dass ich mich ein bisschen quer stelle, hoffe aber, dir zumindest die richtigen Impulse gegeben zu haben.
Meine Faustregel: Löse nichts in VBA, wenn du es mit Excelfunktionalität (relativ unkompliziert) lösen könntest.
Range("A" & c, "A" & b).Select
Selection.FormatConditions.Delete
Selection.FormatConditions.Add Type:=xlCellValue, Operator:=xlBetween, _
Formula1:="=""FF58200""", Formula2:="=""FF58425"""
Selection.FormatConditions(1).Interior.ColorIndex = 36
Selection.FormatConditions.Add Type:=xlCellValue, Operator:=xlBetween, _
Formula1:="=""FF58430""", Formula2:="=""FF58650"""
Selection.FormatConditions(2).Interior.ColorIndex = 35
Selection.Find(What:="FF59", After:=ActiveCell, LookIn:=xlFormulas, _
LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
MatchCase:=False, SearchFormat:=False).Activate
d = ActiveCell.Row
Range("A" & d, "A" & b).Select
Selection.FormatConditions.Delete
Selection.FormatConditions.Add Type:=xlCellValue, Operator:=xlBetween, _
Formula1:="=""FF59210""", Formula2:="=""FF59430"""
Selection.FormatConditions(1).Interior.ColorIndex = 36
Selection.FormatConditions.Add Type:=xlCellValue, Operator:=xlBetween, _
Formula1:="=""FF59610""", Formula2:="=""FF59640"""
Selection.FormatConditions(2).Interior.ColorIndex = 35
Selection.FormatConditions.Add Type:=xlCellValue, Operator:=xlBetween, _
Formula1:="=""FF59810""", Formula2:="=""FF59825"""
Selection.FormatConditions(3).Interior.ColorIndex = 36
So sind die Regeln für die bedingte Formatierung von der Spalte A, jetzt muss ich dieselben Zellen in Spalte E,F,K und M genauso färben, daran haperts.
Eine Möglichkeit wäre, als Type für die FormatCondition xlExpression wählen.
Dann baust du die Formel wie folgt auf:
Selection.FormatConditions.Add Type:=xlExpression, Operator:=xlNone, Formula1:="=UND(" & Selection.Address & ">=""FF59210"";" & Selection.Address & "<=""FF59430"")"
Selection.FormatConditions(1).Interior.ColorIndex = 36
Das Format kopierst du mit
Selection.Copy
Range("XXXXX").PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
Nimmst du als Typ xlCellValue, wird die gleiche bedingte Formatierung auf den Kopierzielbereich angewendet. Die Formatbedingung würde dann sozusagen kopiert werden, nicht das Format(-resultat) der Quelle.
Range("A" & c, "A" & a - 1).Select
Selection.FormatConditions.Add Type:=xlExpression, Operator:=xlNone, Formula1:="=UND(" & Selection.Address & ">=""FF59210"";" & Selection.Address & "<=""FF59430"")"
Selection.FormatConditions(1).Interior.ColorIndex = 36
Range("A" & c, "A" & a - 1).Select
Selection.Copy
Range("E" & c, "E" & a - 1).PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
So hab ichs mal auf meine Tabelle angewendet, aber diese werden nicht eingefärbt. Hab ich was vergessen, oder stell ich mich nur dumm an ?
In meinem Test habe ich nur eine Zelle behandelt.
Versuche mal, Selection.Address zu ersetzen durch "$A" & c, also der Adresse der obersten Zelle.
Hat auf anhieb funktioniert. Danke für deine Hilfe! :D
So habe leider einen kleinen Rückschlag erlitten, denn auf einmal werden die Zielzellen genau in der falschen Farbe markiert
Do
Range("A" & c).Select
Selection.FormatConditions.Add Type:=xlExpression, Operator:=xlNone, Formula1:="=UND(" & "$A" & c & ">=""FF58200"";" & "$A" & c & "<=""FF58430"")"
Selection.FormatConditions(1).Interior.ColorIndex = 36
Selection.FormatConditions.Add Type:=xlExpression, Operator:=xlNone, Formula1:="=UND(" & "$A" & c & ">=""FF58610"";" & "$A" & c & "<=""FF58642"")"
Selection.FormatConditions(2).Interior.ColorIndex = 35
Selection.FormatConditions.Add Type:=xlExpression, Operator:=xlNone, Formula1:="=UND(" & "$A" & c & ">=""FF58809"";" & "$A" & c & "<=""FF58811"")"
Selection.FormatConditions(3).Interior.ColorIndex = 35
Selection.FormatConditions.Add Type:=xlExpression, Operator:=xlNone, Formula1:="=UND(" & "$A" & c & ">=""FF59429"";" & "$A" & c & "<=""FF59431"")"
Selection.FormatConditions(4).Interior.ColorIndex = 36
Selection.FormatConditions.Add Type:=xlExpression, Operator:=xlNone, Formula1:="=UND(" & "$A" & c & ">=""FF59610"";" & "$A" & c & "<=""FF59643"")"
Selection.FormatConditions(5).Interior.ColorIndex = 35
Selection.FormatConditions.Add Type:=xlExpression, Operator:=xlNone, Formula1:="=UND(" & "$A" & c & ">=""FF59819"";" & "$A" & c & "<=""FF59821"")"
Selection.FormatConditions(6).Interior.ColorIndex = 36
c = c + 1
Loop Until c = a
Columns("A:A").Select
Selection.Find(What:="FF58200", After:=ActiveCell, LookIn:=xlFormulas, _
LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
MatchCase:=False, SearchFormat:=False).Activate
Selection.FindNext(After:=ActiveCell).Activate
c = ActiveCell.Row
Do
Range("A" & c).Select
Selection.Copy
Range("E" & c).PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
c = c + 1
Loop Until c = b
Ich habe das so vestanden, dass wenn die Zelle in Ax gelb eingefärbt wird, dass dann Ex auch gelb werden soll.
Wenn du nur die Bedingung zur Formatierung auf Ex übertragen willst, d. h. auch Ex überprüfen willst, in welchem Berech der Wert liegt, dann warst du mit deiner Lösung schon nah dran. Dann kannst du die Between-Variante nehmen und einfach das Format kopieren.
Versuche aber als Erstes, mit dem Dollarzeichen in der FormatCondition zu spielen.
ich bin da einem Irrtum aufgesessen: das sind gar keine Hexadezimalzahlen, sondern eine Zahl mit vorangestelltem FF?
Dann
=und(Teil(A1;3;99)
*
1<59625;Teil(A1;3;99)*
1>58200)