【问题标题】:Delay Macro Run, Excessive Countifs延迟宏运行,过多计数
【发布时间】:2015-04-27 20:48:23
【问题描述】:

我正在运行一个宏,它会打开一个引用我正在使用的文件的文件,将相关项目作为值粘贴到单独的工作表中,然后从该工作表中制作一个工作簿。

我这样做的原因是因为有几千个 countifs、averageifs 和处理器密集型之类的。

程序从头到尾运行,就好了。问题是在复制/粘贴操作之前只计算了少数项目,因此我在使用公式的工作表副本上得到很多#VALUE 错误——即使公式在进一步检查时计算正确。

我怀疑正确的做法是延迟运行直到工作表完成计算。任何和所有的帮助将不胜感激。

编辑:我尝试了各种方式的 application.calculations,但似乎没有任何效果。如果我手动打开并让处理器执行其操作,则链接和项目会正常计算。唯一计算的项目是其中某处包含“COUNTA”的项目。会不会是应用计算方法不适用于Countifs之类的?

【问题讨论】:

  • 作为一个快速测试,您是否尝试过在宏开始时关闭电子表格自动计算,并在结束时将其打开(或在关闭源数据之前将其关闭)? Application.Calculation = xlCalculateManual。另外,尝试关闭屏幕更新 - 这可能会有所帮助。 Application.ScreenUpdating = False
  • 你能发布你的代码,这样我们就可以确切地看到发生了什么。 @user3578951 的建议可能是正确的答案,但可能需要根据您的具体操作方式进行微调。
  • @user3578951 - 当我解释这个问题时...OP 已经在工作表完成计算之前指示了代码副本,关闭计算将如何解决问题?

标签: excel vba


【解决方案1】:

应该不难做到 - Worksheet 对象有一个计算属性,它会在计算后触发。您可以向工作表添加自定义属性,该属性会在计算完成后公开您设置的标志。在有耗时计算的工作表代码中...

Option Explicit
Private can_copy As Boolean

Public Property Get CopyOK()
    CopyOK = can_copy
End Property

Private Sub Worksheet_Calculate()
    can_copy = True
End Sub

Private Sub Worksheet_Activate()
    can_copy = False
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
    can_copy = False
End Sub

'For volitile functions.
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    can_copy = False
End Sub

...在调用代码中:

Dim book As Workbook

Set book = Application.Workbooks.Open("C:\foobar.xlsm")
Do While Not book.Worksheets("Sheet1").CopyOK
    DoEvents
Loop

'Do your thing...

请注意,我可能错过了一些会触发重新计算的事件,但这应该涵盖刚刚打开它的场景。

【讨论】:

  • 这对我不起作用。我不知道为什么。它要求更新链接(我试过“是”和“否”),现在它给了我整张纸上的价值错误。
【解决方案2】:

所以,我找到了一种可行的方法:

Do Until Application.CalculationState = xlDone
       Application.Calculate
        While Application.CalculationState <> xlDone
            MsgBox Application.CalculationState
            DoEvents
        Wend
    Loop

这是我从 Siddharth Rout 应用的一种解决方案:Wait until Application.Calculate has finished

感谢大家的帮助!

【讨论】:

    猜你喜欢
    • 2022-11-03
    • 2020-02-07
    • 1970-01-01
    • 2018-09-17
    • 2013-01-30
    • 2016-03-24
    • 2020-10-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多