Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

VBA: Alle Datein in Ordner umbenennen
#1
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
Antworten Top
#2
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 -
Antworten Top
#3
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
Antworten Top
#4
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 
Zum übersetzen von Excel Formeln:

http://dolf.trieschnigg.nl/excel/index.p...gids=en+de
Antworten Top
#5
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
Antworten Top
#6
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
Antworten Top
#7
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 -
Antworten Top
#8
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
Antworten Top
#9
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
Antworten Top
#10
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 -
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste