internet2107
Goto Top

Powershell, Excel - Löschen einer leeren Spalte (Column)

Hallo zusammen.
Ich habe folgendes Problem. Ich finde zwar bereits im Internet diverse Beispielcodes und Hilfen, aber leider ist noch nicht die perfekte, bzw. fehlerfreie Lösung dabei.
Ich habe ein Exceldokument, was ich mit Powershell öffne/bearbeite. Das klappt auch soweit einwandfrei. Nur habe ich in der Tabelle Spalten, die keine Daten enthalten und demnach gelöscht werden müssen, um eine bessere Übersichtlichkeit zu erreichen. Die bisherigen Codes löschen entweder gar nichts oder löschen alles.
Ein vorhandenes Makro (VBA) läuft einwandfrei, jedoch tue ich mich schwer bei der Konvertierung des Makros nach Powershell.

Ich habe mal als Beispiel ein Screenshot der Exceltabelle angehängt und ein paar dieser leeren Reihen mit einem Pfeil gekennzeichnet. Exceltabelle

Hier dazu der Code, der leider nicht so funktioniert, wie ich es benötige.

#delete columns

$xlCellTypeLastCell = 11
$used = $worksheet.usedRange
$lastCell = $used.SpecialCells($xlCellTypeLastCell)
$Column = $lastCell.Column

for ($i = 1; $i -le $Column; $i++)
{
	while ($worksheet.Cells.Item(1, 5).Value() -eq $Null)
	{
		$Range = $worksheet.Cells.Item(1, 5).EntireColumn
		$Range.Delete([Microsoft.office.interop.excel.xldeleteshiftdirection]::xlShiftToLeft)
		
	}
}

bzw. hier der VBA-Code

Sub DelEmptyCols()
Dim rng As Range
xTitleId = ""  
Set InputRng = Application.ActiveSheet.UsedRange
Application.ScreenUpdating = False
For i = InputRng.Columns.Count To 1 Step -1
Set rng = InputRng.Cells(1, i).EntireColumn
If Application.WorksheetFunction.CountA(rng) = 0 Then
rng.Delete
End If
Next
Application.ScreenUpdating = True
End Sub

Wunsch wäre, dass die mit dem Pfeil gekennzeichneten Reihen entsprechend gelöscht werden, wenn die Zellen in den Reihen keine Daten enthalten, was in diesem Fall immer zu 99,9% der Fall ist.

Vielen Dank!!!

Content-Key: 245577

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

Printed on: April 25, 2024 at 10:04 o'clock

Member: colinardo
colinardo Aug 05, 2014 updated at 08:41:38 (UTC)
Goto Top
Hallo Internet2107, Willkommen auf Administrator.de!

Beispiel das die Zellen A1 bis zur letzten verwendeten Spalte nach Rechts auf leere Zellen durchsucht und diese dann entfernt:
$objExcel = New-Object -ComObject Excel.Application
$objExcel.Visible = $true
$wb = $objExcel.Workbooks.Open("C:\demo.xlsx")  
$ws = $wb.Worksheets.Item(1)
$xlToLeft = -4159
# Array in dem wir die nicht benutzen Spalten speichern
$arrCols = @()
# für jede Zelle im Bereich "A1" bis "letzte benutzte Spalte"  
foreach($cell in $ws.Range("A1",$ws.Cells.Item(1,$ws.Columns.Count).End($xlToLeft))){  
    if ($cell.Value() -eq $null){
        # wenn Zelle leer ist füge die gesamte Spalte zum Array hinzu
        $arrCols += $cell.EntireColumn
    }
}
# Lösche die leeren Spalten
$arrCols | %{$_.Delete() | out-null}
Grüße Uwe
Member: internet2107
internet2107 Aug 05, 2014 at 13:14:48 (UTC)
Goto Top
SUPER!!. Genauso wie ich es mir vorgestellt habe. Danke !!!