Ecxel per Script bearbeiten jeden Tag
Moin Zusammen,
ich hoffe die Frage ist hier halbwegs richtig. Und zwar habe ich folgendes "Problem".
Wir in der Firma haben eine Excel Tabelle, die aus dem System ausgegeben wird. Die Mitarbeiter passen diese dann händisch an. Das passiert jeden Tag.
Das Ding ist, es kostet Zeit und ist im endeffekt immer die selbe Aufgabe.
Ich versuche das mal halbwegs zu erklären.
Wir bekommen aus dem System Auswertungen als csv raus. In diesen Feldern stehen Abkürzungen vom System, die wir leider bei der Ausgabe nicht verändern können.
Nun ist unser Ablauf wie folgt. In der CSV stehen dann Werte wie 11 oder 1004 oder 2243 (hinter diesen Steckt dann eine Information.
Die Mitarbeiter gehen nun bei und löschen dieses kürzel und ersetzen es durch den richtigen Wert.
Beispiele:
11 - ersetzt durch - 0800P11700
1004 - ersetzt durch - 0900P05160
Diese Werte können dann von einem anderen System weiterverarbeitet werden.
Das sind jeden Tag etwa 100 Felder die die Mitarbeiter händisch ersetzen. Die Werte sind dabei immer gleich, also die 11 steht immer für 0800P11700
Da ich in Excel nicht so fitt bin, wüsste ich nicht wie ich das richtig lösen sollte. Ich hatte schon an einen querverweis gedacht.
Aber auch ein Skript wäre möglich, in dem dann die Werte verändert werden. Nach dem Motto: Überall wo 11 steht, durch 0800P11700 ersetzen.
Die 11 taucht nämlich öfter in der csv aus und das leider immer in verschiednen Spalten, je nachdem wie das System auswertet.
Irgendwie stehe ich auf dem Schlauch und würde das den Mitarbeitern gerne vereinfachen. Die verbringen jeden Tag 15-20 Minuten dabei das zu ändern.
Ich bin für jeden Vorschlag dankbar.
Mit freundlichen Grüßen
Milord
ich hoffe die Frage ist hier halbwegs richtig. Und zwar habe ich folgendes "Problem".
Wir in der Firma haben eine Excel Tabelle, die aus dem System ausgegeben wird. Die Mitarbeiter passen diese dann händisch an. Das passiert jeden Tag.
Das Ding ist, es kostet Zeit und ist im endeffekt immer die selbe Aufgabe.
Ich versuche das mal halbwegs zu erklären.
Wir bekommen aus dem System Auswertungen als csv raus. In diesen Feldern stehen Abkürzungen vom System, die wir leider bei der Ausgabe nicht verändern können.
Nun ist unser Ablauf wie folgt. In der CSV stehen dann Werte wie 11 oder 1004 oder 2243 (hinter diesen Steckt dann eine Information.
Die Mitarbeiter gehen nun bei und löschen dieses kürzel und ersetzen es durch den richtigen Wert.
Beispiele:
11 - ersetzt durch - 0800P11700
1004 - ersetzt durch - 0900P05160
Diese Werte können dann von einem anderen System weiterverarbeitet werden.
Das sind jeden Tag etwa 100 Felder die die Mitarbeiter händisch ersetzen. Die Werte sind dabei immer gleich, also die 11 steht immer für 0800P11700
Da ich in Excel nicht so fitt bin, wüsste ich nicht wie ich das richtig lösen sollte. Ich hatte schon an einen querverweis gedacht.
Aber auch ein Skript wäre möglich, in dem dann die Werte verändert werden. Nach dem Motto: Überall wo 11 steht, durch 0800P11700 ersetzen.
Die 11 taucht nämlich öfter in der csv aus und das leider immer in verschiednen Spalten, je nachdem wie das System auswertet.
Irgendwie stehe ich auf dem Schlauch und würde das den Mitarbeitern gerne vereinfachen. Die verbringen jeden Tag 15-20 Minuten dabei das zu ändern.
Ich bin für jeden Vorschlag dankbar.
Mit freundlichen Grüßen
Milord
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 379673
Url: https://administrator.de/contentid/379673
Ausgedruckt am: 12.11.2024 um 22:11 Uhr
16 Kommentare
Neuester Kommentar
Moin,
korrekt, mit der PowerShell recht zügig erledigt:
PowerShell Skript suchen und ersetzen in einer CSV
Wenn du im WW etwas weiter suchst,kannst du noch folgendes bauen:
erstelle eine Umsetzung.txt, welche deine Umsetzung enthält
Für jede Zeile in der Umsetzung lässt du die Werte in deiner csv dann ersetzen.
Weitere Hilfe:
https://www.msxfaq.de/code/powershell/pscsv.htm
https://www.windowspro.de/script/schleifen-powershell-foreach-while-do-u ...
Gruß
em-pie
korrekt, mit der PowerShell recht zügig erledigt:
PowerShell Skript suchen und ersetzen in einer CSV
Wenn du im WW etwas weiter suchst,kannst du noch folgendes bauen:
erstelle eine Umsetzung.txt, welche deine Umsetzung enthält
11;0800P11700
1004;0900P05160
Weitere Hilfe:
https://www.msxfaq.de/code/powershell/pscsv.htm
https://www.windowspro.de/script/schleifen-powershell-foreach-while-do-u ...
Gruß
em-pie
Moin,
vorsicht! Das kann schnell nach hinten losgehen. Nehmen wir mal an, dass in einer Spalte die 11 wie gewünscht steht. In der nächsten Spalte steht 110 z. B. als Mengenangabe. Wenn Du blind 11 durch 0800P11700 ersetzt, dann ersetzt Du das in beiden Spalten, so dass auch in der zweiten nicht mehr 110, sondern 0800P117000 steht. Du solltest also vor dem Ersetzen per Regex prüfen, ob das zu ersetzende alleine steht oder Teil eines anderen Strings ist.
hth
Erik
vorsicht! Das kann schnell nach hinten losgehen. Nehmen wir mal an, dass in einer Spalte die 11 wie gewünscht steht. In der nächsten Spalte steht 110 z. B. als Mengenangabe. Wenn Du blind 11 durch 0800P11700 ersetzt, dann ersetzt Du das in beiden Spalten, so dass auch in der zweiten nicht mehr 110, sondern 0800P117000 steht. Du solltest also vor dem Ersetzen per Regex prüfen, ob das zu ersetzende alleine steht oder Teil eines anderen Strings ist.
hth
Erik
Zitat von @Milord:
Wenn ich allerdings eine xls Datei damit anpassen will, dann ist die Datei danach beschädigt. Hat noch jemand einen Tipp für mich?
Jupp: XLS-Dateien sind Binär-Dateien: https://msdn.microsoft.com/en-us/library/office/cc313154(v=office.12).as ...Wenn ich allerdings eine xls Datei damit anpassen will, dann ist die Datei danach beschädigt. Hat noch jemand einen Tipp für mich?
Servus,
ersetzt alle Zellen die genau dem Suchstring entsprechen:
Das
Grüße Uwe
ersetzt alle Zellen die genau dem Suchstring entsprechen:
Das
$objExcel.Visible = $true
ist optional und zeigt dir nur das etwas passiert.# Quelldatei
$quelle = 'D:\demo.xls'
# Suchstring
$searchString = '1000'
# Ersetzungs String
$replaceWith = '0800P11700'
# Excel Objekt
$objExcel = New-Object -Com Excel.Application
# Mappe öffnen
$wb = $objExcel.Workbooks.Open($quelle)
# Excel anzeigen, Dialoge und Screenupdating deaktivieren
$objExcel.Visible = $true
$objExcel.DisplayAlerts = $false
# Finde Zellen mit dem Inhalt
$wb.Sheets.Item(1).UsedRange | ?{$_.Value() -eq $searchString} | %{
# Zellenformat auf Text setzen
$_.NumberFormat = "@"
# Wert setzen
$_.Value() = $replaceWith
}
# Datei speichern, Dialoge und Screenupdating wieder einschalten
$wb.Save()
$objExcel.DisplayAlerts = $true
# Dokument schließen
$wb.Close($true)
# Excel schließen
$objExcel.Quit()
# Ressourcen freigeben
[System.Runtime.InteropServices.Marshal]::ReleaseComObject($objExcel)
Nun muss ich noch die Spaltengröße anpassen
Kein Thema, folgendes passt alle Spalten mit Daten automatisch an den Inhalt an:$wb.Sheets.Item(1).UsedRange.EntireColumn.Autofit()
Ich muss mich wohl einfach mehr mit Powershell beschäftigen.
Alls das was hier genutzt wird kommt aus VBA, d.h. vieles kannst du direkt aus Makros übernehmen, aber es gibt einige Ausnahmen für Konstanten und Eigenheiten bei der Nutzung mit der Powershell etc.pp.- https://msdn.microsoft.com/en-us/vba/excel-vba/articles/object-model-exc ...
- Office 2013 Developer References
Wenns das dann war, den Beitrag bitte noch auf gelöst setzen, und Lösungen markieren. Merci.
Zitat von @Milord:
Nun stehe ich aber vor dem nächsten Problem, wo ich eigentlich bis vorhin dachte, dass es klappt.
Ich wollte nun mehrere Änderungen machen. Dafür wollte ich mehrmals hintereinander folgenden Befehl einfügen.
das kannst du 1.000.000 mal machen - wird sich aber auf deine Datei nicht auswirkenNun stehe ich aber vor dem nächsten Problem, wo ich eigentlich bis vorhin dachte, dass es klappt.
Ich wollte nun mehrere Änderungen machen. Dafür wollte ich mehrmals hintereinander folgenden Befehl einfügen.
$searchString = '1000'
> # Ersetzungs String
> $replaceWith = '0800P11700'
Das klappt aber nicht, ich meine das hat vorhin noch funktioniert.
sicherlich nichtWas dir fehlt, ist eine Schleife
Dazu machst du dir z.B. einfach eine Liste (Hashtable) mit den Such- und Ersetzungsbegriffen und iterierst einfach über diese Liste in einer Schleife
# Quelldatei
$quelle = 'C:\backup\test.xls'
$map = @{
'1000' = '0800P11700'
'2000' = '0800XXXX00'
}
# Excel Objekt
$objExcel = New-Object -Com Excel.Application
# Mappe öffnen
$wb = $objExcel.Workbooks.Open($quelle)
# Excel anzeigen, Dialoge und Screenupdating deaktivieren
$objExcel.Visible = $true
$objExcel.DisplayAlerts = $false
# Finde Zellen mit dem Inhalt
$map.GetEnumerator() | %{
# Suchstring
$searchString = $_.Key
# Ersetzungs String
$replaceWith = $_.Value
$wb.Sheets.Item(1).UsedRange | ?{$_.Value() -eq $searchString} | %{
# Zellenformat auf Text setzen
$_.NumberFormat = "@"
# Wert setzen
$_.Value() = $replaceWith
}
}
$wb.Sheets.Item(1).UsedRange.EntireColumn.Autofit()
# Datei speichern, Dialoge und Screenupdating wieder einschalten
$wb.Save()
$objExcel.DisplayAlerts = $true
# Dokument schließen
$wb.Close($true)
# Excel schließen
$objExcel.Quit()
# Ressourcen freigeben
[System.Runtime.InteropServices.Marshal]::ReleaseComObject($objExcel)