Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1596to1600
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

Ineffizienter Sorting Code für großen Datensatz

Ineffizienter Sorting Code für großen Datensatz
18.12.2017 14:16:30
Fabi
Hallo,
ich habe einen VBA Code geschrieben, um von einem größeren Datensatz (ca. 3800 Zeilen und ca. 7 _ Spalten) in jeder Zeile zu checken, welche der 7 Spalten die 5 größten Werte beinhalten. Jetzt habe ich unten stehenden Code geschrieben, der für jede Spalte einzeln überprüft, ob der Wert der jeweiligen Zeile unter den top 5 größten Werten ist und dann gibt "boo" den Wert TRUE aus. Die Funktion "check_top5" (siehe unten) wird von einem anderen

Sub aufgerufen und die Ergebnisse werden dann in einer Binärmatrix (1=True und 0=FALSE) auf  _
einem weiteren Sheet vermerkt.
Die Funktion funktioniert einwandfrei, nur ist der Code zu ineffizient. Es dauert viel zu lange  _
(> 15 Minuten), um das für alle Spalten und alle Zeilen zu berechnen und ich würde mich über
Anregungen und Vorschläge freuen, die mir helfen, den Code schneller laufen zu lassen.
Hier mein Code:

Function check_top5(ByVal spalte_name As String)
Dim e As Integer
Dim boo As Boolean
boo = False
'Das hier schreibt in ein Hilfsblatt "sheet5" alle 7 Werte der jeweiligen Zeile untereinander  _
in Spalte A und in Spalte B die Benennung der jeweiligen Spalten, um die Werte zuordnen zu können.
For e = 1 To 7
col_nr = e * 6
Sheet5.Range("A" & e) = Sheet3.Range("A" & 201).Offset(0, col_nr)
'im Blatt "Sheet3" ist der ganze Datensatz gespeichert
Sheet5.Range("B" & e) = Sheet3.Range("A1").Offset(0, col_nr).Offset(0, -5)
Next e
'Dieser Teil sortiert die 7 Werte im Hilfsblatt "sheet" (=Sheet5) absteigend, um von oben  _
einfach die 5 größten Werte abzählen zu können.
Columns("A:A").Select
ActiveWorkbook.Worksheets("sheet").sort.SortFields.Clear
ActiveWorkbook.Worksheets("sheet").sort.SortFields.Add Key:=Range("A1"), _
SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("sheet").sort
.SetRange Range("A1:B7")
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
'Dieser Code überprüft, ob der Name der einzelne Spalte, die in diesem Aufruf der Funktion  _
betrachtet wird, unter den top 5 größten Werte ist. Falls dies der Fall ist, gibt "boo" der Funktion den Wert TRUE.
Andernfalls den Wert FALSE.
For i = 1 To 5
If Sheet5.Range("B" & i) = spalte_name Then
boo = True
End If
Next i
check_top5 = boo
End Function

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Ineffizienter Sorting Code
18.12.2017 16:36:11
guenni
Eine Beispieldatei wäre zur Einschätzung des Problems sinnvoll!
Vielleicht könnte Dir ein Ansatz mit der Funktion "RANG" weiterhelfen
Gruß,
Günther
AW: Ineffizienter Sorting Code
18.12.2017 17:04:32
Fabi
Vielen Dank für das Feedback Günther, leider kann man keine Excel files hochladen sondern nur txt und Ähnliches. Ich habe hier noch die andere Sub() angehangen, die die Funktion check_top5 aufruft. Vielleicht hilft das auch schon.
VG
Fabian
Hier der Code der Sub():
Sub check_inv()
Dim k As Integer
Sheet3.Select
k = Range("A1", Range("A1").End(xlDown)).Count
Dim stock1 As String
Dim stock2 As String
Dim stock3 As String
Dim stock4 As String
Dim stock5 As String
Dim stock6 As String
Dim stock7 As String
Dim r_blatt As String
r_blatt = "calc div 1w"
stock1 = "b"
stock2 = "h"
stock3 = "n"
stock4 = "t"
stock5 = "z"
stock6 = "af"
stock7 = "al"
Sheets(r_blatt).Select
For i = 201 To k Step 1
'vergleicht SMA50 und SMA200 in Sheet "data" und gibt "1" in der Binärmatrix in Blatt "r_blatt"  _
aus, falls SMA50>SMA200 und gleichzeitig check_top5 = TRUE
Sheets(r_blatt).Range("A" & i) = Sheet3.Range("a" & i)
'datum
If Sheet3.Range(stock1 & i).Offset(0, 3) > Sheet3.Range(stock1 & i).Offset(0, 4) Then
If check_top5(Sheet3.Range(stock1 & 1)) Then
Sheets(r_blatt).Range("B" & i) = 1
Else
Sheets(r_blatt).Range("B" & i) = 0
End If
Else
Sheets(r_blatt).Range("B" & i) = 0
End If
If Sheet3.Range(stock2 & i).Offset(0, 3) > Sheet3.Range(stock2 & i).Offset(0, 4) Then
If check_top5(Sheet3.Range(stock2 & 1)) Then
Sheets(r_blatt).Range("c" & i) = 1
Else
Sheets(r_blatt).Range("c" & i) = 0
End If
Else
Sheets(r_blatt).Range("c" & i) = 0
End If
If Sheet3.Range(stock3 & i).Offset(0, 3) > Sheet3.Range(stock3 & i).Offset(0, 4) Then
If check_top5(Sheet3.Range(stock3 & 1)) Then
Sheets(r_blatt).Range("d" & i) = 1
Else
Sheets(r_blatt).Range("d" & i) = 0
End If
Else
Sheets(r_blatt).Range("d" & i) = 0
End If
If Sheet3.Range(stock4 & i).Offset(0, 3) > Sheet3.Range(stock4 & i).Offset(0, 4) Then
If check_top5(Sheet3.Range(stock4 & 1)) Then
Sheets(r_blatt).Range("e" & i) = 1
Else
Sheets(r_blatt).Range("e" & i) = 0
End If
Else
Sheets(r_blatt).Range("e" & i) = 0
End If
If Sheet3.Range(stock5 & i).Offset(0, 3) > Sheet3.Range(stock5 & i).Offset(0, 4) Then
If check_top5(Sheet3.Range(stock5 & 1)) Then
Sheets(r_blatt).Range("f" & i) = 1
Else
Sheets(r_blatt).Range("f" & i) = 0
End If
Else
Sheets(r_blatt).Range("f" & i) = 0
End If
If Sheet3.Range(stock6 & i).Offset(0, 3) > Sheet3.Range(stock6 & i).Offset(0, 4) Then
If check_top5(Sheet3.Range(stock6 & 1)) Then
Sheets(r_blatt).Range("g" & i) = 1
Else
Sheets(r_blatt).Range("g" & i) = 0
End If
Else
Sheets(r_blatt).Range("g" & i) = 0
End If
If Sheet3.Range(stock7 & i).Offset(0, 3) > Sheet3.Range(stock7 & i).Offset(0, 4) Then
If check_top5(Sheet3.Range(stock6 & 1)) Then
Sheets(r_blatt).Range("h" & i) = 1
Else
Sheets(r_blatt).Range("h" & i) = 0
End If
Else
Sheets(r_blatt).Range("h" & i) = 0
End If
Next i
End Sub

Anzeige
AW: Ineffizienter Sorting Code
18.12.2017 18:50:26
guenni
Hallo Fabian, das stimmt so nicht. Nur es gibt eine Größenbeschränkung.
Dadurch gehen echte Produktiv-Dateien oft nicht, und müssen zu Beispieldateien umgearbeitet werden.
https://www.herber.de/bbs/user/118402.xlsm
AW: Ineffizienter Sorting Code
18.12.2017 22:39:59
Firmus
Hi Fabien,
da ich öfters mit größeren Datenmengen in XLS konfrontiert bin, hat mich das Thema interessiert.
Ich habe einen komplett anderen Ansatz in VBA gewählt. Vllt. hilft er Dir weiter.
Hier ist meine Lösung, die bei 5000 Zeilen x 7 Spalten in wenigen Sekunden die Top-5 (or Top-x) ermittelt.
https://www.herber.de/bbs/user/118408.xlsm
Lass wissen, ob es hilfreich war.
Gruß
Firmus
Anzeige

168 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige