Excelファイルからファイル名と特定のセルの情報をCSVファイルに書き出すPowershell

定型フォーマットから値を抜き出すのに使用できます。尚ファイル名や値の重複については無視して1ファイル1行で出力します。文字コードは使用する環境に合わせて保存してください。

#ローカルファイル版

# --- 設定項目 ---
$folderPath = "C:\Folder\Path" # 対象フォルダ
$outputFile = "C:\Folder\Path\result.csv" # 出力CSVファイル
$targetSheetName = "Sheet1" # 抽出したいシート名を入力
$targetCell = "A1" # 抽出したいセル
# ----------------

$files = Get-ChildItem -Path $folderPath -Filter *.xl*
$excel = New-Object -ComObject Excel.Application
$excel.Visible = $false
$excel.DisplayAlerts = $false

$results = New-Object System.Collections.Generic.List[PSObject]

foreach ($file in $files) {
try {
$workbook = $excel.Workbooks.Open($file.FullName, [Type]::Missing, $true)

# 指定したシートが存在するか確認
$sheet = $null
foreach ($s in $workbook.Sheets) {
if ($s.Name -eq $targetSheetName) {
$sheet = $s
break
}
}

if ($sheet -ne $null) {
$cellValue = $sheet.Range($targetCell).Text
$results.Add([PSCustomObject]@{
"FileName" = $file.Name
"SheetName" = $targetSheetName
"CellValue" = $cellValue
})
} else {
# シートが見つからなかった場合
$results.Add([PSCustomObject]@{
"FileName" = $file.Name
"SheetName" = "NOT FOUND"
"CellValue" = "N/A"
})
}

$workbook.Close($false)
}
catch {
$results.Add([PSCustomObject]@{
"FileName" = $file.Name
"SheetName" = "ERROR"
"CellValue" = "取得失敗"
})
}
}

$excel.Quit()
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel) | Out-Null

# CSV出力 (UTF8BOM付きでExcelでの文字化けを防止)
$results | Export-Csv -Path $outputFile -NoTypeInformation -Encoding utf8

Write-Host "完了!シート '$targetSheetName' から抽出しました。"
#ネットワーク共有対応版

# --- 設定項目 ---
$folderPath = "\\ServerName\SharedFolder\Target" # ネットワークのUNCパスを指定
$outputFile = "C:\Temp\result.csv" # 出力先はローカルドライブを推奨
$targetSheetName = "Sheet1" # 抽出したいシート名
$targetCell = "A1" # 抽出したいセル
# ----------------

# ファイル一覧を取得
$files = Get-ChildItem -Path $folderPath -Filter *.xl*
$totalFiles = $files.Count
$currentIndex = 0

if ($totalFiles -eq 0) {
Write-Host "指定されたパスにExcelファイルが見つかりません。"
exit
}

$excel = New-Object -ComObject Excel.Application
$excel.Visible = $false
$excel.DisplayAlerts = $false
# ネットワーク上のファイルを開く際のマクロやセキュリティ警告を無効化
$excel.AutomationSecurity = 3

$results = New-Object System.Collections.Generic.List[PSObject]

foreach ($file in $files) {
$currentIndex++
# プログレスバーを表示(ネットワーク越しは時間がかかるため)
Write-Progress -Activity "Excelデータ抽出中 (ネットワーク)" -Status "$currentIndex / $totalFiles : $($file.Name)" -PercentComplete (($currentIndex / $totalFiles) * 100)

try {
$workbook = $excel.Workbooks.Open($file.FullName, [Type]::Missing, $true)

$sheet = $null
foreach ($s in $workbook.Sheets) {
if ($s.Name -eq $targetSheetName) {
$sheet = $s
break
}
}

if ($sheet -ne $null) {
$cellValue = $sheet.Range($targetCell).Text
$results.Add([PSCustomObject]@{
"FileName" = $file.Name
"SheetName" = $targetSheetName
"CellValue" = $cellValue
})
} else {
$results.Add([PSCustomObject]@{
"FileName" = $file.Name
"SheetName" = "NOT FOUND"
"CellValue" = "N/A"
})
}

$workbook.Close($false)
}
catch {
$results.Add([PSCustomObject]@{
"FileName" = $file.Name
"SheetName" = "ERROR"
"CellValue" = "取得失敗"
})
}
}

# プログレスバーを閉じる
Write-Progress -Activity "Excelデータ抽出中" -Completed

$excel.Quit()
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel) | Out-Null

# CSV出力 (UTF8BOM付き)
$results | Export-Csv -Path $outputFile -NoTypeInformation -Encoding utf8

Write-Host "完了!ファイル数 $totalFiles 件の処理が終わり、$outputFile に保存されました。"
#複数のシートを抽出する&共有フォルダ対応版
# --- 設定項目 ---
$folderPath = "\\ServerName\SharedFolder\Target" # ネットワークのUNCパスを指定
$outputFile = "C:\Temp\result.csv" # 出力先CSV(ローカル推奨)
$targetPrefix = "機能設定" # 検索したいシート名の先頭文字(例:4文字)
$targetCell = "A1" # 抽出したいセル
# ----------------

