Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

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

Frage Entwicklung VB for Applications

Mitglied: benomatic

benomatic (Level 1) - Jetzt verbinden

03.02.2010, aktualisiert 04.02.2010, 11889 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 ..
Neuester Wissensbeitrag
Microsoft

Lizenzwiederverkauf und seine Tücken

(5)

Erfahrungsbericht von DerWoWusste zum Thema Microsoft ...

Ähnliche Inhalte
Windows Server
gelöst Word-Dokument mit Powershell bearbeiten (5)

Frage von Peter0816 zum Thema Windows Server ...

Batch & Shell
Powershell - In Textdatei suchen und ersetzen (5)

Frage von Raaja89 zum Thema Batch & Shell ...

Batch & Shell
gelöst PowerShell Domain Join (2)

Frage von Patrick-IT zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (18)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Windows Netzwerk
Windows 10 RDP geht nicht (16)

Frage von Fiasko zum Thema Windows Netzwerk ...

Windows Server
Outlook Verbindungsversuch mit Exchange (15)

Frage von xbast1x zum Thema Windows Server ...