tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルExcelの終了時にプロセスが残ったままになります。
記事No580
投稿日: 2003/12/05(Fri) 17:02
投稿者みけ
[OSのVer]:Windows2000    [VBのVer]:VB.NET

Microsoft Excel 9.0 Object Libraryを
参照設定で追加し、

1.Application.Run でフォームを起動する

2.起動したフォームのボタンクリックイベントで
    以下のようにExcelを起動・終了する。
    
    '起動
    dim xlApp as Excel.Application
    xlApp = CreateObject("Excel.Application")

    '終了
    xlApp.Quit
    system.GC.Collect
    xlApp=Nothing

3.Application.Exit()でアプリを終了する。

以上のようなコードを実行すると
2.のボタン押下後にも
エクセルのプロセスが残ったままに
なります。
ただし、Application.Exitで
プロセスが終了します。

アプリケーションの起動中にExcelファイルを
開く可能性があるので、
2の時点でエクセルを確実に
終了したいのですが
上記のような事前バインディングでの終了方法が
わからずに悩んでいます。
どなたかご教授よろしくお願いします。
  

[ツリー表示へ]
タイトルRe: Excelの終了時にプロセスが残ったままになります。
記事No581
投稿日: 2003/12/06(Sat) 00:46
投稿者しんじ
終了コードに下記の一行を付け加えてはどうでしょう。

xlApp.Quit
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp)
system.GC.Collect
xlApp=Nothing

[ツリー表示へ]
タイトルRe^2: Excelの終了時にプロセスが残ったままになります。
記事No582
投稿日: 2003/12/08(Mon) 09:14
投稿者みけ
しんじさん、レスありがとうございます。

System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp)

を加えて実行してみたのですが、
「メモリが"read"になることはできませんでした」
というエラーが発生しました。

[ツリー表示へ]
タイトルRe^3: Excelの終了時にプロセスが残ったままになります。
記事No590
投稿日: 2003/12/12(Fri) 16:42
投稿者しんじ
すみません。
コードだけ見て記載してので間違えていました。汗
EXCELはワークシート、ワークブック、アプリケーションオブジェクトがありますので
起動する順番とは逆の手順で終了させなければいけません。

EXCELを起動する時は

Dim ExcelAp AS Excel.Application
Dim ExcelWb AS Excel.Workbook
Dim ExcelWs AS Excel.WorkSheets

と宣言されCreateオブジェクトからWorkBookをオープンにし、ワークシートの
インスタンスを設定して、EXCEL処理を行い、クローズという流れになるのが一般的です。


エクセルをクローズする時は、ワークシート、ワークブック、エクセル
の順序で終了していってガベージコレクションしてあげると終了します。
サンプルを作って試してみたところ私のPCでは正常に終了しました。

もっといい方法があるかもしれないのですが、私のスキルでは下記の
用になりました。

〜省略
〜ファイルを先に保存する。

ExcelAp.Quit()
System.Runtime.InteropServices.Marshal.ReleaseComObject(ExcelWs)
System.Runtime.InteropServices.Marshal.ReleaseComObject(ExcelWb)
System.Runtime.InteropServices.Marshal.ReleaseComObject(ExcelAp)
ExcelWs = Nothing
ExcelWb = Nothing
ExcelAp = Nothing
GC.Collect()

[ツリー表示へ]
タイトルRe^4: Excelの終了時にプロセスが残ったままになります。
記事No596
投稿日: 2003/12/15(Mon) 12:40
投稿者みけ
しんじさん、教えていただいた方法で
うまくいきました。
助かりました!
わかりやすく説明していただき
本当にありがとうございました!!

[ツリー表示へ]
タイトルRe: Excelの終了時にプロセスが残ったままになります。
記事No678
投稿日: 2004/01/31(Sat) 20:17
投稿者花ちゃん
今、他の事を調べていたら技術情報を見つけたので投稿しておきます。

各オブジェクトを新しい変数として宣言しています。たとえば、コードに次の行があるとします。
oBook = oExcel.Workbooks.Add()
                    
この行を次のように変更します。
dim oBooks as Excel.Workbooks
oBooks = oExcel.Workbooks
oBook = oBooks.Add()
                    
オブジェクトの使用が終了したら、
System.Runtime.InteropServices.Marshal.ReleaseComObject を使用します。
このメソッドによって RCW の参照カウントを減らします。

といった事が書かれています。詳しくはリンクを見て下さい。

  hhttp://support.microsoft.com/default.aspx?scid=kb;ja;317109

[ツリー表示へ]