Ich habe ein Array von Daten auf einem Arbeitsblatt. Ich muss das Array durchlaufen, jede Zeile basierend auf bestimmten Kriterien auswerten und dann die mit den Kriterien übereinstimmenden Zeilen übernehmen und sie in ein anderes Arbeitsblatt kopieren. Ich habe den folgenden Code geschrieben, um diesen Prozess durchzuführen.Schleife durch Array mit verschachtelten Ifs schneller
Die Schleife dauert jedoch zu lange. Es dauert ungefähr 5 Minuten zu laufen. Ich brauche es in weniger als 30 Sekunden zu laufen. Ich lese die folgende q auf SO: What is the most efficient/quickest way to loop through rows in VBA (excel)? und das führte mich zum Erstellen des Arrays. Ich habe auch versucht, den Code einfach zu halten. Ich deaktiviere Bildschirmaktualisierung und aktiviere Ereignisse.
Was kann ich tun, um diesen Prozess zu beschleunigen? Danke für Ihre Hilfe.
Sub tester()
Dim vData() As Variant
Dim R As Long
Dim C As Long
Dim LastRow1 As Long
Dim rng1 As Range, rng2 As Range
Set sh3 = Sheets("ABC")
Set sh5 = Sheets("XYZ")
Application.ScreenUpdating = False
Application.EnableEvents = False
LastRow1 = sh3.Cells(Rows.Count, "A").End(xlUp).Row
vData = Range("A1:N" & LastRow1).Value
sh5.Range("B3:AV10000").ClearContents
For R = 1 To UBound(vData, 1)
For C = 1 To UBound(vData, 2)
If sh3.Cells(R, "G").Value <= Date Then 'if date is prior to today then
If sh3.Cells(R, "J").Value = "C" Then
If sh3.Cells(R, "D").Value > 0 Then
If sh3.Cells(R, "I").Value >= sh3.Cells(R, "H").Value Then
Set rng1 = sh3.Range("A" & R & ":N" & R)
Set rng2 = sh5.Range("B" & R & ":O" & R)
rng1.Copy rng2
Else
Set rng3 = sh3.Range("A" & R & ":N" & R)
Set rng4 = sh5.Range("B" & R & ":O" & R)
rng3.Copy rng4
End If
ElseIf sh3.Cells(R, "D").Value < 0 Then
If sh3.Cells(R, "I").Value >= sh3.Cells(R, "H").Value Then
Set rng5 = sh3.Range("A" & R & ":N" & R)
Set rng6 = sh5.Range("B" & R & ":O" & R)
rng5.Copy rng6
Else
Set rng7 = sh3.Range("A" & R & ":N" & R)
Set rng8 = sh5.Range("B" & R & ":O" & R)
rng7.Copy rng8
End If
End If
End If
End If
Next C
Next R
Application.ScreenUpdating = True
Application.EnableEvents = True
End Sub
Zwei weitere 'Application' bezogene Tipps Performance zu helfen, sind' Application.Calculation = xlCalculationManual' und 'Application.DisplayAlerts = false'. Aber in deinem Fall bin ich mir nicht sicher, ob dir das sehr helfen würde –
Alter! Application.Calculation = xlCalculationManual funktioniert. Nahm es von 5+ Minuten bis <10 Sekunden. Warum das??? Ich hatte das nicht hinzugefügt, weil ich dachte, dass das Durchlaufen eines Arrays nur Werte und keine Formeln ansieht, also wäre das Verhindern von Berechnungen bedeutungslos. – tulanejosh
Jedes Mal, wenn Sie eine Änderung schreiben, berechnet die Arbeitsmappe –