指定ディレクトリ下のExcelファイル(.xlsx)内に指定した文字列がある場合、ファイル名、シート名、セルの座標、セルの値を返すスクリプトです。
沢山あるExcelファイルから特定の文字を含むファイルを探すことが出来ると便利かと作ってみました。
<#
.SYNOPSIS
Excelファイル内の文字検索
.DESCRIPTION
指定ディレクトリ内のExcelファイルを一括検索します。
.EXAMPLE
PS>Sample-Excel.ps1 -TargetDir:"ディレクトリ" -Keayword :"検索文字列"
#>
param(
[string]$TargetDir = "H:\ps1\excel_data",
[string]$Keyword = "小中"
)
function Search-Excel
{
param(
[string]$fullPath,
[string]$keyword
)
$Excel = New-Object -ComObject Excel.Application # Excel起動
try
{
$Excel.Visible = $False # 表示・非表示
$workbook = $Excel.Workbooks.Open($fullPath) # ワークブックを開く
$workbook.Worksheets | % {
$sheetName = $_.Name
$range = $_.UsedRange # 使われている範囲を取得
$r = $range.Find($keyword) # 検索初回
if ($r -eq $Null)
{
# 初回検索で見つからない
} else {
# 初回検索の位置を記憶
$firstColumn = $r.Column
$firstRow = $r.Row
do {
[PSCustomObject]@{"FullPath"=$fullPath;
"Sheet" = $sheetName;
"Address" = $r.Address();
"Value" = $r.Value()} # 該当行を出力
$r = $range.FindNext($r) # 二回目以降検索
if ($r -eq $Null)
{
break # ループ終了
}
} while ($r.Column -ne $firstColumn -Or $r.Row -ne $firstRow) # 継続条件
}
}
$workbook.Close() | Out-Null # ワークブックを閉じる
}
finally
{
$Excel.Quit() | Out-Null # Excelを終了
$Excel = $Null
[System.GC]::Collect() | Out-Null # ガーベージコレクト
}
}
ls $TargetDir -Filter "*.xlsx" -Recurse | % { Search-Excel $_.FullName $Keyword }
PowerShellで書いてはいますが中身はほぼVBAな代物です。
残念ながらExcelファイルごとにExcelの起動と終了をしているのでかなり動作は遅いです。
一度作成したExcelのインスタンスを使いまわすように作ることが出来れば高速化するのですが…
追記20230320
Excelのインストールが必要ないバージョン
Excelのインストールが必要ないバージョン
PowerShellでExcelファイル内の文字列を一括検索、再び
Excelの.xlsxファイルの実態が.zipファイルだと知りました。それならばPowerShellスクリプトで内部の.xmlファイルから文字検索が出来るでは無いかと思い試作してみました。スクリプトファイル名:XlsxSearch.ps1<...
コメント
[…] PowerShellでExcelファイル内の文字列を一括検索 […]