我有一个奇怪的问题,Excel在我的开发机器和测试机器上表现不同。
在我的插件中,我已经在几个地方为长时间运行的进程关闭了ScreenUpdating。在我的机器上这很好用。在测试机器上,Excel在写入单元格后立即设置ScreenUpdating = true
。
以下代码为我演示了这个问题。
private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
Microsoft.Office.Interop.Excel.Application excel = Globals.ThisAddIn.Application;
MessageBox.Show(excel.ScreenUpdating.ToString());
excel.ScreenUpdating = false;
MessageBox.Show(excel.ScreenUpdating.ToString());
Workbook workbook = Globals.ThisAddIn.Application.ActiveWorkbook;
Worksheet w = (Worksheet)workbook.Worksheets[1];
((Range)w.Cells[1, 1]).Value = "Test";
MessageBox.Show(excel.ScreenUpdating.ToString());
}
在我的机器上,打开Excel会显示三个消息框
“真实”,“虚假”,“虚假”。
在测试机上他们说
“真实”,“虚假”和“真实”。
我还使用远程调试器,并在设置单元格值后立即观察ScreenUpdating
属性更改。此外,这不是重置ScreenUpdating
的唯一因素。添加或删除工作表或工作簿也可以执行此操作。
每个系统上的Excel版本相同(14.0.6112.5000(32位))。
可能导致这种情况的原因是什么?如何修复它以便Excel尊重我的设置?
答案 0 :(得分:3)
我遇到了与使用VSTO加载项的Bloomberg加载项将ScreenUpdating(和其他设置)重置为true的相同问题。他们的支持正致力于解决方案,但同时以下解决方案可行:
通过在与其单元格交互时隐藏每个工作表,屏幕将不会更新,您将获得性能优势。确保不要试图隐藏最后一张纸,因为它会引发错误。不确定这是否适合您的项目,但它是我的可行解决方案。
以下是VB.NET中隐藏工作表的一些示例代码:
' Create a book with a single worksheet
Dim Book As Excel.Workbook
Book = Globals.ThisAddIn.Application.Workbooks.Add(Excel.XlWBATemplate.xlWBATWorksheet)
'% Create sheet variable
Dim Sheet As Excel.Worksheet
Sheet = TryCast(Book.ActiveSheet, Excel.Worksheet)
' Visible
Sheet.Visible = Excel.XlSheetVisibility.xlSheetVisible
' Hidden but user able to show
Sheet.Visible = Excel.XlSheetVisibility.xlSheetHidden
' Hidden for user as well
Sheet.Visible = Excel.XlSheetVisibility.xlSheetVeryHidden
答案 1 :(得分:1)
Excel中的其他插件可能会干扰该单一全局设置。
出于这个原因,您应该将当前的ScreenUpdating状态保存到本地变量之前,并在每次使用之后将其恢复。
忽略ThisAddIn_Startup
事件中该设置的更改(因为您通常不会在那里工作)。
答案 2 :(得分:0)
如果加载项以某种方式干扰了您的ScreenUpdating,您可以通过暂时禁用事件来阻止它们执行此操作。使用EnableEvents
。这可能会破坏该插件的功能,但它可以满足我的需求。