2012-06-11 31 views
1

我有一個奇怪的問題,Excel在我的開發機器和測試機器上表現不同。寫入單元格打開ScreenUpdating在我的VSTO加載項

在我的加載項中,我關閉了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

測試機器在XLStart文件夾中是否有其他xla或插件? – Kiru

+0

@Kiru是的。有一個彭博加載項已安裝。事實上,禁用它似乎可以解決問題並重新啓用該功能。我想我需要跟彭博社交談。 –

回答

1

Excel中的其他插件可能會干擾單個全局設置。

正是出於這個原因,你應該將當前的ScreenUpdating狀態保存到本地變量之前,並在每次使用之後恢復它。

忽略ThisAddIn_Startup事件中該設置的更改(因爲無論如何您通常不會在此工作)。

+0

ScreenUpdating變量正在重置*每次*我進行更改。我發佈的代碼僅僅是一個例子。實際上,無論我在哪裏設置它,只要我寫入單元格,它就會被設置爲true。 –

+0

明白了:在這種情況下,另一個加載項捕獲單元格更改事件並將ScreenUpdating重置爲true(這是另一個加載項中的一個錯誤)。建議您刪除其他加載項,或者儘可能將其替換。 –

+0

我認爲你是對的。我無法刪除它,因爲這是一個關鍵業務加載項。但是我可以和做出來的人交談,看看他們是否知道這件事。 –

3

我正在用ScreenUpdating(和其他設置)通過Bloomberg加載項與VSTO加載項重置爲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 
+0

很酷。我不知道這件事。謝謝。什麼是隱藏工作表的代碼? –

+0

爲您添加了示例代碼@KrisHarper –

0

如果某個加載項與您ScreenUpdating莫名其妙的干擾,你可以阻止他們形成通過暫時禁用事件做。使用EnableEvents。這可能會打破該插件的功能,但它可以滿足我的需求。

相關問題