Hatena::ブログ(Diary)

社内SE奮戦記 このページをアンテナに追加 RSSフィード

2010-03-09

VBでExcelファイルを扱う時の注意

ソースコード

Imports Excel = Microsoft.Office.Interop.Excel
'…省略

Dim oExcel As Excel.ApplicationClass = New Excel.ApplicationClass
'WorkBookオブジェクト
Dim oBook As Excel.WorkbookClass
Dim oSheet As Excel.Worksheet

oBook = CType(oExcel.Workbooks.Add(), Excel.WorkbookClass)
oSheet = CType(oBook.Worksheets(1), Excel.Worksheet)

Try
    'A1, B1に数値を設定
    oSheet.Cells(1, 1) = 2
    oSheet.Cells(1, 2) = 3
    '…とかなんとかしてExcelファイルを作る。

    'SaveFileDialog生成
    Dim saveFileDialog1 As SaveFileDialog = New SaveFileDialog()
    saveFileDialog1.Title = "保存先選択"
    'デフォルト保存先ディレクトリ
    saveFileDialog1.InitialDirectory = Application.StartupPath
    'ファイル名
    saveFileDialog1.FileName = "ファイル名.xls"
    'フィルタ
    saveFileDialog1.Filter = "Excelファイル (*.xls)|*.xsl"
    
    If saveFileDialog1.ShowDialog() = DialogResult.OK Then
        oBook.SaveAs(saveFileDialog1.FileName, Excel.XlFileFormat.xlExcel8)
    End If
    
    Catch ex As Exception
        MessageBox.Show(ex.Message, "エラー", MessageBoxButtons.OK)
    Finally
        oBook.Close(False)
        System.Runtime.InteropServices.Marshal.ReleaseComObject(oBook)
        oBook = Nothing
        oExcel.Quit()
        System.Runtime.InteropServices.Marshal.ReleaseComObject(oExcel)
        oExcel = Nothing
End Try

大事なのはここ

oBook.Close(False)
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(oBook)
oBook = Nothing
oExcel.Quit()
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(oExcel)
oExcel = Nothing

VB.netExcelファイルを扱いたくてCOMオブジェクトを利用する場合、COMオブジェクトは明示的に開放してやらないと、タスクExcelが残ったままになる。

COMオブジェクトの仕組み

COMオブジェクトには、参照カウントという仕組みがある。

参照カウントは、COMオブジェクトを参照しているオブジェクト数を表わしていて、以下のタイミングで増減する。

COMオブジェクトの生成は、通常のオブジェクトと同じ方法で生成することができる(参照カウントを意識する必要はない)

が、オブジェクトの開放は以下のメソッドを利用して明示的に行わなければならない。

System.Runtime.InteropServices.Marshal.FinalReleaseComObject

通常のオブジェクト同様、COMのラッパーオブジェクトの参照がなくなれば、GCを実行して解放することができるが、オブジェクトを即時に解放できるわけではないので注意。あくまで解放し忘れている場合の保険。

COMオブジェクトを利用する場合、参照したものをすべて変数に格納しておく必要がある。

補足

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証