我正在構建一個應用程序,該應用程序生成一些數據,然後將其輸出到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
我相當多的狩獵周圍做,但我無法弄清楚如何阻止這種情況發生。異常的隨機性使我認爲它可能像垃圾收集器在不可預知的時間運行,但我不知道如何去測試這個理論。
感謝您的建議。這個問題似乎仍然在發生,可能我使用的是xlApp錯誤?在調用你指定的語句之前,我正在編寫'Dim xlApp As Excel.Application = New Excel.Application'。當我在最後重新啓用它時(在不同的功能中),我會做同樣的事情。這是正確的,還是應該xlApp在全球以某種方式聲明? – Keilan
@Keilan好吧,將Excel的副本留在內存中可能不是一個好主意。如果您需要兩次Excel,那麼我會按照您的建議全局聲明它,然後在該實例中打開和關閉工作簿,或者在重用之前退出並正確處理舊工作簿。否則,你可能會遇到許多Excel無頭實例懸而未決的問題。調試您的程序並觀察過程在您移動代碼時開始和停止。 Windows任務管理器應該足以跟蹤它們。 –
再次感謝您的幫助,我將其更改爲使用全局變量來防止懸掛過程。不幸的是,它並沒有解決問題,隨機錯誤依然存在。我會繼續尋找。 – Keilan