@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

EXCELのタスクが残ってしまいます

1
投稿者投稿内容
くぇれる
会議室デビュー日: 2005/03/30
投稿数: 7
投稿日時: 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 です。
背古井
常連さん
会議室デビュー日: 2004/04/02
投稿数: 39
投稿日時: 2005-03-30 12:49
かかれているソースが入っている関数の外でもう一度
GC.COLLECT
を起動するとプロセスは消えると思います。
どうも同じファンクション内でGC.COLLECTをかけても
うまく処理してくれないようです。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-03-30 13:08
こんにちは、じゃんぬ です。

参照したものをすべて明示的に解放しないと、GC.Collect() しても解放されないと思うんですが... (^-^;)

ちなみに、ReleaseComObject() を使っている場合は、GC.Collect() は不要です。

(※) COM オブジェクトは、参照したものすべてを変数に取り、
  参照カウント分、解放してあげてください。
_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
ぼのぼの
ぬし
会議室デビュー日: 2004/09/16
投稿数: 544
投稿日時: 2005-03-30 13:10
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=13903&forum=7
くぇれる
会議室デビュー日: 2005/03/30
投稿数: 7
投稿日時: 2005-03-30 13:33
背古井さん、じゃんぬねっとさん、ぼのぼのさんへ

早速の返答ありがとうございます。


背古井さんへ
背古井さんのアドバイス通りに関数の外でGC.COLLECTをかけたところ、
タスクが起こらないようになりました。

じゃんぬねっとさんへ
VB.NET初心者なので、解放の部分があまり良くわかっていません。
これから勉強致します。

ぼのぼのさんへ
すみません。過去ログを見ないまま、質問をしてしまいました。
これからは過去ログを見るように致します。


これからも何かありましたら、宜しくお願い致します。
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2005-03-30 13:46
引用:

背古井さんのアドバイス通りに関数の外でGC.COLLECTをかけたところ、
タスクが起こらないようになりました。



ラッキーでしたね。
それで常にうまく行く保証はまったくないので、安易に「GC.Collect() すれば大丈夫」と覚えるのは止めた方がいいです。

引用:

VB.NET初心者なので、解放の部分があまり良くわかっていません。
これから勉強致します。



VB.NET とは本質的に関係ありません。
C# でも同様です。

大元は、「Excel をオートメーションする」ために使用されている、COM/OLE という技術の問題です。

COM/OLE では、取得したオブジェクト参照を明示的に解放するのが大原則です。

VB6 まではこれを隠蔽する機能があり、非常に口当たりのよい仕上がりになっていましたが、.NET は VB6 ほど完全に隠蔽してくれていません。

なので、.NET なプログラミング言語では、プログラマの責任でオブジェクト参照を管理する必要があります。


[ メッセージ編集済み 編集者: 渋木宏明(ひどり) 編集日時 2005-03-30 13:47 ]
くぇれる
会議室デビュー日: 2005/03/30
投稿数: 7
投稿日時: 2005-03-30 14:05
渋木宏明(ひどり)さんへ

今までVB6では開発したことはありますが、渋木宏明(ひどり)さんのおっしゃる通り、
VB.NETと違って、安易に開放できた記憶があります。

そういったこともあり、多少戸惑いながらの作業となっています。

また、何かありましたら質問をさせてください。ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)