2008/04/24(Thu) 03:17:08 編集(投稿者)
■No17422 (neko さん) に返信
> 画面上ではエクセルが閉じるのを確認出来たのですが、プロセス上では EXCEL.EXEが残ってしまいます。
> (エクセルの、アプリケーション、ブック、シート の開放も行ったのですが、プロセス上で残っていました。)
可能であれば、タイプライブラリを利用したコードに差し替えた方が無難かと思います。
.NET でレイトバインドした場合、特定状況下において、型変換時に内部的に参照カウントが
増加してしまい、Marshal.ReleaseComObject を余計に呼び出さねばならない事がありますので。
# 複数バージョンの Excel に対応させたい場合は、レイトバインドになるのも仕方ないですけど。
> Dim sheet1 = book1.Worksheets(1)
> Dim sheet2 = book2.Worksheets(1)
ここが NG です。Sheets / Worksheets コレクションを変数に受けてください。
sheets = book1.Worksheets
sheet1 = sheets(1)
Marshal.ReleaseComObject(sheets)
という感じで。
> Dim Row1 = sheet1.UsedRange.Rows.Count() - 1
> Dim Row2 = sheet2.UsedRange.Rows.Count() - 1
ここも NG。4 つの Range オブジェクトを解放し忘れています。
.UsedRange から返される Range オブジェクトを変数に受け、
その .Rows から返される Range オブジェクトも変数に受け、
それぞれを解放する処理を加えてください。
> Dim Col1 = sheet1.UsedRange.Columns.Count() - 1
> Dim Col2 = sheet2.UsedRange.Columns.Count() - 1
同様。
> If sheet1.cells(i + 1, j + 1).value = Nothing Then
ここで NG。.Cells から返される Range オブジェクトと、
._Default から返される Range オブジェクトを明示的に解放してください。
aaa = sheet1.Cells
bbb = aaa(i + 1, j + 1)
ccc = bbb.Value
Marshal.ReleaseComObject(bbb)
Marshal.ReleaseComObject(aaa)
> Else
> myData.File1_buf(i, j) = sheet1.cells(i + 1, j + 1).value
> myData.File1_s_buf(i, j) = sheet1.cells(i + 1, j + 1).value
> myData.File1_out_s_buf(i, j) = sheet1.cells(i + 1, j + 1).value
> End If
以下、.Cells 系はすべて同様に。
> '終了処理
> app1.Workbooks.close()
ここは、bk1.Close() にすべきかと。
> app2.Workbooks.close()
こちらも同様。