我在运行以下代码时遇到了麻烦。基本上,我们的想法是对列表进行排序并将唯一记录复制到另一个表单。但由于记录数量很大(160000行)。我的代码总是被绞死,无法停止计算。
Columns("A:A").Insert Shift:=xlToRight
Range("A1").Value = "Reference2"
Range("A2").Formula = "=B2&F2&N2"
Range("A2").AutoFill Destination:=Range("A2:A160000")
Range("N1").Value = "Day"
Range("N2").Formula = "=DAY(G2)"
Range("N2").AutoFill Destination:=Range("N2:N160000")
Columns("A:N").Select
Selection.Sort Key1:=Range("N2"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal
Columns("A:N").Select
Selection.Sort Key1:=Range("F2"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal
Columns("A:N").Select
Selection.Sort Key1:=Range("B2"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal
Sheets("Fairbanks Data").Range("A1:N" & Range("B1").End(xlDown).Row).Select
Selection.Copy
Sheets("Fairbanks Data(Edited)").Cells(Rows.Count, "A").End(xlUp).PasteSpecial xlPasteValues
'my code always stopped at here and did the calculation
Sheets("Fairbanks Data").Delete
Sheets("Fairbanks Data(Edited)").Range("A1:A160000").AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Sheets("Step1Raw").Range("A2"), Unique:=True
这是否可以提高速度?谢谢你的时间!
答案 0 :(得分:2)
VBA有一些规则可以让你的代码更快。
规则#1。不要复制和粘贴
复制和粘贴(或 PasteSpecial )功能很慢。使用以下内容复制和粘贴值的速度大约快25倍。
Range("A1:Z100").value = Range("A101:Z200").value
如果您这样做,您的代码可能会正常工作。如果你在很多行上这样做,那么Mamory可能会出现问题。
规则#2。计算强>
通常,当该单元格或范围的先例发生变化时,Excel将重新计算单元格或一系列单元格。这可能会导致您的工作簿经常重新计算,这会降低性能。您可以使用以下语句阻止Excel重新计算工作簿:
Application.Calculation = xlCalculationManual
在代码结束时,您可以使用以下语句将计算模式设置为自动:
Application.Calculation = xlCalculationAutomatic
但请记住,当计算模式为 xlCalculationManual 时,Excel不会更新单元格中的值。如果您的宏依赖于更新的单元格值,则必须使用类似Worksheets(1).Calculate
的.Calculate方法强制执行Calculate事件。
规则#3。 ScreenUpdating
VBA的其他速度问题是,每次VBA将数据写入工作表时,它都会刷新您看到的屏幕图像。刷新图像对性能造成相当大的影响。以下命令将关闭屏幕更新。
Application.ScreenUpdating = FALSE
在宏的末尾使用以下命令重新打开屏幕更新。
Application.ScreenUpdating = TRUE
答案 1 :(得分:2)
我有两个潜艇,我倾向于在我运行的任何代码之前和之后放置。
' 01.
Sub deaktiver()
Application.EnableEvents = False
Application.ScreenUpdating = False
Application.DisplayStatusBar = False
Application.Calculation = xlCalculationManual
' ActiveSheet.DisplayPageBreaks = True 'note this is a sheet-level setting
End Sub
' 02.
Sub reaktiver()
Application.EnableEvents = True
Application.ScreenUpdating = True
Application.DisplayStatusBar = True
Application.Calculation = xlCalculationAutomatic
' ActiveSheet.DisplayPageBreaks = True 'note this is a sheet-level setting
End Sub
显然你需要知道,不同的设置会做什么,因为一些设置会阻止计算发生或事件发生,正如Moosli上面解释的那样。
上面代码中的大多数(全部?)我发现了here,这也提供了其他一些方法来提高您的代码效率。