tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルExcelのプロセスについて(質問を修正しました)
記事No8752
投稿日: 2009/02/26(Thu) 12:44
投稿者mole
以下の環境でExcelファイルを編集するプログラムを作成しています。

WinXP
VB2008EE
Excel2007

かなり大雑把ですがプログラムの構造は以下のような感じです。

Sub main()
    初期処理
    Form表示
End Sub

Sub Form上でExcelをいじる処理()
    Excelファイルを出力
End Sub

ステップ実行すると Sub main() を指した時点でExcelプロセスが出現し、
プログラムが終了するまで残ります。
プログラムを終了せずに出力したファイルをExcel2007で開くと正常に開きますが、
Excel2002で開くと、Excelのウィンドウ枠だけ表示されたような状態になり開きません。
プログラムを終了すると実行開始時にできたプロセスが消え正常に開きます。

実行時にできるExcelプロセスは何なのでしょうか。
プログラムを終了しなくても解放して正常にExcelを開くようにするにはどのようにすればいいでしょうか。

よろしくお願いいたします。

[ツリー表示へ]
タイトルRe: Excelのプロセスについて(質問を修正しました)
記事No8753
投稿日: 2009/02/26(Thu) 16:31
投稿者るしぇ
このサイトの解説を読んだ上での質問でしょうか?
http://hanatyan.sakura.ne.jp/dotnet/Excelflm.htm
書いてある通りのことをして、使用した Excel オブジェクトを
全て ReleaseComObject できていればプロセスは残りません。

> 実行時にできるExcelプロセスは何なのでしょうか。
VB.NET は外部のプログラムと連携を取ることで様々な
ことが実行できます。Excel のファイル構造を全て理解し
処理するのは手間がかかるので、実際の処理は実行環境に
インストールされている Excel.exe にお願いして処理して
もらいます。
このため、Excel が起動しているだけです。

その際、Excel は VB.NET でオブジェクトが必要なくなった
かどうか判断できないため、ReleaseComObject で『もう
使わないよ』と教えないと、また使われるかもしれないと
思ってずーっと破棄せずに待ち続けます。だから終了しなく
なります。

> ステップ実行すると Sub main() を指した時点でExcelプロセスが出現し、
それは無いと思います。実際に処理を実行してもらう Excel の
プロセスを呼び出しているのは VB.NET 自身です。そして
その命令は、Excel.Application のインスタンスを作成した
ときです。提示のコードには書かれていませんが、初期処理で
New していたら、そこでプロセスが作成されるはずです。

[ツリー表示へ]
タイトルRe^2: Excelのプロセスについて(質問を修正しました)
記事No8755
投稿日: 2009/02/26(Thu) 17:24
投稿者mole
レスありがとうございます。

Excel編集処理時に作るExcel関連のオブジェクトは処理が終われば全て解放し、
タスクマネージャからもその時使ったプロセスは消えています。
しかし、プログラム起動時に現れるプロセスだけはプログラムを終了するまで残ります。
起動時にはExcelを使うような処理はしていないので出現する原因が判らず、
解放処理も見当が付きません…。

[ツリー表示へ]
タイトルRe^3: Excelのプロセスについて(質問を修正しました)
記事No8756
投稿日: 2009/02/26(Thu) 18:04
投稿者るしぇ
新規プロジェクトから1つ1つ設定を追加して確認すれば
良い話では?

[ツリー表示へ]
タイトルRe^4: Excelのプロセスについて(質問を修正しました)
記事No8757
投稿日: 2009/02/26(Thu) 18:33
投稿者mole
すみません、ありがとうございます。
もう一度確認してみます。

[ツリー表示へ]
タイトルRe^4: Excelのプロセスについて(質問を修正しました)
記事No8759
投稿日: 2009/02/27(Fri) 12:24
投稿者mole
解決しましたのでご報告いたします。
非常に単純な見落としでした…。

UpgradeSupport.vb の中で Excel.Global がNewされており、
使っていない変数だったので消したら直りました。
ついでに妙に重かった起動も軽くなりました。

すっきりです。ありがとうございました。

[ツリー表示へ]
タイトルRe: Excelのプロセスについて(質問を修正しました)
記事No8754
投稿日: 2009/02/26(Thu) 16:53
投稿者るしぇ
> プログラムを終了しなくても解放して正常にExcelを開くようにするには
> どのようにすればいいでしょうか。
これは完全には無理かもしれない。既にユーザが Excel で作業している
環境で後からプログラムが処理する場合は新しいプロセスを作れば良いけど、
プログラムが処理している状態でユーザが Excel ファイルを開いた場合、
Excel の仕様で、同じプロセスを利用しようとします。

この際利用されるプロセスの実体は、Excel を普通に利用している場合と
同じだから、
> Excel2002で開くと、Excelのウィンドウ枠だけ表示されたような状態になり開きません。
このような現象が起きます。正確には開いているんだけど処理中だから
表示処理がうまく実行できないという状態のようです。

プログラムでオブジェクトを全て解放していても、処理中はどうしても
参照状態になってしまいますので、プログラムの処理中にユーザが Excel
を操作すれば同じ状態が起こりえます。

『VB.NET で処理している端末では Excel を操作しない』という運用
ルールを作るか、サードパーティ製の Excel ファイルを直接操作する
ツールを購入し、Excel.exe に処理をお願いしない。。。といった
対策をとる必要があるかもしれません。

[ツリー表示へ]