VB.NETを使って、ExcelやWord等のOffice製品と連携することが多々ある。
このような場合で、VBA(マクロ)をVB.NETから実行したいことがある。
その方法について説明する。

以下、サンプル。
《準備》
 ・参照設定を追加する。
  →COMコンポーネントのMicrosoft Excel xx.x Object Libraryを追加する。
 ・Imports文でMicrosoft.Office.Interop.Excelを宣言する。
《コード》
'[参照設定の追加]-[COM]タブから
'Microsoft Excel xx.x Object Libraryを選択する必要あり。
Imports Excel = Microsoft.Office.Interop.Excel

Private Sub Main()
 Dim oExcel As Excel.ApplicationClass
 Dim oBook As Excel.WorkbookClass
 Dim oBooks As Excel.Workbooks
 Dim strPath As String

 'C:\Test.xlsを実行ファイルに指定する。
 strPath = "C:\Test.xls"

 'Excelオブジェクトの作成
 oExcel = New Excel.Application
 'oExcel = CreateObject("Excel.Application")
 oExcel.Visible = True
 oBooks = oExcel.Workbooks
 'Excelファイルを開く
 oBook = oBooks.Open(strPath) 

 'マクロを実行する
 oExcel.Run("Test")
 oExcel.Run("TestWithParameter", "Hello from VB .NET Client")

 '後処理
 oBook.Close(False)
 System.Runtime.InteropServices.Marshal.ReleaseComObject(oBook)
 oBook = Nothing
 System.Runtime.InteropServices.Marshal.ReleaseComObject(oBooks)
 oBooks = Nothing
 oExcel.Quit()
 System.Runtime.InteropServices.Marshal.ReleaseComObject(oExcel)
 oExcel = Nothing
End Sub

上記のコードの他に、Cドライブの直下に"Test.xls"を作成する必要がある。このExcelファイルには、VBAの標準モジュールを追加し、以下の名前を持つ関数を作成する必要がある。処理内容はどのようなものでも構わないが、メッセージボックスを表示させると動作していることが確認し易い。
 ・Test
 ・TestWithParameter(strParam As String)

【補足事項】
・他のOffice製品(Word, PowerPoint, Access)のVBAも似たような方法で実行可能。
 1.対象とする製品の参照設定を追加する
 2.対応するクラスをImportsする。
  Accessの場合 … Microsoft.Office.Interop.Access
  Wordの場合 … Microsoft.Office.Interop.Word
  PowerPointの場合 … Microsoft.Office.Interop.PowerPoint
 3.製品に対応するオブジェクトをデータ型として使用する。
・Runメソッドの第1引数が、実行する関数名、第2引数がパラメータとなっている。