Mit der Powershell Excelsheets bearbeiten
Hi Leute,
Ich versuche mit einem Powershellscript ein Excelsheet zu bearbeiten. Leider gelingt mir ein simples "Delete Cell" nicht so richtig.
Das Script springt zur 2ten Spalte in die 3te Zeile und kopiert deren Inhalt in benachberte darüberliegende Zelle. Danach soll die Zelle (3,2) gelöschtwerden und die darunter liegende Zelle "darüber geschoben" werden.
Hier ist das Problem, am anfang sieht alles Gut aus aber an der letzten Zelle der ersten spallte löscht es die Zelle von Links statt von unten.
Durch das löschen nach Links verziehen sich die benachberten Tabellen und alles ist für die Katz.
ich hoffe ich habe mich deutlich ausdrücken können, und danke
gruss ben
Ich versuche mit einem Powershellscript ein Excelsheet zu bearbeiten. Leider gelingt mir ein simples "Delete Cell" nicht so richtig.
Das Script springt zur 2ten Spalte in die 3te Zeile und kopiert deren Inhalt in benachberte darüberliegende Zelle. Danach soll die Zelle (3,2) gelöschtwerden und die darunter liegende Zelle "darüber geschoben" werden.
$excel = new-object -comobject Excel.Application # create base object
$excel.visible = $true # make Excel visible
cls # Clear Screen
$wb = $excel.workbooks.open("c:\Morphometrie_.xls") # open the workbook
$ws = $wb.Worksheets.item(1) # open worksheet
$i = 2
$j = 2
while ( $ws.Cells.Item($i,$j).Text -eq "Length/µM" ) {
$i+=1
while ($ws.Cells.Item($i,$j).Text -ne ""){
$ws.Cells.Item($i,$j+1) = $ws.Cells.Item($i+1,$j)
$ws.Cells.Item($i+1,$j).Selection.Delete()::ShiftxlUp
$i+=1
}
$j += 8
$i = 2
}
Hier ist das Problem, am anfang sieht alles Gut aus aber an der letzten Zelle der ersten spallte löscht es die Zelle von Links statt von unten.
Durch das löschen nach Links verziehen sich die benachberten Tabellen und alles ist für die Katz.
$ws.Cells.Item($i+1,$j).Selection.Delete()::ShiftxlUp
ich hoffe ich habe mich deutlich ausdrücken können, und danke
gruss ben
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 135107
Url: https://administrator.de/forum/mit-der-powershell-excelsheets-bearbeiten-135107.html
Ausgedruckt am: 18.05.2025 um 22:05 Uhr
13 Kommentare
Neuester Kommentar

Hallo benomatic!
Keine Ahnung von Powershell, aber müsstet Du die Variable "xlShiftUp" eventuell in Deinem Skipt definieren oder zumindest richtig schreiben?
Gruß Dieter
Keine Ahnung von Powershell, aber müsstet Du die Variable "xlShiftUp" eventuell in Deinem Skipt definieren oder zumindest richtig schreiben?
xlShiftUp = -4162 (&HFFFFEFBE) |
Gruß Dieter
[OT]
Moin benomatic,
bist du sicher, dass du grad im selben Film bist wie didi1954?
Oder zumindest im selben Kino?
Lies doch bitte noch mal didis Tipp... horizontal, von links nach rechts.
Ohne komplette Zeilen der Arbeitsmappe zu verziehen.
Grüße
Biber]
[/OT]
Moin benomatic,
Zitat von @76109:
Keine Ahnung von Powershell, aber müsstet Du die Variable "xlShiftUp" eventuell in Deinem Skipt definieren oder zumindest richtig schreiben?
Keine Ahnung von Powershell, aber müsstet Du die Variable "xlShiftUp" eventuell in Deinem Skipt definieren oder zumindest richtig schreiben?
xlShiftUp = -4162 (&HFFFFEFBE) |
Zitat von @benomatic:
Du hast recht das "selection" muss hier weg, aber sonst Funktioniert das, nur am Ende der ersten Spalte, löscht
"er" von Links und verzieht die Komplette Zeile des Arbeitsmappe. Das hat denn Effekt das die nächste Spalte kapputt ist.
$ws.Cells.Item($i+1,$j).Delete()::ShiftxlUp
Du hast recht das "selection" muss hier weg, aber sonst Funktioniert das, nur am Ende der ersten Spalte, löscht
"er" von Links und verzieht die Komplette Zeile des Arbeitsmappe. Das hat denn Effekt das die nächste Spalte kapputt ist.
$ws.Cells.Item($i+1,$j).Delete()::ShiftxlUp
bist du sicher, dass du grad im selben Film bist wie didi1954?
Oder zumindest im selben Kino?
Lies doch bitte noch mal didis Tipp... horizontal, von links nach rechts.
Ohne komplette Zeilen der Arbeitsmappe zu verziehen.
Grüße
Biber]
[/OT]

