chr*_*sen 33
如果代码以导致更改屏幕内容的方式与Excel交互,则关闭屏幕更新只会对执行时间产生影响.屏幕变化量越大,影响越大.其他发布的答案恰当地证明了这一点.
其他可能对执行时间产生影响的应用程序设置是计算和事件处理.使用此代码模板作为起点(错误处理程序确保在sub的末尾重新打开这些属性,即使它出错)
Sub YourSub()
On Error GoTo EH
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False
' Code here
CleanUp:
On Error Resume Next
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True
Exit Sub
EH:
' Do error handling
Resume CleanUp
End Sub
Run Code Online (Sandbox Code Playgroud)
存在可以提供执行速度的更大改进的其他技术.
最有用的包括
Select,Activate并ActiveCell/Sheet/Workbook尽可能多地.而是声明并分配变量并引用它们.Range.SpecialCells,Range.Find并Range.AutoFilter限制引用的单元格数.在SO上有很多这些技术的例子.
如果您想查看一个ScreenUpdating相当重要的原因,请运行以下代码.Excel 2011中运行此交换的时间大约需要45倍ScreenUpdating = false!这是一个巨大的时间差异.
Sub testScreenUpdating()
Dim i As Integer
Dim numbSwitches As Integer
Dim results As String
'swap between sheets this number of times
numbSwitches = 1000
'keep track of time
Dim startTime As Double
startTime = Time
'swap between sheets 1/2 (need both sheets or this will crash)
For i = 1 To numbSwitches
Sheets(1 + (i Mod 2)).Select
Next i
'get results
results = "Screen Updating not disabled: " & Format(Time - startTime, "hh:mm:ss") & " seconds"
startTime = Time
'scenario 2 - screenupdating disabled
Application.ScreenUpdating = False
'swap between sheets 1/2 (need both sheets or this will crash)
For i = 1 To numbSwitches
Sheets(1 + (i Mod 2)).Select
Next i
Application.ScreenUpdating = True
'get results for part two
results = results & vbCrLf & "Screen Updating IS disabled: " & Format(Time - startTime, "hh:mm:ss") & " seconds"
'show results
MsgBox results
End Sub
Run Code Online (Sandbox Code Playgroud)
此外,虽然我们对方式,提高办事效率的话题,另一个关键的一点是Select,Selection和Activate很少(如果有的话)必要的.当您录制宏时,它将始终使用这些宏,但是当您需要在代码中实际使用它们时,情况非常少.同样,Active标题中的任何内容(例如ActiveCell)通常都表示您的代码较慢,因为您可能正在选择单元格.
您几乎总是可以专门引用单元格/工作表并避免选择.例如:
msgbox (Worksheets(1).Range("A1").value)
Run Code Online (Sandbox Code Playgroud)
无论您当前是否在第一个工作表上,它都将起作用.一个常见的新VBA错误是做更多的事情:
Worksheets(1).Select
msgbox (Range("A1").value)
Run Code Online (Sandbox Code Playgroud)
这是一个不必要的步骤.
这为代码运行时增加了大量时间.