In 10000 Excel07-Dateien in den immer in der selben Zelle ein Eintrag vorhanden ist sollen bis auf die letzten 6 Zahlen in diesem Feld ersetzt werden.
Hallo,
Erklärung:
Wir stellen unseren Teamcenter um auf eine neue Version und dabei hat unsere Gruppe beschlossen die 14 stelligen Zeichnungsnummern abzuändern so das die letzten 6 Ziffern erhalten bleiben aber der Rest soll ersetzt werden. Da es durch dieses Teamcenter auch abgeleitete Exceldateien gibt müssen diese jetzt geändert werden.
Weiter soll unterschieden werden zwischen Einzelteilen und Baugruppen
Die Zeichnungsnummer für Einzelteile sieht wie folgt z.B. aus "G-25-12-333333" soll jetzt umbenannt werden in z.B. "GE_33_13_333333" und für Baugruppen "G-25-12-222222" soll jetzt umbenannt werden in "GS_33_13_222222".
Also es müsste anhand der letzten 6 Ziffern unterschieden werden wie die Aktualierung zu erfolgen hat. Bei uns beginnen Einzelteil immer mit einer 3 und Bauteile mit einer 2. Also Enzelteil soll jetzt "GE_33_13_33333" und Bauteil "GS_33_13_222222" sein.
Jetzt kommt der Kniff dabei. Es handelt sich um ca. 10000 Exceldateien die in verschiedenen Verzeichnissen liegen.
Mein Wunsch wäre es wenn die Aktualisierung der Zeichnungsnummern in den Exceldatein ohne zu öffnen der Dateien funktioniert. Das wäre der Schritt 1.
Schritt 2 wäre es wenn jetzt noch automatisch der Dateinahme angepasst würde und zwar auch wieder nur ein Teil des Dateinamens. Leider ist durch verschiedene Ersteller der Dateien die gewünschte Änderung nicht immer an gleicher Stelle im Dateinamen. Aber es handelt sich immer um ein Datum das wie folg geschrieben ist "2013-02-15" nur jedes mal andere Datumsangaben. Dies sollte dann durch das aktuelle Datum ersetzt werden.
Schritt 3 wäre es wenn jetzt noch automatisch nach jeder Aktualisierung auch eine aktuelle pdf Dateierzeugt wird.
Mir ist bewusst das dies bestimmt eine grosse Herrausforderung ist aber es würde für mich eine Menge Arbeit ersparen.
Zumindestens würde mir 30% geholfen sein wenn ich Schritt 1 umsetzen könnte.
Danke im Vorraus für eure Unterstüzung
Gruß Roger
Erklärung:
Wir stellen unseren Teamcenter um auf eine neue Version und dabei hat unsere Gruppe beschlossen die 14 stelligen Zeichnungsnummern abzuändern so das die letzten 6 Ziffern erhalten bleiben aber der Rest soll ersetzt werden. Da es durch dieses Teamcenter auch abgeleitete Exceldateien gibt müssen diese jetzt geändert werden.
Weiter soll unterschieden werden zwischen Einzelteilen und Baugruppen
Die Zeichnungsnummer für Einzelteile sieht wie folgt z.B. aus "G-25-12-333333" soll jetzt umbenannt werden in z.B. "GE_33_13_333333" und für Baugruppen "G-25-12-222222" soll jetzt umbenannt werden in "GS_33_13_222222".
Also es müsste anhand der letzten 6 Ziffern unterschieden werden wie die Aktualierung zu erfolgen hat. Bei uns beginnen Einzelteil immer mit einer 3 und Bauteile mit einer 2. Also Enzelteil soll jetzt "GE_33_13_33333" und Bauteil "GS_33_13_222222" sein.
Jetzt kommt der Kniff dabei. Es handelt sich um ca. 10000 Exceldateien die in verschiedenen Verzeichnissen liegen.
Mein Wunsch wäre es wenn die Aktualisierung der Zeichnungsnummern in den Exceldatein ohne zu öffnen der Dateien funktioniert. Das wäre der Schritt 1.
Schritt 2 wäre es wenn jetzt noch automatisch der Dateinahme angepasst würde und zwar auch wieder nur ein Teil des Dateinamens. Leider ist durch verschiedene Ersteller der Dateien die gewünschte Änderung nicht immer an gleicher Stelle im Dateinamen. Aber es handelt sich immer um ein Datum das wie folg geschrieben ist "2013-02-15" nur jedes mal andere Datumsangaben. Dies sollte dann durch das aktuelle Datum ersetzt werden.
Schritt 3 wäre es wenn jetzt noch automatisch nach jeder Aktualisierung auch eine aktuelle pdf Dateierzeugt wird.
Mir ist bewusst das dies bestimmt eine grosse Herrausforderung ist aber es würde für mich eine Menge Arbeit ersparen.
Zumindestens würde mir 30% geholfen sein wenn ich Schritt 1 umsetzen könnte.
Danke im Vorraus für eure Unterstüzung
Gruß Roger
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 201804
Url: https://administrator.de/contentid/201804
Ausgedruckt am: 08.11.2024 um 09:11 Uhr
12 Kommentare
Neuester Kommentar
Hallo utroger!
Als VBScript etwa so:
Die Logdatei kannst du mit Excel öffnen und ggf passend sortieren, um fehlerhafte Dateien zu finden.
Grüße
bastla
[Edit] Zeilen 10, 59 und 61 aufgrund zusätzlicher Anforderungen (s. u.) ehinzugefügt [/Edit]
Als VBScript etwa so:
Basis = "D:\Excel-Dateien Zeichnungen"
Typ = "xlsx" 'in Kleinbuchstaben
LogDatei = "D:\Log.csv"
Delim =";" 'Trennzeichen für Logdatei
ZNrAdr = "B4" 'Zelle mit Zeichnungsnummer
ZNrNeu2 = "GS_33_13_" 'Neuer Namensteil für Bauteile
ZNrNeu3 = "GE_33_13_" 'Neuer Namensteil für Einzelteile
DatAdr = "H7" ' Zelle für Änderungsdatum
'Datumsstring für Dateinamen im Format "JJJJ-MM-TT" erstellen
AktDat = Mid(Date, 7, 4) & "-" & Mid(Date, 4, 2) & "-" & Left(Date, 2)
Set fso = CreateObject("Scripting.FileSystemObject")
Set oXL = CreateObject("Excel.Application")
Set LF = fso.CreateTextFile(LogDatei) 'Logdatei erzeugen
Set rE = New RegExp
rE.Pattern = "\d{4}-\d{2}-\d{2}" 'Regex-Suchmuster im Format "####-##-##"
DoSubFolders fso.GetFolder(Basis) 'rekursive Verarbeitung in Basis-Ordner starten
oXL.Quit
LF.Close
WScript.Echo "Fertig"
Sub DoSubFolders(Folder)
For Each File In Folder.Files 'alle Dateien des Ordners durchgehen
FName = File.Name 'Dateinamen zwischenspeichern
'nur Dateien des passenden Typs und solche, die noch nicht bearbeitet wurden
If LCase(fso.GetExtensionName(FName)) = Typ And InStr(FName, AktDat) = 0 Then
Set WB = oXL.Workbooks.Open(File.Path) 'Datei öffnen
FNameNeu = rE.Replace(FName, AktDat) 'neuen Namen mit aktuellem Datum erzeugen
If FName <> FNameNeu Then 'Dateiname geändert?
WB.SaveAs fso.GetParentFolderName(File.Path) & "\" & FNameNeu 'Datei unter neuem Namen speichern
Info = File.Path & Delim & FNameNeu 'Dateiinfo für Logdatei erzeugen
Else
Info = File.Path & Delim & "#Dateiname gleich" 'Hinweis auf unveränderten Dateinamen
End If
Set ZN = WB.WorkSheets(1).Range(ZNrAdr) 'Zelle mit Zeichnungsnummer zwischenspeichern
Kennung = Right(ZN.Value, 6) 'letzte 6 Stellen der ZNr als Kennung auslesen
Select Case Left(Kennung, 1) 'Unterscheidung anhand erster Stelle der Kennung
Case "2" 'Bauteil
ZNrNeu = ZNrNeu2 & Kennung 'neue Zeichnungsnummer erzeugen ...
ZN.Value = ZNrNeu '... und eintragen
Info = Info & Delim & ZNrNeu 'Info für Logdatei um neue Zeichnungsnummer ergänzen
Case "3" 'Einzelteil
ZNrNeu = ZNrNeu3 & Kennung 'neue Zeichnungsnummer erzeugen ...
ZN.Value = ZNrNeu '... und eintragen
Info = Info & Delim & ZNrNeu 'Info für Logdatei um neue Zeichnungsnummer ergänzen
Case Else 'Whatever
'Info für Logdatei um Hinweis auf unveränderte Zeichnungsnummer ergänzen
Info = Info & Delim & "#Zeichnungsnummer gleich"
End Select
WB.WorkSheets(1).Range(DatAdr).Value = Date 'Aktuelles Datum eintragen
WB.ExportAsFixedFormat 0, fso.GetParentFolderName(File.Path) & "\" & fso.GetBaseName(FNameNeu) & ".pdf" 'PDF erzeugen
LF.WriteLine Info 'Info in Logdatei schreiben
WB.Close True'Datei speichern und schließen
End If
Next
For Each SubFolder in Folder.SubFolders 'rekursive Verabeitung der Unterordner
DoSubFolders SubFolder
Next
End Sub
Grüße
bastla
[Edit] Zeilen 10, 59 und 61 aufgrund zusätzlicher Anforderungen (s. u.) ehinzugefügt [/Edit]
Hallo bastla!
Und warum SaveAs, anstatt einfaches Umbenennen
So, speicherst Du jede Datei 2 mal und die alten Dateien müssten dann ja auch noch irgendwie entsorgt werden?
Eventeuell wäre noch ein On Error-Test zu überdenken und zwar für den Fall, dass eine Datei bereits anderweitig geöffnet ist?
Gruß Dieter
Und warum SaveAs, anstatt einfaches Umbenennen
So, speicherst Du jede Datei 2 mal und die alten Dateien müssten dann ja auch noch irgendwie entsorgt werden?
Eventeuell wäre noch ein On Error-Test zu überdenken und zwar für den Fall, dass eine Datei bereits anderweitig geöffnet ist?
Gruß Dieter
Hallo Dieter!
Grüße
bastla
Und warum SaveAs, anstatt einfaches Umbenennen
Hatte ich mir auch überlegt - so ganz genau ist allerdings die Problembeschreibung nicht geraten, daher ist das auch keine Lösung, sondern nur ein Ansatz ...Eventeuell wäre noch ein On Error-Test zu überdenken und zwar für den Fall, dass eine Datei bereits anderweitig geöffnet ist?
Dass eine Datei geöffnet ist, sollte wohl bei einer derartigen Aktion schon organisatorisch verhindert werden, aber schaden kann's natürlich nicht.Grüße
bastla
... und noch als Nachtrag: Mit der folgenden Zeile 57 sollte sich (Excel 2007 mit SP 2 oder zumindest dem "Speichern unter – PDF oder XPS -AddIn" bzw eine neuere Excel-Version vorausgesetzt) auch das gewünschte PDF erzeugen lassen:
Grüße
bastla
WB.ExportAsFixedFormat 0, fso.GetParentFolderName(File.Path) & "\" & fso.GetBaseName(FNameNeu) & ".pdf"
bastla
Hallo bastla!
Gruß Dieter
... und noch als Nachtrag...
Bei einer Arbeitserleichterung von 100% gibt's ja nix mehr zu meckern...Gruß Dieter
Hallo utroger!
Zu 1.: ja
Zu 2.: Die Log-Datei wird erstellt, um den Ablauf nachvollziehen zu können - Du kannst sie, nachdem das Script durchgelaufen ist, mit Excel öffnen.
Und nur zur Sicherheit: Das Script ist nicht per VBA (in Excel) auszuführen, sondern ein VBScript - daher mit dem Dateityp ".vbs" speichern und per Doppelklick starten.
Grüße
bastla
Zu 1.: ja
Zu 2.: Die Log-Datei wird erstellt, um den Ablauf nachvollziehen zu können - Du kannst sie, nachdem das Script durchgelaufen ist, mit Excel öffnen.
Und nur zur Sicherheit: Das Script ist nicht per VBA (in Excel) auszuführen, sondern ein VBScript - daher mit dem Dateityp ".vbs" speichern und per Doppelklick starten.
Grüße
bastla