データを生成してExcelシートに出力するアプリケーションを構築しています。このシートは数千行の長さになることがあるので、BackgroundWorkerを使用して処理します(編集を防ぐプログレスバーを使用して、スプレッドシートの生成中にユーザーがスプレッドシートを変更できないようにします)。
残念ながら、これが発生している間、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
例外は、「Return引数の型が無効です。」、「HRESULTからの例外:0x800A03EC」、およびその他のいくつかのHRESULTコードを含むさまざまな形式で表示されます。
重要かもしれないもう1つの奇妙な点は、その例外をキャッチしてすぐに同じ行を実行すると、機能することです。(つまり、次のようにすると、プログラムは正常に完了します)
Try
modify sheet code
Catch ex As Exception
identical modify sheet code
End Try
私はかなりの狩りをしましたが、これを防ぐ方法がわかりません。例外のランダムな性質により、予測できない時間に実行されるガベージコレクターのようなものである可能性があると思いますが、その理論をテストする方法がわかりません。