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