Excel互操作 – 重新计算特定范围的问题

这是我得到的当前代码

private void recalculateRRange(Excel.Range UsedRange) { Excel.Range currentRRange = null, firstRRange = null; currentRRange = (Excel.Range)UsedRange.Find("#HERE#", Type.Missing, Excel.XlFindLookIn.xlValues, Excel.XlLookAt.xlPart, Excel.XlSearchOrder.xlByRows, Excel.XlSearchDirection.xlNext, false, Type.Missing, Type.Missing); while (currentRRange != null) { if (firstRRange == null) { firstRRange = currentRRange; } else if (currentRRange.get_Address(Type.Missing, Type.Missing, Excel.XlReferenceStyle.xlA1, Type.Missing, Type.Missing) == firstRRange.get_Address(Type.Missing, Type.Missing, Excel.XlReferenceStyle.xlA1, Type.Missing, Type.Missing)) { break; } //force current range to recalculate currentRRange.Calculate(); currentRRange = (Excel.Range)UsedRange.FindNext(currentRRange); } } 

上面的方法用于find标记为#HERE#的单元格,并强制重新计算这个单元格,以便获得更新的结果。

我设法得到这个代码工作一天前,但不知何故现在不工作。 无论如何,我猜这个代码有点bug,因为我只能一次捕获exception。 我想知道是否有更好的方法来实现它?

捕获的例外:

Exception from HRESULT: 0x800AC472 at System.RuntimeType.ForwardCallToInvokeMember(String memberName, BindingFlags flags, Object target, Int32[] aWrapperTypes, MessageData& msgData) at Microsoft.Office.Interop.Excel.Range.Calculate()

我不知道这是否意味着什么。 我最好的猜测是,可能会阻止currentRRange调用Calculate() 。 无论如何,我会很感激任何帮助。

非常感谢。

你得到的错误意味着VBA_E_IGNORE ,这意味着某人/某人正在运行/交互在该表上…这可能是一个用户和/或一些复杂的计算…

您应该在Excel应用程序对象上设置Visible = false并在selectRange后等待一会儿,然后在收到此错误时重试Calculate调用…

另一点:你应该避免从多个线程访问Excel应用程序对象…