忍者ブログ

VB.NET-TIPS などプログラミングについて

VB.NETのTIPS(小技集)を中心に、Javascript、PHP その他のプログラミングについて少し役に立つ情報を発信します。いわゆる個人的な忘備録ですが、みなさんのお役に立てれば幸いです。

VB.NET:VB.NETでメモリにプロセスが残らない、エクセルファイルの処理について
VB.NETでエクセルファイルを処理する場合、エクセルのプロセスがメモリ上に残るときがあります。
プロセスにエクセル(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

コメント

コメントを書く