1

我有一个奇怪的问题,即 Excel 在我的开发机器和测试机器上的行为不同。

在我的加载项中,我在几个地方关闭了 ScreenUpdating 以实现长时间运行的进程。在我的机器上这工作正常。在测试机上,ScreenUpdating = true我一写入单元格,Excel 就会设置。

以下代码为我演示了这个问题。

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 尊重我的设置?

4

3 回答 3

3

我遇到了同样的问题,ScreenUpdating(和其他设置)被带有 VSTO 插件的 Bloomberg 插件重置为 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
于 2012-11-20T18:23:17.693 回答
1

Excel 中的其他插件可能会干扰该单一全局设置。

正是出于这个原因,您应该在每次使用之前将当前 ScreenUpdating 状态保存到局部变量,并在之后恢复它。

在事件中忽略该设置的更改ThisAddIn_Startup(因为您通常不会在那里进行工作)。

于 2012-06-11T12:58:32.257 回答
0

如果加载项以某种方式干扰您的 ScreenUpdating,您可以通过暂时禁用事件来阻止他们这样做。使用EnableEvents. 这可能会破坏该插件的功能,但它可以很好地满足我的需求。

于 2013-06-11T17:17:38.263 回答