• ベストアンサー

起動中のEXCELファイル(EXCELプロセスではなく)のうちひとつを終了したい(C#.NET2003)

例えば、プロセスのEXCELではなく、 起動中の~.xlsをプログラムで強制終了させたいと考えています。 他のEXCELファイルを閉じたくはないので、 EXCELのプロセスを終了する方法は駄目でした。 また、既に起動中なので、一度開いて閉じようとすると二重起動になってしまい駄目でした。 良い方法がありましたらご教授願います。 (C#.NET2003、Office2000、xpsp2)

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

#2>ファイル名の一覧の取り方 コレクションですのでforeach が使えます。 (コレクションというよりIEnumerableを実装していれば使える) foreach(Excel.Workbook wb in excel.Workbooks){ MessageBox.Show(wb.Name);//実際は、リストボックスなんかに放り込む } (既におわかりのように、)また、配列としてもアクセスできるので 次のようにもできます。 (この方がわかりやすいですかね。後でそのままi も使えそう?) int len=excel.Workbooks.Count; for(int i=1;i<=len;i++){ // MessageBox.Show(excel.Workbooks.get_Item(i).Name); MessageBox.Show(excel.Workbooks[i].Name); }

taka4terada
質問者

補足

ご指南ありがとうございます。 ファイル名の一覧取れました! ただ、一部ファイル名が表示されないEXCELファイルが ありました。昨日の「~.get_Item("~.xls").~CLOSE」で、インデックスが無効になるのと同じ 原因だと思います。 以下の二つのケースを行うと、片方のケースのファイル名が取れないです。先におこなったケースの方のファイル名が取得できます。 EXCELのプロセスが二つあるようです。 ・WindowsでEXCEL.exeを起動し、そのアクティブ状態 でファイル作成、又はファイルオープンをする。 ・EXCEL.exeを起動せず、又は非アクティブ状態で既存 のファイルをオープンする。 EXCELのウィンドウメニューの最下部のファイル名一覧が、二つのケースで分かれている。 度々、すみません。よろしくお願い致します。

その他の回答 (3)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.4

#3>EXCELのプロセスが二つあるようです。 GetActiveObject は、1つのプロセスを捕まえるものです。(たぶん) いわゆるApplication オブジェクトですね。 当然別プロセスは別Application オブジェクトに含まれているわけで、 今捕まえているApplication オブジェクトから別のApplication オブジェクトの内容にはアクセスできないように思います。 どっちかというと、エクセルを複数(別プロセスで)起動して使うのは競合が起こっておかしな動作が起こることもありますから、あんまり良いことではないですね。 起動しているプロセスの名前を調べて、excel が複数起動していることを調べることもできるかもしれませんが、だからといってプログラムから勝手に片方を終了させるワケにもいかないので、そういう使い方をしないでね♪とかお知らせするとか・ あと、もしかしたら別要因かも知れませんが、 状況がわからない(こちらでは調べられない)ので、なんとも言えません。

taka4terada
質問者

お礼

MADNのサイトに以下の様なコメントがありました。 運用とかでEXCELが複数起動しないようにするしかないようですね。 「複数のインスタンス Excel(Excel.exe)が同時に実行できます。特定のサーバーでの GetActiveObject は、期待しなかったインスタンスを返すことがあります。 通常横に最初に登録されるインスタンスが GetActiveObject に返されるインスタンスです。」 迅速な回答ありがとうございました。 いろいろ、手助けして頂き助かりました。 また、何かありまし らその節はどうぞよろしくお願いいたします。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

#1>インデックスが無効となるエラーになりました。 Visual Studio.NET 2003(C#.NET2003) Office2002(XP) xpsp2 で試験しましたが、一応問題なく動作しています。(文字列を与えても大丈夫) たぶん、ファイル名が(細部で)違うのではないかと思います。 ファイル名の一覧を取りだして、選ばせるのもいいかと思いますが・

taka4terada
質問者

補足

回答ありがとうございます。 文字列で正常に動作しました。 大変、失礼しました。(わざわざご確認までして頂いて)非常に助かりました。感謝です。 存在してない、オブジェクトitemを取得しようすると エラーになりますね。 ご指摘のあったファイル名の一覧でチェックをして から、存在していたらCloseなどをした方がいいですね。 ファイル名の一覧の取り方は、どのような方法 がありますでしょうか? いろいろと手解きして頂き、ご面倒をおかけします。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

参照設定で、 envdte とエクセル(たぶんエクセルは、設定済みですね)を参照設定して 以下のようにすると、現在開いているエクセルを捕まえられます。 以下の例は、開いているブックの内"A.xls" を閉じるサンプル VBAと違ってClose の引数を省略できないことに注意 ---------------------------------------------------------------- Excel.Application excel; excel = (Excel.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.application"); excel.Workbooks.get_Item("A.xls").Close(true,null,false);//保存して閉じる

taka4terada
質問者

お礼

お礼が、大変遅れました。 いろいろ教えていただきありがとうございました。

taka4terada
質問者

補足

早速の回答ありがとうございます。 ご指摘のあったソースで実行したところ、 インデックスが無効となるエラーになりました。 get_ItemにはObject indexを指定しなくては いけないと思い、excel.Workbooks.get_Item(1)~として、実行したら、あるひとつのEXCELファイルが閉じました。 ただ、インデックスなのでどの~.xlsファイルを閉じるというのが出来ない状況です。 良い方法がありますでしょうか? よろしくお願いいたします。

関連するQ&A