Powershell l oop для замены Excel - PullRequest
0 голосов
/ 05 мая 2020

Я нашел здесь немного кода при переполнении стека и добавил несколько бит. Он работает как шарм с текущими настройками ... На Sheet1 в столбцах от A до D.

Я бы хотел, чтобы он работал на всех листах в книге. Но я не могу думать о том, что работает.

Это мой код, который работает на Sheet1:

$replacecount = 0
$file = "H:\test4.xlsx"
$Excel = New-Object -ComObject Excel.Application
$Excel.Visible = $false
$Workbook = $Excel.workbooks.open($file)
$SearchString = "2019-AUG"
$replacestring = "2020-MAY"

$Worksheet = $Workbook.Worksheets.Item(1)
$Range = $Worksheet.Range("A1:D1").EntireColumn

    write-output $worksheet.index

    $Search = $Range.find($SearchString)
    if ($search -ne $null) {
        $FirstAddress = $Search.Address
        do {
            $search.Value() = $Search.value() -Replace $SearchString, $replacestring  
            $search = $Range.FindNext($search)
            $replacecount++
        } while ($search -ne $null -and $search.Address -ne $FirstAddress)
    }

Write-output "status Close"
Write-output $replacecount

$WorkBook.Save()
$WorkBook.Close()

Я думаю, что мне следует использовать FOREACH (лист на листе), но когда я пытаюсь установить диапазон внутри l oop Получаю ошибку

1 Ответ

0 голосов
/ 05 мая 2020

Рассмотрите возможность зацикливания на свойстве Excel Sheets.Count :

$num = $Workbook.Sheets.Count()

For ($i = 1; $i -le $num; $i++) {
    write-host $Workbook.Worksheets.Item($i).Name

    $Worksheet = $Workbook.Worksheets.Item($i)
    $Range = $Worksheet.Range("A1:D1").EntireColumn

    write-output $worksheet.index

    $Search = $Range.find($SearchString)
    if ($search -ne $null) {
        $FirstAddress = $Search.Address
        do {
            $search.Value() = $Search.value() -Replace $SearchString, $replacestring  
            $search = $Range.FindNext($search)
            $replacecount++
        } while ($search -ne $null -and $search.Address -ne $FirstAddress)
    }

}

В качестве альтернативы, напрямую l oop на листах, а не через индекс листа с Item как комментирует @Theo:

foreach ($Worksheet in $Workbook.Worksheets){
        write-host $Worksheet.Name

        # $Worksheet = $Workbook.Worksheets.Item($i)   REMOVE THIS ASSIGNMENT
        ...
}
...