Der Aufruf der Funktion (von Melanie Breden, 2007.02.27)
=SummeProzent(A1:A11;90%) mit A1:A11={3;7;2;8;6;10;4;9;11;5;1}
ergibt 60.
Funktionsweise: Gib die Summe der ausmachenden größten Bestandteile aus, sobald sie die Grenze von 90% überschreiten.
Public Function SummeProzent(ByVal rngBereich As Range, dblProzent As Double) As Double Dim arLarge() As Variant Dim lngC As Long ReDim arLarge(rngBereich.Rows.Count - 1) For lngC = 0 To UBound(arLarge) arLarge(lngC) = Application.Large(rngBereich,lngC + 1) If Application.Sum(arLarge) > Application.Sum(rngBereich) * dblProzent Then SummeProzent = Application.Sum(arLarge) Exit Function End If Next lngC End Function
Was ist an dieser Funktion hervorzuheben?
- leichte Lesbarkeit
- Verwendung eines Range-Arguments
- gute Variablen-Typisierung durch ar, lng, dbl (kann man leicht suchen und
ersetzen)
- sie ist nicht durch eine einstufige ("1-Zellen") Formel in Excel ersetzbar,
da die Lösung Sortierung und Abbruch-Bedingung zugleich benötigt. In einer
Array-Funktion geht aber nur eines von beiden.
Gibt es auch etwas zu kritisieren?
Ja, am Inhalt der Aufgabe (aus der Newsgroup vom 2007.02.27) für diese Funktion. Denn das Ergebnis beträgt immer 90%<y<=100% der Gesamtheit, ist also ein wenig belanglos. Interessanter (im Sinne von Konzentration) ist da schon eher die Summe, die den mehr als 90% ANZAHL größten Einträgen entspricht. Die Anzahl sollte dann natürlich 10 überschreiten:
=SUMME(A1:A11)-SUMMENPRODUKT(KKLEINSTE(A1:A11;ZEILE(INDIREKT("1:"&GANZZAHL(ANZAHL(A1:A11)*0,1)))))
ergibt 65. Diese Formel ist als Tabellenfunktion ohne Hilfszellen möglich.