.Netではオブジェクトの解放を正しく行わないとタスクにExcelが残ったままになるので注意。
主な注意点は以下の通り
1.オブジェクトはNothingだけではなくFinalReleaseComObjectメソッドで解放を行うこと
2.ExcelオブジェクトのQuitメソッドを必ず行うこと
3.オブジェクトは変数にセットして使用するようにすること(グローバルオブジェクトを使用しない)
4.Excel.Workbooks、Excel.Sheetsオブジェクトを使用すること。
以下のように「.」を2つ続けるような参照をすると解放されません。
objBook = objExcel.Workbooks.Open("D:\temp.xls")
なお、.NetFrameWorkとExcelのバージョンによって挙動が異なることがあるらしい。
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