【C#】Excelにマクロを組み込む

前提

・Microsoft Excel 12.0 Object Libraryを参照していること
 (EPPlusではマクロの操作はできないため、COMを使用する)

・デスクトップにVBAコードが記載されたテキストファイル
 「sampleMacro.txt」が存在すること

・Excel2007の場合、「Microsoft Office ボタン」-「Excelのオプション」-
 「セキュリティ センター」-「セキュリティ センターの設定」-
 「マクロの設定」-「VBA プロジェクト オブジェクト モデルへの
 アクセスを信頼する」がチェック済みであること

サンプルプログラム

using Excel = Microsoft.Office.Interop.Excel;
using Microsoft.Vbe.Interop;
using System.Runtime.InteropServices;
(省略)

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Button1_Click(object sender, EventArgs e)
        {
            Excel.Application oExcel = null;
            Excel.Workbook oBook = null;
            Excel.Workbooks oBooks = null;
            VBComponent MyModule = null;
            string fileName = null;

            //Excelのインスタンスを作成
            oExcel = new Excel.Application();

            //Excelファイルの新規作成
            oBooks = oExcel.Workbooks;
            
            oBook = oBooks.Add();

            //エクセルVBAの標準モジュールのフォルダを作成する
            oBook.VBProject.VBComponents.Add(vbext_ComponentType.vbext_ct_StdModule);

            //Module1(標準モジュール)を作成する
            MyModule = oBook.VBProject.VBComponents.Item("Module1");

            //VBAコードが記載されたテキストファイルを流し込む
            MyModule.CodeModule.AddFromFile("C:\\Users\\user\\Desktop\\sampleMacro.txt");

            // マクロ有効ブックとして保存して閉じる
            fileName = "C:\\Users\\user\\Desktop\\sample.xlsm";
            oBook.SaveAs(Filename: fileName, FileFormat: Excel.XlFileFormat.xlOpenXMLWorkbookMacroEnabled) ;
            oExcel.Quit();

            //開放
            Marshal.ReleaseComObject(MyModule);
            Marshal.ReleaseComObject(oBook);
            Marshal.ReleaseComObject(oBooks);
            Marshal.ReleaseComObject(oExcel);
            MyModule = null;
            oBook = null;
            oBooks = null;
            oExcel = null;
            GC.Collect();

            MessageBox.Show("完了");
        }
    }

タイトルとURLをコピーしました