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でも同じ要領。
んまま、明日への自分へのメモってことで。
