1

何千もの Excel ファイルがあり、すべて同じテンプレートから作成されています。それぞれに、日付、部品番号、エンジニアなどのパラメーターの列があります。エンジニア セルはドロップダウン リストに設定されているため、ユーザーは特定のエンジニアの名前のみを入力できます。新しいエンジニアを追加したり、退職したエンジニアを削除したりする場合、現在、必要に応じて Microsoft Script Editor の名前のリストを変更しています。

<x:DataValidation>
     <x:Range>$D$19:$D$37</x:Range>
     <x:Type>List</x:Type>
     <x:CellRangeList/>
     **<x:Value>&quot;Peter, Paul, Mary&quot;</x:Value>**
</x:DataValidation>

しばらく更新していない Excel ファイルに遭遇するたびに、ctrl+F11 を押して、"Peter, Paul, Mary" の行を見つけ、手動で "Peter, John, Susan" に変更する必要があります。これは非常に煩わしいので、上記のデータを編集して、"Peter, Paul, Mary" を "Peter, John, Susan" に置き換えたいと思います。ファイル名が「ABC」で終わるすべてのExcelファイルに対してこれを行いたいと思います。すべてのファイルを探し出して手動で変更するのではなく、これに対するコード ソリューションはありますか? 私は C++/C# を好みますが、必要に応じて、または簡単であれば Visual Basic で管理できます。

4

1 に答える 1

0

これらはすべて、COM 相互運用機能を使用して行うことができます。プロジェクトで Excel 相互運用が参照されていることを確認してください。(マシンにExcelをインストールする必要があると思います)

using System.IO;
using Microsoft.Office.Interop.Excel;
using Excel = Microsoft.Office.Interop.Excel;

次に、アプリ

class Program
{
    static void Main(string[] args)
    {
        var mypath = @"c:\my\search\directory";
        string[] files = Directory.GetFiles(mypath, "*abc.xls", SearchOption.AllDirectories);

        foreach (var file in files)
        {
            Find(Path.Combine(mypath,file));
        }
    }

    private static void Find(string path)
    {
        object missing = null;
        Excel.Range currentFind = null;
        Excel.Range firstFind = null;
        var app = new Excel.Application();
        app.Visible = true;
        Excel.Workbook workbook = app.Workbooks.Open(path, 0, false, 5, "", "", false, Excel.XlPlatform.xlWindows, "", true, false, 0, true, false, false);
        var worksheet = workbook.Sheets[1];


        Excel.Range foundNames = worksheet.Range["A1", "B3"];
        // You should specify all these parameters every time you call this method, 
        // since they can be overridden in the user interface. 
        currentFind = foundNames.Find("Peter, Paul, Mary", LookIn: XlFindLookIn.xlValues, LookAt: XlLookAt.xlPart);

        currentFind.Replace(What:"Peter, Paul, Mary", Replacement:"Peter, John, Susan");

        workbook.Save();
    }
}

この例では、すべてが A1 と B3 内の最初のワークシートにあると想定しています。明らかに、ワークシートは異なるため、それを反映するようにこれらの値を変更する必要があります。また、「visible=true」を削除すると、速度が向上する可能性があります。私は自分のアプリが何をしているかを見ることができるようにしただけです。

于 2013-08-26T21:12:26.160 に答える