【PowerShell】PowerShellからExcelVBAのマクロを呼び出すには

この記事では、PowerShellからExcelVBAのマクロを呼び出す方法についてご説明します。

【動画】PowerShellからExcelVBAのマクロを呼び出す実際の動き

本題に入る前に、まずは次の動画をご覧ください。


Excelアプリケーションのインスタンスを生成し、Excelファイルを開きます。

Excelファイルを開いたらマクロを実行しています。

コードの流れ

STEP.1
Excelインスタンスを生成する
Excelインスタンスを生成します。
STEP.2
マクロが含まれるExcelファイルのフルパス、モジュール名、サブルーチン名を取得する
マクロが含まれるExcelファイルのフルパス、モジュール名、サブルーチン名を取得します。
STEP.3
Excelファイルを開いてマクロを実行する
Excelファイルを開いてマクロを実行します。
STEP.4
Excelを閉じる
Excelを閉じます。
STEP.5
COMオブジェクトへの参照を解放する
COMオブジェクトへの参照を解放します。

Excelファイルのマクロの例

今回は下のExcelファイルのマクロを用意しました。

Option Explicit

Sub test()

    MsgBox "テスト"

End Sub

Sheet1のシートモジュールにあるtestサブルーチン内にメッセージボックスを表示させるコードが存在しています。

PowerShellのコードを実行すると、以下の通りにメッセージボックスが出力されました。

PowerShellのコード(例)

注意
今回のコードはCOMオブジェクトを扱うので、コードが終了した後にExcelのプロセスが残っていないか確認・テストを行ってから自己責任でご参照・利用ください。
# Excelアプリケーションのインスタンスを生成する
$excel = New-Object -ComObject Excel.Application

# モジュール名を取得する
$mdlNM = "Sheet1"

# サブルーチン名を取得する
$sbrNM = "test"

# Excelファイルのフルパスを取得する
$excelFile = "C:\work\10_勉強\18_PowerShell\0029\0029.xlsm"

# Excelファイルを開く
$workbook = $excel.Workbooks.Open($excelFile)

# マクロを実行する
$excel.Run($mdlNM + "." + $sbrNM)

# Excelファイル閉じる
$workbook.Close()

# Excelアプリケーションを閉じる
$excel.Quit()

# COMオブジェクトへの参照を解放する
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel) | Out-Null

# Excelアプリケーションオブジェクトを参照する変数excelを削除する
Remove-Variable excel

注目すべきコード①

最初に見て頂きたいのは2行目です。

# Excelアプリケーションのインスタンスを生成する
$excel = New-Object -ComObject Excel.Application

コードの説明

以上のコードは、Excelアプリケーションのインスタンスを生成することでExcelファイルを開いたり、マクロを閉じるなどの操作が可能になります。

注目すべきコード③

次に見て頂きたいのは5行目から11行目です。

# モジュール名を取得する
$mdlNM = "Sheet1"

# サブルーチン名を取得する
$sbrNM = "test"

# Excelファイルのフルパスを取得する
$excelFile = "C:\work\10_勉強\18_PowerShell\0029\0029.xlsm"

コードの説明

以上のコードは、マクロが含まれるExcelファイルのフルパス、モジュール名、サブルーチン名を取得する処理のコードです。

注目すべきコード④

次に見て頂きたいのは14行目です。

# Excelファイルを開く
$workbook = $excel.Workbooks.Open($excelFile)

コードの説明

以上のコードは、Excelファイルを開く処理のコードです。

OpenメソッドにExcelファイルのフルパスを指定して実行するとExcelファイルが開きます。

注目すべきコード⑤

次に見て頂きたいのは17行目です。

# マクロを実行する
$excel.Run($mdlNM + "." + $sbrNM)

コードの説明

以上のコードは、マクロを実行する処理のコードです。

Runメソッドの引数に「モジュール名」+「.」+「サブルーチン名」(例:Sheet1.test)のとおりに指定して実行することでマクロが実行されます。

注目すべきコード⑥

次に見て頂きたいのは20行目から23行目です。

# Excelファイル閉じる
$workbook.Close()

# Excelアプリケーションを閉じる
$excel.Quit()

コードの説明

以上のコードは、Excelファイルを閉じてExcelアプリケーションも閉じる処理のコードです。

注目すべきコード⑦

次に見て頂きたいのは26行目から29行目です。

# COMオブジェクトへの参照を解放する
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel) | Out-Null

# Excelアプリケーションオブジェクトを参照する変数excelを削除する
Remove-Variable excel

コードの説明

以上のコードは、COMオブジェクトへの参照を解放し、Excelアプリケーションオブジェクトを参照する変数excelを削除する処理のコードです。

ReleaseComObjectメソッドの引数にExcelアプリケーションのインスタンスを指定して実行することで、COMオブジェクトへの参照が解放されます。

また、指定された名前の変数を削除するRemove-Variableコマンドレットを実行し、スクリプトの実行中に使用されたメモリリソースを解放します。

動作確認

Excelファイルのマクロの例」をご覧ください。

最後に

この記事では、C#からExcelVBAのマクロを呼び出す方法についてご説明します。

C#からExcelVBAのマクロを呼び出したい場合は本記事を参考にして頂けたら幸いです。

プログラミングのスキルを習得するなら

プログラミングのスキルを習得したい、今のスキルをもっと高めたい、そう考えているなら「プログラミングスクール」がおすすめです。

プログラミングのスキルの基礎を身につけるなら「TechAcademy」で1週間の無料体験があるので、これで「プログラミングの基礎」を学ぶのにおすすめですよ。

→ TechAcademyの「1週間 無料体験」はこちら