Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1460to1464
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

VBA: Durchschnitt der x-größten Werte eines Arrays

VBA: Durchschnitt der x-größten Werte eines Arrays
25.11.2015 12:32:03
Martin
Hallo,
gibt es eine einfache Möglichkeit den Durchschnitt der x-größten Werte eines Arrays zu ermitteln als VBA-Lösung? Als Formel geht es recht einfach:
http://chandoo.org/wp/2010/06/04/average-of-top-5-values
Ich habe eine Function mit einer Schleife geschrieben, aber vielleicht denke ich (mal wieder) zu umständlich:
Sub Test()
Dim arrTest As Variant
arrTest = Array(15.52, 12.44, 19.68, 88.17, 18.48, 17.44, 19.58, 13.22, 55.44)
Debug.Print AverageTopX(arrTest, 5) 'Top 5
End Sub
Function AverageTopX(varArray As Variant, intBiggest As Integer) As Double
Dim i As Integer
For i = 1 To intBiggest
AverageTopX = AverageTopX + Application.Large(varArray, i)
Next i
AverageTopX = AverageTopX / intBiggest
End Function

Ich will sehr große Arrays mit mehreren 10.000 Werten im Top-1000er Bereich auswerten, da erscheint mir meine Function etwas umständlich.
Viele Grüße
Martin

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA: Durchschnitt der x-größten Werte
25.11.2015 13:10:16
Rudi
Hallo,
sieht doch gut aus.
Ich weiß nicht, wie es noch einfacher gehen sollte.
Gruß
Rudi

AW: VBA: Durchschnitt der x-größten Werte
25.11.2015 13:42:01
Martin
Hallo Rudi,
ich danke dir für die Antwort. VBA überrascht mich immer wieder mit "hauseigenen" Lösungen, wo ich vorher umständliche Umwege gegangen bin. Ich dachte schon, dass es vielleicht eine Funktion gibt, die automatisch die x-größten Werte eines Arrays summiert und somit einen Schleifendurchlauf unnötig macht.
Viele Grüße
Martin

AW: VBA: Durchschnitt der x-größten Werte
25.11.2015 13:50:36
Daniel
Hi
bevor man sich verkünstelt, kann man auch den pragmatischen Weg gehen, die Werte in einen freien Bereich auf einem Tabellenblatt schreiben, dort sortieren und dann einfach den Mittelwert über die 1000 obersten Zellen bilden.
Gruß Daniel

Anzeige
...das wär doch noch umständlicher
25.11.2015 14:20:51
Martin
Hallo Daniel,
ich suche eine möglichst performante Lösung, aber das "Auslagern" in ein Tabellenblatt und eine Excel-Sortierung würden wesentlich mehr Systemressourcen beanspruchen. Da wäre eine Array-Sortierung mit einem intelligenten Sortieralgorithmus eher vorstellbar. Hier mal eine interessante Tabelle mit der Messung verschiedener Sortieralgorithmen im Vergleich zur Excel-Sortierung. Quicksort ist richtig schnell. Vielleicht hat Excel seinen Sortieralgorithmus zwischenzeitlich optimiert, diese Messung wurde offensichtlich unter Excel 2003 durchgeführt.
Viele Grüße
Martin

ABCDEFGHIJ
1Eigenschaften und Zeitaufwand der Sortiermethoden in Sekunden
2Methode EigenschaftenDurchläufe (Anzahl der Elemente)
3 in-placestabilrekursiv655100065531000065536131072
4ExcelSort---0,04690,04690,0630,0780,28geht nicht
5BucketSort (*)neinjanein0,14060,14060,1550,1550,190,23
6QuickSortjaneinja0,00000,00000,0160,0310,250,58
7HeapSortjaneinnein0,00000,00000,0310,0630,501,08
8CombSortjaneinnein0,00000,00000,0470,0630,591,16
9MergeSortneinjaja0,00000,00000,0470,0780,631,33
10ShellSortjaneinnein0,00000,00000,0310,0630,631,55
11SplitSortneinjaja0,00000,01460,0780,1421,002,14
12InsertionSortjajanein0,01560,04692,2815,313235,08nicht getestet
13MinMaxSortjaneinnein0,01660,04692,4065,577240,20nicht getestet
14MinSortjaneinnein0,03130,06252,7976,531283,09nicht getestet
15MinsertionSortjaneinnein0,04690,10944,0479,469409,81nicht getestet
16NoNetSortjajanein0,04690,09384,42210,328448,30nicht getestet
17BiDiBubbleSortjajanein0,04690,11044,89011,515505,63nicht getestet
18OetSortjajanein0,06150,12505,23512,203530,23nicht getestet
19BubbleSortjajanein0,04690,12505,26612,313537,30nicht getestet
20PositionSortneinjanein0,06250,15636,34414,813644,23nicht getestet
21RlxSortneinjanein0,06250,15636,51615,188664,56nicht getestet
22GnomeSortjajanein0,07810,18658,04718,797815,00nicht getestet
23AllocationSortneinjanein0,09380,234410,37524,1721058,02nicht getestet
24SwirlSortneinneinnein2,75007,1729n. getestetn. getestetn. getestetnicht getestet
25(*) = außer Konkurrenz, da nur bedingt verwendbar

