如何优化VBA代码的性能?

时间:2015-01-29 06:26:14

标签: excel-vba vba excel

我在运行以下代码时遇到了麻烦。基本上,我们的想法是对列表进行排序并将唯一记录复制到另一个表单。但由于记录数量很大(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

这是否可以提高速度?谢谢你的时间!

2 个答案:

答案 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,这也提供了其他一些方法来提高您的代码效率。