以前の記事でExcel VBAの実行方法について説明したが、内容が不十分だったので、その続きを…
前回は、単純に実行するだけで戻り値を返さないSubステートメントの説明であったので、今回は、戻り値を返すFunctionステートメントの利用方法について説明する。
ExcelファイルにVBAを記述する方法は、以前の記事を参照のこと。
【Functionステートメントの利用手順】
 1.Excelファイルを作成する。
 2.Excel VBAでFunctionステートメントを作成し、戻り値の型を決定する。
 3.2で作成したFunctionステートメントの戻り値に合う変数を宣言する。
  例)VBA側の戻り値がVariant型の場合、VB.NETではObject型を用意する。
 4.Excel.ApplicationクラスのRunメソッドを実行する箇所で、以下を記述する。
  変数 = オブジェクト.Run("Functionステートメント名", "引数")
 5.変数内の値を確認する。

以下、サンプル。
【VB.NET】
'[参照設定の追加]-[COM]タブから
'Microsoft Excel xx.0 Object Libraryを選択する必要あり。
Imports Excel = Microsoft.Office.Interop.Excel

Private Sub ExecButton_Click(ByVal sender As System.Object, _
 ByVal e As System.EventArgs) Handles ExecButton.Click

 Try
  Dim oExcel As New Excel.ApplicationClass
  Dim oBook As Excel.WorkbookClass
  Dim oBooks As Excel.Workbooks = oExcel.Workbooks
  Dim strPath As String
  Dim Result As String

  'C:\Test.xlsを実行ファイルに指定する。
  strPath = "C:\Test.xls"
  'Excelオブジェクトの設定
  oExcel.Visible = False
  oBook = oBooks.Open(strPath)

  'マクロを実行する
  'Subステートメントを実行する場合
  'oExcel.Run("'" & oBook.Name & "'!Test")
  'oExcel.Run("'" & oBook.Name & "'!TestWithParameter", "Hello from VB .NET Client")
  'Functionステートメントを実行する場合
  Result = _
   DirectCast(oExcel.Run("'" & oBook.Name & _
   "'!TestReturnParameter"), String)
  MessageBox.Show(Result, "TestReturnParameter", _
   MessageBoxButtons.OK)
  Result = _
   DirectCast(oExcel.Run("'" & oBook.Name & _
   "'!TestParameter", "Test!"), String)
  MessageBox.Show(Result, "TestParameter", MessageBoxButtons.OK)
  'Result = DirectCast(oExcel.Run("'" & oBook.Name & _
  ' "'!ThisWorkBook.TestParameter", "Test!"), String)
  'MessageBox.Show(Result, "TestParameter", MessageBoxButtons.OK)

  '後処理
  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

 Catch ex As Exception
  MessageBox.Show(ex.Message, "エラー", MessageBoxButtons.OK)
 End Try
End Sub

【Excel VBA】
'引数は受け取らず、値を返すのみ
Public Function TestReturnParameter() As String
 TestReturnParameter = "TestReturnParameter " & Application.Name
End Function

'引数を受け取り、その値を返す
Public Function TestParameter(sMsg As String) As String
 TestParameter = sMsg
End Function

【補足事項】
サポートオンライン「Visual Basic .NET からオートメーションを使用して Office マクロを実行する方法」を参照
・VB.NET側から実行できるVBAは、標準モジュール内に記述されたものに限定される。
 →ThisWorkBookや各シートに記述したマクロを実行すると、以下のエラーメッセージが表示される。
   マクロ''ブック名.xls'!シート名.関数名'を実行できません。このブックで
   マクロが使用できないか、またはすべてのマクロが無効になっている
   可能性があります。