PowerShell①Excel自動操作編

忙しさにかまけて投稿を先送り、気付けば前回の投稿から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」が開いたまま
開放されていないことが確認出来ます。

CloseもQuitも効かないなんて…!

調査した結果、「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」の魅力を全く引き出せず…。次回にご期待下さい!

  • takamoto