2016-02-12 41 views
1

我在C#中創建Excel插件並使用插件按鈕單擊更改某些單元格值。它工作順利,但是,我注意到,如果用戶試圖在任何單元格中輸入某些內容(不僅是我要更改值的內容),它總是會拋出HRESULT: 0x800A03EC異常。Excel中拋出異常HRESULT:0x800A03EC用戶仍在鍵入單元格和單元格值更改

我的代碼很簡單,比如我只有這一段代碼測試這樣的:

private void buttonFoo_Click(object sender, RibbonControlEventArgs e) 
{ 
    var ws = Globals.ThisAddIn.Application.ActiveSheet; 
    ws.Range["A1"].Value = "bar"; 
} 

當我點擊一個隨機的單元格中鍵入「富」,但我不任意位置單擊在工作表上,我沒有完成寫「富」,而是我點擊buttonFoo,而我仍然集中在我的單元格,它會拋出這個異常。

這張照片可以解釋我想要做的,我會在測試按鈕的圖片被點擊,同時仍打字這樣的:

enter image description here

我認爲這是例外,如果發生我試圖在特定的單元格中輸入某些內容,並且該特定的單元格也在我的代碼中更改。但事實並非如此。我試過選擇一個未使用的單元,如下所示:

ws.Range["B1"].Select(); 

沒有幫助。我試着發送ESC鍵取消用戶鍵入:

excelApp.SendKeys("{ESCAPE}"); 

我測試了這一點,它實際上將發送逃跑,但它仍然會拋出異常。我完全沒有想法,並沒有發現任何關於這個問題。我的意思是我可以用try/catch尋找這個異常來包圍所有東西,但這太可怕了。任何人都知道該怎麼做?

+1

由於應用程序在編輯模式下,大部分的代碼將不會運行,直到編輯完一個單元格。先嚐試檢查應用程序的'.Interactive'屬性。 –

+0

我剛剛嘗試更改'.Interactive',但它仍然會引發異常,當我嘗試它..也許它只是不可能運行代碼,而應用程序處於編輯模式? – Peroxy

回答

1

嘗試這樣的事情,而不是看是否應用程序正忙:

bool XLAppBusy() 
{ 
    if (Globals.ThisAddIn.Application.Interactive == false) 
    { 
     return false; 
    } 

    try 
    { 
     Globals.ThisAddIn.Application.Interactive = false; 
     Globals.ThisAddIn.Application.Interactive = true; 
    } 
    catch 
    { 
     return true; 
    } 
     return false; 
} 

private void buttonFoo_Click(object sender, RibbonControlEventArgs e) 
{ 
    if (XLAppBusy() == false) 
    {  
     ws.Range["A1"].Value = "bar"; 
    } 
} 
+1

該死的,這是一個有趣的方法,工程..乾杯 – Peroxy

相關問題