2016-11-10 2 views
0

Ich habe Probleme mit der Geschwindigkeit des Codes, der Spalten löscht. Der unten stehende Code dauert 5 Sekunden. Wenn ich das Dokument direkt vor dem Ausführen speichern möchte, dauert es nur 1 Sekunde. Die Einsparungen sind nicht groß, aber ich habe einen anständigen Computer und andere, die dieses Blatt ausführen, sind im Wesentlichen auf Thin Clients und ich habe viel mehr Code zum Ausführen. Auch wenn die Arbeitsmappe abgeschlossen ist, kann ich sie nicht speichern, da sie als Vorlage verwendet und nach Fertigstellung als neue Arbeitsmappe gespeichert wird. Die Anzahl der Zeilen mit Daten ist ~ 49.000 und ich habe dies auch zuerst ohne ClearContents versucht.Excel VBA langsam zu löschen Spalte, es sei denn Dokument zuerst gespeichert

Gibt es eine Möglichkeit, dies zu beschleunigen, ohne das Dokument zuerst speichern zu müssen?

Sub GenerateOperations() 

With Application 
    .ScreenUpdating = False 
    .DisplayAlerts = False 
    .EnableEvents = False 
    .CutCopyMode = False 
End With 

Dim OpSheet As Worksheet 

Set OpSheet = Sheet3 

Application.Calculation = xlCalculationManual 
OpSheet.Range("A:C,E:G,L:Q").ClearContents 
OpSheet.Range("A:C,E:G,L:Q").Delete xlShiftToLeft 
Application.Calculation = xlCalculationAutomatic 

With Application 
    .ScreenUpdating = True 
    .DisplayAlerts = True 
    .EnableEvents = True 
End With 

End Sub 

Antwort

0

Ich habe gefunden, dass durch das Finden der letzten Zeile und das Löschen nur des Abschnitts der Spalte, dass der Code fast sofort ausgeführt wird, der Arbeitscode unten ist.

Sub GenerateOperations() 

With Application 
    .ScreenUpdating = False 
    .DisplayAlerts = False 
    .EnableEvents = False 
    .CutCopyMode = False 
End With 

Dim OpSheet As Worksheet 

Set OpSheet = Sheet3 

With OpSheet 
    LastRow = .UsedRange.Rows.Count 
    .Range("A1:C" & LastRow & ",E1:G" & LastRow & ",L1:Q" & LastRow).Delete xlShiftToLeft 
End With 

With Application 
    .ScreenUpdating = True 
    .DisplayAlerts = True 
    .EnableEvents = True 
End With 

End Sub 
0

Haben Sie es ohne dieses Bit versucht: .ScreenUpdating = True?

+0

Warum sollte er das abstellen? Es wird dringend empfohlen, die Bildschirmaktualisierung zu deaktivieren, um die Leistung zu erhöhen –

+0

Das würde es nicht beschleunigen – Rdster

+0

Ja, wenn Sie es ausschalten, wird es schneller. Das Einschalten nach meiner Erfahrung ist unnötig und kann den Code verlangsamen, wenn unmittelbar danach ein anderes Sub aufgerufen wird. – Nick

Verwandte Themen