- PR -

Excelのプロセス終了方法は??

投稿者投稿内容
takahon
会議室デビュー日: 2003/08/15
投稿数: 4
投稿日時: 2003-08-15 18:06
いつも参考にさせていただいております。
さて、ヘルプを参考にエクセルを起動/終了して
みたのですが、タスクマネージャにExcelのプロセス
が残ったままになります。
解放方法を色々試したのですが・・・
どこか不備があるのでしょうか?

(↓以下、MSヘルプを参照し実行)
---------------------------------------
Sub TestExcel()
Dim xlApp As Excel.Application
Dim xlBook As Excel.Workbook
Dim xlSheet As Excel.Worksheet
xlApp = CType(CreateObject("Excel.Application"), Excel.Application)
xlBook = CType(xlApp.Workbooks.Add, Excel.Workbook)
xlSheet = CType(xlBook.Worksheets(1), Excel.Worksheet)
xlSheet.Cells(2, 2) = "This is column B row 2"
xlSheet.Application.Visible = True
xlSheet.SaveAs("C:\\aaa.xls")
xlBook.Close()
xlApp.Quit()
xlSheet = Nothing
xlBook = Nothing
xlApp = Nothing
End Sub

[ メッセージ編集済み 編集者: takahon 編集日時 2003-08-15 18:56 ]
mei
大ベテラン
会議室デビュー日: 2003/04/08
投稿数: 114
投稿日時: 2003-08-15 21:09
こんばんは、meiです。

引用:

takahonさんの書き込み (2003-08-15 18:06) より:
さて、ヘルプを参考にエクセルを起動/終了して
みたのですが、タスクマネージャにExcelのプロセス
が残ったままになります。



処理の最後に、
System.GC.Collect()
を追加するとどうでしょうか?

Notingでクリアしてあげても、
ガベージコレクタが削除してくれていないと思われます。
takahon
会議室デビュー日: 2003/08/15
投稿数: 4
投稿日時: 2003-08-15 21:20
meiさんこんばんは。
返信有り難うございます。

引用:
--------------------------------------------------------------------------------

処理の最後に、
System.GC.Collect()
を追加するとどうでしょうか?

--------------------------------------------------------------------------------

処理を追加してみたのですが・・・
状況は変わらないようです。
CreateObjectでの「CLOSE」「Nothing」が
失敗しているんでしょうか・・・
(VB6.0の時も同じような処理で悩みました)



mei
大ベテラン
会議室デビュー日: 2003/04/08
投稿数: 114
投稿日時: 2003-08-15 21:35
引用:

takahonさんの書き込み (2003-08-15 21:20) より:
処理を追加してみたのですが・・・
状況は変わらないようです。



駄目ですか・・・
私のところで動かした限りはタスクマネージャ上で、
Excelが消えるのが確認出来たのですが・・・

あと、
xlSheet.SaveAs("C:\\aaa.xls")
は、エラーになりますが(\が一個多い)、SaveAsで失敗している訳じゃないですよね?

追記
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=3343&forum=7
↑過去ログが参考になりそうです。


[ メッセージ編集済み 編集者: mei 編集日時 2003-08-15 21:52 ]
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-08-18 08:52
引用:

meiさんの書き込み (2003-08-15 21:09) より:

処理の最後に、
System.GC.Collect()
を追加するとどうでしょうか?

Notingでクリアしてあげても、
ガベージコレクタが削除してくれていないと思われます。


DisposeメソッドまたはCloseメソッドがある場合は必ずコールする。
GC.Collect(2)で、完全解放させる←詳しくは川俣さんのコラム。
↑どの記事だったか忘れました。『ガベージコレクタが走るときに参照されているメモリは世代があがり、解放されにくくなる。加えて確保時に一定量以上のメモリを確保した場合は世代が2になり、コレクトの対象とならない。』みたいなことが書いてありました。

 より完全を期すなら、メインとなるクラスでエクセルをコールするのではなく、メインとなるクラスによって作成されるクラスのインスタンスでエクセルをコールし、このインスタンスを破棄する。エクセルを起動するために確保したメモリが、完全に参照されなくなるようにする。また、いきなりCreateObjectではなく、インスタンスの有無を調べ、再利用するような仕組みも考える。

 私も含めて、過去に数回同じ内容のポストがあるので、検索して参照してください。

[ メッセージ編集済み 編集者: Jitta 編集日時 2003-08-18 09:15 ]
cats
大ベテラン
会議室デビュー日: 2002/11/29
投稿数: 221
お住まい・勤務地: 東京
投稿日時: 2003-08-18 09:26
後輩が同じことで悩んでましたが、結局、
Excelのプロセスをkillしてたようでした。
Beatle
ぬし
会議室デビュー日: 2003/06/09
投稿数: 394
投稿日時: 2003-08-18 10:26
関係ないかもしれませんが、

>xlSheet.SaveAs("C:\\aaa.xls")

って xlBook.SaveAs("C:\\aaa.xls")  ですかね。

それと、
Application.DisplayAlerts = False
等を入れてみては?
Beatle
ぬし
会議室デビュー日: 2003/06/09
投稿数: 394
投稿日時: 2003-08-18 10:30
間違った、
>Application.DisplayAlerts = False
ではなく、
xlapp.Application.DisplayAlerts = False
ですかね。

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