Private _WorkBook As String = Nothing Private _WorkBookIsNew As Boolean = Nothing Public Property WorkBook As String Set(value As String) _WorkBook = value Select Case _WorkBook Case "" WorkBook_Open() _WorkBookIsNew = True Case "Close" _frgClose = True WorkBook_Close() Case "Save" xlsWorkbook.Save() Case "SaveAfterClose", "CloseBeforeSave" xlsWorkbook.Save() _frgClose = True WorkBook_Close() Case Else WorkBook_Open(_WorkBook) _WorkBookIsNew = False End Select End Set Get Return _WorkBook End Get End Property
Private Sub WorkBook_Open(Optional ByVal strFileName As String = Nothing) 'Excel アプリケーション起動 xlsApplication = New Excel.Application 'Excel の Workbooks 取得 xlsWorkbooks = xlsApplication.Workbooks 'Excel非表示 xlsApplication.Visible = False xlsApplication.DisplayAlerts = False If IsNothing(strFileName) Then '新規 Excel ファイルを開く xlsWorkbook = xlsWorkbooks.Add() Else '既存 Excel ファイルを開く xlsWorkbook = xlsWorkbooks.Open(strFileName) End If 'Excel の Worksheets 取得 xlsWorkSheets = xlsWorkbook.Worksheets 'Excel の Worksheet 取得 xlsWorkSheet = xlsWorkSheets.Item(1) xlsWorkSheet.Select() xlsApplication.Visible = ExcelVisible End Sub
Private Sub WorkBook_Close() '終了処理 'xlsRange の解放 MRComObject(xlsRange, True) 'xlsWorkSheet の解放 MRComObject(xlsWorkSheet, True) 'xlsWorkSheets の解放 MRComObject(xlsWorkSheets, True) 'xlsWorkbookを閉じる If Not xlsWorkbook Is Nothing Then xlsWorkbook.Close() 'xlsWorkbook の解放 MRComObject(xlsWorkbook, True) 'xlsWorkbooks の解放 MRComObject(xlsWorkbooks, True) 'Excelを閉じる If Not xlsApplication Is Nothing Then xlsApplication.Quit() 'xlsApplication を解放 MRComObject(xlsApplication, True) End Sub
'COM オブジェクトへの参照を解放 ''' <summary> ''' COMオブジェクトの参照カウントをデクリメントします。 ''' </summary> ''' <typeparam name="T">(省略可能)</typeparam> ''' <param name="objCom"> ''' COM オブジェクト持った変数を指定します。 ''' このメソッドの呼出し後、この引数の内容は Nothing となります。 ''' </param> ''' <param name="force"> ''' すべての参照を強制解放する場合はTrue、現在の参照のみを減ずる場合はFalse。 ''' </param> Friend Sub MRComObject(Of T As Class)(ByRef objCom As T, Optional ByVal force As Boolean = False) If objCom Is Nothing Then Return Try If System.Runtime.InteropServices.Marshal.IsComObject(objCom) Then If force Then System.Runtime.InteropServices.Marshal.FinalReleaseComObject(objCom) Else System.Runtime.InteropServices.Marshal.ReleaseComObject(objCom) End If End If Finally objCom = Nothing End Try End Sub ----------------------------------------------------------------------------------------------------
上記ExcelExクラスがベースクラスで、子クラス、孫クラスがあります。 子クラスで、Data As Microsoft.Office.Interop.Excel.Rangeと言うヶ所があるので、 (必要無いとは思っているものの)MRComObject(Data)と入れてあります。
ちょっと書いている途中で思いついたので、ベースクラスのみ呼び出して閉じる… ---------------------------------------------------------------------------------------------------- Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click ExEx1 = New ExcelEx() ExEx1.WorkBook = path & "Test.xlsx" ExEx1.xlsApplication.WindowState = Excel.XlWindowState.xlMaximized ExEx1.Sheets(1) ExEx1.WorkBook = "Close" End Sub ---------------------------------------------------------------------------------------------------- を実行してもやはりゴミが残ります。