2012-10-23 24 views
3

我正在構建一個應用程序,該應用程序生成一些數據,然後將其輸出到Excel工作表。有時候這張表有幾千行,所以我使用BackgroundWorker來處理它(請注意,我使用了一個阻止用戶在生成時修改電子表格的編輯功能的進度條)。修改Excel工作表時隨機發生COM異常

不幸的是,當發生這種情況時,由於COM異常,程序會隨機崩潰。通過隨機我的意思是,異常發生在執行期間的不同時間,有時根本不會發生。下面是導致問題的代碼,在使用sheet變量的行上始終調用異常。

Public Sub modifyCell(ByRef sheet As Worksheet, ByVal row As Integer, ByVal column As Integer, ByRef value As String) 

    sheet.Cells(row, column) = value 

End Sub 

Public Sub colorRange(ByRef sheet As Worksheet, ByVal iRow As Integer, ByVal iCol As Integer, ByVal fRow As Integer, ByVal fCol As Integer, ByVal color As Integer, ByRef type As String) 

    If type Is "Interior" Then 
     sheet.Range(sheet.Cells(iRow, iCol), sheet.Cells(fRow, fCol)).Interior.ColorIndex = color 
    ElseIf type Is "Font" Then 
     sheet.Range(sheet.Cells(iRow, iCol), sheet.Cells(fRow, fCol)).Font.ColorIndex = color 
    End If 

End Sub 

的異常不同的形式,包括顯示了,「從HRESULT異常:0x800A03EC」「返回參數具有一個無效的類型。」和其他一些HRESULT代碼。

另一個可能很重要的奇怪現象 - 如果我發現了這個異常,然後立即執行同一行,它就會起作用。 (即下面讓程序成功完成)

Try 
    modify sheet code 
Catch ex As Exception 
    identical modify sheet code 
End Try 

我相當多的狩獵周圍做,但我無法弄清楚如何阻止這種情況發生。異常的隨機性使我認爲它可能像垃圾收集器在不可預知的時間運行,但我不知道如何去測試這個理論。

回答

2

我以前遇到過使用Excel電子表格的奇怪COM異常,而且我的解決方案是禁用Excel的自動重新發布功能。 Interop似乎對能夠在任何時候想要訪問Excel非常挑剔,對於我來說,只要有中斷事件就會拋出異常。

可以由此禁用自動恢復:

xlApp.Autorecover.Enabled = False 

但記得要在年底重新啓用它,否則將保持關閉爲好。

不知道這是否會解決您的問題,但它可能值得一試。

+0

感謝您的建議。這個問題似乎仍然在發生,可能我使用的是xlApp錯誤?在調用你指定的語句之前,我正在編寫'Dim xlApp As Excel.Application = New Excel.Application'。當我在最後重新啓用它時(在不同的功能中),我會做同樣的事情。這是正確的,還是應該xlApp在全球以某種方式聲明? – Keilan

+1

@Keilan好吧,將Excel的副本留在內存中可能不是一個好主意。如果您需要兩次Excel,那麼我會按照您的建議全局聲明它,然後在該實例中打開和關閉工作簿,或者在重用之前退出並正確處理舊工作簿。否則,你可能會遇到許多Excel無頭實例懸而未決的問題。調試您的程序並觀察過程在您移動代碼時開始和停止。 Windows任務管理器應該足以跟蹤它們。 –

+0

再次感謝您的幫助,我將其更改爲使用全局變量來防止懸掛過程。不幸的是,它並沒有解決問題,隨機錯誤依然存在。我會繼續尋找。 – Keilan

相關問題