PowerShellメモ Excelのセルの値をセル名を指定して取得してみる
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 取得したセルの値: ここの値を取得する おしまい
そんなこんなで、明日への自分へメモってことで。
ディスカッション
コメント一覧
まだ、コメントがありません