pat.bat
Goto Top

PowerShell Excel - Wörter mit Umlaute aus Array lesen um in Excel zu suchen

Hallo zusammen,

Ich stecke momentan an einem kleinen Problem fest.

Ich habe eine Excel datei, die ich per PowerShell öffne um dort ein paar unnötige Spalten zu löschen, soweit so gut. Nun gibt es eine Spalte wo in der Beschriftung ein Umlaut vorhanden ist.
Dazu habe ich ein Array das mit Spaltenbezeichnungen gefüllt ist für Spalten die ich gerne behalten möchte, alle anderen soll er löschen.

Im Array scheint alles zu stimmen, aber im Bereich wo er durch die Spalten looped muss es ein Problem geben.

$count = $xls.UsedRange.Columns.Count
$count..1|ForEach-Object{
    if($xls.Cells.Item(1,$_).Text -notin $SpaltenBehalten)
        {[void]$xls.Cells.Item(1,$_).EntireColumn.Delete()}
       }


Vielen Dank im Voraus.

Content-Key: 621162

Url: https://administrator.de/contentid/621162

Ausgedruckt am: 28.03.2024 um 10:03 Uhr

Mitglied: TK1987
TK1987 11.11.2020 aktualisiert um 14:32:39 Uhr
Goto Top
Moin,

ein grundlegender Denkfehler in deinem Code:
UsedRange gibt dir nur den von-bis Bereich von Zellen aus, die auch Inhalt haben - dieser muss nicht zwangsläufig mit Spalte A anfangen!
Wenn also in Spalte A kein Inhalt steht, zählst du komplett falsch.

Ein weiteres Problem: Sobald eine Spalte gelöscht wird, ändern sich die Spaltennummern der restlichen Spalten.
Die Nachbarspalte derer, die du gerade gelöscht hast, erhält also nun die Nummer der gelöschten Spalte und wird nicht mehr überprüft, da du ja weiter hoch zählst.

Umlaute machen keine Probleme, sofern in deinem Array der selbe Inhalt steht.
Ein Vorschlag, der auch die von mir angesprochenen Probleme löst:
$SpalteLöschen = $xls.UsedRange.Rows(1).Cells | Where-Object {$_.Text -notin $SpaltenBehalten}
[void]$SpalteLöschen.EntireColumn.Delete()
$xls.UsedRange.Rows(1).Cells gibt nur die Zellen aus Zeile 1 des beschriebenen Bereichs aus.
Mit Where-Object geben wir von diesen Zellen nur noch die aus, die nicht in $SpalteBehalten stehen.

Gruß Thomas