PowerShellでExcelファイル内の文字列を一括検索

Excel コンピュータ
Microsoft Excel

指定ディレクトリ下の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のインスタンスを使いまわすように作ることが出来れば高速化するのですが…

コメント