【问题标题】:Why running the same piece of VBA code takes different amount of time?为什么运行相同的 VBA 代码需要不同的时间?
【发布时间】:2016-05-19 18:27:45
【问题描述】:

我在 Excel 中以两种不同的方式运行相同的 VBA 代码。 1. 原方式:点击调用sub的命令按钮。 2. 使用 Application.Run 从不同工作簿中的宏调用 sub。

我放了一个计时器来测量只运行 sub 中的代码需要多长时间。第一种方式耗时 319.36 秒,而第二种方式耗时仅为 2.89 秒。

如何解释?

下面是代码。一般来说,它所做的是在调用 sub 时更改 stsheet 中的一个值,该值是活动表,然后在不同的表之间复制和粘贴一些值。

Sub CopyPaste()

time1 = Timer
Application.ScreenUpdating = False

stsheet = ActiveSheet.Name


Sheets("A1").Select
Range("F6:AA25").ClearContents

Sheets("A2").Select
Range("F6:S25").ClearContents


For I = 1 To 20
    Sheets(stsheet).Select
    Range("A20").Value = I

    Sheets("B").Select
    Range("u26:v30").Select
    Selection.Copy
    Range("d26").Select
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
    Sheets(stsheet).Select

    If Range("m34").Value = 0 Then
        Exit For
    End If

    For J = 1 To 22
        Sheets(stsheet).Select
        Range("A22").Value = J

        Range("y47").Value = Range("E101")

        Range("Y47").Select
        Selection.Copy
        Sheets("M1").Select
        Range("F6").Offset((I - 1), J - 1).Select
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False

    Next J

    For K = 1 To 14
        Sheets(stsheet).Select
        Range("t52").Value = K

        Range("y48").Value = Range("E201")

        Range("y48").Select
        Selection.Copy
        Sheets("M2").Select
        Range("F6").Offset((I - 1), K - 1).Select
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False

    Next K
 Next I

Application.CutCopyMode = False
Application.ScreenUpdating = True

MsgBox Timer - time1

End Sub

【问题讨论】:

  • 代码运行时与哪个工作簿处于活动状态有关?代码有什么作用?在您的帖子中包含实际代码会更有用。
  • 快一百多倍!这既令人惊讶又令人担忧,代码在这两种情况下都成功运行了吗?并且正在做同样的事情吗?
  • 这两种情况下 Excel 工作表是否可见?
  • @TimWilliams ,我已经包含了按钮和宏调用的 sub。
  • @GaryEvans :这令人担忧,但两次运行的结果似乎相同。

标签: vba excel


【解决方案1】:

如果这需要很长时间,请尝试在宏运行时手动进行计算。请记住在最后恢复为自动(如果需要),就像这样。

Sub CopyPaste()

time1 = Timer
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual

    *your code here*

Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic

End Sub

【讨论】:

  • 谢谢,蒂姆。这使它更快。只是最初的担心是试图理解为什么第二种方法比原始方法快很多,并确保代码已经使用第二种方法成功运行。
  • 如果没有看到另一个宏,很难说出为什么一种方式比另一种慢得多。有很多复制和粘贴(如果可能,应始终避免!),一种方法可能是使用比另一种方法更多的系统内存,使其更慢或更快。从您问题中的信息来看,有太多变量无法确定原因,所以我选择了速度的解决方案,而不是解释原因:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多