掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
複数Excelファイルオープンにおける、オブジェクト解放について (ID:146863)
名前
ホームページ(ブログ、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) >という結果になってしまった事がありました。 参照カウント増加を招くとは、Excelオブジェクトの解放も奥が深いですね。 まぁ、使った元をちゃんと元の場所に戻すのは当たり前ですけど、 正直な気持ちは魔法を使って一気に元の場所へ戻すように上位層オブジェクト を解放するだけで下位層オブジェクトも解放してもらいたいですけど(笑) とにかく、ありがとうございました!
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2020 Takeshi Okamoto All Rights Reserved.