我正在运行一个宏来打开一个引用我正在使用的文件的文件,将相关项目作为值粘贴到一个单独的工作表中,并从该工作表中创建一个工作簿。
我这样做的原因是因为有几千个countifs,averageifs和处理器密集型。
程序从头到尾运行,很好。问题是在复制/粘贴操作之前只计算了一些项目,因此我在使用公式的工作表副本上得到了很多#VALUE错误 - 即使公式在进一步检查时正确计算。
我怀疑正确的行动方案是延迟运行直到工作表完成计算。任何和所有的帮助将不胜感激。
编辑:我已尝试过各种各样的application.calculations,似乎没有任何工作。如果我手动打开并让处理器执行其操作,链接和项目会正常计算。唯一计算的项目是包含" COUNTA"在它的某个地方。应用计算方法是否可能不适用于Countifs等?答案 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
谢谢大家的帮助!