Clever-Excel-Forum

Normale Version: VBA: Alle Datein in Ordner umbenennen
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Seiten: 1 2
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
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
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
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 
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
Hallo Lutz,

Jeremaias Code ist funktionell mit Deinem identisch. Wink
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
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.
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
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 Huh .

Werde dann die Datei vor Umwandlung prüfen, ob sie das richtige Format hat.

Vielen Dank,
Lutz
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.
Seiten: 1 2