- - PR -
EXCELのタスクが残ってしまいます
1
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-03-30 11:23
わからないことがありますので、質問させていただきます。
VB.NETでEXCELにコメントを挿入しようとしまして、以下のようにコーディングをしましたが、 EXCELのタスクがどうしても残ってしまいます。 Dim StrFileName As String = "" '出力ファイル名称 Dim mStrPass As String = "" 'パスワード Dim mStrSelectSheet As String = "" '出力シート名称 Dim mObjExcel As Excel.Application = Nothing 'エクセル起動用変数 (中略) mStrSelectSheet = "シート名称" 'シート名称指定 (中略) mObjExcel = Nothing mObjExcel = CreateObject("Excel.Application") 'エクセル起動 mObjExcel.DisplayAlerts = False 'メッセージ非表示 mObjExcel.Visible = False '非表示設定 mObjExcel.Workbooks.Open(Filename:=StrFileName, password:=mStrPass) mObjExcel.Sheets(mStrSelectSheet).Select() mObjExcel.ActiveSheet.Cells(3, 1).AddComment() mObjExcel.ActiveSheet.Cells(3, 1).Comment.Visible = False mObjExcel.ActiveSheet.Cells(3, 1).Comment.Text(Text:="あいうえお") mObjExcel.Save() mObjExcel.Quit() System.Runtime.InteropServices.Marshal.ReleaseComObject(mObjExcel) mObjExcel = Nothing System.GC.Collect() どのようにしたら良いのか、知恵を貸していただきたいです。 なお、必要と思われる箇所だけ抜粋しましたので、変数の宣言など、足りない箇所も あるかと思いますが、宜しくお願い致します。 環境はWindow2000、VB.NET です。 | ||||||||
|
投稿日時: 2005-03-30 12:49
かかれているソースが入っている関数の外でもう一度
GC.COLLECT を起動するとプロセスは消えると思います。 どうも同じファンクション内でGC.COLLECTをかけても うまく処理してくれないようです。 | ||||||||
|
投稿日時: 2005-03-30 13:08
こんにちは、じゃんぬ です。
参照したものをすべて明示的に解放しないと、GC.Collect() しても解放されないと思うんですが... (^-^;) ちなみに、ReleaseComObject() を使っている場合は、GC.Collect() は不要です。 (※) COM オブジェクトは、参照したものすべてを変数に取り、 参照カウント分、解放してあげてください。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||
|
投稿日時: 2005-03-30 13:10
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=13903&forum=7
| ||||||||
|
投稿日時: 2005-03-30 13:33
背古井さん、じゃんぬねっとさん、ぼのぼのさんへ
早速の返答ありがとうございます。 背古井さんへ 背古井さんのアドバイス通りに関数の外でGC.COLLECTをかけたところ、 タスクが起こらないようになりました。 じゃんぬねっとさんへ VB.NET初心者なので、解放の部分があまり良くわかっていません。 これから勉強致します。 ぼのぼのさんへ すみません。過去ログを見ないまま、質問をしてしまいました。 これからは過去ログを見るように致します。 これからも何かありましたら、宜しくお願い致します。 | ||||||||
|
投稿日時: 2005-03-30 13:46
ラッキーでしたね。 それで常にうまく行く保証はまったくないので、安易に「GC.Collect() すれば大丈夫」と覚えるのは止めた方がいいです。
VB.NET とは本質的に関係ありません。 C# でも同様です。 大元は、「Excel をオートメーションする」ために使用されている、COM/OLE という技術の問題です。 COM/OLE では、取得したオブジェクト参照を明示的に解放するのが大原則です。 VB6 まではこれを隠蔽する機能があり、非常に口当たりのよい仕上がりになっていましたが、.NET は VB6 ほど完全に隠蔽してくれていません。 なので、.NET なプログラミング言語では、プログラマの責任でオブジェクト参照を管理する必要があります。 [ メッセージ編集済み 編集者: 渋木宏明(ひどり) 編集日時 2005-03-30 13:47 ] | ||||||||
|
投稿日時: 2005-03-30 14:05
渋木宏明(ひどり)さんへ
今までVB6では開発したことはありますが、渋木宏明(ひどり)さんのおっしゃる通り、 VB.NETと違って、安易に開放できた記憶があります。 そういったこともあり、多少戸惑いながらの作業となっています。 また、何かありましたら質問をさせてください。ありがとうございました。 |
1