# ファイル一覧を取得
$files = Get-ChildItem -Path $folderPath -Filter *.xl*
$totalFiles = $files.Count
$currentIndex = 0

if ($totalFiles -eq 0) {
Write-Host "指定されたパスにExcelファイルが見つかりません。"
exit
}

$excel = New-Object -ComObject Excel.Application
$excel.Visible = $false
$excel.DisplayAlerts = $false
$excel.AutomationSecurity = 3

$results = New-Object System.Collections.Generic.List[PSObject]

foreach ($file in $files) {
$currentIndex++
Write-Progress -Activity "Excelデータ抽出中" -Status "$currentIndex / $totalFiles : $($file.Name)" -PercentComplete (($currentIndex / $totalFiles) * 100)

try {
$workbook = $excel.Workbooks.Open($file.FullName, [Type]::Missing, $true)

$matchFound = $false # 一致するシートが1つでもあったか判定するフラグ

# ブック内の全シートをループ処理
foreach ($s in $workbook.Sheets) {
# シート名が指定文字数以上で、かつ先頭が指定文字列と一致するか判定
if ($s.Name.Length -ge $targetPrefix.Length -and $s.Name.Substring(0, $targetPrefix.Length) -eq $targetPrefix) {

$cellValue = $s.Range($targetCell).Text
$results.Add([PSCustomObject]@{
"FileName" = $file.Name
"SheetName" = $s.Name # 実際のシート名を記録
"CellValue" = $cellValue
})
$matchFound = $true
}
}

# 1つも条件に合うシートがなかった場合
if (-not $matchFound) {
$results.Add([PSCustomObject]@{
"FileName" = $file.Name
"SheetName" = "NOT FOUND"
"CellValue" = "N/A"
})
}

$workbook.Close($false)
}
catch {
$results.Add([PSCustomObject]@{
"FileName" = $file.Name
"SheetName" = "ERROR"
"CellValue" = "取得失敗"
})
}
}

Write-Progress -Activity "Excelデータ抽出中" -Completed

$excel.Quit()
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel) | Out-Null

# CSV出力 (UTF8BOM付き)
$results | Export-Csv -Path $outputFile -NoTypeInformation -Encoding utf8

Write-Host "完了!ファイル数 $totalFiles 件の処理が終わり、$outputFile に保存されました。"
#シート名に関連性がない場合にすべてのシートの特定のセルを抽出する版
#抽出後に手作業や別途マクロ作成が必要です
# --- 設定項目 ---
$folderPath = "\\ServerName\SharedFolder\Target" # ネットワークのUNCパスなどを指定
$outputFile = "C:\Temp\result_allsheets.csv" # 出力先CSV(ローカル推奨)
$targetCell = "A1" # 抽出したいセル
# ----------------

# ファイル一覧を取得
$files = Get-ChildItem -Path $folderPath -Filter *.xl*
$totalFiles = $files.Count
$currentIndex = 0

if ($totalFiles -eq 0) {
Write-Host "指定されたパスにExcelファイルが見つかりません。"
exit
}

# Excelアプリケーションを起動
$excel = New-Object -ComObject Excel.Application
$excel.Visible = $false
$excel.DisplayAlerts = $false
$excel.AutomationSecurity = 3 # マクロやセキュリティ警告を無効化

$results = New-Object System.Collections.Generic.List[PSObject]

foreach ($file in $files) {
$currentIndex++
Write-Progress -Activity "Excelデータ抽出中 (全シート対象)" -Status "$currentIndex / $totalFiles : $($file.Name)" -PercentComplete (($currentIndex / $totalFiles) * 100)

try {
# 読み取り専用でブックを開く
$workbook = $excel.Workbooks.Open($file.FullName, [Type]::Missing, $true)

# ブック内の全シートを無条件でループ処理
foreach ($s in $workbook.Sheets) {
$cellValue = $s.Range($targetCell).Text

$results.Add([PSCustomObject]@{
"FileName" = $file.Name
"SheetName" = $s.Name
"CellValue" = $cellValue
})
}

$workbook.Close($false)
}
catch {
# ファイル自体が開けなかった場合などのエラー処理
$results.Add([PSCustomObject]@{
"FileName" = $file.Name
"SheetName" = "ERROR"
"CellValue" = "取得失敗"
})
}
}

Write-Progress -Activity "Excelデータ抽出中 (全シート対象)" -Completed

# Excelを終了してメモリを解放
$excel.Quit()
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel) | Out-Null
[System.GC]::Collect()
[System.GC]::WaitForPendingFinalizers()

# CSV出力 (UTF8BOM付き)
$results | Export-Csv -Path $outputFile -NoTypeInformation -Encoding utf8

Write-Host "完了!ファイル数 $totalFiles 件(全シート)の処理が終わり、$outputFile に保存されました。"

ご参考まで

関連記事

TOP