PowerShellメモ Excelのセルの値をセル名を指定して取得してみる

PowerShell

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
取得したセルの値: ここの値を取得する
おしまい

そんなこんなで、明日への自分へメモってことで。

PowerShellReadExcelByCellName