下記のようなコードを書きました。
Public Sub XXXXXXXXXXX
Dim xlApp As New Excel.Application
Dim xlBook As Excel.Workbook
Dim xlSheet As New Excel.Worksheet
try
xlApp = CreateObject("Excel.Application")
xlApp.Workbooks.Open(Filename:=excelTempPath, UpdateLinks:=0)
xlBook = DirectCast((xlApp.Workbooks.Open(excelTempPath)), Excel.Workbook)
シートのコピー、削除など操作
xlBook.Close(SaveChanges:=True, Filename:=strExcelPath)
xlApp.Quit()
Finally
MRComObject(xlSheet)
MRComObject(xlBook)
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp)
xlApp = Nothing
End Try
End Sub
Public Sub MRComObject(Of T As Class)(ByRef objCom As T, Optional ByVal force As Boolean = False)
If objCom Is Nothing Then
Return
End If
Try
If System.Runtime.InteropServices.Marshal.IsComObject(objCom) Then
If force Then
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(objCom)
Else
Dim count As Integer = System.Runtime.InteropServices.Marshal.ReleaseComObject(objCom)
End If
End If
Finally
objCom = Nothing
End Try
End Sub
MRComObject(xlBook)でコンパイルの警告が出力されるのですが
回避する方法はないのでしょうか。
警告が「xlBookは割り当てられる前に・・・」のようなものであれば
Dim xlBook As Excel.Workbook = Nothing
とすれば出なくなります。
余談ですが
Dim xlApp As New Excel.Application
ここでNewを使いインスタンスを生成しているので、
xlApp = CreateObject("Excel.Application")
は必要ないかと。(せっかくCOMの解放を丁寧に行っているのに無用なインスタンスを作っているようなので気になりました)
お礼
ありがとうございます。 教えていただいた修正を試してみます。