C# Excel互操作-重新计算特定范围时出现问题

C# Excel互操作-重新计算特定范围时出现问题,c#,excel,vsto,C#,Excel,Vsto,这是我目前掌握的密码 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, E

这是我目前掌握的密码

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#
的单元格,并强制此单元格重新计算,以便获得更新的结果

我一天前设法让这个代码工作,但不知怎么的,它现在不工作了。我猜代码有点问题,因为我只捕获了一次异常。我想知道是否有更好的方法来实施它

捕获的异常:

来自HRESULT的异常:0x800AC472 位于System.RuntimeType.ForwardCallToInvokeMember(字符串memberName、BindingFlags标志、对象目标、Int32[]aWrapperTypes、MessageData和msgData) 在Microsoft.Office.Interop.Excel.Range.Calculate()上

我不知道这是否意味着什么。我最好的猜测是,可能有什么东西阻止了
currentArrange
调用
Calculate()
您得到的错误意味着,这反过来意味着某个/某人正在该工作表上运行/交互。。。这可能是用户和/或一些复杂的计算

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


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

所以您建议我在这种情况下可能不应该使用BackgroundWorker?当我使用调试器时,我确实看到这个方法在工作线程上运行,而不是在VSTO主线程上运行。可能是问题的原因?是-这可能是导致此错误的原因之一。。。请阅读我的答案中的链接所说的内容…Excel将处于繁忙状态,例如,当用户编辑单元格时。从另一个线程对Excel自动化模型进行的任何COM调用都可能导致此错误,您需要处理它并重试。避免错误处理分散的一种方法是设置对宏的中心调用,该宏将调用主线程上的实际代码。然后,您只需在一个地方进行错误处理和重试,即调用Application.Run(“MyMacroRunner”)。Excel DNA组的讨论可能会有所帮助:。