I Made this VBA Code 2,880,952% faster
#1
Moin

Geiler Titel. Ob man das für jeden Code erreichen kann?

https://www.youtube.com/watch?v=g6fWAAWuBq4
Wir sehen uns!
... Detlef

Meine Beiträge können Ironie oder Sarkasmus enthalten.

Antworten Top
#2
Hallo,

ja, die Übertragung der Daten in ein Array, dort bearbeiten und komplet zurück schreiben ist wohl das Schnellste, was Excel/VBA zu bieten hat.

Ob es immer 20.000 Mal schneller wird, sei dahingestellt.

Die Erklärungen waren ziemlich lang-atmig.

mfg
Antworten Top
#3
Wollen wir mal das Gegenteil versuchen? Wär doch auch mal eine tolle Challenge.
Antworten Top
#4
Hallo,

ein kleiner Wettbewerb "Speed-Test" ist immer interessant.

Anbei eine kleine Datei. Wenn die Spalte "A" um einige tausend Zeilen nach unten gezogen wird, sollte es für einen Test ausreichen.

Spalte "B" wird mit einem kleinen VBA-Code berechnet. Den gilte es zu beschleunigen.

Code:
Sub Rev()
Dim Start
Start = Timer
For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row
    Cells(i, 2) = VBA.StrReverse(Cells(i, 1))
Next i

Debug.Print Timer - Start
End Sub

Schaun wir mal


Angehängte Dateien
.xlsm   Speedtest.xlsm (Größe: 14,93 KB / Downloads: 6)
Antworten Top
#5
Hallo,

etwa 60 zu 3 Sekunden:

Code:
Sub RevCellsInNewSheet()
  Dim i As Long
  Dim sngTime As Single
 
  With Worksheets.Add
    .Cells(1, 1).Resize(10 ^ 6, 1).Formula = "=""This is a Text""&ROW()"
    sngTime = Timer
    For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row
      .Cells(i, 2).Value = VBA.StrReverse(.Cells(i, 1).Value)
    Next i
    sngTime = Timer - sngTime
    .Cells(1, 3).Value = sngTime
    .Cells(1, 4).Value = "Sekunden"
    .Columns("A:D").AutoFit
  End With
End Sub

Sub RevArrayInNewSheet()
  Dim i As Long
  Dim sngTime As Single
  Dim vArr As Variant
 
  With Worksheets.Add
    .Cells(1, 1).Resize(10 ^ 6, 1).Formula = "=""This is a Text""&ROW()"
    sngTime = Timer
    vArr = .Cells(1, 1).CurrentRegion.Columns(1).Value
    If IsArray(vArr) Then
      For i = 1 To UBound(vArr)
        vArr(i, 1) = StrReverse(vArr(i, 1))
      Next i
      .Cells(1, 2).Resize(UBound(vArr), 1).Value = vArr
      sngTime = Timer - sngTime
      .Cells(1, 3).Value = sngTime
      .Cells(1, 4).Value = "Sekunden"
    End If
    .Columns("A:D").AutoFit
  End With
End Sub

Gruß, Uwe
Antworten Top
#6
Hallo Uwe,

auch bei meinen Versuche war eine Beschleunigung um einen Faktor 20+ gut zu erreichen. Allerdings schwanke die Zeit bei mehrfachem Run erheblich.

Danke und

mfg
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 2 Gast/Gäste