Excelのプロセス解放

.Netではオブジェクトの解放を正しく行わないとタスクにExcelが残ったままになるので注意。
主な注意点は以下の通り



1.オブジェクトはNothingだけではなくFinalReleaseComObjectメソッドで解放を行うこと


2.ExcelオブジェクトのQuitメソッドを必ず行うこと


3.オブジェクトは変数にセットして使用するようにすること(グローバルオブジェクトを使用しない)


4.Excel.Workbooks、Excel.Sheetsオブジェクトを使用すること。
以下のように「.」を2つ続けるような参照をすると解放されません。

objBook = objExcel.Workbooks.Open("D:\temp.xls")


なお、.NetFrameWorkとExcelのバージョンによって挙動が異なることがあるらしい。




VB.Netでのサンプルソースは以下の通り。

Imports Excel 'Microsoft Excel 11.0 Object Librlary

Public Class Form1

    'テスト用ドライバ
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Call func_Excel_Output()

    End Sub

    'Excel出力
    Private Sub func_Excel_Output()

        Dim objExcel As Excel.Application
        Dim objBooks As Excel.Workbooks
        Dim objBook As Excel.Workbook
        Dim objSheets As Excel.Sheets
        Dim objSheet As Excel.Worksheet
        Dim objRange As Excel.Range

        On Error GoTo Err_Proc

        'Excelを開く
        objExcel = New Excel.Application

        'Bookを開く
        objBooks = objExcel.Workbooks
        objBook = objBooks.Open("D:\temp.xls")

        'シートの指定
        objSheets = objBook.Worksheets
        objSheet = objSheets.Item(1)

        '値のセット
        objRange = objSheet.Range("A1")
        objRange.Value = "test1"
        Call ReleaseCOMObject(objRange)

        objRange = objSheet.Range("A2")
        objRange.Value = "test2"
        Call ReleaseCOMObject(objRange)

        'ブックの保存
        objBook.Save()

Exit_Proc:
        'オブジェクトの解放
        Call ReleaseCOMObject(objRange)
        Call ReleaseCOMObject(objSheet)
        Call ReleaseCOMObject(objSheets)
        Call ReleaseCOMObject(objBook)
        Call ReleaseCOMObject(objBooks)

        'Excelを閉じる
        objExcel.Quit()
        Call ReleaseCOMObject(objExcel)

        Exit Sub


Err_Proc:
        '例外処理

        Resume Exit_Proc
    End Sub

    'COMオブジェクトの解放
    Private Shared Sub ReleaseCOMObject(Of T As Class)(ByRef objCom As T)

        'オブジェクトが空の場合処理を抜ける
        If objCom Is Nothing Then
            Return
        End If

        Try
            'パラメタがCOMオブジェクトかチェック
            If System.Runtime.InteropServices.Marshal.IsComObject(objCom) Then

                'Runtime Callable Wrapperの解放を行う
                Dim cntRCW As Integer = System.Runtime.InteropServices.Marshal.FinalReleaseComObject(objCom)

                If cntRCW <> 0 Then
                    '解放しきれていない場合、メッセージを出力
                    MessageBox.Show("解放エラー")
                End If

            End If

        Finally
            objCom = Nothing
        End Try

    End Sub

End Class





動作確認環境:Visual Stadio 2005