2

私はこれに対する答えをオンラインで検索しています。数十の「解決策」がありますが、どれも正しく機能していないようです。私が作成しているアプリケーション (C# を使用) は、mdb クエリ定義からデータを取得し、2 つのワークシートを含む Excel ワークブックを作成します。その部分は完璧に機能します。ここで、簡単にする必要がある部分について説明します。複数のワークシートを含むワークブックがあります (各ワークシートはデータの計算方法が異なります)。「テンプレート」ワークブックを開き、正しいワークシートをコピーし、コピーを新しく作成したワークシートに配置するコードが必要です。他の 2 つのワークシートを含むワークブック。これは、「動作するはず」と私が感じるコードのサンプルです。

            _Application xlApp;
        Workbook xlTemplateWB;
        Workbook xlTempWB;
        object missing = System.Reflection.Missing.Value;

        xlApp = new ApplicationClass();
        xlApp.Visible = true;

        //Open Bench Sheet Template
        xlTemplateWB = xlApp.Workbooks.Open(Elmnt.getDBPath() + TEMPLATENAME, 0, true, 5, "", "",
            false, XlPlatform.xlWindows, "", true, false, 0, true, false, false);

        //Open temporary workbook
        xlTempWB = xlApp.Workbooks.Open(XLTempDir + XLTempName, 0, false, 5, true, "", true, 
            XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0);

        //Copy "BOD" Worksheet
        xlTempWB.Worksheets.Copy(xlTemplateWB.Worksheets["BOD"]);
        xlTempWB.Save();

        //Close Workbooks
        xlTempWB.Close(true, missing, missing);
        xlTemplateWB.Close(true, missing, missing);
        xlApp.Quit();

        //Release Objects
        releaseObject(xlTempWB);
        releaseObject(xlTemplateWB);
        releaseObject(xlApp);
4

2 に答える 2

2

MSDN のドキュメントを読んだところ、Worksheet.Copy() は Workbook 内でのみ機能します。C# 構文は正しいようです。

これにアプローチするには、いくつかの方法があります。

  1. テンプレート ワークブック全体を ( を使用してWorkBook.SaveCopyAs()) 複製し、不要なものを削除します。
  2. 移動したい範囲を選択し、クリップボード ( Range.Select; Range.Copy; Range.Paste;) を使用してコピーします。

お役に立てれば。

于 2013-01-02T17:55:56.360 に答える
1

ご協力ありがとうございました。さらにいくつかのことを試した後、ワークブック全体をコピーして該当しないワークシートを削除することしかできないことがわかりました。これは非常に面倒だと思うので、誰かがそれを行うためのより良い方法を見つけたら、私はすべて耳を傾けます. 最終的に使用したコードは次のとおりです。

            _Application xlApp;
        Workbook xlTemplateWB;
        Workbook xlTempWB;
        object missing = System.Reflection.Missing.Value;

        xlApp = new ApplicationClass();
        xlApp.Visible = true;

        //Open Bench Sheet Template
        xlTemplateWB = xlApp.Workbooks.Open(Elmnt.getDBPath() + TEMPLATENAME, 0, true, 5, "", "",
            false, XlPlatform.xlWindows, "", true, false, 0, true, false, false);

        //Save As a temporary workbook
        xlTemplateWB.SaveAs(XLTempDir + XLTempName);
        xlTemplateWB.Close(true, missing, missing);
        releaseObject(xlTemplateWB);

        //Open temporary workbook
        xlTempWB = xlApp.Workbooks.Open(XLTempDir + XLTempName, 0, false, 5, true, "", true,
            XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0);

        //Remove non-applicable worksheets
        for (int i = xlTempWB.Sheets.Count; i > 0; i--)
        {
            if (((Worksheet)xlTempWB.Sheets[i]).Name != bchSheet)
            {
                xlApp.DisplayAlerts = false;
                ((Worksheet)xlTempWB.Sheets[i]).Delete();
                xlApp.DisplayAlerts = true;
            }
        }
        xlTempWB.Save();

        //Close Workbooks
        xlTempWB.Close(true, missing, missing);
        xlApp.Quit();

        //Release Objects
        releaseObject(xlTempWB);
        releaseObject(xlApp);
于 2013-01-02T20:06:39.327 に答える