Registriert seit: 06.09.2016
Version(en): 2016
Hallo wertes Forum, ich dreh am Rad... :20: Ich möchte alle Dateien in einem Ordner umbenennen (von z.B. Personalliste 20.11.2018 erl.xlsx in Personalliste 20181120 erl.xlsx). Dazu habe ich folgendes Makro: Code: Pfad = "G:\Produktion\Produktionsreporting\Personal\Test\" Datei = Dir(Pfad) Anzahl = 0 Do Until Datei = "" Anzahl = Anzahl + 1 Debug.Print Anzahl, Datei, "Personalliste " & Mid(Datei, 21, 4) & Mid(Datei, 18, 2) & Mid(Datei, 15, 2) & " erl.xlsx" Name Pfad & Datei As Pfad & "Personalliste " & Mid(Datei, 21, 4) & Mid(Datei, 18, 2) & Mid(Datei, 15, 2) & " erl.xlsx" Datei = Dir() Loop
Kommentiere ich die eigentliche Umbenennung aus, läuft's super und hört nach der richtigen Anzahl an Dateien auf. Ob alle Dateien richtig umbenannt wurden, weiß ich nicht. Sobald ich aber die Umbenennung laufen lasse, fängt das Makro irgendwann an, die bereits umbenannten Dateien nochmals umzubenennen. Wo ist der Fehler? Vielen Dank für Eure Hilfe, Lutz
Registriert seit: 05.11.2019
Version(en): 2010, 2019
18.12.2019, 17:49
(Dieser Beitrag wurde zuletzt bearbeitet: 18.12.2019, 17:49 von JereMaia.)
Probiere mal diesen Code: Code: Sub Umbenennen() On Error Resume Next
Dim Pfad As String Dim Anzahl As Long Dim Datei As String Dim Datei1 As String Dim Datei2 As String
'******** Init **** Pfad = "G:\Produktion\Produktionsreporting\Personal\Test\" Anzahl = 0 Datei = Dir(Pfad & "*.xlsx", vbNormal) Do Until (Datei = "") If (InStr(Left(Datei, Len(Datei) - 5), ".") > 0) Then Anzahl = Anzahl + 1 Datei1 = Pfad & Datei Datei2 = Pfad & "Personalliste " & Mid(Datei, 21, 4) & Mid(Datei, 18, 2) & Mid(Datei, 15, 2) & " erl.xlsx" Name Datei1 As Datei2 End If Datei = Dir() Loop
End Sub
Registriert seit: 06.12.2015
Version(en): 2016
Hallo, eine Aktion im File-System geht auch mit Powershell: Code: $Pfad = 'C:\Users\xxx\Desktop' # >>>> anpassen $Files = get-childitem $Pfad -Filter Per*.txt # >>> anpassen foreach ($f in $files) { $Dt = $f.Name | Select-String -Pattern '\d{2}\.\d{2}\.\d{4}' $Dt1 = '{0:yyyyMMdd}' -f (get-date -date $Dt.Matches.value) $Dt1 $neu = $f.Name -replace $Dt.Matches.value, $Dt1 $neu rename-item $f.FullName $neu }
mfg
Registriert seit: 29.09.2015
Version(en): 2030,5
PHP-Code: Sub M_snb() c00 = "G:\Produktion\Produktionsreporting\Personal\Test\" sn = Split(CreateObject("wscript.shell").exec("cmd /c dir " & c00 & "*.xlsx /b/a-d").stdout.readall, vbCrLf)
For j = 0 To UBound(sn) - 1 st = Split(sn(j)) st(1) = Format(st(1), "yyyymmdd") Name c00 & sn(j) As c00 & Join(st) Next End Sub
Registriert seit: 06.09.2016
Version(en): 2016
Hallo zusammen,
vielen Dank für Eure Hilfe.
@Fennek, PowerShell hab ich schonmal gehört, kann aber nicht wirklich was mit anfangen... @JereMaia, snb, damit sollte es funktioniern.
Aber wisst Ihr, warum mein Code nicht funktioniert? Ich habe ihn in dieser Form in diversen Foren gefunden und alle haben sich über das einwandfreie Ergebnis gefreut. Aber warum läuft er bei mir nicht? Ich würde es gerne verstehen, damit es mir evtl. zukünftig hilft.
Vielen Dank, Lutz
Registriert seit: 17.04.2014
Version(en): MS Office 365(32)
Hallo Lutz, Jeremaias Code ist funktionell mit Deinem identisch. Das Problem ist, dass durch die Umbenennungen die Dateien wieder von der Dir-Funktion als (neue) weitere Dateien aufgenommen werden. snb´s Code umgeht dies, in dem alle Dateien vorher in ein Array gelesen und erst dann umbenannt werden. Gruß Uwe
Registriert seit: 05.11.2019
Version(en): 2010, 2019
19.12.2019, 09:06
(Dieser Beitrag wurde zuletzt bearbeitet: 19.12.2019, 09:25 von JereMaia.)
1. Da Du die Dateinamen innerhalb eines Verzeichnisses manipulierst, das ständig neu abgefragt wird könnte das zu Deinen geschilderten Problemen führen. Dein Code prüft nicht ab, ob eine Datei noch umgewandelt werden muss, wenn diese schon umgewandelt wurde. Deshalb läuft Dein Code irgendwann quer und verwandelt die schon umgewandelten Dateinamen nochmal und das soll ja nicht sein.
2. Dann würde ich mir mit der DIR-Funktion NUR die Dateien, die mit .xlsx enden auflisten lassen. Alle anderen Dateien in dem Verzeichnis kannst Du nach der Aufgabenstellungen ignorieren.
3. Was ich nicht erkennen kann und nur vermute ist: Evtl. lässt Du "ausversehen" diese Sub-Routine in Deiner Excelmappe mehrmals aufrufen ohne das Du das eigentlich willst und dann haut Dir Dein Code siehe Punkt 1 alles wieder zusammen.
Registriert seit: 17.04.2019
Version(en): M$ 365 AfE v2009 / Office2013
Hi, noch n Gedicht: Code: Sub Funktionsaufruf() Debug.Print getFilename("Personalliste 20.11.2018 erl.xlsx") End Sub
Function getFilename(ByVal sFilename As String) As String Dim sExtension As String sExtension = Mid(sFilename, InStrRev(sFilename, ".")) getFilename = Replace(Left(sFilename, InStrRev(sFilename, ".") - 1), ".", "") & sExtension End Function
Registriert seit: 06.09.2016
Version(en): 2016
Hallo zusammen, vielen Dank für Eure Hilfe. Problem soweit verstanden. Ich frage mich dann nur, warum der Code bei allen anderen zu funktionieren scheint, nur nicht bei mir . Werde dann die Datei vor Umwandlung prüfen, ob sie das richtige Format hat. Vielen Dank, Lutz
Registriert seit: 05.11.2019
Version(en): 2010, 2019
Genau. Wahrscheinlich wird deine Prozedur mehrmals aufgerufen, was wir von hier aus nicht feststellen können.
Wie rufst Du Deinen Code denn auf? Innerhalb eines Ereignisses oder per Button?
Wenn Du uns Deine Mappe (anonymisiert) mal postest könnten wir das evtl. analysieren.
|