在Excel Application.ScreenUpdating中处理异常(0x800AC472)

时间:2019-07-02 12:51:04

标签: c# excel vsto

我正在编写一个C# VSTO Excel插件。 在我的项目中,需要更新和合并大量单元格。

为了减少闪烁并提高性能,我在操作完成之前将Application.ScreenUpdating设置为false,并在操作完成后将其设置为true

问题是有时我会得到一个异常设置,回到true状态。

错误消息:

  

(HRESULT:0x800AC472)(VBA_E_IGNORE)。

在这种情况下,Excel卡住了(因为没有屏幕更新),唯一的选择是退出/重新打开Excel。

这是我的代码:

 Excel.Application app = somevalue;
    try
    {
        app.ScreenUpdating = false;
        return true;
    }
    catch (Exception e)
    {
        e.LogExceptionError($"SafeEnableScreenUpdating -> param={enable}");
    }

    ... some large operation.

    try
    {
        app.ScreenUpdating = true;
        return true;
    }
    catch (Exception e)
    {
       // exception is here.
        e.LogExceptionError($"SafeEnableScreenUpdating");
    }

到目前为止,我发现的唯一可能的解决方案是进行循环并尝试几次恢复状态。 有人遇到过这样的问题吗?

2 个答案:

答案 0 :(得分:0)

最可能在ScreenUpdating调用时显示一个对话框。您可能会在Exception (HRESULT: 0x800AC472) when using Excel.Worksheet.Select after calling Excel.Workbook.SaveAs页中找到类似的例外情况。

此外,我建议设置CalculationModeEnableEvents属性:

Sub YourSub()
    On Error GoTo EH

    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    Application.EnableEvents = False

    ' Code here

CleanUp:
    On Error Resume Next
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
    Application.EnableEvents = True
Exit Sub
EH:
    ' Do error handling
    GoTo CleanUp
End Sub

答案 1 :(得分:0)

如果这可以帮助某人: 我已经使用Excel-DNA辅助函数ExcelAsyncUtil.QueueAsMacro来执行ScreenUpdating启用/禁用操作。

根据documentation

  

这将等待Excel准备就绪,然后运行您传递的委托。在   在那里,您可以使用对象模型

所以我的代码看起来像(我在操作之前和之后调用此函数):

ExcelAsyncUtil.QueueAsMacro(state =>
{
    try
    {
        app.ScreenUpdating = (bool)state;
    }
    catch (Exception e)
    {
        e.LogExceptionError($"ExcelAsyncUtil.QueueAsMacro");
    }
}, enable); // enable can be true or false.