トップ回答者
C#からエクセルのシートを挿入し、シート名を変更する。

質問
-
いつもお世話になります。
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");
よろしくお願い致します。
回答
-
((Worksheet) workBook.ActiveSheet).Name = (i+1).ToString("d4");
とりあえずこれで動くか確認してみるとか。
- 回答としてマーク MitsuoTAKEI 2014年3月11日 11:15
すべての返信
-
workBook.ActiveSheet の型はどうなってますか?Worksheet 型にキャストする必要があるかどうか検討してみてください。
galaco様
ご回答ありがとうございました。
workBook.ActiveSheet の型は読み取り専用になっています。
コンパイルエラーの出ないプロジェクトでは、以下が表示されます。
(.Nameの上にカーソルを置くと)
(動的な式)
この操作は実行時に解決されます。
ーーーーーーーーーーーーーーーーーーーー
念の為usingをコピーしてみたのですが、やはり結果は同じでした。
プロジェクトの設定等で、なにか違いがあるのでしょうか?
たとえば参照の違いとかです。
-
((Worksheet) workBook.ActiveSheet).Name = (i+1).ToString("d4");
とりあえずこれで動くか確認してみるとか。
- 回答としてマーク MitsuoTAKEI 2014年3月11日 11:15
-
((Worksheet) workBook.ActiveSheet).Name = (i+1).ToString("d4");
とりあえずこれで動くか確認してみるとか。
galaco様
お世話になります。
ご指摘どおり、やってみましたが、以下のコンパイルエラーが出ます。
Form1.cs(306,33): エラー CS1061: 'object' に 'Name' の定義が含まれておらず、型 'object' の最初の引数を受け付ける拡張メソッドが見つかりませんでした。using ディレクティブまたはアセンブリ参照が不足しています。
先ず、これを解決しなければなりません。実行時解決の設定が出来る方法があるのでしょうか?
コンパイルエラーにしないように、コンパイラに指示するディレクティブなどです。
-
-
今さらながらの質問ですが・・・
> テストプロジェクトではOKですが、本番ソースコードはコンパイルエラー(CS1061)となります。
その「テストプロジェクト」と「本番」とで、具体的に何がどのように違うのでしょうか?
SurferOnWww様
ご指摘ありがとうございます。
テスト、本番用では環境上、違うところは無いはずですが、片やコンパイルエラーとなる
点で納得できずにいます。
アセンブリ参照もエクセルを含み、異なる点はないと認識しています。
(同じマシンですし)
エクセルに書き込む範囲やシート数等の違いだけです。
今回、galaco様のキャストで解決したのですが、どのような背景があるのか、知りたいところです。
-
-
> テスト、本番用では環境上、違うところは無いはずですが、片やコンパイルエラーとなる
何かが違うから結果が違うのですよね。
何が違うかは、回答者やその他の閲覧者は、掲示板に書いてあること以外は質問者さんの環境・状況は知りえないわけですから、そのあたりは質問者さんがよく調べて違いを見つけていただくしかないのですが・・・
#「テスト」は開発マシンの Visual Studio 上で[デバッグ(D)]⇒[デバッグなしで開始(H)](もしくは[デバッグ開始(S)])で実行、「本番」はユーザーの PC で実行と思っていたんですが、違うのでしょうか?SurferOnWww様
ご指摘ありがとうございます。
>そのあたりは質問者さんがよく調べて違いを見つけていただくしかないのですが・・・
もう一度考え直してみます。
>「本番」はユーザーの PC で実行と思っていたんですが、違うのでしょうか?
本番用はまだ開発段階にあります。(シートのコピーとリネームができないため、
テストを作成しました。従いまして、どちらも同じ環境->Visual Studioでデバッグモードです。)