トップ回答者
Excel出力で「Excelは動作を停止しました」のダイアログがでます。

質問
-
みなさん、こんばんは!
お世話になります。早速ですが、質問させて頂きます。
アプリから Excel シートの出力をしています。
そこで、シートに書き込む量が少ない場合(と思われます)に
次のようなダイアログが出ます。Microsoft Office Excel
Microsoft Office Excelは動作を停止しました
この問題の解決策を確認しています...
【キャンセル】
少し時間が過ぎると、このダイアログは消えて、シートに正しく
書き込まファイルが出力されています。シートに書き込むデータが多い場合には、このような事は起こり
ません。
と言う事で、処理の途中に何カ所か「待ち」を掛けて色々試して
みた所、その場所により問題の現象が生じなくなりました。
その状況を旨く掛けないので、基本部分のみにそぎ落としたソース
を添付します。using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using Microsoft.Office.Interop.Excel; namespace excel_output { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { button1.Enabled = false; backgroundWorker1.RunWorkerAsync(); } private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { var excel = new Microsoft.Office.Interop.Excel.Application { DisplayAlerts = false }; var books = excel.Workbooks; var book = books.Add(XlWBATemplate.xlWBATWorksheet); var sheets = book.Worksheets; var sheet = (Worksheet)sheets[1]; var cell = (Range)sheet.Cells[1, 1]; int i = 5; cell = sheet.Cells[i, i]; cell.Value2 = "セル [" + i.ToString() + ", " + i.ToString() + "]"; sheet.Name = "シート名 (" + i.ToString() + ")"; sheet.PageSetup.RightFooter = "右フッター" + "シート名 (" + i.ToString() + ")"; // System.Threading.Thread.Sleep(500); // ① string filepath = "c:\\test.xls"; try { book.SaveAs(filepath, XlFileFormat.xlExcel9795, Type.Missing, Type.Missing, Type.Missing, Type.Missing, XlSaveAsAccessMode.xlNoChange, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing); e.Result = "正常終了しました。"; } catch(Exception ex) { e.Result = ex.Message; } // System.Threading.Thread.Sleep(500); // ② book.Close(); // System.Threading.Thread.Sleep(500); // ③ excel.Quit(); // System.Threading.Thread.Sleep(500); // ④ } private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { MessageBox.Show((string)e.Result); button1.Enabled = true; } } }
(だらだらと長いソースで申し訳ありません)この中で、①②③を入れると問題の現象が現れず、④では効果が
有りませんでした。
もっとも、①②③でも200ミリ程度にすると時々問題が生じました。「待ち」を掛けるとOKと言うのも少々納得できませんし、この
ソースには何か間違いが有るのではないかと考えています。どの辺りにまずい所があるのかヒントでも頂ければ嬉しいです。
ちなみに、参照設定は
Microsoft.Office.Interop.Excel
バージョン:14.0.0.0
ランタイムバージョン:v2.0.50727となっています。
どうぞ、よろしくお願い致します。
回答
-
早速、参照設定を変えようとしましたが、私の環境(Visual Studio 2010)では参照の追加の候補に
14.0.0.0 と 12.0.0.0 しか見つかりませんでした。
で、12.0.0.0 で試してみましたが変化は有りませんでした。
Office 2003 の PIA がインストールされていないとかでしょうか?
Office 2003 プライマリ相互運用機能アセンブリをインストールして使用する (Microsoft Office 2003 技術記事)
http://msdn.microsoft.com/ja-jp/library/aa159923(v=office.11).aspx
所で参照設定ですが、ビルドの際には最新のものを設定しておけば、上位互換でOKと認識していた
のですが、実行する環境毎に参照設定を変えてビルドする必要があるのでしょうか。
この辺りが十分理解できていません。
この認識は正しくありません。Excel のバージョンに合致したタイプ ライブラリを参照する必要があります。
次の URL の記事は C# と VB とでほぼ同じ内容を説明していますが、特に VB の方にはバージョンが一致していないといけないことが説明されています。(当然 C# でも同じです。)
このあたりが原因で アーリー バインドやらレイト バインドやらの話が出てきます。
Microsoft Visual C# .NET を使用して Microsoft Excel を自動化する方法
http://support.microsoft.com/kb/302084/ja
Visual Basic を使用して Microsoft Excel を自動化する方法
http://support.microsoft.com/kb/219151/ja
# 参照設定が正しくないことが原因である可能性は低いようには思いますけれども。
それからアドインですが、Excelのメニュー【ツール】にあるアドインのチェックが全て外してある
状態の事でしょうか。
とすれば、その状態でこの現象は発生します。
それであれば問題ありません。アドインが原因で「動作を停止しました」エラーが発生するケースもあるようですので、念のため。- 回答としてマーク おおつの井上です。 2011年7月28日 8:11
-
クリックイベントに直接書いても、状況は変わりませんでした。
そうだとすると、スレッド以外の問題ですね。
それから、この件は「落ちる」と言うのか、エラー・ダイアログは出るものの
少し待てば「キャンセル」を押さなくても消えてしまい、意図したファイルは
正しく生成されます。最終結果が正しくても、過程がおかしいのであれば、それは不具合です。
「落ちると言わないで」ではなく、きちんと不具合であると認識して、調査・修正することが必要です。故に、私は「落ちる」と表現し、問題が生じていると解釈します。
所で、MTA対応って???
調べてみたのですが、電子メール配送に絡む事柄しか見つけられません。
お書き頂いた文面からすると、バックグラウンドで動かせる条件でしょうか。STA/MTA はスレッドモデルの話です。メール配信がらみでも MTA って言葉がありますが、違います。
ただ、今回は本筋じゃなさそうなので、あまり気にしないでください。
(参考1、参考2)本筋の路線に関しては、バージョンを合わせた際に問題が解消されるかを最初にみるべきでしょうね。
その結果を元に、ほかの可能性を検討・考慮することになると思います。
質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。- 回答としてマーク おおつの井上です。 2011年7月28日 8:11
すべての返信
-
var cell = (Range)sheet.Cells[1, 1];
cell = sheet.Cells[i, i];
book.SaveAs(filepath, XlFileFormat.xlExcel9795, Type.Missing, Type.Missing, Type.Missing, Type.Missing, XlSaveAsAccessMode.xlNoChange, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
直接関係はないと思いますが、 cell に Range オブジェクトを二度代入してますが解放はそれぞれやってますか?
実行環境の Excel のバージョンはいくつですか?バージョンによっては XlFileFormat.xlExcel9795 を使えないようです。
http://d.hatena.ne.jp/Kazzz/20061206/p1
-
totojo さん、ありがとうございます。
早速、参照設定を変えようとしましたが、私の環境(Visual Studio 2010)では参照の追加の候補に
14.0.0.0 と 12.0.0.0 しか見つかりませんでした。
で、12.0.0.0 で試してみましたが変化は有りませんでした。
所で参照設定ですが、ビルドの際には最新のものを設定しておけば、上位互換でOKと認識していた
のですが、実行する環境毎に参照設定を変えてビルドする必要があるのでしょうか。
この辺りが十分理解できていません。
それからアドインですが、Excelのメニュー【ツール】にあるアドインのチェックが全て外してある
状態の事でしょうか。
とすれば、その状態でこの現象は発生します。
質問ばかりで恐縮ですが、よろしくお願い致します。 -
早速、参照設定を変えようとしましたが、私の環境(Visual Studio 2010)では参照の追加の候補に
14.0.0.0 と 12.0.0.0 しか見つかりませんでした。
で、12.0.0.0 で試してみましたが変化は有りませんでした。
Office 2003 の PIA がインストールされていないとかでしょうか?
Office 2003 プライマリ相互運用機能アセンブリをインストールして使用する (Microsoft Office 2003 技術記事)
http://msdn.microsoft.com/ja-jp/library/aa159923(v=office.11).aspx
所で参照設定ですが、ビルドの際には最新のものを設定しておけば、上位互換でOKと認識していた
のですが、実行する環境毎に参照設定を変えてビルドする必要があるのでしょうか。
この辺りが十分理解できていません。
この認識は正しくありません。Excel のバージョンに合致したタイプ ライブラリを参照する必要があります。
次の URL の記事は C# と VB とでほぼ同じ内容を説明していますが、特に VB の方にはバージョンが一致していないといけないことが説明されています。(当然 C# でも同じです。)
このあたりが原因で アーリー バインドやらレイト バインドやらの話が出てきます。
Microsoft Visual C# .NET を使用して Microsoft Excel を自動化する方法
http://support.microsoft.com/kb/302084/ja
Visual Basic を使用して Microsoft Excel を自動化する方法
http://support.microsoft.com/kb/219151/ja
# 参照設定が正しくないことが原因である可能性は低いようには思いますけれども。
それからアドインですが、Excelのメニュー【ツール】にあるアドインのチェックが全て外してある
状態の事でしょうか。
とすれば、その状態でこの現象は発生します。
それであれば問題ありません。アドインが原因で「動作を停止しました」エラーが発生するケースもあるようですので、念のため。- 回答としてマーク おおつの井上です。 2011年7月28日 8:11
-
クリックイベントに直接書いても、状況は変わりませんでした。
そうだとすると、スレッド以外の問題ですね。
それから、この件は「落ちる」と言うのか、エラー・ダイアログは出るものの
少し待てば「キャンセル」を押さなくても消えてしまい、意図したファイルは
正しく生成されます。最終結果が正しくても、過程がおかしいのであれば、それは不具合です。
「落ちると言わないで」ではなく、きちんと不具合であると認識して、調査・修正することが必要です。故に、私は「落ちる」と表現し、問題が生じていると解釈します。
所で、MTA対応って???
調べてみたのですが、電子メール配送に絡む事柄しか見つけられません。
お書き頂いた文面からすると、バックグラウンドで動かせる条件でしょうか。STA/MTA はスレッドモデルの話です。メール配信がらみでも MTA って言葉がありますが、違います。
ただ、今回は本筋じゃなさそうなので、あまり気にしないでください。
(参考1、参考2)本筋の路線に関しては、バージョンを合わせた際に問題が解消されるかを最初にみるべきでしょうね。
その結果を元に、ほかの可能性を検討・考慮することになると思います。
質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。- 回答としてマーク おおつの井上です。 2011年7月28日 8:11
-
Azuleanさん、色々と有難うございます。
「落ちる」件について、仰る通り「不具合」と認識しています。
「待ち」を入れると現象が表面化しないだけで処置した事にはならず
抜本的な対応が必要と考えています。で、皆さんから教えて頂いているように、まずバージョンを合わせて
テストを行う事が先決と思いますので、Office 2003 プライマリ相互
運用機能アセンブリのインストールから始めてみます。それから、実行環境に Excel2007がセットされている場合のバージョンは
12.0.0.0 で良かったんでしょうか。 確認させてください。どうぞ、よろしくお願い致します。
-
みなさん、いつもお世話になります。
その後、皆さんに教えて頂いた事柄を参考に、他の資料も調べながら
色々と試してみました。参照の設置に一部誤りが有った事も分かり、正しく
Microsoft Excel 11.0 Object Library に設定し直して試しています。しかし、例のダイアログが表示され、これが間もなく消えてしまう
現象は発生します。但し、この現象が発生するのは、book、sheet を作り、ほんの少しの
セルに書き込み保存する場合のみで、今の所、私にはどんな状態に
なっているのか、様子を捕まえるすべがありません。と言う事で、もう少し問題を絞り込みハッキリとした質問ができる
ようになるまで、一旦このスレッドはクローズさせて頂こうと思います。皆様、色々と参考になるアドバイスを頂き、有難うございました。
今後とも、どうぞよろしくお願い致します。 -
このあたりは関係していないでしょうか?
Office Live Add-in Sign-in がインストールされている Excel または Word を終了すると、"動作を停止しました" が表示され正常に終了しない場合がある
http://support.microsoft.com/kb/2562521/ja