- 締切済み
C#で複数のエクセルを閉じる方法
c#で複数のエクセルを起動(オープン)させた後に、起動させたエクセルを閉じる(クローズ) させる為に、下記ソースを記載しましたが、エラーになってしまいます。 ※エラー内容としましては、例えば2ファイルのエクセルを起動させて閉じる場合、1ファイルは正常に閉じれるのですが、もう1ファイルを閉じる際にエラーとなってしまいます ※下記URLの内容を全てやったのですけれども解決できません。 (https://social.msdn.microsoft.com/Forums/vstudio/ja-JP/0f210f52-366... ご教示の程、よろしくお願い申し上げます。 private List<String> filepath = new List<String>(); Excel.Workbook objWorkBook = null; finally { if (objWorkSheet != null) { Marshal.ReleaseComObject(objWorkSheet); objWorkSheet = null; } if (xlSheets != null) { Marshal.ReleaseComObject(xlSheets); xlSheets = null; } if (objWorkBook != null) { for (int I = 0; I < filepath.Count; I++) { objWorkBook.Close(false, filepath[I], true); } Marshal.ReleaseComObject(objWorkBook); objWorkBook = null; } if (objWorkBooks != null) { objWorkBooks.Close(); Marshal.ReleaseComObject(objWorkBooks); objWorkBooks = null; } if (objExcel != null) { objExcel.Workbooks.Close(); objExcel.Quit(); Marshal.ReleaseComObject(objExcel); objExcel = null; } GC.Collect(); }
- みんなの回答 (3)
- 専門家の回答
みんなの回答
う~ん、、、C#を、というかプログラミングをまったくされたことがないのでしょうか。。。? 開いた物を全部閉じられればなんでもよいので、お好きなようにコーディングすれば良いかと思います。 掲載されているコード部分だけを見てごく単純に考えれば、 ファイルパスを filepath としてリストで管理しているように、 Excel.Workbook をリストで管理して、開いたものを全部保持しておいて全部閉じるとかでしょうか。 ただし、以前の回答にも書きましたが、掲載されたコードが中途半端でOpen処理を含めた処理の流れも書かれておらず、どうするのが一番良いのかは当方の知るところではありません。 また、当方としましては、自身で問題解決をしようとされている方へのアドバイス等であれば喜んでしますが、そうでないように見える場合はまるで興味を持てません。 本件については、本回答にて最後とさせて頂きます。
No.1の補足コメントに対して。 そうですね、その補足コメントに貼り付けて頂いた部分が誤っていると思われます。 元の質問文にファイルを開く処理部分が載っていませんが、 おそらく filepath のリストに格納される複数のファイルをOpenしているのですよね? それに対して objWorkBook はリストになっておらず、1つだけですよね? objWorkBook は開いた全部のファイルに対して処理できるオブジェクトではありません。 objWorkBook は、開いたファイル1つに対して1つ生成されます。 2つのファイルを開いたならば、objWorkBook の他にもう1つ、Excel.Workbook型のオブジェクトがなければなりません。 たとえばですが、(引数部分はちょっと省略しますが)2つのファイルを開いたら以下のように、開いたファイルそれぞれに対応するWorkbookオブジェクトが2つ出来て、それぞれを個別に閉じる必要があります。 以下のようであれば、objBook1 を閉じれば path1 のファイルが閉じますし、objBook2 を閉じれば path2 のファイルが閉じます。 Excel.Workbook objBook1 = appExcel.Workbooks.Open(path1); Excel.Workbook objBook2 = appExcel.Workbooks.Open(path2); // なんらかの処理 objBook1.Close(); objBook2.Close(); 現状の gehogehohoge さんのコードだと、objBook1 を2回Closeしてpath1もpath2も閉じようとしている、というのと同じことになります。
補足
toras9000さん ご回答頂き、ありがとうございます。 元の質問文にファイルを開く処理部分が載っていませんが、 おそらく filepath のリストに格納される複数のファイルをOpenしているのですよね? それに対して objWorkBook はリストになっておらず、1つだけですよね? →おっしゃる通りです。 filepath のリストに格納される複数のファイル(ファイル数はいくつあるか不明の場合)を 全て閉じる為にはどうすればよろしいでしょうか? ファイル数が分かっていればtoras9000さんからご回答頂いた通りのobjBook1、2、3 という風に定義したら解決出来るのですが、今回の場合はファイル数がいくつあるか不明 な為、どの用に修正すればよろしいでしょうか? 何度も何度も、大変申し訳ありませんがよろしくお願い申し上げます。
掲載されているコードが中途半端で、 ファイルを開く処理なども載っていないので推測ですが、 objWorkBook 変数の定義などを見る限り、 2つめのブックに対応するオブジェクトを捨てちゃっていませんか? 通常、Workbooks.Open()を2回呼び出したら、 Open()の戻り値である Workbook オブジェクトは2つ保持されて 閉じるときにはそれぞれのオブジェクトで閉じる必要があるはずです。 そのあたりの作りを確認してみてください。
補足
toras9000さん ご回答頂き、ありがとうございます。 >通常、Workbooks.Open()を2回呼び出したら、 >Open()の戻り値である Workbook オブジェクトは2つ保持されて >閉じるときにはそれぞれのオブジェクトで閉じる必要があるはずです。 →ご回答頂いた部分に関しまして、下記ソースで対応していると思われるのですが 誤っておりますでしょうか? if (objWorkBook != null) { for (int I = 0; I < filepath.Count; I++) { objWorkBook.Close(false, filepath[I], true); } }
補足
色々とご教示頂き、ありがとうございましたm(_ _)m 解決するよう頑張ってみます。 本当に、ありがとうございました。