Sicher mit der Fml, die du im BedingtFormat ...
04.03.2015 05:27:14
Luc:-?
…einsetzt, Debian,
natürlich entsprd angepasst und als ZellFml verwendet.
Damit habe ich mich aber nicht weiter beschäftigt, weil mir etwas Anderes aufgefallen ist. Du verwendest auch eine ZellFml mit der UDF Farbsumme. Solche UDFs findet man ja bekanntlich im INet, aber ich habe den Eindruck, dass du versucht hast, sie an deine Zwecke anzupassen. Nur ist diese Anpassung aus meiner Sicht untauglich. Wozu gibst du als Argument2 einen FarbIndex an, wenn der dann in der UDF gar nicht verwendet wird? Den kannst du in einer ZellFml dann auch straflos weglassen, ohne dass er optional sein muss. Allerdings fktt die UDF so ohnehin nicht und würde wohl auch in der ursprünglichen Fassung falsche Werte liefern, weil sie mit FarbIndizes arbeitet, was ab xl12/2007 sträflicher Leichtsinn ist, weil diese mehrfach für ganz unterschiedliche Farben auftauchen können. So auch hier, AI6 u.AI7 haben den gleichen FarbIndex 15!
Deshalb habe ich diese UDF mal überarbeitet und dabei etwas universalisiert. Was sie jetzt kann, steht als Anmerkung über ihrer Kopfzeile. Die Fml in Zelle AM81 könnte dann bspw so aussehen:
=FarbSumme(AI4:AI81;9944773)*8.4 bzw =FarbSumme(AI4:AI81;;A86:A97)*8.4
Oder auch so: =FarbSumme(AI4:AI81;;A86:A97;AH4)*8.4
Das entspräche dann wohl am ehesten deinen Vorgaben. Wolltest du in diesem Fall nur eine relevante Farbe zählen, müsstest du als Arg3 auch nur diese eine Zelle innerhalb der ansonsten relevanten angeben, also hier so: =FarbSumme(AI4:AI81;;A96;AH4)*8.4
Alle FarbAngaben in Arg2, die =0 oder >56 sind, wdn als BGR-Farbwert, alle anderen >0 als FarbIndex behandelt. Das Prüfen auf farblose Zellen ist nur per Farbwert für Weiß möglich!
Rem Zählt alle Zellen in Arg1, die entweder Farbe lt Arg2 haben oder deren Farbe in Arg3 auf-
' tritt, wobei in dsm Fall m.Arg4 auch d.1.Zelle 1es zusätzl KontrollBereichs angebbar ist.
' FremdFkt überarbeitet & universalisiert: 20150304, LSr:CyWorXxl
Function FarbSumme(Bereich As Range, Optional ByVal Farbe As Long = -1, Optional ByVal _
relFarbBereich As Range, Optional ByVal KontrollZelle1 As Range)
Dim isAdd As Boolean, isAll As Boolean, isCtrl As Boolean, isColor As VbTriState, _
arRelColor() As Long, ix As Long, spVersatz As Long, zlVersatz As Long, _
Zelle As Range, wf As WorksheetFunction
On Error Resume Next: Application.Volatile: Set wf = WorksheetFunction
isColor = CInt(Farbe >= 0) + CInt(Farbe = 0 Or Farbe > 56)
isAll = Not (CBool(isColor) Or relFarbBereich Is Nothing)
isCtrl = isAll And Not KontrollZelle1 Is Nothing
If isAll Then
ReDim arRelColor(relFarbBereich.Cells.Count - 1)
For Each Zelle In relFarbBereich
arRelColor(ix) = Zelle.Interior.Color: ix = ix + 1
Next Zelle
End If
If isCtrl Then
zlVersatz = KontrollZelle1.Row - Bereich.Row
spVersatz = KontrollZelle1.Column - Bereich.Column
End If
For Each Zelle In Bereich
Select Case isColor
Case vbUseDefault: Let isAdd = Zelle.Interior.Color = Farbe
Case vbTrue: Let isAdd = Zelle.Interior.ColorIndex = Farbe
Case vbFalse: isAdd = False
If isAll Then
isAdd = wf.Match(Zelle.Interior.Color, arRelColor, 0)
If isCtrl Then isAdd = isAdd And Zelle.Interior.Color = _
Zelle.Offset(zlVersatz, spVersatz).Interior.Color
End If
End Select
FarbSumme = FarbSumme - CInt(isAdd)
Next Zelle
Set wf = Nothing
End Function
Das Application.Volatile wird dir bei FarbÄnderungen aber nur nutzen, wenn du anschld in irgendeine (Leer-)Zelle klickst. Das kann man aber auch mit dem Vorsatz von 1^JETZT()* am Fml-Anfang erreichen.
Gruß aus D.BB.TF.BM.AB1, Morrn, Luc :-?