Excelには外部データ接続(Power Queryなど)を使って最新データを取り込む機能があります。 この記事では PowerShell 5.x を使って、次の処理を自動化します👇
- Excelのデータ接続をすべて更新
- 「日付」と「ステータス」で複合フィルタ
- フィルタ後のデータを JSON 出力(非連続セルにも対応)
💻 スクリプト全文
# Requires -Version 5.1 param( [Parameter(Mandatory=$true)] [string]$ExcelPath, [Parameter(Mandatory=$false)] [string]$OutputJson = "$(Split-Path $ExcelPath -Parent)\filtered.json", [int]$DaysBack = 30, [string]$StatusFilter = "Active" ) $xlCellTypeVisible = 12 $xlAnd = 1 $excel = New-Object -ComObject Excel.Application $excel.Visible = $false $excel.DisplayAlerts = $false try { $wb = $excel.Workbooks.Open($ExcelPath) $wb.RefreshAll() while (-not $excel.CalculateUntilAsyncQueriesDone()) { Start-Sleep -Milliseconds 500 } $ws = $wb.Worksheets.Item(1) $table = $ws.ListObjects.Item(1) $dateCol = ($table.ListColumns | Where-Object { $_.Name -eq "Date" }).Index $statusCol = ($table.ListColumns | Where-Object { $_.Name -eq "Status" }).Index $cutoff = (Get-Date).AddDays(-$DaysBack) try { $table.AutoFilter.ShowAllData() } catch {} $ws.Range($table.Name).AutoFilter($dateCol, ">=" + $cutoff.ToOADate(), $xlAnd) $ws.Range($table.Name).AutoFilter($statusCol, $StatusFilter, $xlAnd) $visibleCells = $table.DataBodyRange.SpecialCells($xlCellTypeVisible) $headers = $table.ListColumns | ForEach-Object { $_.Name } $rows = @() foreach ($area in @($visibleCells.Areas)) { $data = $area.Value2 if ($null -eq $data) { continue } if ($data -is [object[,]]) { for ($r = 1; $r -le $data.GetLength(0); $r++) { $obj = @{} for ($c = 1; $c -le $headers.Count; $c++) { $obj[$headers[$c-1]] = $data[$r,$c] } $rows += [PSCustomObject]$obj } } else { $obj = @{} for ($c = 1; $c -le $headers.Count; $c++) { $obj[$headers[$c-1]] = $data[$c] } $rows += [PSCustomObject]$obj } } if ($rows.Count -gt 0) { $rows | ConvertTo-Json -Depth 5 | Out-File $OutputJson -Encoding UTF8 Write-Host "✅ Exported: $OutputJson" } } finally { $wb.Close($false) $excel.Quit() [System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel) | Out-Null }
⚙️ 実行例
powershell -ExecutionPolicy Bypass -File .\Export-FilteredExcelToJson.ps1 ` -ExcelPath "C:\Data\Report.xlsx" ` -DaysBack 30 ` -StatusFilter "Active"
🧠 ポイント
機能 | 説明 |
---|---|
Excel更新 | Workbook.RefreshAll() で最新データを取得 |
複合フィルタ | Date+Status の2条件をExcel内部でAND処理 |
高速化 | 可視セルだけを .Value2 で転送 |
安定性 | 非連続領域(Areas)にも対応 |
出力形式 | JSON (UTF-8) で保存 |