VB.NETでエクセルファイルを処理する場合、エクセルのプロセスがメモリ上に残るときがあります。
プロセスにエクセル(EXCEL.EXE)が残ると、エクセルを扱うプログラムでエクセルファイルのアクセスを行い、 同時にエクセルを起動して処理したい場合に不都合が発生します。
VB.NETプログラムからエクセルを扱う場合は、以下のソースの様にエクセルアプリケーションオブジェクト、 ブックスオブジェクト、ブックオブジェクト、シートオブジェクト等を利用しますが、それぞれ使用した後では オブジェクトを廃棄してやる必要があります。
また、オブジェクトを2回参照すること、つまり"."(ドットでの参照)の参照は1回のみにします。
さらに、処理を終えるところではブックオブジェクトはCloseし、エクセルアプリケーションオブジェクトはQuitする様にします。
尚、今回のエクセルの処理で煩雑にならないように以下の関数を定義しています。
・「_ReleaseComObject」はオブジェクトの参照を解放するためのローカル関数です。
・「_ObjToStr」はオブジェクトの値から文字列へ変換するためのローカル関数です。
=====
2016/01/12:の時の情報
プロセスにエクセル(EXCEL.EXE)が残ると、エクセルを扱うプログラムでエクセルファイルのアクセスを行い、 同時にエクセルを起動して処理したい場合に不都合が発生します。
VB.NETプログラムからエクセルを扱う場合は、以下のソースの様にエクセルアプリケーションオブジェクト、 ブックスオブジェクト、ブックオブジェクト、シートオブジェクト等を利用しますが、それぞれ使用した後では オブジェクトを廃棄してやる必要があります。
また、オブジェクトを2回参照すること、つまり"."(ドットでの参照)の参照は1回のみにします。
さらに、処理を終えるところではブックオブジェクトはCloseし、エクセルアプリケーションオブジェクトはQuitする様にします。
'''エクセルファイル処理 '''xlsxファイル名 Private Sub TestXlsx(ByVal strXlsxFileName As String) 'エクセル・オブジェクト宣言 Dim objExcel As Object = Nothing Dim objWorkBooks As Object = Nothing Dim objWorkBook As Object = Nothing Dim objSheet As Object = Nothing Dim objCells As Object = Nothing Dim objCell As Object = Nothing Try 'CreateObjectでExcelObjectを実行時バインディングする objExcel = CreateObject("Excel.Application") objExcel.visible = False objWorkBooks = objExcel.Workbooks objWorkBook = objWorkBooks.open(System.IO.Path.GetFullPath(strXlsxFileName)) objSheet = objWorkBook.Worksheets(1) objCells = objSheet.Cells '文字列の連結 Dim strTest As String = "" '内容を1行ずつ読み込む For Row As Integer = 1 To 10 objCell = objCells(Row, 1) strTest &= _ObjToStr(objCell.Value).Trim _ReleaseComObject(objCell) 'セルオブジェクト廃棄 objCell = objCells(Row, 2) strTest &= _ObjToStr(objCell.Value).Trim _ReleaseComObject(objCell) objCell = objCells(Row, 3) strTest &= _ObjToStr(objCell.Value).Trim & vbCrLf _ReleaseComObject(objCell) Next MsgBox(strTest) Finally '各オブジェクトの廃棄 If Not IsNothing(objCell) Then _ReleaseComObject(objCell) End If If Not IsNothing(objCells) Then _ReleaseComObject(objCells) End If If Not IsNothing(objSheet) Then _ReleaseComObject(objSheet) End If If Not IsNothing(objWorkBook) Then objWorkBook.Close(False) 'ファイルを閉じる _ReleaseComObject(objWorkBook) End If If Not IsNothing(objWorkBooks) Then _ReleaseComObject(objWorkBooks) End If If Not IsNothing(objExcel) Then objExcel.Quit() 'EXCELを閉じる _ReleaseComObject(objExcel) End If End Try End Sub '''明示的にCOMオブジェクトの参照を解放 '''COMオブジェクトの参照 Private Sub _ReleaseComObject(ByRef obj As Object) Try If Not obj Is Nothing Then Marshal.FinalReleaseComObject(obj) End If Finally obj = Nothing End Try End Sub '''Object型からString型への変更 '''変換元Object型データ '''変換後String型データ Private Function _ObjToStr(ByVal objStr As Object) As String Try Return objStr.ToString Catch ex As Exception Return "" End Try End Function
尚、今回のエクセルの処理で煩雑にならないように以下の関数を定義しています。
・「_ReleaseComObject」はオブジェクトの参照を解放するためのローカル関数です。
・「_ObjToStr」はオブジェクトの値から文字列へ変換するためのローカル関数です。
=====
2016/01/12:の時の情報
PR
コメント