QA@IT
この質問・回答は、@ITの旧掲示板からインポートされたものです。

Excelのシートコピーでオートシェイプがコピーされない

VS.NET2005(C#)で開発をしております。

複数のExcelを一つのExcelにまとめるようなプログラムを作成しているのですが、シートをコピーした際に、セルの色や形などはちゃんとコピーされるのですが、
なぜかオートシェイプで作成した図形がコピーされません。

オートシェイプの図形をコピーするには特殊な操作が必要なのでしょうか?

質問者:セルカー

回答

セルカーさんの書き込み (2007-12-13 16:08) より:

複数のExcelを一つのExcelにまとめるようなプログラムを作成しているのですが、シートをコピーした際に、セルの色や形などはちゃんとコピーされるのですが、なぜかオートシェイプで作成した図形がコピーされません。オートシェイプの図形をコピーするには特殊な操作が必要なのでしょうか?

まずはどのような手段でどのようなコードを書いているのか提示して頂けませんか? Object Library による COM Interop か VSTO あたりならば答えられるかと思いますが、とりあえずコードが欲しいです。

_________________C# と VB.NET の入門サイト
じゃんぬねっと日誌

投稿者:じゃんぬねっと

編集 履歴 (0)

ありがとうございます。

かいつまんでソースを貼り付けます

------------------------------------------------------------------

        // 新しいブックにシートをコピーして保存する
        if (saveFileDialog1.ShowDialog() == DialogResult.OK)
        {
            // Excelアプリとブックのインスタンスを生成する
            Excel.Application xlsApp = new Excel.Application();
            Excel.Workbooks xlsBooks;

            // Excelアプリを起動します
            xlsApp.Visible = true;

            // Bookを閉じる時、確認メッセージを表示させない
            xlsApp.Application.DisplayAlerts = false;

            // 新しいWorkBooksを取得する
            xlsBooks = xlsApp.Workbooks;

            // 新しいExcelブックを追加する
            xlsBooks.Add(string.Empty);

            // 新規Bookを取得する
            Excel._Workbook bookNew = xlsBooks.get_Item(1);

            // 新規Bookシートを全て取得
            Excel.Sheets sheetsNew = bookNew.Worksheets;

            // シートオブジェクト
            Excel._Worksheet sheet;

            // 処理対象となるをExcelブックを全て読み込み、シートを追加する
            foreach (string strFileName in あるだけ)
            {
                // 既存のExcelブックを開く
                xlsBooks.Open(strFileName, 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);

                // Bookを取得する
                Excel._Workbook book = xlsBooks.get_Item(2);

                // シートを全て取得
                Excel.Sheets sheets = book.Worksheets;

                // シートがあるだけ処理を回す
                for (int j = 1; j <= sheets.Count; ++j)
                {
                    // シートを取得
                    sheet = (Excel._Worksheet)sheets.get_Item(j);

                    // シートをコピー
                    sheet.Copy(Type.Missing, sheetsNew.get_Item(sheetsNew.Count));
                } 

                // 開いた既存のExcelブックを閉じる
                book.Close(Type.Missing, Type.Missing, Type.Missing);

                // COM オブジェクトの参照カウントを解放する
                Marshal.ReleaseComObject(sheets);
                Marshal.ReleaseComObject(book);
            }

以下後処理
------------------------------------------------------------------

例外処理などは省いております。

宜しくお願いします。

投稿者:セルカー

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。