PowerShell でExcelのボタンに紐づけられたマクロを実行する方法 (「ボタンを押す」と同義のこと)
1.環境
PowerShellのバージョンは以下の通り。
PS C:\Users\hisabo> $PSVersionTable Name Value ---- ----- PSVersion 5.1.18362.752 ・・・以下、略・・・
Excelはよくわからないけど、Office365って書かれている奴。
2.はじめに
Qiitaや技術系ブログなどを調べればいくらでも出てくる情報だが、実際に自分で試行したときのメモとして記録を残す。
3.目指すところ
- Excelのシート上に配置されたボタン(正確には、ボタンに紐づけられたマクロ)を実行するPowerShellスクリプトを作る
- 実行を繰り返す
- 繰り返しの間にSleepを入れる
- スクリプトの実行は、Windows PowerShell ISEから行う
4.やってみよう
Excelのシートにボタンを配置
まあ、ざっくりとこんな感じ。Book1.xlsmとして保存。
ボタンのプロパティは、こんな感じ。ほとんどデフォルト。
VBEにてコードを書く
test.txtとファイルに追記形式で日時と「あほ」という文言を書き出すだけのコード。Privateサブルーチンだが、PowerShellから呼び出せるか?
Private Sub CommandButton1_Click() Dim fn fn = FreeFile ' Get unused file Open ThisWorkbook.Path + "\test.txt" For Output As #fn Print #fn, Now & vbTab & "あほ" Close #fn End Sub
PowerShellスクリプト
「Excelを開いて、ボタン押して、Excel閉じる」を5秒間隔で10回繰り返すスクリプト。
$FilePath = "C:\temp\Book1.xlsm" $cnt = 0 do { # start Excel $excel = New-Object -comobject Excel.Application $workbook = $excel.Workbooks.Open($FilePath) $excel.Visible = $true ## Here you can "click" the button $app = $excel.Application $app.Run("Sheet1.CommandButton1_Click") $excel.Quit() $excel = $null [System.GC]::Collect() # GC実行 echo ("Count : " + $cnt) $cnt++ #Sleep 5 sec Start-Sleep -Seconds 5 }While($cnt -lt 10)
実行結果
どうやら無事実行できたようだ。test.txtの内容は以下の通り。微妙に5秒間隔ではないが、良しとしよう。
2020/05/17 16:46:08 あほ 2020/05/17 16:46:15 あほ 2020/05/17 16:46:23 あほ 2020/05/17 16:46:30 あほ 2020/05/17 16:46:37 あほ 2020/05/17 16:46:44 あほ 2020/05/17 16:46:51 あほ 2020/05/17 16:46:58 あほ 2020/05/17 16:47:05 あほ 2020/05/17 16:47:12 あほ
終.獲得した知識
- ExcelのマクロをPowerShellから実行する方法