- - PR -
VB.NETでエクセルエグゼが残ってしまいます。
投稿者 | 投稿内容 | ||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-12-21 11:01
(前から指摘しているように MRComObject メソッド自体が、良くない実装なのですが) そういうことです。 これは、試してみれば、わかることだと思います。
参照の取り忘れがあれば、ReleaseComObject メソッドで参照カウントをデクリメントできません。 上記で 'エドさん自身が書かれたコト' ができなくなりますよね。
そのとおりです。 xlSheets は Excel.Sheets 型のコレクションなのはお分かりでしょうか? (複数形であることに注意) xlSheets("Sheet1") は Excel.Worksheet (複数形でないことに注意) を返します。 この Excel.Worksheet を参照に取らずして、
などとしたら、この Excel.Worksheet の参照カウントはどこで解放できますか? 変数に参照を取っていなければ、不可能ですよね。(これが、参照の取り忘れです)
必要ありません。 Close | Quit する必要があるのは、Excel.Workbook と Excel.Application です。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||||||||||
|
投稿日時: 2006-12-21 11:07
このように、すべての COM ラッパ オブジェクトの参照は必ず取っておく必要があります。
これは、CLR から COM を扱うにおいて、基本中の基本なので、
どこを調べても、たいてい書いてあると思います。ご覧になっていないのではないかと推測し、紹介しておきます。 このように、CLR と COM との相性は最悪と言って良いほどです。 どう考えても面倒な上に精神衛生上よろしくありません。 よって、COM を利用したい場合は、VB6、Excel VBA マクロ、VBScript あたりを利用して、 それを、CLR 言語側から呼び出すのが、まだ賢明ではないかと思います。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||||||||||
|
投稿日時: 2006-12-21 11:45
!!
っと言う事は"A"列から"AQ"列までの自動幅を行うには xlSheets("Sheet1").columns("A:AQ").AutoFit() ではなくて正確には xlSheet("Sheet1").columns("A:AQ").AutoFit() としなくてはならいという事でしょうか?! 単数系のものを操作するのに複数系のオブジェクトを使用していた為、 開放の際に不十分になってしまった。とそんな感じでしょうか? | ||||||||||||||||||||
|
投稿日時: 2006-12-21 12:10
それだけだと、まだ不正解です。 xlSheets だけに限った話ではないでしょう。 2 つ前の私の投稿を読み直しましょう。 # 最初の方でも、"合計 3 つの参照の取り忘れがあります" と私は書いています。
何もしていないのですから "不十分" という言葉は不適切で、'完全に漏れている' が正解です。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||||||||||
|
投稿日時: 2006-12-21 13:10
!!!
複数形、「合計 3 つの参照の取り忘れがあります」っと言う事は xlSheets("Sheet1").columns("A:AQ").AutoFit() ↓ xlSheet("Sheet1").column("A:AQ").AutoFit() とシートとカラムとそれぞれに関して単数形で行うと言う事ですね?! そして、この場合だと、宣言部で Dim xlcolumn as object のみ宣言し、 開放部に MRComObject(xlcolumn) を付け加える でよさそうですね☆ | ||||||||||||||||||||
|
投稿日時: 2006-12-21 14:03
Columns は Excel.Column のコレクションなので注意しましょう。
良くないです。 それだと、1 つだけで、残りの 2 つが解放できていないです。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||||||||||
|
投稿日時: 2006-12-21 14:36
茶々入れw
ExcelやWord などの COM(Component Object Model)を利用するものを .NET Framework から使う場合は、 . が出てくるたびに分解し、そのたびに、一つ変数を用意して、そのうえで、その変数を ReleaseComObject に渡して、その変数の持つ分のCOM参照を開放します。 #全部解放された時点で、COMの実体(本物のインスタンス)もいなくなります。 具体的に書くと xlSheets("Sheet1").columns("A:AQ").AutoFit() であれば、 sheet = xlSheets("Sheet1") colum = sheet.columns("A:AQ") colum.AutoFit() というように、「3つ」に分解する必要があるということです。 また、オブジェクトが取れるという保証もありませんので(たとえ、データソースであるシートが「正しいものを指定できていた」としても、です) =の行の後ろで、オブジェクトがあるということも確認する必要があります。 あとは、じゃんぬさんがリンク張りまくってるので、それ見てください。 ここの過去ログを ReleaseComObject で検索するだけでも、答えがいっぱい出てますよ。 何度も「同じもの」見てますしw | ||||||||||||||||||||
|
投稿日時: 2006-12-21 15:28
これだけだと、コレクション系の 「デフォルト プロパティ」 で躓く可能性がありますね。
が、
このように展開されることがわかっていないと、通じないかもしれません。
でしょうか。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 |