Excel interop - 重新计算特定范围的问题

问题描述 投票:1回答:1

这是我目前的代码

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()

c# excel vsto
1个回答
2
投票

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

您应该在Excel应用程序对象上设置Visible = false并在选择Range后稍等片刻,并在收到此错误时重试Calculate调用...

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

© www.soinside.com 2019 - 2024. All rights reserved.