3

データを生成して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

私はかなりの狩りをしましたが、これを防ぐ方法がわかりません。例外のランダムな性質により、予測できない時間に実行されるガベージコレクターのようなものである可能性があると思いますが、その理論をテストする方法がわかりません。

4

1 に答える 1

2

以前、Excel スプレッドシートでおかしな COM 例外が発生したことがあり、解決策は Excel の自動回復機能を無効にすることでした。Interop は、必要なときにいつでも Excel にアクセスできるようにすることに非常にうるさいようで、私にとっては、何かが中断するたびに例外をスローします。

次のようにして、自動回復を無効にすることができます。

xlApp.Autorecover.Enabled = False

ただし、最後に再度有効にすることを忘れないでください。そうしないと、永久にオフのままになります。

これで問題が解決するかどうかはわかりませんが、おそらく試してみる価値があります。

于 2012-10-29T16:43:37.360 に答える