0

C# を使用して、既存の csv ファイルで既存の Excel マクロ (VB で記述され、マクロ エディターを使用して Excel からコピーできます) を実行する必要があります。次のような xlsm ファイルでマクロを実行するために使用できる作業コードが既にあります。

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

namespace MacroBuddy
{
    public class test
    {
        public static void go_Macro()
        {
            object oMissing = System.Reflection.Missing.Value;

            //create new Excel application instance
            Excel.Application oExcel = new Excel.Application();

            oExcel.Visible = true;

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

            string path = @"C:\Users\user\Desktop\test.csv";

            //open file located at path
            oBook = oBooks.Open(path, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing);

            //run Macro by referencing file and the name of the Macro
            RunMacro(oExcel, new Object[] { "test.xlsm!TestMacro" });

            //save and close workbook
            oBook.Save();
            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;
            GC.Collect();
        }

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

        static void Main()
        { go_Macro(); }
    }
}

ただし、指定したファイルが csv ファイルの場合は機能しません。したがって、同様のコードを csv ファイルで機能させるか、csv ファイルを C# から xlsm ファイルに変換する自動化プロセスを作成するための支援が必要です。

また、VB マクロ コードを文字列として取得し、その文字列を引数として取得するメソッドまたは同様のプロセスを使用してマクロを実行できると便利です。

4

2 に答える 2

0

次の 2 つのリンクが、csv ファイルを開いて Excel 形式で保存するのに役立つことを願っています。その後、Excelファイルを開いてタスクを実行します。

http://msdn.microsoft.com/en-us/library/c9838808.aspx (CSV を開く) http://msdn.microsoft.com/en-us/library/h1e33e36.aspx (Excel に保存)。

于 2013-08-14T19:30:02.207 に答える
0

そもそもcsvに書き込む代わりに、次のようなものを使用して、複数のシートを含む.xlsxファイルに書き込むことにしました。

public class test
{
    object missing = Type.Missing;
    public test()
    {
        Excel.Application XL = new Excel.Application();
        oXL.Visible = false;
        Excel.Workbook WB = XL.Workbooks.Add(missing);
        Excel.Worksheet Sheet = WB.ActiveSheet as Excel.Worksheet;
        oSheet.Name = "First sheet";
        oSheet.Cells[1, 1] = "Written on first sheet";
        Excel.Worksheet Sheet2 = WB.Sheets.Add(missing, missing, 1, missing) 
                    as Excel.Worksheet;
        Sheet2.Name = "Second sheet";
        Sheet2.Cells[1, 1] = "Written on second sheet";
        string fileName = @"C:\temp\SoSample.xlsx";
        oWB.SaveAs(fileName, Excel.XlFileFormat.xlOpenXMLWorkbook,
            missing, missing, missing, missing,
            Excel.XlSaveAsAccessMode.xlNoChange,
            missing, missing, missing, missing, missing);
        oWB.Close(missing, missing, missing);
        oXL.UserControl = true;
        oXL.Quit();
    }
}

次に、次のコードを使用してワークブックを作成しました。

private void button1_Click(object sender, System.EventArgs e)
{
         Excel.Application oExcel;
         Excel.Workbook oBook;
         VBIDE.VBComponent oModule;
         Office.CommandBar oCommandBar;
         Office.CommandBarButton oCommandBarButton;
         String sCode;
         Object oMissing = System.Reflection.Missing.Value;
         // Create an instance of Excel.
         oExcel = new Excel.Application();

         // Add a workbook.
         oBook = oExcel.Workbooks.Add(@"C:\Users\user\Downloads\test.xlsm");

         // Create a new VBA code module.
         oModule = oBook.VBProject.VBComponents.Add(VBIDE.vbext_ComponentType.vbext_ct_StdModule);

         sCode =
         //paste in your macro here, with each line followed by a new line
         "Sub TestMacro()\r\n" +
         "Columns(\"D:D\").Select\r\n" +
         "Selection.Copy\r\n" +
         "Columns(\"F:F\").Select\r\n" +
         "ActiveSheet.Paste\r\n" +
         "Application.CutCopyMode = False\r\n" +
         "ActiveSheet.Range(\"$F$1:$F$542\").RemoveDuplicates Columns:=1, Header:=xlNo\r\n" +
         "Range(\"F1\").Select\r\n" +
         "ActiveCell.FormulaR1C1 = \"Unique Query\"\r\n" +
         "Range(\"F2\").Select\r\n" +
         "End Sub";
         // Add the VBA macro to the new code module.
         oModule.CodeModule.AddFromString(sCode);



         // Make Excel visible to the user.
         oExcel.Visible = true;
         // Set the UserControl property so Excel won't shut down.
         oExcel.UserControl = true;

         // Release the variables.
         oModule = null;
         oBook = null;
         oExcel = null;             
         // Collect garbage.
         GC.Collect();
}

その後、最初に投稿したコードで作成したばかりのマクロを実行できました。

于 2013-08-16T16:10:34.920 に答える