写入单元格会在我的VSTO加载项中打开ScreenUpdating

时间:2012-06-11 12:44:22

标签: c# excel vsto excel-addins

我有一个奇怪的问题,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尊重我的设置?

3 个答案:

答案 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。这可能会破坏该插件的功能,但它可以满足我的需求。