utroger
Goto Top

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

Content-ID: 201804

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

Ausgedruckt am: 08.11.2024 um 09:11 Uhr

Alex1234
Alex1234 15.02.2013 um 10:28:59 Uhr
Goto Top
Das bekommst Du über ein EXCEL-Makro hin. Jedoch muss das Makro die Dateien öffnen, aber unter einem anderen Namen speichern (soll ja auch). Für einen EXCEL-VBA-Programmierer sollte das keine schwere Aufgabe sein.
bastla
bastla 15.02.2013, aktualisiert am 18.02.2013 um 12:02:00 Uhr
Goto Top
Hallo utroger!

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
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]
76109
76109 16.02.2013 um 15:38:33 Uhr
Goto Top
Hallo bastla!

Und warum SaveAs, anstatt einfaches Umbenennenface-wink

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
bastla
bastla 16.02.2013 um 19:19:01 Uhr
Goto Top
Hallo Dieter!
Und warum SaveAs, anstatt einfaches Umbenennenface-wink
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
bastla
bastla 16.02.2013 um 21:45:50 Uhr
Goto Top
... 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:
WB.ExportAsFixedFormat 0, fso.GetParentFolderName(File.Path) & "\" & fso.GetBaseName(FNameNeu) & ".pdf"
Grüße
bastla
76109
76109 17.02.2013 um 11:33:56 Uhr
Goto Top
Hallo bastla!

... und noch als Nachtrag...
Bei einer Arbeitserleichterung von 100% gibt's ja nix mehr zu meckern...face-wink

Gruß Dieter
utroger
utroger 18.02.2013 um 07:37:23 Uhr
Goto Top
Hallo bastla,
erstmal vielen Dank für deine Mühe.

zwei Fragen:

1. Basis = "D:\Excel-Dateien Zeichnungen" - verstehe ich das richtig, hier ist mein Verzeichnis einzutragen wo die Exeldateien Abglegt sind diese geändert werden sollen?

2. LogDatei = "D:\Log.csv" - Diese ist eine separate Datei in dieser eine Auflistung der Dateien erfolgt wo ich den Pfad auch entsprechend vorgeben muss?

Ich habe nach dem ich den entsprechend Pfad angegeben habe oder aber belasse eine Fehlermeldung:
"Fehler beim Kompilieren: Außerhalb einer Prozedur ungültig" und ich kann nicht wirklich was mit dieser Meldung anfangen auch wenn ich mit die Erklärung dafür ansehe. Sorry, könntest Du mir hier nochmal behilflich sein.

Danke
Gruß Roger
bastla
bastla 18.02.2013 um 08:06:09 Uhr
Goto Top
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
utroger
utroger 18.02.2013 um 09:36:59 Uhr
Goto Top
Hallo Basla,

funktioniert alles bestens, auch mit der pdf.

Eines habe ich vergessen. In den Exceldateien ist im Feld H7 das Datum eingetragen der letzten Aktualisierung.
Kannst Du das Script abändern das auch im Feld H7 das aktuelle Datum übernommen wird.

Danke
und im Vorraus noch mal besten Dank für deine Hilfe

Gruß Roger
bastla
bastla 18.02.2013 um 12:00:30 Uhr
Goto Top
Hallo utroger!

Ich habe oben die beiden zusätzlichen Wünsche (für PDF-Ausgabe und Datumseintrag) eingearbeitet ...

Grüße
bastla
utroger
utroger 18.02.2013 um 12:52:05 Uhr
Goto Top
Hallo Bastla,

jetzt ändert sich das Datum aber die Zeichnungsnummern nicht mehr.
Irgendwo steckt ein Fehler

Gruß Roger
utroger
utroger 18.02.2013 um 12:56:04 Uhr
Goto Top
klappt
Sorry, hatte ein Fehler bei mir eingebaut

Gruß Roger