Top-Themen

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

Mit der Powershell Excelsheets bearbeiten

Mitglied: benomatic

benomatic (Level 1) - Jetzt verbinden

03.02.2010, aktualisiert 04.02.2010, 14295 Aufrufe, 13 Kommentare

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
Mitglied: 76109
03.02.2010 um 18:28 Uhr
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
Bitte warten ..
Mitglied: benomatic
03.02.2010 um 19:04 Uhr
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
Bitte warten ..
Mitglied: Biber
03.02.2010 um 19:18 Uhr
[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.

Grüße
Biber]
[/OT]
Bitte warten ..
Mitglied: benomatic
03.02.2010 um 19:39 Uhr
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.
Bitte warten ..
Mitglied: 76109
03.02.2010 um 20:39 Uhr
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:
Set-Variable xlShiftUp -option Constant -value -4162

@Biber
Es ist immer wieder erfrischend Deine Kommentare zu lesen

Gruß Dieter
Bitte warten ..
Mitglied: benomatic
03.02.2010 um 21:07 Uhr
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
Bitte warten ..
Mitglied: 76109
03.02.2010 um 21:33 Uhr
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
Bitte warten ..
Mitglied: benomatic
04.02.2010 um 07:53 Uhr
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
Bitte warten ..
Mitglied: 76109
04.02.2010 um 09:31 Uhr
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 befasst
Wie würd in VBA ein einfaches
while ( Bedingung ) { tu was }
aussehen ?
In etwa so:
01.
    i = 2
02.
    j = 2
03.
    
04.
    Do While (ws.Cells(i, j).Text = "Length/µM")
05.

06.
        i = i + 1
07.

08.
        Do While (ws.Cells(i, j).Text <> "")
09.
            ws.Cells(i, j + 1) = ws.Cells(i + 1, j)
10.
            ws.Cells(i + 1, j).Delete Shift:=xlShiftUp
11.
            i = i + 1
12.
        Loop
13.
      
14.
        j = j + 8
15.
        i = 2
16.
    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 posten

Gruß Dieter


PS. Setze Deinen Code in Code-Tags, sodass man den Quellcode auch vernüftig kopieren kann
<$code>
........
<$/code>
ohne Dollarzeichen
Bitte warten ..
Mitglied: benomatic
04.02.2010 um 09:53 Uhr
Super das klappt 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
Bitte warten ..
Mitglied: 76109
04.02.2010 um 10:18 Uhr
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
Bitte warten ..
Mitglied: benomatic
04.02.2010 um 22:48 Uhr
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
Bitte warten ..
Mitglied: 76109
04.02.2010 um 23:38 Uhr
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 merken 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:
Text Text usw

Gruß Dieter
Bitte warten ..
Ähnliche Inhalte
Microsoft Office

Excelsheet gesperrt durch nicht mehr vorhandenen AD-User

Frage von Dopamin85Microsoft Office5 Kommentare

Hallo zusammen, wir haben seit langer Zeit folgendes Phänomen: Ein bestimmtes Exelsheet wird immer wieder mal durch einen AD-User ...

Batch & Shell

Remote Powershell ausführen wie lokale Powershell

gelöst Frage von IngenieursBatch & Shell2 Kommentare

Hallo vielleicht ist der Titel nicht ganz deutlich formuliert. Ich möchte wissen ob es eine Möglichkeit gibt Remote Powershell ...

Windows Server

PowerShell Remoting

gelöst Frage von derhoeppiWindows Server4 Kommentare

Hallo, ich habe ein Problem beim PowerShell Remoting. In meinem Lab habe ich einen bidirektionalen Trust zweier unabhängiger Domains ...

Batch & Shell

Powershell Übergabeparameter

Frage von Bommi1961Batch & Shell1 Kommentar

Hallo zusammen! Ich weis das ist hier schon oft beschrieben wurden, aber leider bekomme ich es nicht hin. Mein ...

Neue Wissensbeiträge
Humor (lol)

"Linux und 5 Gründe Warum man kein Windows verwenden sollte sondern Ubuntu Linux"

Tipp von Snowbird vor 4 StundenHumor (lol)8 Kommentare

Gerade gefunden. Ja, ist etwas älter, aber irgendwie lustig?

Humor (lol)

"Warum Linux in einer vernetzten Welt einfach keinen Komfort bietet!"

Tipp von Snowbird vor 22 StundenHumor (lol)13 Kommentare

Ein interessanter Einblick warum Linux nichts für Geräteübergreifende Arbeit ist :)

Humor (lol)
Zuviel Speicher ist ungesund. :-)
Tipp von Lochkartenstanzer vor 1 TagHumor (lol)14 Kommentare

Moin Kollegen, Heute hatte ich ein ungewöhnliches Aha-Erlebnis: Über das Wochenende habe ich einen einen 6 Jahre alten Bare-Metal ...

Windows Update

KB4517297 verfügbar, behebt Fehler in VB6 VBA VBScript

Information von sabines vor 1 TagWindows Update

Das Update behebt mögliche Fehler in VB6, VBA und VBScript, die durch das Update KB4512486 vom August entstanden sind. ...

Heiß diskutierte Inhalte
Router & Routing
Deinstalliertes Geräte wird in FritzBox noch immer als verbundenes Gerät angezeigt
gelöst Frage von imebroRouter & Routing18 Kommentare

Hallo, in meiner FritzBox 7490 wird im Bereich "Funknetz" ein Gereät bei den verbundenen Geräten angezeigt, wobei ich nicht ...

Batch & Shell
PowerShell - Text an HTMLbody übergeben mit UTF-8 Kodierung
Frage von Pat.batBatch & Shell14 Kommentare

Hallo zusammen, ich stoße momentan auf folgendes Problem. Ich möchte mit meinem Skript E-Mails versenden. Text und Signatur samt ...

Sonstige Systeme
Ist es möglich ein ISDN-Telefon an einen analogen Anschluss anzuschließen?
Frage von cramtroniSonstige Systeme14 Kommentare

Also anders herum geht es ja, da gibt es ja diese Adapter von RJ11 auf TAE-F, aber gibt es ...

Humor (lol)
Zuviel Speicher ist ungesund. :-)
Tipp von LochkartenstanzerHumor (lol)14 Kommentare

Moin Kollegen, Heute hatte ich ein ungewöhnliches Aha-Erlebnis: Über das Wochenende habe ich einen einen 6 Jahre alten Bare-Metal ...