@ > Home > Inhalt > VBA-Funktion mit Range-Argument Excel 97+

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.