我有一个vba代码,可以将某些单元格从另一个Excel工作表复制到活动的Excel工作表。在这里,用户不需要查看处理甚至excel应用程序窗口,直到工作完成,我希望工作更快。我通过互联网阅读了一些博客,说将Application.screenupdating设置为false会加快任务。
所以,我的问题是 -
我应该将Application.screenupdating / Application.visible中的哪一个(/两个)设置为false?我的理解是,两个属性都可以通过vba任务的输出增加,但是当用户应该查看应用程序时要使用screenupdating属性,而不是在需要时进行更新但是当用户不需要查看时使用可见属性窗户。我相信将一个属性设置为false可能不需要将另一个属性设置为false。
请提供您的答案的理由。
答案 0 :(得分:5)
我对你的问题没有直接的答案;但我认为将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
内执行。
参考文献:www.officena.net:阿拉伯文办公室论坛
编辑#1
有许多方法可以衡量代码的执行时间;我不知道最准确的一个;我只需要近似值;请参阅:
How do you test running time of VBA code?
我使用的是最简单的一个:
Sub my_test()
Dim t As Single
t = Timer
'code
Call LoopExample
MsgBox Timer - t
End Sub
答案 1 :(得分:1)
我应该将Application.screenupdating / Application.visible中的哪一个(/两个)设置为false?
请提供答案的理由。
这实际上取决于你想做什么。让我解释一下。
<强>目的强>
当您不希望用户查看应用程序时,使用 Application.visible
。应用程序是否正在更新是无关紧要的。例如,您可能会显示Login Userform
,并且在用户输入正确的信息之前您不希望显示该应用程序。
Application.screenupdating
与Application
本身的可见性无关。它(简单地说)可以防止您在更新应用程序时看到的闪烁。
我应该使用哪一个?
Screenupdating
为False
且Application.visible
为True
时,闪烁不会发生Screenupdating
为True
且Application.visible
为False
时,闪烁会发生,但您无法看到它,因为应用程序已被隐藏。Screenupdating
为True
且Application.visible
为True
时,闪烁就会发生,您可以看到它。Screenupdating
为False
且Application.visible
为False
时,闪烁不会发生。因此,如果您担心性能(代码执行速度),则始终建议将Screenupdating
切换为False
。
希望这能回答你的问题。