VBAではサクッとできたから、PowerShellでもできるよね?ってのを試したくなって。
ポイントはこんなとこ?
- New-ObjectでExcelのCOMオブジェクトを作る
- Excelの動作の設定をする(設定はVBAとかC#とかと似てる)
- Excelのファイルを開く
- セル名をRangeで指定しつつセルの値を取得する
- Excelのファイルを閉じる
- COMオブジェクトを破棄する
スクリプトはこんな感じ。
# 読み取るExcelの情報を変数に設定する
$filename = "C:\Users\tetsuyanbo\Desktop\Sample.xlsx"
$sheetname = "Table"
$rangename = "Target"
# 変数を定義する
$excel = $null
$workbook = $null
$worksheet = $null
try
{
# ExcelのCOMオブジェクトを取得する
$excel = New-Object -ComObject Excel.Application
# Excelの動作の設定をする
$excel.Visible = $false
$excel.DisplayAlerts = $false
# Excelファイルの指定したシートのセルの値を取得する
$workbook = $excel.Workbooks.Open($filename)
$worksheet = $workbook.Sheets($sheetname)
$value = $worksheet.Range($rangename).Text
# 取得したセルの値をコンソールに表示する
Write-Host "シート名:" $worksheet.Name
Write-Host "セル名:" $rangename
Write-Host "取得したセルの値:" $value
}
catch
{
# エラーメッセージを表示する
Write-Error("Error"+$_.Exception)
}
finally
{
# COMオブジェクトを開放する
# ※ReleaseComObjectは戻り値0を返してくるんだけど
# コンソールに0が表示されるので変数で受け取って表示しないようにする
if($worksheet -ne $null)
{
# ワークシートを破棄する
$result = [System.Runtime.InteropServices.Marshal]::ReleaseComObject($worksheet)
}
if($workbook -ne $null)
{
# Excelファイルを閉じる
$workbook.Close($false)
$result = [System.Runtime.InteropServices.Marshal]::ReleaseComObject($workbook)
}
if($excel -ne $null)
{
# Excelを閉じる
$excel.Quit()
$result = [System.Runtime.InteropServices.Marshal]::ReleaseComObject($excel)
}
}
# 実行はおしまい
Write-Host "おしまい"
読み込むExcelのファイルはこんな感じ。
Tableって名前のシートにして、B2のセルにTargetって名前をつけた。
セルの値は”ここの値を取得する”って文字列にしといて、PowerShellのスクリプトがちゃんと動いてたらコンソールに表示されるはず。
PowerShellのスクリプトを実行するときのコマンドはこんな感じ。
powershell -ExecutionPolicy Bypass -File Proto.ps1
実行したらこんな感じにコンソールに表示された。
うん、ちゃんと動いとる。
シート名: Table セル名: Target 取得したセルの値: ここの値を取得する おしまい
そんなこんなで、明日への自分へメモってことで。
