none
C#からエクセルのシートを挿入し、シート名を変更する。 RRS feed

  • 質問

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

    C#からエクセルを開き、シートを挿入し、シート名を変更しようとしているのですが、

    テストプロジェクトではOKですが、本番ソースコードはコンパイルエラー(CS1061)となります。

    どなたか、解決方法をご存知の方、アドバイスをお願い致します。

    環境は、Windows7 VisualStudio 2010 、 エクセル 2010、C#です。

            private void button1_Click(object sender, EventArgs e)
            {
                Excel.Application app = app = new Excel.Application();
                Excel.Workbook workBook = null;
                app.Visible = true;
    
                // ワークブックを開く
                workBook = (Excel.Workbook)(app.Workbooks.Open(
                @"C:\takei\all.xls",
                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));
    
                for (int i = 0; i < 805; i++)
                {
                    // シートインデックス取得               
                    int idx = getSheetIndex("Sheet2", workBook.Sheets);
                    int idx2 = getSheetIndex("Total", workBook.Sheets);
    
                    // シートの作成
                    Excel.Worksheet workSheet = (Excel.Worksheet)workBook.Sheets[idx];
                    Excel.Worksheet workSheet2 = (Excel.Worksheet)workBook.Sheets[idx2];
    
                    // シートのコピーとリネーム
                    workSheet.Copy(workSheet2, Type.Missing);
                    workBook.ActiveSheet.Name = (i+1).ToString("d4");
                }
                // 保存・終了
                workBook.Close(true, Type.Missing, Type.Missing);
                app.Quit();
            }
    
    
            //シート名からインデックスを取得する。
            private int getSheetIndex(string sheetname, Excel.Sheets shs)
            {
                int i = 0;
                foreach (Excel.Worksheet sh in shs)
                {
                    if (sheetname == sh.Name)
                        return i + 1;
                    i++;
                }
                return 0;
            }
        }
    } 

    コンパイルエラー(CS1061 ObjectにNameの定義が含まれておらず。。。)の出る行は、以下です。

     workBook.ActiveSheet.Name = (i+1).ToString("d4");

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

    2014年3月11日 4:05

回答

