C# 处理Excel应用程序中的异常(0x800AC472)。屏幕更新

C# 处理Excel应用程序中的异常(0x800AC472)。屏幕更新,c#,excel,vsto,C#,Excel,Vsto,我正在写一个C#VSTOExcelAddin。 在我的项目中,需要更新和合并大量单元格 为了减少闪烁并提高性能,我将Application.ScreenUpdate设置为false,然后在操作完成后设置回true 问题是,有时我会将异常设置回true状态 错误消息: (HRESULT:0x800AC472)(VBA_E_忽略) 在这种情况下,Excel被卡住(因为没有屏幕更新),唯一的选择是退出/重新打开Excel 这是我的密码: Excel.Application app = someval

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

为了减少闪烁并提高性能,我将Application.ScreenUpdate设置为
false
,然后在操作完成后设置回
true

问题是,有时我会将异常设置回
true
状态

错误消息:

(HRESULT:0x800AC472)(VBA_E_忽略)

在这种情况下,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");
    }
到目前为止,我找到的唯一可能的解决方案是创建一个循环并尝试几次恢复状态。
有人遇到过这样的问题吗?

很可能在调用
屏幕更新时会显示一个对话框窗口。您可能会发现页面中描述的类似异常

另外,我建议设置
CalculationMode
EnableEvents
属性:

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
如果这有助于某人: 我使用了一个Excel DNA助手函数
ExcelAsyncUtil.QueueAsMacro
来执行
屏幕更新
启用/禁用操作

根据报告:

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

因此,我的代码如下所示(我在操作前后调用此函数):


我会用一个。此外,您还可以添加一个重置屏幕更新。不确定最终如何在这里提供帮助?操作在呼叫应用程序中失败。ScreenUpdate=true;->在finally block中,它也会有同样的行为。很抱歉,在我的手机上错过了这一部分。我还是会查一下背景工作人员。在单独的线程中运行该过程可能会有所帮助。如果在更新时还将“Visible”标志设置为false,会发生什么情况。
ExcelAsyncUtil.QueueAsMacro(state =>
{
    try
    {
        app.ScreenUpdating = (bool)state;
    }
    catch (Exception e)
    {
        e.LogExceptionError($"ExcelAsyncUtil.QueueAsMacro");
    }
}, enable); // enable can be true or false.