Projektplan - Farben zählen bzw Summe nach Farben
23.02.2016 02:39:25
Luc:-?
Morrn, Jan;
habe mal ein Bsp dafür gefertigt, was ab deiner XlVersion 14/2010 möglich wäre. Hier wdn allerdings Summen nach Farben gebildet, aber das könntest du ja evtl anpassen:
| K | L | M | N | O | P | Q |
---|
55 | 60 | Zellfarbe (K55): 65535, bedingt: 255 | real: 65535 | background-color:#FFFF00 |
---|
56 | 44 | Zellfarbe (K56): 16777215, bedingt: 255 | real: 255 | background-color:#FF0000 |
---|
57 | 43 | Zellfarbe (K57): 65535, bedingt: 255 | real: 255 | background-color:#FF0000 |
---|
58 | 44 | Zellfarbe (K58): 16777215, bedingt: 255 | real: 255 | background-color:#FF0000 |
---|
59 | 45 | Zellfarbe (K59): 65535, bedingt: 255 | real: 65535 | background-color:#FFFF00 |
---|
60 | Summen: | | | | | | |
---|
61 | 105 | {=1^JETZT()*SUMME(MTRANS(TxEval(MTRANS(WECHSELN("CellColor(K#)";"#";ZEILE(A$55:A$59))&T(ZEILE(A1:A5))))=65535)*K55:K59)} |
---|
62 | 131 | {=1^JETZT()*SUMME(MTRANS(TxEval(MTRANS(WECHSELN("CellColor(K#)";"#";ZEILE(A$55:A$59))&T(ZEILE(A1:A5))))=255)*K55:K59)} |
---|
63 | 105 | 105 | {=1^JETZT()*SUMME((ZFarbe=65535)*K55:K59)} | duale (quasi-1-zellige) |
---|
64 | 131 | 131 | {=1^JETZT()*SUMME((ZFarbe=255)*K55:K59)} | benannte MatrixFormeln |
---|
65 | ZFarbe:=MTRANS(AUSWERTEN(MTRANS(WECHSELN("CellColor(K#)";"#";ZEILE(B$55:B$59))&T(ZEILE(B1:B5))))) |
---|
Entscheidend ist hierbei die simple UDF CellColor, die allerdings nur für EinzelZellen, keine ZellBereiche ausgelegt ist. Das ist bei der uralten XLM-Fkt ZELLE.ZUORDNEN ebenfalls so, die kann aber nur direkte ZellFarben erkennen, keine bedingten. Die UDF kann auch letzteres, da sie auf einer neuen, objektbegründenden ZellEigenschaft basiert:
Rem Ermittelt gezeigte ZellFarbe (auch aus BedingtFormat, erst ab Xl14)
Function CellColor(Zelle As Range)
CellColor = Zelle.DisplayFormat.Interior.Color
End Function
Aus Stabilitätsgründen hat MS dieses neue Objekt aber nicht für Fktt in ZellFmln zugelassen (man erhält bei normalem Einsatz stets den FWert #WERT!), weshalb die hier nur per FmlText-Auswerten eingesetzt wdn kann. Dabei fktioniert auch ein Application.Volatile nicht, weshalb sie darauf verzichtet. Eine volatile xlStandardFkt sollte aber in die Fml eingebaut wdn (hier JETZT), damit sie per [F9] oder Klick in eine beliebige Zelle nebst Abschluss neu berechnet wdn kann (normale FarbÄnderungen lösen keine Neuberechnung aus, nur aufkopierte!).
Will man dafür die ebenfalls uralte XLM-Fkt AUSWERTEN einsetzen, kann das ebenfalls nur per benannter Fml erfolgen. Da sie aber anscheinend auch nur auf Einzel-FmlTexte ausgerichtet ist, bleibt deren hier erforderliche Variation über ZellBereiche der XlSteuerung überlassen, die zur Wiedergabe aller Werte eines Anstoßes bedarf. Der besteht hier in einer sich über mindestens 2 Zellen erstreckenden MatrixFml, die ich deshalb im Ggsatz zu echten 1zelligen (singular) und mehrzelligen (plural) MatrixFmln dual (quasi-1-zellig) nenne. Sie liefern denn auch 2× das gleiche Ergebnis (den überzähligen Wert kann man ausblenden oder eine spezielle VerbundZelle - per FormatPinsel Format einer MusterVbZelle übertragen - über beide Werte bilden (im Bsp K63:L64, hier nicht als VerbundZelle dargestellt!).
Es gibt aber noch eine einfachere Möglichkeit mit einer weiteren simplen UDF, die das Auswerten besorgt. Der FmlText muss dann allerdings in US-Original-Notation angegeben wdn, was hier aber irrelevant ist (im Bsp K61:K62). Diese kann auch ZellBereiche und Datenfelder (aus Ausdrücken, was hier der Fall ist!) verarbeiten:
Rem rekursive TrivialVar zu LetEval/LetFormula
' Vs1.0 -LSr -cd:20151026 -lupd:20151026n
Function TxEval(Bezug)
Dim ix As Long, erg, tx
If TypeName(Bezug) = "String" Then
TxEval = Evaluate(Bezug)
Else: ReDim erg(WorksheetFunction.CountA(Bezug) - 1)
For Each tx In Bezug
erg(ix) = TxEval(tx): ix = ix + 1
Next tx
TxEval = erg
End If
End Function
Viel Erfolg! Luc :-?