Hallo benomatic, Hallo Biber!
Naja, nun scheinen wir ja fast im gleichen Film zu sein?
Also, der Originalname der Variablen heißt in Excel "xlShiftUp" und ist als Longwert 'Const xlShiftUp=-4162' definiert. Der Wert in der Klammer ist nur als Kommentar zu werten, der den Dezimalwert in Long-Hexadezimal darstellt.
Die Powershell kennt diese Variable nicht und muss daher in Deinem Skript definiert werden, wobei es genaugenommen wurscht ist, ob die Variable in Deinem Skript nun sinnvollerweise den gleichen Namen oder einen anderen Namen erhält. Wichtig ist nur, dass der richtige Wert an Excel übergeben wird. Ansonsten kein ShiftUp
Ich denke mal in etwa so:
@Biber
Es ist immer wieder erfrischend Deine Kommentare zu lesen
Gruß Dieter
Naja, nun scheinen wir ja fast im gleichen Film zu sein?
Also, der Originalname der Variablen heißt in Excel "xlShiftUp" und ist als Longwert 'Const xlShiftUp=-4162' definiert. Der Wert in der Klammer ist nur als Kommentar zu werten, der den Dezimalwert in Long-Hexadezimal darstellt.
Die Powershell kennt diese Variable nicht und muss daher in Deinem Skript definiert werden, wobei es genaugenommen wurscht ist, ob die Variable in Deinem Skript nun sinnvollerweise den gleichen Namen oder einen anderen Namen erhält. Wichtig ist nur, dass der richtige Wert an Excel übergeben wird. Ansonsten kein ShiftUp
Ich denke mal in etwa so:
Set-Variable xlShiftUp -option Constant -value -4162 |
@Biber
Es ist immer wieder erfrischend Deine Kommentare zu lesen
Gruß Dieter

Hallo benomatic!
Also, in VBS oder VBA wäre die Syntax folgende:
Aber wie das in Powershell umzusetzen ist, keine Ahnung?
Gruß Dieter
Also, in VBS oder VBA wäre die Syntax folgende:
ws.Cells(i+1,j).Delete Shift:=xlShiftUp |
Gruß Dieter

Hallo beno!
So ähnlich geht's mir mit Powershell, noch nie mit befasst
Zum besseren Verständnis könntest Du mal ein ein Ist- und Soll-Tabellenbeispiel als Screenshot posten
Gruß Dieter
PS. Setze Deinen Code in Code-Tags, sodass man den Quellcode auch vernüftig kopieren kann
<$code>
<$/code>
ohne Dollarzeichen
So ähnlich geht's mir mit Powershell, noch nie mit befasst
Wie würd in VBA ein einfaches
aussehen ?
In etwa so:while ( Bedingung ) { tu was }
i = 2
j = 2
Do While (ws.Cells(i, j).Text = "Length/µM")
i = i + 1
Do While (ws.Cells(i, j).Text <> "")
ws.Cells(i, j + 1) = ws.Cells(i + 1, j)
ws.Cells(i + 1, j).Delete Shift:=xlShiftUp
i = i + 1
Loop
j = j + 8
i = 2
Loop
Wie man sieht suche ich ja in der Zeile 2 ein Wert = "Length/µM", wenn ich diesen gefunden habe dann gehe ich
durch die Spalte und fang mit dem Kopieren und Löschen an.
Wäre nett wenn man mir da eine Hilfe geben könnte.
Ist das jetzt so zu verstehen, dass Du das Ganze jetzt als VB-Skript oder als VBA-Excel-Makro schreiben willst?durch die Spalte und fang mit dem Kopieren und Löschen an.
Wäre nett wenn man mir da eine Hilfe geben könnte.
Zum besseren Verständnis könntest Du mal ein ein Ist- und Soll-Tabellenbeispiel als Screenshot posten
Gruß Dieter
PS. Setze Deinen Code in Code-Tags, sodass man den Quellcode auch vernüftig kopieren kann
<$code>
<$/code>
ohne Dollarzeichen

Hallo benomatic!
Wo befindet sich das Makro, in dem zugehörigen Tabellenblatt oder in einem Modul?
Und soll
tatsächlich ungleich(<>) oder doch gleich(=) heißen
Gruß Dieter
Wo befindet sich das Makro, in dem zugehörigen Tabellenblatt oder in einem Modul?
Und soll
.Text <> "Length/µM" |
Gruß Dieter

Hallo beno!
Kleiner(<) und Größer(>) ergibt zusammen Ungleich, Gleich(=), KleinerGleich(<=) und GrößerGleich(>=)
Dann hast Du beim Zusammenschustern ja gleich was gelernt
Und funktionierts jetzt?
Du hättest ja mal ein Screenshot mit einem Vor- und Nachherbeispiel posten können. Anhand der Code-Verwirrungen ist es schwierig zu erfassen, was eigentlich wo steht und genau passieren soll. Da hätte ich Dir in jedem Fall besser helfen können.
Und wenn das mit dem Scrennshot nicht klappt, dann kann mit entsprechenden Formatierhilfen auch eine Tabelle schreiben. z.B
2*| Leerzeichen Text Leerzeichen 2*| Leerzeichen Text Leerzeichen 2*| Leerzeichen usw 2*| ergibt:
Gruß Dieter
Zitat von @benomatic:
Ohje ich werde mir die Operatoren in VBA mal anschauen, wie gesagt ich habe vorher nie was mit VBA was gemacht. Hab mir das
zusammengeschustert aus etlichen VBA Howtos.
Ich Danke dir nochmal für deine Hilfe.
Die Vergleichsoperatoren sind doch einfach zu merkenOhje ich werde mir die Operatoren in VBA mal anschauen, wie gesagt ich habe vorher nie was mit VBA was gemacht. Hab mir das
zusammengeschustert aus etlichen VBA Howtos.
Ich Danke dir nochmal für deine Hilfe.
Dann hast Du beim Zusammenschustern ja gleich was gelernt
Du hättest ja mal ein Screenshot mit einem Vor- und Nachherbeispiel posten können. Anhand der Code-Verwirrungen ist es schwierig zu erfassen, was eigentlich wo steht und genau passieren soll. Da hätte ich Dir in jedem Fall besser helfen können.
Und wenn das mit dem Scrennshot nicht klappt, dann kann mit entsprechenden Formatierhilfen auch eine Tabelle schreiben. z.B
2*| Leerzeichen Text Leerzeichen 2*| Leerzeichen Text Leerzeichen 2*| Leerzeichen usw 2*| ergibt:
Text | Text | usw |
Gruß Dieter