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

我有一个奇怪的问题,Excel在我的开发机器和testing机器上performance不一样。

在我的加载项中,我closures了ScreenUpdating在长时间运行的进程的几个地方。 在我的机器上,这工作正常。 在testing机器上,只要我写入单元格,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提供了三个消息框

“真”,“假”,“假”。

在testing机器上他们说

“真”,“假”和“真”。

我也用远程debugging器进行了检查,并在单元格值设置后立即观察ScreenUpdating属性的变化。 而且,这不是重置ScreenUpdating的唯一的东西。 添加或删除工作表或工作簿也会这样做。

每个系统上的Excel版本相同(14.0.6112.5000(32位))。

什么可能导致这个? 我怎样才能解决这个问题,让Excel尊重我的设置?

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

正因为如此,你应该保存当前的ScreenUpdating状态到一个本地variables之前,并在每次使用后恢复。

忽略ThisAddIn_Startup事件中该设置的改变(因为无论如何你通常不会在那里做你的工作)。

我正在使用ScreenUpdating(和其他设置)通过Bloomberg加载项与VSTO加载项重置为true的相同问题。 他们的支持正在解决scheme,但同时下面的解决scheme工作正常:

通过在与单元格交互时隐藏每个表单,屏幕不会更新,您将获得性能优势。 确保不要试图隐藏最后一张纸,因为它会引发错误。 不知道这是否适合您的项目,但它是我的一个可行的解决scheme。

这里是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 

如果加载项以某种方式干扰了ScreenUpdating,则可以通过临时禁用事件来阻止它们形成干扰。 使用EnableEvents 。 这可能会打破该插件的function,但它对我的需求很好。