none
Excel出力で「Excelは動作を停止しました」のダイアログがでます。 RRS feed

  • 質問

  • みなさん、こんばんは!
    お世話になります。

    早速ですが、質問させて頂きます。

    アプリから 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

    となっています。

    どうぞ、よろしくお願い致します。

    2011年7月9日 15:48

回答

  • 早速、参照設定を変えようとしましたが、私の環境(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月10日 4:53
  • クリックイベントに直接書いても、状況は変わりませんでした。

    そうだとすると、スレッド以外の問題ですね。

    それから、この件は「落ちる」と言うのか、エラー・ダイアログは出るものの
    少し待てば「キャンセル」を押さなくても消えてしまい、意図したファイルは
    正しく生成されます。

    最終結果が正しくても、過程がおかしいのであれば、それは不具合です。
    「落ちると言わないで」ではなく、きちんと不具合であると認識して、調査・修正することが必要です。

    故に、私は「落ちる」と表現し、問題が生じていると解釈します。

    所で、MTA対応って???
    調べてみたのですが、電子メール配送に絡む事柄しか見つけられません。
    お書き頂いた文面からすると、バックグラウンドで動かせる条件でしょうか。

    STA/MTA はスレッドモデルの話です。メール配信がらみでも MTA って言葉がありますが、違います。
    ただ、今回は本筋じゃなさそうなので、あまり気にしないでください。
    参考1参考2

     

    本筋の路線に関しては、バージョンを合わせた際に問題が解消されるかを最初にみるべきでしょうね。
    その結果を元に、ほかの可能性を検討・考慮することになると思います。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    2011年7月10日 8:46
    モデレータ

すべての返信

  • ちなみに BackgroundWorker ではなく、ボタンのクリックイベントなどに直接書いた場合、待ちを入れなくても落ちないと言うことはありませんか?

    # Excel のオブジェクトって MTA 対応でしたっけ?
    # MTA 非対応なら、BackgroundWorker で使ってはいけないということになりますね。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    2011年7月9日 23:46
    モデレータ
  • 			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

     

    2011年7月10日 0:41
  • Azulean さん、有難うございます。

    クリックイベントに直接書いても、状況は変わりませんでした。

    それから、この件は「落ちる」と言うのか、エラー・ダイアログは出るものの
    少し待てば「キャンセル」を押さなくても消えてしまい、意図したファイルは
    正しく生成されます。

    所で、MTA対応って???
    調べてみたのですが、電子メール配送に絡む事柄しか見つけられません。
    お書き頂いた文面からすると、バックグラウンドで動かせる条件でしょうか。

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

    2011年7月10日 1:27
  • galaco さん、ありがとうございます。

    実行環境は、Excel2003です。

    Exce2007ではダメだったので、何で調べたかはよく覚えていませんが、Excelの
    バージョンを確認して【56】をセットしています。

    いま、手元の環境は2003のため、2007でこのトラブルがどううなるかは未確認です。

    それから、Renge オブジェクトの解放について、認識できていません。
    あちこち探していますが、適当な資料が見つかりません。
    何か、ヒントを頂ければ嬉しいのですが。

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

    2011年7月10日 1:28
  • ちなみに、参照設定は

    Microsoft.Office.Interop.Excel
    バージョン:14.0.0.0
    ランタイムバージョン:v2.0.50727

    となっています。


    実行環境は、Excel2003です。


    問題との関連性は分かりませんが、実行環境が Excel 2003 なのに 参照設定のバージョンが 14.0.0.0 というのは変です。
    Excel 2003 であれば、バージョンは 11 のはずです。

    あと、あらかじめ Excel のアドインをすべて OFF にしておいても同じ現象になるでしょうか。
    2011年7月10日 2:40
  • totojo さん、ありがとうございます。

    早速、参照設定を変えようとしましたが、私の環境(Visual Studio 2010)では参照の追加の候補に
     14.0.0.0 と 12.0.0.0 しか見つかりませんでした。
     で、12.0.0.0 で試してみましたが変化は有りませんでした。
     
     所で参照設定ですが、ビルドの際には最新のものを設定しておけば、上位互換でOKと認識していた
     のですが、実行する環境毎に参照設定を変えてビルドする必要があるのでしょうか。
     この辺りが十分理解できていません。
     
     それからアドインですが、Excelのメニュー【ツール】にあるアドインのチェックが全て外してある
     状態の事でしょうか。
     とすれば、その状態でこの現象は発生します。
     
     質問ばかりで恐縮ですが、よろしくお願い致します。

    2011年7月10日 3:58
  • 早速、参照設定を変えようとしましたが、私の環境(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月10日 4:53
  • totojo さん、お世話になります。

    色々と、参考になる記事を教えて頂き、有難うございます。

    初心者の私にとっては、だいぶ敷居が高いようですが、じっくり読ませて頂き
    勉強してみようと思っています。

    これからも、よろしくお願い致します。

    2011年7月10日 6:20
  • クリックイベントに直接書いても、状況は変わりませんでした。

    そうだとすると、スレッド以外の問題ですね。

    それから、この件は「落ちる」と言うのか、エラー・ダイアログは出るものの
    少し待てば「キャンセル」を押さなくても消えてしまい、意図したファイルは
    正しく生成されます。

    最終結果が正しくても、過程がおかしいのであれば、それは不具合です。
    「落ちると言わないで」ではなく、きちんと不具合であると認識して、調査・修正することが必要です。

    故に、私は「落ちる」と表現し、問題が生じていると解釈します。

    所で、MTA対応って???
    調べてみたのですが、電子メール配送に絡む事柄しか見つけられません。
    お書き頂いた文面からすると、バックグラウンドで動かせる条件でしょうか。

    STA/MTA はスレッドモデルの話です。メール配信がらみでも MTA って言葉がありますが、違います。
    ただ、今回は本筋じゃなさそうなので、あまり気にしないでください。
    参考1参考2

     

    本筋の路線に関しては、バージョンを合わせた際に問題が解消されるかを最初にみるべきでしょうね。
    その結果を元に、ほかの可能性を検討・考慮することになると思います。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    2011年7月10日 8:46
    モデレータ
  • Azuleanさん、色々と有難うございます。

    「落ちる」件について、仰る通り「不具合」と認識しています。
    「待ち」を入れると現象が表面化しないだけで処置した事にはならず
    抜本的な対応が必要と考えています。

    で、皆さんから教えて頂いているように、まずバージョンを合わせて
    テストを行う事が先決と思いますので、Office 2003 プライマリ相互
    運用機能アセンブリのインストールから始めてみます。

    それから、実行環境に Excel2007がセットされている場合のバージョンは
    12.0.0.0 で良かったんでしょうか。 確認させてください。

    どうぞ、よろしくお願い致します。

    2011年7月10日 11:44
  • みなさん、いつもお世話になります。

    その後、皆さんに教えて頂いた事柄を参考に、他の資料も調べながら
    色々と試してみました。

    参照の設置に一部誤りが有った事も分かり、正しく
    Microsoft Excel 11.0 Object Library に設定し直して試しています。

    しかし、例のダイアログが表示され、これが間もなく消えてしまう
    現象は発生します。

    但し、この現象が発生するのは、book、sheet を作り、ほんの少しの
    セルに書き込み保存する場合のみで、今の所、私にはどんな状態に
    なっているのか、様子を捕まえるすべがありません。

    と言う事で、もう少し問題を絞り込みハッキリとした質問ができる
    ようになるまで、一旦このスレッドはクローズさせて頂こうと思います。

    皆様、色々と参考になるアドバイスを頂き、有難うございました。
    今後とも、どうぞよろしくお願い致します。

    2011年7月28日 8:09
  • このあたりは関係していないでしょうか?

    Office Live Add-in Sign-in がインストールされている Excel または Word を終了すると、"動作を停止しました" が表示され正常に終了しない場合がある
    http://support.microsoft.com/kb/2562521/ja

     

    2011年8月1日 6:06
  • maxwell_02 さん、情報を有り難うございます。

    Excel のバージョンが異なるため、教えて頂いた資料通りではありませんが、
    【Microsoft Office Live add-in】を探しましたが、見つからず、これが
    インストールされている気配はありませんでした。

    という事で、関係の有無を直接確認する事はできませんでした。

    遅ればせながら、ご報告です。

     

    2011年9月9日 6:15