首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >屏幕更新的效果

屏幕更新的效果
EN

Stack Overflow用户
提问于 2012-09-12 23:37:37
回答 5查看 64.8K关注 0票数 19

我一直在测量代码执行时间,以测量在本地执行脚本和在服务器上执行脚本的差异。有一次,我忘了禁用screen updating,幸好在考虑更多细节之前,我对闪光灯不敏感:

当我第一次开始使用VBA时,我总是假设它只是被使用过,这样它就不会吓到最终用户,让他们认为他们的PC即将崩溃。当我开始阅读更多关于提高代码效率的文章时,我明白了它的用途,但是screen updating到底对您的代码执行时间有多大的影响呢?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-09-13 20:02:49

如果代码以导致屏幕内容更改的方式与Excel交互,则关闭屏幕更新只会对执行时间产生影响。屏幕更改量越大,影响就越大。其他张贴的答案恰如其分地证明了这一点。

其他可以影响执行时间的应用程序设置是计算和事件处理。使用此代码模板作为起点(错误处理程序确保这些属性在sub结束时重新打开,即使它出错)

代码语言:javascript
运行
复制
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

还有其他技术可以在执行速度方面提供更大的改进。

最有用的包括

  1. 尽可能避免使用SelectActivateActiveCell/Sheet/Workbook。而是声明和赋值变量并引用这些变量。
  2. 当引用大范围时,将范围数据复制到变量数组中进行处理,并将结果复制回后面的范围中。
  3. 使用Range.SpecialCellsRange.FindRange.AutoFilter来限制引用的单元格数量。

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

票数 35
EN

Stack Overflow用户

发布于 2012-09-13 00:09:53

如果您想要查看一个相当激烈的示例,说明为什么ScreenUpdating很重要,请运行以下代码。在Excel2011中,我在不使用ScreenUpdating = false的情况下运行此交换所需的时间大约要长45倍!这是一个巨大的时差。

代码语言:javascript
运行
复制
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

此外,虽然我们在讨论提高效率的方法,但另一个关键点是SelectSelectionActivate很少(如果有的话)是必要的。当您记录宏时,它将始终使用这些宏,但很少情况下您需要在代码中实际使用它们。同样,标题中包含Active的任何内容(如ActiveCell)通常都表示代码速度较慢,因为您可能正在选择单元格。

您几乎总是可以明确地引用单元格/工作表,并避免select。例如:

代码语言:javascript
运行
复制
msgbox (Worksheets(1).Range("A1").value) 

无论您当前是否在第一个工作表上,都将工作。一个常见的新VBA错误是做一些更像这样的事情:

代码语言:javascript
运行
复制
Worksheets(1).Select
msgbox (Range("A1").value)

这是一个不必要的步骤。

这大大增加了代码运行时的时间。

票数 8
EN

Stack Overflow用户

发布于 2012-09-12 23:37:37

首先,我一直在使用由Richie (UK) Post #7 Here编写的脚本

它简单地迭代了一个循环,改变了一个单元格中i的值。我稍微改变了它,所以它循环了10,000次,为了样本大小,我执行了10次。

屏幕更新对我的代码执行速度有什么影响?

以下是禁用和启用Screen Updating时的执行长度:

代码语言:javascript
运行
复制
Disabled    Enabled
0.61909653  2.105066913
0.619555829 2.106865363
0.620805767 2.106866315
0.625528325 2.102403315
0.625319976 2.0991179
0.621287448 2.105103142
0.621540236 2.101392665
0.624537531 2.106866716
0.620401789 2.109004449

如您所见,在未禁用Screen Updating的情况下,执行代码所需的时间几乎是原来的3.5倍。

这两个代码都是使用VB编辑器中的Run按钮执行的,而不是“查看”电子表格。

代码的开头和结尾处有两行简单的代码:

代码语言:javascript
运行
复制
Application.ScreenUpdating = False
Application.ScreenUpdating = True

但是,它们会对你的执行效率有很大的影响!

注意:显然,Screen Updating的优势在这里是众所周知的,但这对初学者可能是有好处的,我发现查看这些数字很有趣!

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12391786

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档