掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
複数Excelファイルオープンにおける、オブジェクト解放について (ID:146862)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
>> data = exlCells(行, 列).Value >>などの記述は NG ですが、その点は大丈夫でしょうか。 > そうなんですね…。NGがありました。 先の回答で、「exlExcelSheet = exlExcelBook.Sheets(i)」ではなく 「exlExcelSheet = exlSheets(i)」の形式を使うように指摘していますが、 それとこれは、いずれも同種の理由によるものです。 exlCells(行, 列) は、exlCells.Default(行, 列) の省略表記です。 そして、exlCells.Default(行, 列) は、Range オブジェクトを返しますから、 この Range オブジェクトも解放すべき対象となります。ゆえに、 foo = exlCells(行, 列) data = foo.Value Marshal.ReleaseComObject(foo) が求められます。 > オブジェクト型は「As Object」の意味でして、 それは、避けておいた方が無難かと思います。 As Object な変数を使って操作すると、特定の条件化においては、 内部的な型変換のタイミングで参照カウントが増加してしまい、 解放処理を複雑にしてしまうケースが存在します。 例えば、 Dim Hs As Excel.HPageBreaks = objSheet1.HPageBreaks Dim H As Excel.HPageBreak = Hs.Add(objRange) Marshal.ReleaseComObject(H) Marshal.ReleaseComObject(Hs) Marshal.ReleaseComObject(objRange) Marshal.ReleaseComObject(objSheet1) ならば正しく解放されたコードが、参照設定無しだと Dim Hs As Object = objSheet1.HPageBreaks Dim H As Object = Hs.Add(objRange) 'ここで参照カウントが増加してしまう。 Marshal.ReleaseComObject(H) Marshal.ReleaseComObject(Hs) Marshal.ReleaseComObject(objRange) 'そのため、ここで解放してもまだ一つ残っている…。 Marshal.ReleaseComObject(objSheet1) という結果になってしまった事がありました。 http://madia.world.coocan.jp/cgi-bin/VBBBS2/wwwlng.cgi?print+200512/05120042.txt
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2020 Takeshi Okamoto All Rights Reserved.