【问题标题】:Handling exception (0x800AC472) in Excel Application.ScreenUpdating处理 Excel Application.ScreenUpdating 中的异常 (0x800AC472)
【发布时间】:2019-08-05 23:10:44
【问题描述】:

我正在写一个 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");
    }

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

【问题讨论】:

  • 我会使用Background Worker 进行设置。您也可以添加Finally 来重置屏幕更新。
  • 不确定Finally 能在这里提供什么帮助?调用 app.ScreenUpdating = true; 操作失败-> 它在 finally 块中也会有相同的行为。
  • 抱歉错过了那部分,在我的手机上。我仍然会检查后台工作人员。在单独的线程中运行该过程可能会有所帮助。
  • 在更新时将“可见”标志设置为 false 会发生什么。

标签: c# excel vsto


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    如果这对某人有帮助: 我使用了 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.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-06
      • 2020-06-26
      • 1970-01-01
      • 1970-01-01
      • 2021-09-16
      • 1970-01-01
      相关资源
      最近更新 更多