PowerShellメモ Excelファイルに書いたVBAのSubプロシージャを呼び出してみる
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でも同じ要領。
んまま、明日への自分へのメモってことで。
ディスカッション
コメント一覧
まだ、コメントがありません