すべての返信

  •  workBook.ActiveSheet の型はどうなってますか?Worksheet 型にキャストする必要があるかどうか検討してみてください。
    2014年3月11日 5:46
  •  workBook.ActiveSheet の型はどうなってますか?Worksheet 型にキャストする必要があるかどうか検討してみてください。


    galaco様

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

    workBook.ActiveSheet の型は読み取り専用になっています。

    コンパイルエラーの出ないプロジェクトでは、以下が表示されます。

    (.Nameの上にカーソルを置くと)

    (動的な式)

    この操作は実行時に解決されます。

    ーーーーーーーーーーーーーーーーーーーー

    念の為usingをコピーしてみたのですが、やはり結果は同じでした。

    プロジェクトの設定等で、なにか違いがあるのでしょうか?

    たとえば参照の違いとかです。

    2014年3月11日 8:26
  • ((Worksheet) workBook.ActiveSheet).Name = (i+1).ToString("d4");

    とりあえずこれで動くか確認してみるとか。

    • 回答としてマーク MitsuoTAKEI 2014年3月11日 11:15
    2014年3月11日 8:42
  • ((Worksheet) workBook.ActiveSheet).Name = (i+1).ToString("d4");

    とりあえずこれで動くか確認してみるとか。

    galaco様

    お世話になります。

    ご指摘どおり、やってみましたが、以下のコンパイルエラーが出ます。

    Form1.cs(306,33): エラー CS1061: 'object' に 'Name' の定義が含まれておらず、型 'object' の最初の引数を受け付ける拡張メソッドが見つかりませんでした。using ディレクティブまたはアセンブリ参照が不足しています。

    先ず、これを解決しなければなりません。実行時解決の設定が出来る方法があるのでしょうか?

    コンパイルエラーにしないように、コンパイラに指示するディレクティブなどです。


    2014年3月11日 9:12
  • ((Worksheet) workBook.ActiveSheet).Name = (i+1).ToString("d4");

    で、なぜ

    > Form1.cs(306,33): エラー CS1061: 'object' に 'Name' の定義が含まれておらず、型 'object' の最初の引数を受け付ける拡張メソッドが見つかりませんでした。using ディレクティブまたはアセンブリ参照が不足しています。
    というコンパイルエラーが出るのか全くわかりません。

    メソッドやプロパティの実行時解決については dynamic について調べてください。

    2014年3月11日 9:37
  • ((Excel.Worksheet) workBook.ActiveSheet).Name = (i+1).ToString("d4");

    にしてみては?
    ※Excelネームスペースの指定が無い事で別のクラスに変換されてるとか・・・

    2014年3月11日 9:47
  • 今さらながらの質問ですが・・・

    > テストプロジェクトではOKですが、本番ソースコードはコンパイルエラー(CS1061)となります。

    その「テストプロジェクト」と「本番」とで、具体的に何がどのように違うのでしょうか?

    2014年3月11日 10:40
  • コンパイルエラーが出るのか全くわかりません。

    すみません、キャストする際の括弧の位置にミスがありました。

    コンパイルエラーは、解消し、ちゃんとシート名が設定されるようになりました。

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

    2014年3月11日 10:51
  • aviator様

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

    括弧の閉じる位置が間違っていました。

    2014年3月11日 10:53
  • 今さらながらの質問ですが・・・

    > テストプロジェクトではOKですが、本番ソースコードはコンパイルエラー(CS1061)となります。

    その「テストプロジェクト」と「本番」とで、具体的に何がどのように違うのでしょうか?

    SurferOnWww様

    ご指摘ありがとうございます。

    テスト、本番用では環境上、違うところは無いはずですが、片やコンパイルエラーとなる

    点で納得できずにいます。

    アセンブリ参照もエクセルを含み、異なる点はないと認識しています。

    (同じマシンですし)

    エクセルに書き込む範囲やシート数等の違いだけです。

    今回、galaco様のキャストで解決したのですが、どのような背景があるのか、知りたいところです。

    2014年3月11日 11:06
  • > テスト、本番用では環境上、違うところは無いはずですが、片やコンパイルエラーとなる

    何かが違うから結果が違うのですよね。

    何が違うかは、回答者やその他の閲覧者は、掲示板に書いてあること以外は質問者さんの環境・状況は知りえないわけですから、そのあたりは質問者さんがよく調べて違いを見つけていただくしかないのですが・・・


    #「テスト」は開発マシンの Visual Studio 上で[デバッグ(D)]⇒[デバッグなしで開始(H)](もしくは[デバッグ開始(S)])で実行、「本番」はユーザーの PC で実行と思っていたんですが、違うのでしょうか?

    2014年3月11日 11:41
  • > テスト、本番用では環境上、違うところは無いはずですが、片やコンパイルエラーとなる

    何かが違うから結果が違うのですよね。

    何が違うかは、回答者やその他の閲覧者は、掲示板に書いてあること以外は質問者さんの環境・状況は知りえないわけですから、そのあたりは質問者さんがよく調べて違いを見つけていただくしかないのですが・・・


    #「テスト」は開発マシンの Visual Studio 上で[デバッグ(D)]⇒[デバッグなしで開始(H)](もしくは[デバッグ開始(S)])で実行、「本番」はユーザーの PC で実行と思っていたんですが、違うのでしょうか?

    SurferOnWww様

    ご指摘ありがとうございます。

    >そのあたりは質問者さんがよく調べて違いを見つけていただくしかないのですが・・・

    もう一度考え直してみます。

    >「本番」はユーザーの PC で実行と思っていたんですが、違うのでしょうか?

    本番用はまだ開発段階にあります。(シートのコピーとリネームができないため、

    テストを作成しました。従いまして、どちらも同じ環境->Visual Studioでデバッグモードです。)

    2014年3月11日 23:59