Excel VBA Application.screenupdating与Application.visible
我有一个VBA代码,从另一个Excel表复制某些单元格到活动的Excel表单。 在这里,用户不需要看到处理,甚至是Excel应用程序窗口,直到工作完成,我希望工作更快。 我通过互联网阅读了一些博客,指出将Application.screenupdating设置为false会加快任务的速度。
所以,在这里我的问题是 –
我应该将Application.screenupdating / Application.visible中的哪一个(/两者)设置为false? 我的理解是,两个属性可以增加vba任务的输出量,尽pipe当用户应该查看应用程序时使用screenupdating属性,而不是在需要时才使用更新,但是当用户不需要查看时使用可见属性窗户。 我相信设置一个属性为false可能不需要设置另一个为false。
请提供您的答案的理由。
我对你的问题没有直接的回答。 但我认为将Application.visible
设置为false
将不会提高性能; 我更喜欢使用下面的代码:
Public Sub YK_Start() Application.ScreenUpdating = False Application.DisplayAlerts = False Application.EnableEvents = False Application.Calculation = xlCalculationManual End Sub Public Sub YK_End() Application.ScreenUpdating = True Application.DisplayAlerts = True Application.EnableEvents = True Application.Calculation = xlCalculationAutomatic End Sub
用法示例:
Sub LoopExample() Dim Cell As Range Call YK_Start Columns("B:F").ClearContents For Each Cell In Range("A1:A100000") Cell.Offset(, 1) = Cell.Value + 1 Cell.Offset(, 2) = Cell.Value + 2 Cell.Offset(, 3) = Cell.Value + 3 Cell.Offset(, 4) = Cell.Value + 4 Cell.Offset(, 5) = Cell.Value + 5 Next Cell Call YK_End End Sub
此源代码将在18 seconds
内执行,而不使用Call YK_Start
和Call YK_End
; 这些程序将在10 seconds
内执行。
参考: http://www.officena.net :阿拉伯办公室论坛。
编辑#1
测量代码执行时间的方法有很多种, 我不知道最准确的一个; 我只需要近似值; 看到:
你如何testingVBA代码的运行时间?
我正在使用最简单的一个:
Sub my_test() Dim t As Single t = Timer 'code Call LoopExample MsgBox Timer - t End Sub
我应该将Application.screenupdating / Application.visible中的哪一个(/两者)设置为false?
请提供您的答案的理由。
这真的取决于你想要做什么。 让我解释。
目的
当不希望用户看到应用程序时,使用Application.visible。 应用程序是否正在更新是不重要的。 例如,您可能会显示一个Login Userform
,在用户input正确的信息之前,您不想显示该应用程序。
另一方面, Application
与Application
本身的可见性无关。 它在那里(简单地说)是防止应用程序正在更新时看到的闪烁。
我应该使用哪一个?
- 当
Screenupdating
是False
,并且Application.visible
是True
,闪烁不会发生 - 当
Screenupdating
为True
,并且Application.visible
为False
,闪烁发生,但由于应用程序隐藏,无法看到它。 - 当
Screenupdating
为True
,并且Application.visible
为True
,闪烁发生,您可以看到它。 - 当
Screenupdating
为False
,并且Application.visible
为False
,闪烁不会发生。
因此,如果您担心性能(代码执行速度),则始终build议将Screenupdating
切换为False
。
希望这回答你的问题。