Excel VBA | Array & Dictionary
03.09.2018 23:19:02
Florian
ich habe ein kleines Excel VBA Problem, das vielleicht gar keines ist.
Die Subroutine sollte eigentlich nur 2 Datensätze vergleichen und den zweiten Datensatz vervollständigen und zurück in den Worksheet schreiben.
Zum Verständnis, in der Tabelle "MSRBSCell" stehen Parameter A & B, in der Tabelle "PUCell" stehen Parameter B & C.
Ergebnis am Ende, Tabelle "PUCell" mit Parameter A komplettieren und dann am Ende einen String generieren. (Die String Generation wird im Moment noch per Formel gelöst)
Das Problem ist eher die Menge der Daten.
MSRBScell = 220.000 Zeilen
PUCell = 270.000 Zeilen
Ein kompletter Durchlauf braucht im Moment 30min.
Wenn ich die Anzahl der Zeilen auf 10.000 reduziere läuft das Script 3 Sekunden.
bei 20.000 = 10s
bei 50.000 = 1:11 min
.
.
.
bei 250k = 30 min
Das Dictonary hab ich für dieses Script schon immer benutzt, die Array's sind neu. Geschwindigkeitsunterschied zu ohne Array geht richtung 0.
Vielleicht hat jemand von euch eine Idee.
PUCell_end = 20000 'PUCell.Cells(Rows.Count, 3).End(xlUp).Row + 1
MSRBSCell_end = 20000 'MSRBSCell.Cells(Rows.Count, 1).End(xlUp).Row
arrDict = MSRBSCell.Range("A2:D" & MSRBSCell_end).Value2
timetaken = Now()
For i = 1 To UBound(arrDict)
With Mydic1
On Error Resume Next:
.Add arrDict(i, 4), arrDict(i, 1)
If Err.Number 0 Then .Item arrDict(i, 4), arrDict(i, 1)
On Error GoTo 0
End With
Next i
arrDict = Empty
timetaken = Now() - timetaken
Debug.Print "Dict: ", timetaken
arrTest = PUCell.Range("B2:J" & PUCell_end).Value2
timetaken = Now()
For i = LBound(arrTest, 1) To UBound(arrTest, 1)
tmpNEID = arrTest(i, 4)
arrTest(i, 1) = Mydic1(tmpNEID)
Next i
PUCell.Range("B2:J" & PUCell_end) = arrTest
timetaken = Now() - timetaken
Debug.Print "Array & paste: ", timetaken
arrTest = Empty