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, 16:49
(Dieser Beitrag wurde zuletzt bearbeitet: 18.12.2019, 16: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
--- Seid nett und helft einander :100: ---
--- denn die Liebe ist die größte Kraft im Universum ---
- Lest die Werke von Jakob Lorber und Gottfried Mayerhofer -
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, 08:06
(Dieser Beitrag wurde zuletzt bearbeitet: 19.12.2019, 08: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.
--- Seid nett und helft einander :100: ---
--- denn die Liebe ist die größte Kraft im Universum ---
- Lest die Werke von Jakob Lorber und Gottfried Mayerhofer -
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
gruß
Marco
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.
--- Seid nett und helft einander :100: ---
--- denn die Liebe ist die größte Kraft im Universum ---
- Lest die Werke von Jakob Lorber und Gottfried Mayerhofer -
|