延迟宏运行,过度的标识

时间:2015-04-27 20:48:24

标签: excel-vba vba excel

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

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

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

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

编辑:我已尝试过各种各样的application.calculations,似乎没有任何工作。如果我手动打开并让处理器执行其操作,链接和项目会正常计算。唯一计算的项目是包含" COUNTA"在它的某个地方。应用计算方法是否可能不适用于Countifs等?

2 个答案:

答案 0 :(得分:0)

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

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...

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

答案 1 :(得分:0)

所以,我发现了一种工作方式:

var dt = "Mon Jan 05 17:38:34 +1100 2015";

DateTime result;
DateTime.TryParseExact(dt, "ddd MMM dd HH:mm:ss zzzz yyyy", 
    CultureInfo.InvariantCulture, DateTimeStyles.None,  out result);

Console.WriteLine(result);

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

谢谢大家的帮助!