Excelのプロセスが残ってしまう への返答
投稿で使用できる特殊コードの説明。(別タブで開きます。)
以下の返答は逆順(新しい順)に並んでいます。
投稿者 魔界の仮面弁士  (社会人)
投稿日時
2008/12/1 18:45:38
> range1 = xlsheet.Cells(1, 2)
Cells プロパティは「引数を持たない」メンバです。上記は、
range1 = xlsheet.Cells._Default(1, 2)
を省略した書き方である事に注意してください。
> とくに変な使い方はしていないと思うのですが・・・。
_Default が返す Range は解放しているようですが、
Cells が返す Range は残っていた…というわけですね。
Cells プロパティは「引数を持たない」メンバです。上記は、
range1 = xlsheet.Cells._Default(1, 2)
を省略した書き方である事に注意してください。
> とくに変な使い方はしていないと思うのですが・・・。
_Default が返す Range は解放しているようですが、
Cells が返す Range は残っていた…というわけですね。
投稿者 ぐすたふ  (学生)
投稿日時
2008/12/1 11:57:16
ある程度原因は絞ったのですがプロセスが残ってしまいます
Dim xlApp As New Excel.Application
Dim xlBooks As Excel.Workbooks = xlApp.Workbooks
Dim xlbook As Excel.Workbook = xlBooks.Open(Filename:="data.xls", UpdateLinks:=0)
Dim xlsheets As Excel.Sheets = xlbook.Worksheets
Dim xlsheet As Excel.Worksheet = xlsheets.Item(1)
Dim xlcells1 As Excel.Range
Dim xlcells2 As Excel.Range
xlcells1 = xlsheet.Cells
xlcells2 = xlsheet.Cells
'問題点
Dim range1 As Excel.Range
range1 = xlsheet.Cells(1, 2)
System.Runtime.InteropServices.Marshal.ReleaseComObject(range1)
'ここまで
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlcells1) 'xlcells1の解放
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlcells2) 'xlcells2の解放
xlbook.Close(False)
xlApp.Quit()
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlsheet)
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlsheets)
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlbook)
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBooks)
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp)
とくに変な使い方はしていないと思うのですが・・・。
Dim xlApp As New Excel.Application
Dim xlBooks As Excel.Workbooks = xlApp.Workbooks
Dim xlbook As Excel.Workbook = xlBooks.Open(Filename:="data.xls", UpdateLinks:=0)
Dim xlsheets As Excel.Sheets = xlbook.Worksheets
Dim xlsheet As Excel.Worksheet = xlsheets.Item(1)
Dim xlcells1 As Excel.Range
Dim xlcells2 As Excel.Range
xlcells1 = xlsheet.Cells
xlcells2 = xlsheet.Cells
'問題点
Dim range1 As Excel.Range
range1 = xlsheet.Cells(1, 2)
System.Runtime.InteropServices.Marshal.ReleaseComObject(range1)
'ここまで
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlcells1) 'xlcells1の解放
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlcells2) 'xlcells2の解放
xlbook.Close(False)
xlApp.Quit()
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlsheet)
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlsheets)
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlbook)
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBooks)
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp)
とくに変な使い方はしていないと思うのですが・・・。
._defaultの省略に気がつきませんでした。
ありがとうございました。
魔界の仮面弁士が過去に返答されていたページを参考に問題を解決しました。
こんな感じでしょうか
Dim range1 As Excel.Range
Dim objcell As Excel.Range
objcell = xlsheet.Cells
range1 = objcell._Default(1, 2)
System.Runtime.InteropServices.Marshal.ReleaseComObject(range1)
System.Runtime.InteropServices.Marshal.ReleaseComObject(objcell)
参考にしたところ
http://homepage1.nifty.com/MADIA/vb/vb_bbs2/200412/200412_04120059.html