10

マクロを実行しようとしています。WorkSheet02 の WorkSheet01 から Macro01 と呼びましょう。

Microsoft.Office.Interop.Excel 名前空間を使用して、WorkSheet01 を開きました。

public void Main_CodedStep()
    {
        // Object for missing (or optional) arguments.
        object oMissing = System.Reflection.Missing.Value;

        // Create an instance of Microsoft Excel
        Excel.ApplicationClass oExcel = new Excel.ApplicationClass();

        // Make it visible
        oExcel.Visible = true;

        // Open Worksheet01.xlsm
        Excel.Workbooks oBooks = oExcel.Workbooks;
        Excel._Workbook oBook = null;
        oBook = oBooks.Open("C:\\Users\\Admin\\Documents\\Worksheet01.xlsm", oMissing, oMissing,
            oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, 
            oMissing, oMissing, oMissing, oMissing, oMissing, oMissing);
    }

次に、自動化されたスクリプトを使用してレポートを取得します。このレポートは、Interop ではなく、IE のダウンロード プロンプトから開きます。

問題は、C# 経由でマクロを実行しようとしたときに発生します (別の新しい Excel.ApplicationClass(); を作成したため、コンパイルしただけです。これは私の失敗の 1 つだと思います。)

public void FirstMacro_CodedStep()
    {
        // Create an instance of Microsoft Excel
        Excel.ApplicationClass oExcel = new Excel.ApplicationClass();
        Console.WriteLine("ApplicationClass: " + oExcel);

        // Run the macro, "First_Macro"
        RunMacro(oExcel, new Object[]{"Worksheet01.xlsm!First_Macro"});

        //Garbage collection
        GC.Collect();
    }

    private void RunMacro(object oApp, object[] oRunArgs)
    {
        oApp.GetType().InvokeMember("Run", System.Reflection.BindingFlags.Default | System.Reflection.BindingFlags.InvokeMethod, null, oApp, oRunArgs);
    }

このメソッドを実行すると、Worksheet02 ではなく Worksheet01 で Worksheet01 のマクロが実行されます。また、My Documents でワークシートを探していたので、移動して何が起こるかを確認しました。

要約:

  1. Worksheet01 を開く
  2. スクリプトを使用して、MSIE からレポート (Worksheet02) を取得して開きます
  3. Worksheet02 で Worksheet01 から Macro01 を実行する

資力:

http://support.microsoft.com/kb/306683

http://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel.aspx

試してみたい方は、using ディレクティブに以下を追加してください:

using System.Reflection;
using Microsoft.Office.Core; //Added to Project Settings' References from C:\Program Files (x86)\Microsoft Visual Studio 10.0\Visual Studio Tools for Office\PIA\Office14 - "office"
using Excel = Microsoft.Office.Interop.Excel; //Added to Project Settings' References from C:\Program Files (x86)\Microsoft Visual Studio 10.0\Visual Studio Tools for Office\PIA\Office14 - "Microsoft.Office.Interop.Excel"
4

3 に答える 3

13

共有したい解決策を見つけました。まず、Worksheet01を開いた部分を削除しました。次に、自動化されたスクリプトで.CSVをマイドキュメントに保存しました。次に、Worksheet01を開く必要があるコードを使用して、ダウンロードしたファイルを開きました。この時点で重要なのは、Worksheet01がWorksheet02とともにDocumentsフォルダーにあることです。最後に、このコードを使用して、Worksheet02で実行されるWorksheet01からマクロを実行しました。

    public void WebTest_CodedStep()
    {
        // Object for missing (or optional) arguments.
        object oMissing = System.Reflection.Missing.Value;

        // Create an instance of Microsoft Excel
        Excel.ApplicationClass oExcel = new Excel.ApplicationClass();

        // Make it visible
        oExcel.Visible = true;

        // Define Workbooks
        Excel.Workbooks oBooks = oExcel.Workbooks;
        Excel._Workbook oBook = null;

        // Get the file path
        string path = System.Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
        path = path + "\\Worksheet02.csv";

        //Open the file, using the 'path' variable
        oBook = oBooks.Open(path, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing,  oMissing, oMissing, oMissing, oMissing, oMissing, oMissing);

        // Run the macro, "First_Macro"
        RunMacro(oExcel, new Object[]{"Worksheet01.xlsm!First_Macro"});

        // Quit Excel and clean up.
        oBook.Close(false, oMissing, oMissing);
        System.Runtime.InteropServices.Marshal.ReleaseComObject (oBook);
        oBook = null;
        System.Runtime.InteropServices.Marshal.ReleaseComObject (oBooks);
        oBooks = null;
        oExcel.Quit();
        System.Runtime.InteropServices.Marshal.ReleaseComObject (oExcel);
        oExcel = null;

        //Garbage collection
        GC.Collect();
    }

    private void RunMacro(object oApp, object[] oRunArgs)
    {
        oApp.GetType().InvokeMember("Run", System.Reflection.BindingFlags.Default | System.Reflection.BindingFlags.InvokeMethod, null, oApp, oRunArgs);
    }
于 2013-01-10T19:50:19.877 に答える
2

この C# VSTO コードを実行して VBA マクロを呼び出しました。これは私が使用する構文です。

this.Application.Run("mymacro");

編集:

マクロはワークブック全体です。おそらく、マクロを実行する前にシート 2 をアクティブなワークシートにする必要があります。たとえば、次のようになります。

foreach (Worksheet worksheet in workbook.Sheets.ComLinq<Worksheet>())
{
    if (worksheet.Name == "Sheet2") worksheet.Activate();
}
于 2013-01-10T00:29:19.517 に答える