ich nutze die Gelegenheit, mich hiermit bei Ihnen herzlich für Ihr super Forum zu bedanken. Ich habe hier schon viele Tipps und Hilfestellungen gefunden, die mir viel Zeit und Mühe gespart haben. Echt klasse, dass Sie Ihr Wissen so bereitwillig zur Verfügung stellen. Vielen Dank!
Ich habe eine etwas "esoterische" Frage, auf die ich keine Antwort finden kann. Hab schon einiges rumgegoogelt, aber keine Chance.
Aus Performancegründen teste ich i.Allg. zuerst den Zustand einer Zelle / Zeile, bevor ich sie ändere. Es bringt enorm viel, wenn man einen Wert nicht erneut zuweist, der schon in der Zelle steht, oder eine Formatierung nicht einstellt, die ohnehin schon drin ist. Das gilt praktisch immer und ganz besonders dann, wenn mit jeder Planänderung per Event weitere Bearbeitungsroutinen angestoßen werden (man kann das zwar mit EnableEvents selektiv ein- und ausschalten, aber das ist a) gefährlich (wehe, man vergisst, z.B. durch einen Fehler-Exit, das wieder zurückzustellen...) und b) ziemlich viel Aufwand für z.B. nur einige wenige Änderungen).
Die spezifische Frage nun ist wie folgt: Ich will eine Zeile einfärben mit einer Farbe aus dem Index, aber nur dann (s.o.), wenn die Zeile noch nicht bereits schon die selbe Farbe hat. Also mit [ Rows(zeile).Font.ColorIndex = Farbe ].
Das Problem sind dabei Zeilen, welche gemischte Farben haben. Eine Zelle rot, eine andere blau, wieder andere schwarz, zum Beispiel. Der Rückgabewert der Abfrage Rows(zeile).Font.ColorIndex interessiert mich. Was ich sozusagen bräuchte, wäre "gemischt", damit ich weiß, nicht alle Zellen in der Zeile haben die gleiche Farbe. Wenn ich jedoch den Wert vorher abfrage [ If Rows(zeile).Font.ColorIndex Farbe Then Rows(zeile).Font.ColorIndex = Farbe ] geht das schief bei Zeilen mit gemischten Farben, und zwar so ziemlich unvorhersagbar (manchmal geht's doch, manchmal nicht, aber warum mal so, mal so, weiß ich nicht). (Anmerkung: Auch wenn die Zeile gemischte Farben hätte, will ich sie trotzdem als Ganzes in eine andere Farbe stellen.)
Ich behelfe mir mit einer selbstgestrickten Funktion:
Function rowcolor(r As Integer) As Integer
Dim i As Integer
rowcolor = Cells(r, 1).Font.ColorIndex
For i = 2 To ActiveSheet.UsedRange.Columns.Count
If rowcolor Cells(r, i).Font.ColorIndex Then
rowcolor = -1
Exit Function
End If
Next
End Function
Diese Funktion gibt entweder die Farbe der ersten Zelle zurück, oder -1 wenn nicht alle genutzten Zellen in der Zeile dieselbe Farbe haben wie die erste. Da es keinen ColorIndex mit -1 gibt (oder etwa doch?), löst das mein Problem zuverlässig.
Tja, und das funktioniert zwar und auch hinreichend performant (für nicht allzuviele Aufrufe), elegant ist es aber nicht. Und bei sehr vielen zu bearbeitenden Zeilen wohl auch nicht mehr allzu schnell - könnte man sich die Prüfung vielleicht sogar sparen...
Wissen Sie vielleicht, wie Excel den Rückgabewert für Row(zeile).Font.ColorIndex behandelt, wenn nicht alle Zellen in einer Zeile dieselbe Farbe aufweisen?
Viele Grüße
Michael Böhm