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应用程序对象…