Anzeige
AW: ...das wär doch noch umständlicher
25.11.2015 14:41:45
Daniel
klar
du kannst, wenn du einen Quicksort programmierst, die Arrays auch dort sortieren lassen und dann mit einer Schleife über die ersten 1000 Elemente laufen und von diesen Werten den Mittelwert bilden.
das ist sicherlich das schnellste.
da ich aber keinen Quicksort programmieren kann, nehme ich die Sortierfunktion von Excel
was man beim Arbeiten mit Excel auch nicht vergessen darf ist, dass der Speicherplatz, der Daten in Tabellenblättern zur Verfügung steht grösser ist, als der Bereich für Variablen.
Gruß Daniel

Quicksort
25.11.2015 14:53:03
Rudi
Hallo,
da ich aber keinen Quicksort programmieren kann
muss man auch nicht können. Sowas in der Sammung zu haben reicht völlig. ;-)

'QuickSort, eindimensionales Array
Sub QuickSort(ByRef DasArray, Optional ErsteZeile, Optional LetzteZeile)
On Error Resume Next
Dim UnterGrenze As Long, OberGrenze As Long
Dim AktuellerWert, GemerkterWert As Variant
If IsMissing(ErsteZeile) Then
ErsteZeile = LBound(DasArray)
End If
If IsMissing(LetzteZeile) Then
LetzteZeile = UBound(DasArray)
End If
UnterGrenze = ErsteZeile
OberGrenze = LetzteZeile
AktuellerWert = DasArray((ErsteZeile + LetzteZeile) / 2)
Do While (UnterGrenze  AktuellerWert And OberGrenze > ErsteZeile)
OberGrenze = OberGrenze - 1
Loop
If (UnterGrenze  ErsteZeile) Then Call QuickSort(DasArray, ErsteZeile, OberGrenze)
If (UnterGrenze  AktuellerWert And OberGrenze > ErsteZeile)
OberGrenze = OberGrenze - 1
Loop
If (UnterGrenze  ErsteZeile) Then Call QuickSort2(DasArray, ErsteZeile, OberGrenze)
If (UnterGrenze 
Auf Online-Excel gibt es noch eine Prozedur von Nepumuk, die die Sortierung nach einem beliebigen Feld auf- und absteigend erlaubt.
Gruß
Rudi

Anzeige
AW: Quicksort
25.11.2015 15:05:35
Daniel
Irgendwie bin ich der Meiunung, dass man den Quellcode den man produziert und für dessen Funktion man verantwortlich ist auch verstehen sollte.
Gruß Daniel

AW: Quicksort
25.11.2015 15:20:22
Rudi
Hallo,
damit hast du sicherlich Recht.
Trotzdem kann man sich vorhandener Werkzeuge bedienen.
Ich fahre ja auch Auto und bin für das sichere Funktionieren verantwortlich, weiß aber nicht, wie es funktioniert.
Weißt du, wie der Excel-Sortieralgorithmus funktioniert?
Quicksort zu verstehen ist ja nicht sooo schwer.
Gruß
Rudi

AW: Quicksort
25.11.2015 15:27:07
Daniel
Hi
ich weiss nicht, wie er funktioniert, aber ich weiss, wie ich ihn bedienen muss und dazu habe ich eine Dokumentation.
Ich versuche halt erstmal das zu verwenden, was ich habe und wofür ich auch bezahlt habe, anstatt dass ich mir was neues schreibe.
Gruß Daniel
Anzeige

324 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige