- PR -

sheetのコピー

投稿者投稿内容
どつと
会議室デビュー日: 2005/11/09
投稿数: 6
投稿日時: 2005-11-29 17:51
いつも拝見させていただいています。
ご存知の方がいらっしゃいましたら教えていただければと思います。

現在、C#でエクセルを操作するものを作成しているのですが、
あるxlsファイルのシートを別のxlsファイルにコピーを行う処理部でエラーが
出てしまい、色々と調べてはみたのですがお手上げ状態になっております。
※同一ファイル内でのコピーができることは確認が取れてます。
下記がエラーになっているコードです。
よろしくお願いします。

----------------------------------------------------------
((Excel.Worksheet)コピー元book.Sheets["Sheet1"]).Copy(コピー先  book.Sheets["Sheet1"],Type.Missing);
-----------------------------------------------------------
ちゃっぴ
ぬし
会議室デビュー日: 2004/12/10
投稿数: 873
投稿日時: 2005-11-29 18:22
Cell に 256文字以上の文字列が含まれているとか
どつと
会議室デビュー日: 2005/11/09
投稿数: 6
投稿日時: 2005-11-29 19:47
引用:

ちゃっぴさんの書き込み (2005-11-29 18:22) より:
Cell に 256文字以上の文字列が含まれているとか



ちゃっぴさん、早速の返答ありがとうございます。
すいません。質問内容について私の説明不足でした。
現在確認を行っているxlsファイルは両ファイルとも
空(データなし)のxlsファイルで行っています。
よろしくお願いします。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-11-30 09:40
引用:

どつとさんの書き込み (2005-11-29 17:51) より:

あるxlsファイルのシートを別のxlsファイルにコピーを行う処理部でエラーが
出てしまい、色々と調べてはみたのですがお手上げ状態になっております。


エラーの内容を書いてくださると解決に近づくと思います。

引用:

((Excel.Worksheet)コピー元book.Sheets["Sheet1"]).Copy(コピー先  book.Sheets["Sheet1"],Type.Missing);


これもまた、参照を解放するタイミングを失ってますね。
暗黙的に WorkSheets オブジェクトが参照されています。

参照の解放については以下をご参照ください。

  COM オブジェクトを解放する

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-11-30 10:12
引用:

ちゃっぴさんの書き込み (2005-11-29 18:22) より:

Cell に 256文字以上の文字列が含まれているとか


これは通常の Excel 操作の場合に、

「コピーするシートには、255 バイトを超える文字を含むセルがあります。
 シート全体をコピーすると、各セルの 255 バイト目までがコピーされます。
 すべてのデータをコピーするには、シート全体ではなく、セルを新しいシートにコピーします。」

という確認ダイアログを表示するもので、エラーではないです。
また、Excel COM の場合は表示されないようです。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
どつと
会議室デビュー日: 2005/11/09
投稿数: 6
投稿日時: 2005-11-30 10:45
じゃんぬねっとさん、ご返答ありがとうございます。
説明不足で申し訳ないです。
ご返答いただいた内容について追記いたします。
よろしくお願いします。

引用:

じゃんぬねっとさんの書き込み (2005-11-30 09:40) より:
エラーの内容を書いてくださると解決に近づくと思います。


現在、発生しているエラー内容(メッセージ)は下記になります。
-------------------------------------------------------------------------
System.Runtime.InteropServices.COMException: HRESULT からの例外です : 0x800A03EC。
-------------------------------------------------------------------------

引用:

これもまた、参照を解放するタイミングを失ってますね。
暗黙的に WorkSheets オブジェクトが参照されています。

参照の解放については以下をご参照ください。

  COM オブジェクトを解放する


現在、確認を行っているロジック(C#)としては、下記のような構成になっています。
 Excel.Application app1 = null;
 Excel.Workbook book1 = null;
app = new Excel.Application();
book1 =(Excel.Workbook)app1.Workbooks.Add(コピー先Excelファイル);

 Excel.Application app2 = null;
 Excel.Workbook book2 = null;
app2 = new Excel.Application();
book2 =(Excel.Workbook)app2.Workbooks.Add(コピー元Excelファイル);

((Excel.Worksheet)book2.Sheets["Sheet1"]).Copy(book1 .Sheets["Sheet1"],Type.Missing);
COM オブジェクトへの参照を解放処理

解放処理を最後ではよくないのでしょうか・・。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-11-30 10:58
引用:

どつとさんの書き込み (2005-11-30 10:45) より:

現在、発生しているエラー内容(メッセージ)は下記になります。


とりあえず、私も試してみますね。

引用:

解放処理を最後ではよくないのでしょうか・・。


順番の問題ではありません。
もう 1 度リンク先をご参照ください。

"たとえば" ここですが、

引用:

book1 =(Excel.Workbook)app1.Workbooks.Add(コピー先Excelファイル);


この時点で、Workbooks オブジェクト参照の解放のタイミングを逃していますよね。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-11-30 11:50
とりあえず試してみました。
以下のようなコードで問題なくコピーはできました。
長文ですいませんです。(*_ _)

コード:

    private static void OneMethod() {
        Excel.Application xlApplication = null;

        try {
            xlApplication = new Excel.Application();
            xlApplication.Visible = true;

            Excel.Workbooks xlBooks = xlApplication.Workbooks;

            try {
                Excel.Workbook xlBook1 = xlBooks.Open(
                    @"C:\Book1.xls",
                    System.Reflection.Missing.Value, System.Reflection.Missing.Value,
                    System.Reflection.Missing.Value, System.Reflection.Missing.Value,
                    System.Reflection.Missing.Value, System.Reflection.Missing.Value,
                    System.Reflection.Missing.Value, System.Reflection.Missing.Value,
                    System.Reflection.Missing.Value, System.Reflection.Missing.Value,
                    System.Reflection.Missing.Value, System.Reflection.Missing.Value,
                    System.Reflection.Missing.Value, System.Reflection.Missing.Value
                );

                try {
                    Excel.Workbook xlBook2 = xlBooks.Open(
                        @"C:\Book2.xls",
                        System.Reflection.Missing.Value, System.Reflection.Missing.Value,
                        System.Reflection.Missing.Value, System.Reflection.Missing.Value,
                        System.Reflection.Missing.Value, System.Reflection.Missing.Value,
                        System.Reflection.Missing.Value, System.Reflection.Missing.Value,
                        System.Reflection.Missing.Value, System.Reflection.Missing.Value,
                        System.Reflection.Missing.Value, System.Reflection.Missing.Value,
                        System.Reflection.Missing.Value, System.Reflection.Missing.Value
                    );

                    try {
                        Excel.Sheets xlSheets1 = xlBook1.Worksheets;

                        try {
                            Excel.Sheets xlSheets2 = xlBook2.Worksheets;

                            try {
                                Excel.Worksheet xlSheet1 = (Excel.Worksheet)xlSheets1["Sheet1"];

                                try {
                                    Excel.Worksheet xlSheet2 = (Excel.Worksheet)xlSheets2["Sheet1"];

                                    try {
                                        xlSheet1.Copy(xlSheet2, System.Reflection.Missing.Value);
                                    } finally {
                                        if (xlSheet2 != null) {
                                            System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheet2);
                                        }
                                    }
                                } finally {
                                    if (xlSheet1 != null) {
                                        System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheet1);
                                    }
                                }
                            } finally {
                                if (xlSheets2 != null) {
                                    System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheets2);
                                }
                            }
                        } finally {
                            if (xlSheets1 != null) {
                                System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheets1);
                            }
                        }
                    } finally {
                        if (xlBook2 != null) {
                            System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBook2);
                        }
                    }
                } finally {
                    if (xlBook1 != null) {
                        System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBook1);
                    }
                }
            } finally {
                if (xlBooks != null) {
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBooks);
                }
            }
        } finally {
            if (xlApplication != null) {
                System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApplication);
            }
        }
    }


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

スキルアップ/キャリアアップ(JOB@IT)