PowerShellメモ Excelファイルに書いたVBAのSubプロシージャを呼び出してみる

PowerShell,VBA

C#に続き(記事はここ)、PowerShellでも試したくなったので。
ポイントはこんな感じ…って言ってもC#をほぼ同じ内容。

  • ExcelのVBAでSubプロシージャやFunctionプロシージャはPowerShellから呼び出されるための特別な書き方をしなくてOK
  • 呼び出すときは"モジュール名.Subプロシージャ名"
  • Microsoft.Office.Interop.Excel.Application.Runメソッドで取り扱うExcelのパスと必要に応じてVBAに渡す引数を指定する
  • PowerShell側でExcelに関係するオブジェクトはSystem.Runtime.InteropServices.Marshal.ReleaseComObjectメソッドで明示的に解放する

んで、まずはPowerShellのコードはこんな感じ。

# 処理共通の変数を初期化する
$location = "C:\Users\tetsuyanbo\Desktop\Sample.xlsm"
$application = $null

try
{
    # Excelを起動する
    $application = New-Object -ComObject Excel.Application
    $book = $application.Workbooks.Open($location)

    # マクロを呼び出す
    $target = "GeneralModule.ModuleSub"
    $message = "呼び出せたよ!"
    $application.Run($target,$message)

    # ブックを閉じる
    $book.Close()
}
catch
{
    Write-Host $Error
}
finally
{
    if( $application -ne $null )
    {
        $application.Quit()
        [System.Runtime.InteropServices.Marshal]::FinalReleaseComObject($application) | Out-Null
    }
}

準備したサンプルのExcel VBAマクロはこんな感じ。

'
' 用意したもの
'
Private Sub ModuleSub(message As String)

    MsgBox "標準モジュールの引数ありSubを..." & message

End Sub

んで、実行してみるとこんな感じ。

こっちもC#と同じように、VBAのダイアログを閉じないと処理がPowerShell側に戻らないのでとかで抑制するんかも?

ちなみに、タイトルはSubプロシージャってなってるけどFunctionでも同じ要領。

んまま、明日への自分へのメモってことで。