benomatic
Goto Top

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.

$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

Content-Key: 135107

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

Printed on: April 16, 2024 at 09:04 o'clock

Mitglied: 76109
76109 Feb 03, 2010 at 17:28:20 (UTC)
Goto Top
Hallo benomatic!

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
Member: benomatic
benomatic Feb 03, 2010 at 18:04:19 (UTC)
Goto Top
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
Member: Biber
Biber Feb 03, 2010 at 18:18:24 (UTC)
Goto Top
[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?
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

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. face-wink

Grüße
Biber]
[/OT]
Member: benomatic
benomatic Feb 03, 2010 at 18:39:04 (UTC)
Goto Top
Hi didi1954 & Biber,

also das lustige ist ja das nur am Ende der Spalte ein "Delete Cells Left" passiert.

Ich habe eine Constante eingegeben

Set-Variable xlShiftUp -option Constant -value "-4162 (&HFFFFEFBE)"

auch habe ich das in

$ws.Cells.Item($i+1,$j).Delete()::xlShiftUp

geändert. Beides (sowohl xlShiftUp als auch ShiftxlUp) ohne erfolg.

Wie gesagt beides hat funktioniert, nur bis zum ende der ersten Spalte.
Ich dachte ich mach das mal ebend und jetzt sitze ich mehr als 5 Stunden an diesem Mist.
Mitglied: 76109
76109 Feb 03, 2010 at 19:39:16 (UTC)
Goto Top
Hallo benomatic, Hallo Biber!

Naja, nun scheinen wir ja fast im gleichen Film zu sein?face-smile

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 ShiftUpface-wink

Ich denke mal in etwa so:
Set-Variable xlShiftUp -option Constant -value -4162

@Biber
Es ist immer wieder erfrischend Deine Kommentare zu lesenface-smile

Gruß Dieter
Member: benomatic
benomatic Feb 03, 2010 at 20:07:33 (UTC)
Goto Top
Ich hab das mal so geändert, aber immer noch das gleiche Problem, in der letzten Zelle der ersten Spalte passiert statt ein "Shift Cell Up" ein "Shift Cell Left"

$excel = New-Object -comobject Excel.Application 		# create base object
$excel.visible = $true 									# make Excel visible 
cls 													# Clear Screen
ls c:\Morphometrie.xls									# verify object exists
$wb = $excel.workbooks.open("c:\Morphometrie.xls")		# open the workbook
$ws = $wb.Worksheets.item(2)							# open worksheet
Set-Variable xlShiftUp -option Constant -value -4162 

$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)
		Write-Host Zelle Value: $ws.Cells.Item($i+1,$j).Text nach Zelle: Y: $i, X: {$j+1} `n
		if($ws.Cells.Item($i+2,$j) -ne "")
		{
			$ws.Cells.Item($i+1,$j).Delete()::xlShiftUp
			Write-Host Zelle indeX: "{$i+1}" ,Y: "$j" Gelöscht `n
		}
		$i+=1
	}
	$j += 8
	$i  = 2
}
#close workbook && excel
$wb.SaveAs("c:\Morphometrie_new.xls")
$excel.Quit()
spps -n excel
Mitglied: 76109
76109 Feb 03, 2010 at 20:33:22 (UTC)
Goto Top
Hallo benomatic!

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

Gruß Dieter
Member: benomatic
benomatic Feb 04, 2010 at 06:53:57 (UTC)
Goto Top
Danke didi1954,

ich hab mir mal die VBA Syntax angeschaut, leider verstehe ich da nur Bahnhof.

Wie würd in VBA ein einfaches

while ( Bedingung ) { tu was }

aussehen ?

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.

Gruss beno
Mitglied: 76109
76109 Feb 04, 2010 at 08:31:29 (UTC)
Goto Top
Hallo beno!

Zitat von @benomatic:
ich hab mir mal die VBA Syntax angeschaut, leider verstehe ich da nur Bahnhof.
So ähnlich geht's mir mit Powershell, noch nie mit befasstface-wink
Wie würd in VBA ein einfaches
while ( Bedingung ) { tu was }
aussehen ?
In etwa so:
    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?

Zum besseren Verständnis könntest Du mal ein ein Ist- und Soll-Tabellenbeispiel als Screenshot postenface-wink

Gruß Dieter


PS. Setze Deinen Code in Code-Tags, sodass man den Quellcode auch vernüftig kopieren kann
<$code>
<$/code>
ohne Dollarzeichen
Member: benomatic
benomatic Feb 04, 2010 at 08:53:52 (UTC)
Goto Top
Super das klappt face-smile echt vielen Dank ich hatte mich auch schon in der Hölle der VBA Programmierung versucht. Hat aber nicht so richtig geklappt.

Hier mal mein Ansatz:
Spaltenanzahl = ActiveSheet.Cells(2, Columns.Count).End(xlToLeft).Column
While Cells(1, Spaltenanzahl).Text <> "Length/µM"
    j = ActiveCell.Columns
    Zeilenanzahl = ActiveSheet.Cells(Rows.Count, j).End(xlUp).Row
    For i = 3 To Zeilenanzahl
        Cells(i + 1, j).Select
        Selection.Cut
        Cells(i, j + 1).Select
        ActiveSheet.Paste
        Cells(i + 1, j).Select
        Selection.Delete Shift:=xlUp
    Next i
Wend

Trotzdem vielen Dank
Beno
Mitglied: 76109
76109 Feb 04, 2010 at 09:18:45 (UTC)
Goto Top
Hallo benomatic!

Wo befindet sich das Makro, in dem zugehörigen Tabellenblatt oder in einem Modul?

Und soll
.Text <> "Length/µM"
tatsächlich ungleich(<>) oder doch gleich(=) heißen

Gruß Dieter
Member: benomatic
benomatic Feb 04, 2010 at 21:48:08 (UTC)
Goto Top
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.

Gruss beno
Mitglied: 76109
76109 Feb 04, 2010 at 22:38:27 (UTC)
Goto Top
Hallo beno!

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 merkenface-smile Kleiner(<) und Größer(>) ergibt zusammen Ungleich, Gleich(=), KleinerGleich(<=) und GrößerGleich(>=)
Dann hast Du beim Zusammenschustern ja gleich was gelerntface-smile 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:
Text Text usw

Gruß Dieter