none
C#2010からエクセル2010出力関数を作成する。 RRS feed

  • 質問

  • いつもお世話になります。

    C#2010からエクセル2010へエラーメッセージを書き出すメソッドを作成したいのですが、

    以下のコンパイルエラーとなり、うまくいきません。

    やりたいのは、下記のメソッドを作成し、呼び出し側から、エクセルを意識させないような

    関数にしたいのですが、(複数ファイルのエクセル出力となる)

    どなたか、解決策をご存知の方、お教えください。

            static Worksheet ws1;
            static Workbook wb;
        static ExlOpen = 0;
    
           // Microsoft.Office.Interop.Excel.Application ExcelApp;
    
            //エラーをエクセルに書き込む。 
            static void InsertError(int errCode, string ANo , string locn, string chkname, string emsg, string remarks)
            {
                if (ExlOpen == 0)
                {
                    //エクセルを開く
                    Microsoft.Office.Interop.Excel.Application ExcelApp = new Microsoft.Office.Interop.Excel.Application();
                    ExcelApp.Visible = false;
                    Workbook wb = ExcelApp.Workbooks.Open(outFName,
                        Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
                        Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
    
                    ws1 = wb.Sheets[1];
                    ws1.Select(Type.Missing);
                    ExlOpen = 1;
                }
    		//ここでエクセルへの書き込み。(省略)
                }
    
                //  エクセルクローズ?
                if (errCode == 9999)
                {
                    wb.Save();
                    wb.Close(false);
                    ExcelApp.Quit();
                    ExlOpen = 0;
                }
            }
    
    エラー	1	名前 'ExcelApp' は現在のコンテキスト内に存在しません。	\Form1.cs	504	17	datchk
    

    2013年12月24日 5:46

回答

  • 掲載されたコードではカッコの数が合わないなどきちんと見えていないのですが、以下のようなことでしょうか?

    Microsoft.Office.Interop.Excel.Application ExcelApp;
    
    //エラーをエクセルに書き込む。 
    static void InsertError(int errCode, string ANo , string locn, string chkname, string emsg, string remarks)
    {
        if (ExlOpen == 0)
        {
            //エクセルを開く
            ExcelApp = new Microsoft.Office.Interop.Excel.Application();
        }
    
        //  エクセルクローズ?
        if (errCode == 9999)
        {
            ExcelApp.Quit();
        }
    }


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    • 回答としてマーク MitsuoTAKEI 2013年12月24日 23:53
    2013年12月24日 8:35
    モデレータ
  • static のメソッドから参照するためには、フィールドも static でなければなりません。
    厳しいことを言うことになるかもしれませんが、もらった回答をそのまま書き写すのではなく、きちんと意図を把握して書き直しましょう。

    2013年12月24日 14:02
    モデレータ

すべての返信

  • スコープについて調べてみて下さい。定義したローカル変数がどこまで見えるかは、スコープによります。
    また、Excelを開いた後の後処理が不十分です。このため、メモリーにExcelが残り続けてしまうと思われます。ReleaseComObjectメソッドを調べてみて下さい。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    2013年12月24日 6:06
    モデレータ
  • ご回答ありがとうございます。

    スコープは

    if (ExlOpen == 0)

    {

    }

    分の中だけとなってしまいます。

    このような、プログラミングスタイルは不可能という

    ことでしょうか??

    2013年12月24日 7:56
  • 掲載されたコードではカッコの数が合わないなどきちんと見えていないのですが、以下のようなことでしょうか?

    Microsoft.Office.Interop.Excel.Application ExcelApp;
    
    //エラーをエクセルに書き込む。 
    static void InsertError(int errCode, string ANo , string locn, string chkname, string emsg, string remarks)
    {
        if (ExlOpen == 0)
        {
            //エクセルを開く
            ExcelApp = new Microsoft.Office.Interop.Excel.Application();
        }
    
        //  エクセルクローズ?
        if (errCode == 9999)
        {
            ExcelApp.Quit();
        }
    }


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    • 回答としてマーク MitsuoTAKEI 2013年12月24日 23:53
    2013年12月24日 8:35
    モデレータ
  • ご回答ありがとうございました。

    ご指摘のとおりです。

    >>掲載されたコードではカッコの数が合わないなどきちんと見えていないのですが、

    すみません、エクセルに書き出す部分を削除する際、}が残ってしまいました。

    ご指摘のソースコードでは、以下のコンパイルエラーとなります。

    静的でないフィールド、メソッド、またはプロパティ 'datchk.Form1.ExcelApp' で、オブジェクト参照が必要です


    2013年12月24日 9:02
  • static のメソッドから参照するためには、フィールドも static でなければなりません。
    厳しいことを言うことになるかもしれませんが、もらった回答をそのまま書き写すのではなく、きちんと意図を把握して書き直しましょう。

    2013年12月24日 14:02
    モデレータ
  • Azulean様

    ご回答ありがとうございます。ご指摘のとおり、思慮が足りませんでした。

    いただいたご回答は、こちらでも吟味していますし、緊急に実現できなければ

    ならないので、真剣です。

    staticを付けて、うまく行きました。

    ありがとうございました。

    2013年12月24日 23:54
  • Azuleanさんによるstaticの指摘が、解決への有益な情報の一つでしたので、私の方で回答としてマークさせていただきました。

    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    2013年12月26日 5:45
    モデレータ