屏幕更新的效果

Ali*_*eir 18 excel optimization vba excel-vba

我一直在测量代码执行时间,以衡量在本地和我的服务器上执行脚本之间的差异.有一次,我忘了禁用screen updating,感谢我对闪光灯不敏感,然后更详细地考虑它:

当我第一次开始使用时,VBA我总是认为它只是被使用,因此它不会吓到最终用户认为他们的PC即将崩溃.当我开始阅读更多关于提高代码效率的内容时,我理解它的用途,但screen updating实际上对代码执行时间的影响有多大?

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)

存在可以提供执行速度的更大改进的其他技术.

最有用的包括

  1. 避免Select,ActivateActiveCell/Sheet/Workbook尽可能多地.而是声明并分配变量并引用它们.
  2. 引用大范围时,将Range数据复制到变量数组以进行处理,并将结果复制回之后的范围.
  3. 使用Range.SpecialCells,Range.FindRange.AutoFilter限制引用的单元格数.

在SO上有很多这些技术的例子.


end*_*and 8

如果您想查看一个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,SelectionActivate很少(如果有的话)必要的.当您录制宏时,它将始终使用这些宏,但是当您需要在代码中实际使用它们时,情况非常少.同样,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)

这是一个不必要的步骤.

这为代码运行时增加了大量时间.