PowerShell①Excel自動操作編
2020年9月16日
忙しさにかまけて投稿を先送り、気付けば前回の投稿から1年経ちました。高本です。
心機一転、新しいことに挑戦、ということで「PowerShell」を触ってみたいと思います。
Win10には標準で「PowerShell」が入ってるので、興味がある方は実行してみてください。
第一回の目的は「Excelを開いて値を入力・保存する」です。
①「PowerShell」を開く
・ 「Windowsキー+R」で「ファイル名を指定して実行」を開く
・ 「powershell」と入力して「OK」をクリックする

②作業フォルダ(カレントディレクトリ)をデスクトップにする
・ 「cd Desktop」と入力して「Enterキー」を押す

③「PowerShell」にプログラムを書く
・ 下記のコードをコピーして、PowerShellの上で右クリック(ペースト)してみてください。
# ここから |
|
$Excel = New-Object -ComObject
Excel.Application | # Excelアプリケーションオブジェクトを $Excel 変数に格納する |
$Path =
(Convert-Path .) +
"\test.xlsx" | # 作業フォルダのパスを $Path
変数に格納する |
$Excel = New-Object -ComObject
Excel.Application | # Excelアプリケーションオブジェクトを $Excel 変数に格納する |
$Excel.Visible = $True | # Excelオブジェクトを表示する |
$Book = $Excel.Workbooks.add() | # 新しいワークブックオブジェクトを $Book 変数に格納する |
$Book.Sheets(1).Range("A1").Value
= "Hello World!!" | # ワークブック の1番目のシートのA1セルに "Hello World!!" と入力する |
$Book.Sheets(1).Range("A2").Value
= "こんにちは!!" | # ワークブック の1番目のシートのA2セルに "こんにちは!!" と入力する |
$Book.SaveAs($Path) | # ワークブックを $Path のフォルダパスに格納する |
$Book.Close() | # ワークブックを閉じる |
$Excel.Quit() | # Excelを終了する |
# ここまで |
|

デスクトップに「test.xlsx」が作成できていて、A1、A2セルに値があれば成功です。
これだけでは実用性はありませんが、意外と簡単に扱えましたね! これで第一回を終わります!
…と言いたいところですが、実はまだプロセスが削除されていません。
タスクマネージャからプロセスを見ると「Excel」が開いたまま
開放されていないことが確認出来ます。

調査した結果、「PowerShell」ではCOMオブジェクトは手動でオブジェクト開放が必要とのこと。
オブジェクトを開放するためには、更に下記のコードも必要です。
# ここから |
# $Book.Close()の直後に下記を実行 |
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($Book)
| Out-Null |
$Book = $null |
[System.GC]::Collect() |
[System.GC]::WaitForPendingFinalizers() |
[System.GC]::Collect() |
# $Excel.Quit() の直後に下記を実行 |
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($Excel)
| Out-Null |
$Excel = $null |
[System.GC]::Collect() |
[System.GC]::WaitForPendingFinalizers() |
[System.GC]::Collect() |
# ここまで |
COMオブジェクトの破棄にクセがありますね。
「PowerShell」でCOMオブジェクトを扱うのは、あまり得策ではないかもしれません。
第一回目なのに「PowerShell」の魅力を全く引き出せず…。次回にご期待下さい!