我正在编写一个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");
}
到目前为止,我发现的唯一可能的解决方案是进行循环并尝试几次恢复状态。 有人遇到过这样的问题吗?
答案 0 :(得分:0)
最可能在ScreenUpdating
调用时显示一个对话框。您可能会在Exception (HRESULT: 0x800AC472) when using Excel.Worksheet.Select after calling Excel.Workbook.SaveAs页中找到类似的例外情况。
此外,我建议设置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
答案 1 :(得分:0)
如果这可以帮助某人:
我已经使用Excel-DNA辅助函数ExcelAsyncUtil.QueueAsMacro
来执行ScreenUpdating
启用/禁用操作。
这将等待Excel准备就绪,然后运行您传递的委托。在 在那里,您可以使用对象模型
所以我的代码看起来像(我在操作之前和之后调用此函数):
ExcelAsyncUtil.QueueAsMacro(state =>
{
try
{
app.ScreenUpdating = (bool)state;
}
catch (Exception e)
{
e.LogExceptionError($"ExcelAsyncUtil.QueueAsMacro");
}
}, enable); // enable can be true or false.