Excel vba Application.screenupdating vs Application.visible

时间:2015-05-24 10:00:33

标签: excel performance excel-vba vba

我有一个vba代码,可以将某些单元格从另一个Excel工作表复制到活动的Excel工作表。在这里,用户不需要查看处理甚至excel应用程序窗口,直到工作完成,我希望工作更快。我通过互联网阅读了一些博客,说将Application.screenupdating设置为false会加快任务。

所以,我的问题是 -

我应该将Application.screenupdating / Application.visible中的哪一个(/两个)设置为false?我的理解是,两个属性都可以通过vba任务的输出增加,但是当用户应该查看应用程序时要使用screenupdating属性,而不是在需要时进行更新但是当用户不需要查看时使用可见属性窗户。我相信将一个属性设置为false可能不需要将另一个属性设置为false。

请提供您的答案的理由。

2 个答案:

答案 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_StartCall 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.screenupdatingApplication本身的可见性无关。它(简单地说)可以防止您在更新应用程序时看到的闪烁。

我应该使用哪一个?

  1. ScreenupdatingFalseApplication.visibleTrue时,闪烁不会发生
  2. ScreenupdatingTrueApplication.visibleFalse时,闪烁会发生,但您无法看到它,因为应用程序已被隐藏。
  3. ScreenupdatingTrueApplication.visibleTrue时,闪烁就会发生,您可以看到它。
  4. ScreenupdatingFalseApplication.visibleFalse时,闪烁不会发生。
  5. 因此,如果您担心性能(代码执行速度),则始终建议将Screenupdating切换为False

    希望这能回答你的问题。