DOBON.NET DOBON.NETプログラミング掲示板過去ログ

VB.NET2008でEXCELを起動させたい

環境/言語:[OS : Windows XP / 言語 : Visual Basic .NET]
分類:[.NET]

いつもお世話になっています。
しまこ と申します。

早速ですが、質問です。

現在、CSVファイルを読み込んで印刷するアプリケーションを作成しています。

ファイルから読み込んだデータをEXCELにて整斉したいのですが、
EXCELを起動して終了させているだけのつもりがプロセスが残ったままになります。

どぼん様のサンプルコードや、他のサイト様のサンプルコードを
そのまま拝借して実行しても同じくプロセスが残ったままです。
念のため、データ整斉部のコードをコメントにしてみたりしたのですが、
どうにもうまく動きません。

ひとつひとつ手順を踏んだところ、
「Workbookの追加」(★マーク)を記述するとプロセスが残ったままになりました。

以下、コードです。
--------------------------------------------------------------------------
Imports Excel = Microsoft.Office.Interop.Excel

Public Class Form1

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim oExcel As New Excel.Application
Dim xlBooks As Excel.Workbooks
xlBooks = oExcel.Workbooks
Dim xlbook As Excel.Workbook
xlbook = xlBooks.Add '★このコード追加するとプロセスが残ります。

oExcel.Visible = True

' 1000 ミリ秒 (1秒) 待機する
System.Threading.Thread.Sleep(1000)

xlbook.Close(False)
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlbook)
xlBooks.Close()
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBooks)
oExcel.Quit()
System.Runtime.InteropServices.Marshal.ReleaseComObject(oExcel)

GC.Collect()

End Sub
End Class
--------------------------------------------------------------------------

この手の質問は山のようにあると思うのですが、どなたかご教授下さい。
回答、よろしくお願いします。


【動作環境】
Windows XP Professional version 2002 Service Pack 3
Visual Studio 2008 Professionl Edition
Microsoft Office Excel 2003 SP3
■No27070に返信(しまこさんの記事)
> 念のため、データ整斉部のコードをコメントにしてみたりしたのですが、
> どうにもうまく動きません。
提示のコードには“データ整斉部のコード”が見当たりませんが、
その“データ整斉部のコード”が無くとも、プロセスは残ってしまうのですね?

> System.Threading.Thread.Sleep(1000)
COM コンポーネントを扱っている最中は、Sleep の呼び出しは控えて下さい。

> ひとつひとつ手順を踏んだところ、
> 「Workbookの追加」(★マーク)を記述するとプロセスが残ったままになりました。
ReleaseComObject メソッドの戻り値を確認し、それらが
すべて 0 になっているかどうかを確認してみて下さい。
魔界の仮面弁士さん、返信ありがとうございます。

>>念のため、データ整斉部のコードをコメントにしてみたりしたのですが、
>>どうにもうまく動きません。
> 提示のコードには“データ整斉部のコード”が見当たりませんが、
> その“データ整斉部のコード”が無くとも、プロセスは残ってしまうのですね?
魔界の仮面弁士さんの言うとおりです。
データ整斉部のコードが無くとも、プロセスは残ってしまいます。

>>System.Threading.Thread.Sleep(1000)
> COM コンポーネントを扱っている最中は、Sleep の呼び出しは控えて下さい。
わかりました。
ご指摘、ありがとうございます。

>>ひとつひとつ手順を踏んだところ、
>>「Workbookの追加」(★マーク)を記述するとプロセスが残ったままになりました。
> ReleaseComObject メソッドの戻り値を確認し、それらが
> すべて 0 になっているかどうかを確認してみて下さい。
確認したところ、すべて 0 になっていました。
以下のソースに変更して、戻り値を確認しました。
---------------------------------------------------------------------------
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim oExcel As New Excel.Application
Dim xlBooks As Excel.Workbooks
xlBooks = oExcel.Workbooks
Dim xlbook As Excel.Workbook
xlbook = xlBooks.Add

oExcel.Visible = True

'' 1000 ミリ秒 (1秒) 待機する
'System.Threading.Thread.Sleep(1000)

xlbook.Close(False)
Debug.Print(CStr(System.Runtime.InteropServices.Marshal.ReleaseComObject(xlbook)))
xlBooks.Close()
Debug.Print(CStr(System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBooks)))
oExcel.Quit()
Debug.Print(CStr(System.Runtime.InteropServices.Marshal.ReleaseComObject(oExcel)))
'xlbook.Close(False)
'System.Runtime.InteropServices.Marshal.ReleaseComObject(xlbook)
'xlBooks.Close()
'System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBooks)
'oExcel.Quit()
'System.Runtime.InteropServices.Marshal.ReleaseComObject(oExcel)

GC.Collect()

End Sub
---------------------------------------------------------------------------
■No27072に返信(しまこさんの記事)
> xlBooks.Close()
ブックを一つしか開いていないなら不要かも。

> GC.Collect()
むやみに GC.Collect しない方が良いですよ。
解放されなかったオブジェクトがあると、ジェネレーション昇格により、
かえって解放されにくくなってしまいますから。

で。どうしても解放できないようであれば、Excel 作業用の AppDomain を
用意し、最後にそれを Unload するという手法も試してみてください。

なお、特にコード的な問題は無いように思えました。
(当方の Excel 2007 環境では再現しませんでした)
Excel 側のマクロやアドイン等に問題が無いかもチェックしてみて下さい。
お返事、ありがとうございます。

>>xlBooks.Close()
> ブックを一つしか開いていないなら不要かも。
>
>>GC.Collect()
> むやみに GC.Collect しない方が良いですよ。
> 解放されなかったオブジェクトがあると、ジェネレーション昇格により、
> かえって解放されにくくなってしまいますから。
わかりました。
ご指摘ありがとうございます。

> で。どうしても解放できないようであれば、Excel 作業用の AppDomain を
> 用意し、最後にそれを Unload するという手法も試してみてください。
インターネットで検索したところ、魔界の仮面弁士さんが作成された
サンプルを見つけたので、そのままを実行してみました。
私のPCでもEXCELプロセスは残りませんでした。

> なお、特にコード的な問題は無いように思えました。
> (当方の Excel 2007 環境では再現しませんでした)
> Excel 側のマクロやアドイン等に問題が無いかもチェックしてみて下さい。
他のPCを使って、最初の記事に乗せたソースのEXEを実行したところ、
プロセスは残りませんでした。
どうやらEXCEL側に問題がありそうです。
マクロやアドインが問題になることがあるんですね…。
これから調査してみようと思います。

ひとまずこの問題は解決済みにさせていただきます。
丁寧なご指導、本当にありがとうございます!
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板