製品コラム

セイテクエンジニアのブログ  製品コラム  PowerShell: Excelシートからセルの値を取得したい-Windows FAQ(仮)

 

 

PowerShell: Excelシートからセルの値を取得したい-Windows FAQ(仮)

2024年10月16日配信
2024年10月16日更新
執筆者:セイ・テクノロジーズ エバンジェリスト

 Officeアプリのコントロールと言えばVBA(Visual Basic for Applications)ですが、PowerShellからもCOMインターフェイスを介してOfficeアプリと比較的簡単にやり取りすることができます。例えば、弊社製品「SSD-assistance」は、サーバーからデータを収集し、Excel(.xlsx)形式のサーバー設定仕様書を自動生成しますが、その設定仕様書から特定の値を取得できれば現在のシステム設定との比較や、再設定に応用できるでしょう。


 今回はSSD-assistanceのサーバー設定仕様書を例にしていますが、PowerShellからExcelワークシートを扱う、汎用的な方法として紹介します。なお、この操作を行うには、ローカルコンピューターにMicrosoft 365(Office)アプリがインストールされている必要があります。

 

SSD-assistanceのサーバー設定仕様書を読む

 

 画面1は、「Windows設定仕様書【基本設定】」デザインを選択して自動生成させたサーバー設定仕様書です。ご覧のように、「表紙」(Sheet1)から始まる、複数のシートから構成されるExcelワークシート(.xlsx)形式のファイルです。一例として、「システム設定」という名前のシートの「コンピューター名」の値(セルのアドレスJ17)をPowerShellから取得してみましょう。

 

画面1
画面1 サンプルのサーバー設定仕様書

 PowerShellのウィンドウ(powershell.exeまたはpwsh.exe)を開き、以下のコマンドラインを順番に実行します。すると、$range.Value()が目的の値を返します(画面2)。

$filepath = "Excelワークシートのファイルパス"
$sheetname = "システム設定"
$celladdr = "J17"
$excel = New-Object -ComObject Excel.Application
$workbook = $excel.workbooks.Open($filepath)
foreach ($sheet in $workbook.Sheets) {
 if ($sheet.Name -eq $sheetname) {
    $range = $sheet.Range($celladdr)
    $range.Value()
 }
}
$workbook.Quit
$excel.Quit()
$excel=$null

 

画面2
画面2 COMインターフェイス経由でExcelワークシートを開き、特定のシートのセルの値を取得する

 

汎用スクリプト化: getvaluefromsheet.ps1


 先ほどのPowerShellのコマンドラインを、汎用的なスクリプトにしたものが、次の「getvaluefromsheet.ps1」です。このスクリプトを次のように実行することで、指定したExcelワークシートの指定したシートから、指定したセルのアドレスの値を取得できます(画面3)。このスクリプトは、SSD-assistanceのサーバー設定仕様書に限定されず、任意のExcelワークシートに利用できます。

.\getvaluefromsheet.ps1 -FilePath "Excelシートのパス" -SheetName "シート名" -CellAddr "セルのアドレス"

 

画面3
画面3 画面2を汎用化したスクリプト「getvaluefromsheet.ps1」

[getvaluefromsheet.ps1]getvaluefromsheet.txt形式でダウンロード

Param($FilePath,$SheetName,$CellAddr)
if ($PSBoundParameters.Count -ne 3)  { Write-host "Error: -FilePath <path> -SheetName <worksheetname> -CellAddr <Cell>" ;exit 1 }
If ( -not (Test-Path $FilePath)) { Write-host "Error: -FilePath <path> does not exist." ;exit 1 }
$excel = New-Object -ComObject Excel.Application
$workbook = $excel.workbooks.Open($filepath)

foreach ($sheet in $workbook.Sheets) {
 if ($sheet.Name -eq $sheetname) {
    $range = $sheet.Range($celladdr)
    $range.Value()
 }
}
$workbook.Quit
$excel.Quit()
$excel=$null
[System.GC]::Collect()

 

blog_column_subscribe

blog_column_comment

最新記事