这是我目前的代码
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);
}
}
上述方法用于查找标记为#HERE#
的单元格并强制重新计算此单元格,以便我们获取更新的结果。
我设法让这段代码在一天前工作,但不知何故它现在还没有用。我想这个代码有点儿错误,因为我已经能够捕获异常一次。我想知道是否有更好的方法来实现它?
捕获异常:
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()
。
答案 0 :(得分:2)
你得到的错误意味着VBA_E_IGNORE
,这反过来意味着某人/某人在该表上正在运行/互动...这可能是一个用户和/或一些复杂的计算。
您应该在Excel应用程序对象上设置Visible = false
并在选择Range
后稍等片刻,并在收到此错误时重试Calculate
来电...
另一点:您应该避免从多个线程访问Excel应用程序对象。