Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1860to1864
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Datei wird mehrfach umbenannt

Datei wird mehrfach umbenannt
11.12.2021 10:24:42
MiSchi
Hallo,
ich würde mich freuen, wenn Ihr mir bei mein Problemen helfen könntet.
Ich habe ein Makro geschrieben um den Datumsteil im Dateinamen umzustellen. Das Makro soll alle csv-Dateien im Verzeichnis abarbeiten bis es am Ende der Dateinamen leer ist.
Bei kurzen Test läuft es auch. Im Ernstfall mit vielen Dateien werden vereinzelt bereits umbenannte Dateien erneut umbenannt, was dann zu Fehlern im Dateinamen führt. Wie kommt es zu dem Verhalten und wie kann ich dieses vermeiden?
Mit einer if-Abfrage kann ich prüfen ob die Struktur stimmt, wenn nicht wird die Datei übersprungen - eine Möglichkeit.
Mir geht es aber darum das Problem zu verstehen warum eine bereits bearbeitete Datei in der Ablaufreihe erneut auftaucht. Fehler in der Loop-Abfrage?
Der Code basiert auf der Lösung von Thorsten aus https://www.herber.de/forum/archiv/680to684/680449_Dateinamen_auslesen_und_aendern_mit_VBA.html

Sub DateiName_csv()
lstrDatName = Dir(ThisWorkbook.Path & "\*.csv")
Do Until lstrDatName = ""
Debug.Print lstrDatName
lstrAlterDatname = lstrDatName
Links1 = Left(lstrDatName, InStrRev(lstrDatName, "_") - 1)
Debug.Print Links1
Rechts1 = Right(lstrDatName, Len(lstrDatName) - InStrRev(lstrDatName, "_"))
Debug.Print Rechts1
Links2 = Left(Links1, InStrRev(Links1, "_") - 1)
Debug.Print Links2
Rechts2 = Right(Links1, Len(Links1) - InStrRev(Links1, "_"))    'Datum
Debug.Print Rechts2
Tag = Left(Rechts2, 2)
Debug.Print Tag
Mon = Mid(Rechts2, 4, 2)
Debug.Print Mon
'If InStr(Mon, "-") = 0 Then     '> 0 Then GoTo Nächste
Jahr = Right(Rechts2, 4)
Debug.Print Jahr
'If InStr(Jahr, "-") = 0 Then      '> 0 Then GoTo Nächste
lstrDatName = Links2 & "_" & Jahr & "-" & Mon & "-" & Tag & "_" & Rechts1
Debug.Print lstrDatName
Name ThisWorkbook.Path & "\" & lstrAlterDatname As ThisWorkbook.Path & "\" & lstrDatName
'Name lstrAlterDatname As lstrDatName
'Else
'Else
'Nächste:
lstrDatName = Dir
Debug.Print ""
Debug.Print ""
Loop
End Sub
Danke für Eure Hilfe
MiSchi

27
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
ich kann ja mal...
11.12.2021 10:46:44
Oberschlumpf
Hi,
...mein Glück versuchen....aber...
Wie genau sehen denn die Dateinamen der csv-Dateien aus?
Sind alle Dateinamen gleich aufgebaut oder gibt es Unterschiede?
Siehe auch in dem Link aus 2005 für Simone.
Sie meinte zuerst, alle Dateinamen sind vom Aufbau identisch:

20051012_text_111353.txt = 8 Zahlen Unterstrich Text Unterstrich 6 Zahlen .Dateiendung
Und bei ihr kam es dann zu einem Fehler, weil doch nicht alle Dateinamen identisch aufgebaut waren:

2005-07-30_Test_203408.txt = 4 Zahlen Bindestrich 2 Zahlen Bindestrich 2 Zahlen Unterstrich Text Unterstrich 6 Zahlen .Dateiendung
Ich denke, eine gute Hilfe von dir könnte sein: Zeig bitte per Upload eine Bsp-Datei, die einfach nur in Spalte A so viele Dateinamen enthält, wie bei dir unterschiedliche vorhanden sind - und natürlich muss der Aufbau der Bsp-Dateinamen in Spalte A genau so sein wie deine Originaldateien.
Ciao
Thorsten
Anzeige
AW: ich kann ja mal...
11.12.2021 11:43:45
MiSchi
Hallo Thorsten, danke für deine Hilfe
so kann die Struktur der Dateinamen ausssehen neben csv verwende ich den gleichen Code für mit Anpassung für pdf
AA_BBBBBBBBBBBB_CCC1111111111_02-10-2016_1445.csv
AA_DDDDDDDDDDDD_FFFFF_2222222222_07-08-2021_034224 (1).pdf
AA_DDDDDDDDDDDD_FFFFF_2222222222_07-08-2021_034224.pdf
AA_EEE_FFFFF_3333333333_07-02-2015_0701.pdf
Von rechts suche ich den "_"
das ist unabhängig von der Anzahl der Zeichen. Dann Extrahiere ich den Datumsteil
Was vor dem Datum steht ist unterschiedlich - ist auch egeal da dieser Teil erhalten bleibt.
Ich bin mir nicht sicher ob mein Problem im Aufbau des Dateinamen liegt.
Ich habe eine Anzahl Datein im Verzeichnis, diese werden solange umbennant bis alle abgearbeitet wurden.
Der code macht das solange, bis keine weitere Datei zur Bearbeitung ansteht.
Was ich schon mal nicht verstehe, da die Dateien nicht auch verschoben werden, sind ja immer Dateien da, die eingelesen werden könnten.
Wieso entsteht nicht grundsätzlich eine Endlosschleife - scheinbar werden die fertigen Datein ja als solches erkannt - nur manche nicht.
Ich verstehe hier auch noch nicht in welcher Reihenfolge die Dateien umbenannt werden.
Ich hatte das Problem schon ein paar mal beobachtet, wenn es um bearbeiten aller Dateien in einem Vezeichnis ging.
So hatte ich auch festgestellt, dass die erste vom Code bearbeitete Datei nicht umbedingt die erste Datei in meiner Ansicht ist, die nach Namen aufsteigend sortiert war.
Hier hätte ich das Problem vermutet, dass eine Datei wieder nach unten rutscht und wieder bearbeitet wird.
Viele grüße
MiSchi
Anzeige
AW: ich kann ja mal...
11.12.2021 11:49:52
Oberschlumpf
Hi,
ich bat um eine (Excel)Bsp-Datei.
Und hab noch etwas vergessen - du allerdings auch.
Wie sollen denn die Dateinamen nach der Änderung aussehen?
Noch mal meine Bitte:
per Upload Bsp-Datei mit Dateiname Zustand jetzt in Spalte A und Wunschdateiname nach Änderung in Spalte B
Ciao
Thorsten
AW: ich kann ja mal...
11.12.2021 12:06:30
MiSchi
Hallo,
geht das nicht auch ohne Datei?
das Datum soll von der Form dd-mm-jjjj in jjjj-mm-dd umgebaut werden.
Darf ich nach einem Ansatz fragen?
Grundsätzlich werden die Dateinamen in der gewünschten Form umgebaut. Nur manche Dateien eben mehrfach angegriffen.
Danke, MiSchi
Anzeige
AW: ich kann ja mal...
11.12.2021 12:39:19
Oberschlumpf
Hi,
ich will dir helfen.
Um helfen zu können, benötige ich Informationen von dir - nicht Beschreibungen von Informationen, sondern die Information selbst.
Denn, deine Beschreibung, wie ein Dateiname aussehen soll, kann von mir falsch interpretiert werden, so dass mein Makro-Ergebnis nicht das liefert, was du gern hättest - deswegen - zeig mir bitte Bsp-Dateinamen, wie diese nach der Änderung aussehen sollen....und eben Bsp-Dateinamen, wie diese vor der Änderung aussehen.
Und all das bitte in einer Bsp-Excel-Datei.
Denn eine Excel-Datei benötige ich zum Testen.
Wenn du da nix liefern willst, will ich auch nich helfen...
Und ohne Datei von dir is das hier mein letzter Versuch....seit Beginn deines Beitrags oder unserer "Unterhaltung" veranstalten wir nur ein hin-und-her-PingPong von Beiträgen - und sind noch nich wirklich vorwärts gekommen.
Ja, ich weiß, alles is meine Schuld...aber damit kann ich leben^^
Ciao
Thorsten
Anzeige
AW: ich kann ja mal...
11.12.2021 13:46:45
MiSchi
Sorry Thorsten,
ich kann (darf) Dir von diesem Rechner keine Dateien hochladen. Auch kann ich dir nur den Rahmen der Dateinahmen und keine exakten Namen liefern.
Mittlerweile glaube ich aber, dass es nicht am Code selbst liegt, sondern an möglichen Attributen o.ä., dass eine Datei 2x bearbeitet wird. Da dieser Fehler immer bei den selben Dateien auftritt, deren Dateinamen, den selben Aufbau hat wie viele andere im selben Ordner.
Trotzdem vielen Dank Michael
AW: ich kann ja mal...
11.12.2021 15:04:44
MiSchi
..an dieser Stelle vielleicht auch noch eine Frage, falls sich jemand diesem Thread annehmen möchte.
beim Befehl Dir
VBA-Begriff: Dir-Funktion (Beispiel)
' Liefert einen Dateinamen mit der angegebenen Erweiterung. Existieren
' mehrere Dateien mit der Erweiterung .INI, so wird der erste gefundene
' Dateiname zurückgegeben.
Datei1 = Dir("C:\WINDOWS\*.INI")
Baut man diesen Befehl in eine ähnliche Schleife, die solange arbeitet bis alle Dateien abgearbeitet wurden, konnte ich öfters feststellen, dass Windows eine andere Reihenfolge abarbeitet, wie ich es dachte bzw. wie mein Explorer die nach Namen aufsteigend dargestellte Reihenfolge zeigte.
Woran liegt das - bzw. läßt sich mein ursprüngliches Problem der doppelten Bearbeitung auf eine ähnliche "Windows Eigenschaft" zurückführen?
Um nicht zu weit abzuschweifen, aber vielleicht gibt es auch hierzu eine "einfache" Antwort - möglicherweise bin ich damit aber im falschen Forum.
Beim Kopieren von z.B. Bildern kann man beobachten, dass die Bilder nicht in ihrer namentlichen Reihenfolge kopiert werden. Die selbe "Windows Eigenschaft/Eigenart"?
Danke, viele grüße
MiSchi
Anzeige
AW: ich kann ja mal...
11.12.2021 15:06:37
MiSchi
fehlt noch offen?
AW: ich kann ja mal...
11.12.2021 19:21:49
AlterDresdner
Hallo,
wahrscheinlich werden die umbenannten .csv halt gelegentlcih von Dir wieder erfasst. Wenn Du alle Dateinamen erst einliest und dann die Umbenennung startest:
Dim Dateinamen() As String, lstrDatName, anz As Long
ReDim Dateinamen(1 To 1)
lstrDatName = Dir(ThisWorkbook.Path & "\*.csv")
Do Until lstrDatName = ""
anz = anz + 1
If anz > UBound(Dateinamen) Then ReDim Preserve Dateinamen(1 To anz)
Dateinamen(anz) = lstrDatName
lstrDatName = Dir
Loop
For Each lstrDatName In Dateinamen
Debug.Print lstrDatName
und weiter wie bisher, das Loop-Ende dann entsprechend in Next ändern,
wäre es vielleicht besser.
Gruß der ALteDresdner
Anzeige
AW: ich kann ja mal...
11.12.2021 21:23:59
MiSchi
Vielen Dank AlterDresdner!
Gute Idee nur das umzubenennen was schon vorhanden war!
Magst Du mir noch erklären, was es mit dem ReDim auf sich hat? Sorry, die MS Erklärung versteh ich (mit meinem Level) nicht...
ReDim Dateinamen(1 To 1): ursprüngliche Größe zur selben Größe? Am Anfang ist die ArrayGröße nicht definiert. Mit diesem Befehl weise ich auf die spätere Anpassung hin?
Dateinamen(1 To anz) die Größe des Array wird auf die Anzahl angepasst (um Speicher zu optimieren?)
Danke und viele Grüße
MiSchi
AW: ich kann ja mal...
12.12.2021 11:23:29
AlterDresdner
Hallo,
das To ist bei Dim/Redim Optional. Es gibt ein Option Base 1, das festlegt, dass Felder grundsätzlich ab 1 bis... dimensioniert werden. Standard (ohne Option Base) ist 0...
Duch das Redim abc(1 to 1) lege ich immer 1...n fest, ohne auf das Vorhandensein von OptionBase angewiesen zu sein.
Bytheway: Die ANweisung Option Explicit am Anfang des Codes ist sehr nützlich, sie erzwingt die Deklaration von verwendeten Variablen und deckt so Tippfehler etc. auf.
Redim: Ich weiß nicht, wie viele Dateien ich finden werde, also muss das nicht deklarierte Datenfeld abc erst mal anfangs-dimensioniert werden, also Redim abc(1 to 1). Finde ich eine Datei, wird sie als letzter Wert in das Feld abc eingetragen. Das muss ich also immer größer werden lassen, also Redim Preserve abc(1 to anz). Das Preserve verhindert, dass die bisher existierenden Werte in abc() gelöscht (geleert) werden.
Gruß und frohen Advent
Anzeige
Ich mache das eher umgekehrt, ...
12.12.2021 13:46:57
Luc:-?
…Alter Dresdner,
denn ebensowenig wie der VBA-Standard Option Base 0 Einfluss auf direkt aus Xl stammende Datenfelder, zB per MatrixKonstante bzw INDEX, hat, hat Option Base 1 Einfluss auf VBA-interne Indizierungen. Eine ParamArray-Variable beginnt trotzdem immer bei Index 0. Und preserven kann man die grundsätzlich nicht, nur in eine neue, die sich dann so redimmen lässt, übertragen.
Andererseits wdn mit Option Base 0 Modulo-(bzw Remnant-[„Rest“])Berechnungen mit VBA-Operator Mod (REST in Xl entspricht dagg Modulo - verkehrte Welt!) erleichtert. Da VBA-Indizes ungleich häufiger in Pgmm vorkommen können als Xl-Indizes, ist es wohl einfacher, letztere einer SonderBehandlung zu unterziehen bzw zu „preserve-redimmen“.
Gruß & schöAdv3So, Luc :-?
Anzeige
AW: ich kann ja mal...
12.12.2021 20:38:04
MiSchi
Hallo AlterDresdner, Luc, ...
danke für Eure Hilfe und Erklärungen!
Ich bin mir nicht sicher ob es schlauer wäre eine neue Frage zu stellen - ich füge diese mal hier an...
Kann der Code auch erweitert werden, dass alle csv-Dateien, die auch in Unterordnern enthalten sind aufgelistet und anschließend abgearbeitet werden?
Danke, viele Grüße
MiSchi
AW: ich kann ja mal...
13.12.2021 14:56:09
Firmus
Hi Michael,
mit folgendem Code liest du ein Verzeichnis aus - ohne Unterverzeichnisse - und schreibst alle Dateinamen in Spalte "A" eines neuen Blattes.
Diese Spalte kannst Du dann beim Umbenennen abarbeiten.
Oder:
In Spalte "B" die neuen Namen erzeugen, verifizieren, und dann nur Rename Spalte-A gegen Spalte-B pro Zeile.

Option Explicit
Sub DateienAuflisten()
Dim fso, o, varDatei
Dim Ordnerangabe As String
Dim zeile As Long
MsgBox "Die Liste der Dateinamen wird in ein neu hinzugefügtes Blatt geschrieben."
Ordnerangabe = "C:\Users\username\Documents\testverzeichnis"
'Ordnerangabe = ActiveSheet.Range("E3").Value                'oder in einer Zelle vorbelegt.
ActiveWorkbook.Sheets.Add Before:=ActiveWorkbook.Worksheets(ActiveWorkbook.Worksheets.Count)
ActiveSheet.Name = "Dateiliste_" & Format((Now), "YYYYMMDD-hhmmss")
Set fso = CreateObject("Scripting.FileSystemObject")
Set o = fso.GetFolder(Ordnerangabe)
zeile = zeile + 1
For Each varDatei In o.Files
ActiveSheet.Cells(zeile, "a").Value = varDatei.Name
zeile = zeile + 1
Next
End Sub
Warum klappte das im ursprünglichen Ansatz nicht: Meine Überlegungen.
1. Dateinamen stehen nicht im Explorer, sondern in der MFT.
2. Die Sortierfolge in der MFT ist (vermutlich) alphabetisch per Pointerketten.
3. Der Explorer ist nur ein Layer auf die MFT, um die gewünschten Daten anzuzeigen.
4. Die MFT wird nicht von Excel oder VBA beackert (umbenennen von Dateien), sondern vom Windowssystem.
(gut ersichtlich im Taskmanager bei Hochlast)
4. Woher Excel die Dateiinformation holt (Explorer-Layer) oder vom WinSystem weiss ich nicht.
5. Es können also Excel-VBA-Fortschritt und MFT-update-Fortschritt im WinSystem out-of-sync gehen.
Das würde m. E. das von dir geschilderte Verhalten erklären.
6. Besonders spürbar sind diese Effekte bei sehr vollen Disks (voll=viele Dateinamen, mit Größe größer ein MFT-Block).
Viel Erfolg,
Firmus
AW: ich kann ja mal...
14.12.2021 08:09:52
MiSchi
Vielen Dank Firmus für Deine Antwort und Hilfe,
ich hatte auch das Gefühl, dass es grundsätzlich nicht am Code liegt, sondern Windows die Ursache sein könnte - jedoch keine Ahnung von den Hintergründen.
Deinen Code werde ich testen, um zu sehen wie dieser arbeitet, wenn ich auch den Code vom Alten Dresdner weiterverwende.
Viele Grüße
MiSchi
auch die SubDirs
13.12.2021 19:16:45
AlterDresdner
Hallo,
Firmus hat sicher recht, ich wechsele aber nicht mitten im Fluß Pferde und Kutsche.
Der folgende Code ist nur im Prinzip getestet, also noch mal genau mit Deinen Umständen.
Er erfasst auch nur Dateien in Directorys unterhalb Thisworkbook.path, nicht in noch tiefer liegenden SubDirs!
Option Explicit
Dim Dateinamen() As String, lstrDatName, anz As Long
Dim Verzeichnisse() As String, Verz

Sub DateiName_csv()
Dim Links1, Links2, Rechts1, Rechts2, Tag, Mon, Jahr, lstrAlterDatname
FindSubDirs (ThisWorkbook.Path) 'alle Verzeichnisse incl. Thisworkbook.path lesen
anz = 0
ReDim Dateinamen(1 To 1)
For Each Verz In Verzeichnisse
lstrDatName = Dir(Verz & "\*.csv")
Do Until lstrDatName = ""
anz = anz + 1
If anz > UBound(Dateinamen) Then ReDim Preserve Dateinamen(1 To anz)
Dateinamen(anz) = Verz & "\" & lstrDatName
lstrDatName = Dir
Loop
Next
If Dateinamen(1)  "" Then
For Each lstrDatName In Dateinamen
lstrAlterDatname = lstrDatName
Links1 = Left(lstrDatName, InStrRev(lstrDatName, "_") - 1)
Rechts1 = Right(lstrDatName, Len(lstrDatName) - InStrRev(lstrDatName, "_"))
Links2 = Left(Links1, InStrRev(Links1, "_") - 1)
Rechts2 = Right(Links1, Len(Links1) - InStrRev(Links1, "_"))    'Datum
Tag = Left(Rechts2, 2)
Mon = Mid(Rechts2, 4, 2)
Jahr = Right(Rechts2, 4)
lstrDatName = Links2 & "_" & Jahr & "-" & Mon & "-" & Tag & "_" & Rechts1
Name lstrAlterDatname As lstrDatName
Next
End If
End Sub

Function FindSubDirs(Pfad As String)
anz = 1
ReDim Verzeichnisse(1 To 1)
Verzeichnisse(1) = Pfad
lstrDatName = Dir(Pfad & "\", vbDirectory)
Do Until lstrDatName = ""
If lstrDatName  "." And lstrDatName  ".." And (GetAttr(Pfad & "\" & lstrDatName) And vbDirectory) = vbDirectory Then
anz = anz + 1
If anz > UBound(Verzeichnisse) Then ReDim Preserve Verzeichnisse(1 To anz)
Verzeichnisse(anz) = lstrDatName
End If
lstrDatName = Dir
Loop
End Function
Gruß der ALteDresdner
AW: auch die SubDirs
13.12.2021 21:40:36
Firmus
Hallo AlterDresdner,
danke für die Erweiterung, ich war zu "faul" das auf subdirs zu erweitern. Zumal die Anforderung nicht gegeben war.
Ich hoffe du erlaubst mir die Erweiterung einfach per Copy/Paste zu testen und zu nutzen.
Gruß aus "Greater Augsburg",
Firmus
ps: noch offen für Michael
aber gerne doch owT
13.12.2021 21:48:43
AlterDresdner
AW: auch die SubDirs
14.12.2021 12:04:41
MiSchi
Vielen Dank AlterDresdner!
ich bin noch am Testen bzw. per Einzelschritt beim Verstehen , was dein Code macht. Vielen Dank auch hierfür, dass Du die Teile zu einem kompletten Macro zusammengeführt hast.
Weitere SubDirs zu erfassen ist wohl komplexer.
Ich scheitere gerade daran die Beispiele von Case unter http://www.office-loesung.de/ftopic408237_0_0_asc.php
oder ein Beispiel von Hajo (zip-Datei bzw. die Alternative im Thread)
https://www.herber.de/forum/archiv/1660to1664/1663253_Alle_Excel_dateien_auflisten_mit_link_C_inkl_Unt.html
zu verstehen und ob ich den Teil, der die Dateien ausliest und anschließend in ein Tabellenblatt schreibt so zu gestalten, dass diese im Array landen.
Ich kann ja die Extras der Formatierung und Hyperlinks sowie der Auswahl-Abfragen (bei Hajo) weglassen.
Meine naive Vorstellung einfach in der Dir abfrage ein Platzhalter mit \ einzufügen wäre zu einfach gewesen...
Meine Frage wäre nun, erkennst Du den relevanten Teil und kannst/möchtest den Code anpassen?
Viele Grüße
MiSchi
AW: auch die SubDirs
14.12.2021 21:19:09
AlterDresdner
Hallo,
mit den Links zu Nepumuk und Hajo komme ich nicht klar, das verstehe ich nicht.
Ich habe alle Subdirs suchen in meine Version implementiert, es gibt aber ein Problem: offensichtlich kommt Dir mit Umlauten im Dateinamen nicht klar.
Diese Dateien werden dann nicht umbenannt.
Viel Spaß beim Testen wünscht der ALeDresdner
Option Explicit
Dim Dateinamen() As String, lstrDatName, anz As Long
Dim Verzeichnisse() As String, Verz, FoundNew As Boolean

Sub DateiName_csv()
Dim Links1, Links2, Rechts1, Rechts2, Tag, Mon, Jahr, lstrAlterDatname
FindAllSubs (ThisWorkbook.Path) 'alle Verzeichnisse incl. Thisworkbook.path lesen
anz = 0
ReDim Dateinamen(1 To 1)
For Each Verz In Verzeichnisse
lstrDatName = Dir(Verz & "\*.csv")
Do Until lstrDatName = ""
anz = anz + 1
If anz > UBound(Dateinamen) Then ReDim Preserve Dateinamen(1 To anz)
Dateinamen(anz) = Verz & "\" & lstrDatName
lstrDatName = Dir
Loop
Next
If Dateinamen(1)  "" Then
For Each lstrDatName In Dateinamen
lstrAlterDatname = lstrDatName
Links1 = Left(lstrDatName, InStrRev(lstrDatName, "_") - 1)
Rechts1 = Right(lstrDatName, Len(lstrDatName) - InStrRev(lstrDatName, "_"))
Links2 = Left(Links1, InStrRev(Links1, "_") - 1)
Rechts2 = Right(Links1, Len(Links1) - InStrRev(Links1, "_"))    'Datum
Tag = Left(Rechts2, 2)
Mon = Mid(Rechts2, 4, 2)
Jahr = Right(Rechts2, 4)
lstrDatName = Links2 & "_" & Jahr & "-" & Mon & "-" & Tag & "_" & Rechts1
On Error Resume Next
Name lstrAlterDatname As lstrDatName
If Err Then MsgBox "Datei " & lstrAlterDatname & " nicht umbenannt (Umlaute)"
Err.Clear
Next
End If
End Sub

Function FindSubDirs(ByVal Pfad As String)
lstrDatName = Dir(Pfad & "\", vbDirectory)
Do Until lstrDatName = ""
If lstrDatName  "." And lstrDatName  ".." And (GetAttr(Pfad & "\" & lstrDatName) And vbDirectory) = vbDirectory Then
anz = anz + 1
FoundNew = True
If anz > UBound(Verzeichnisse) Then ReDim Preserve Verzeichnisse(1 To anz)
Verzeichnisse(anz) = Pfad & "\" & lstrDatName
End If
lstrDatName = Dir
Loop
End Function

Function FindAllSubs(FirstPfad As String)
Dim i As Long, ianf As Long, anzmerk As Long
ianf = 1
anz = 1
ReDim Verzeichnisse(1 To 1)
Verzeichnisse(anz) = FirstPfad
FoundNew = True
Do
anzmerk = anz + 1
For i = ianf To anz
FindSubDirs Verzeichnisse(i)
Next i
ianf = anzmerk + 1
If Not FoundNew Then Exit Do
FoundNew = False
Loop
End Function

AW: auch die SubDirs
15.12.2021 00:28:22
MiSchi
Vielen Dank AlterDresdner!
ich habe Deinen Code noch nicht testen können - ich beiße mich gerade beim Code von Case etwas fest. Ich denke ich hab diesen soweit verstanden und abändern können, dass ich statt einzeln Verzeichnis und Unterverzeichnis und Dateinamen in Zellen zu schreiben Pfad\Dateinamen in Debug.Print schreibe. Statt Debug.Print sollte das auch in ein Array-Element einzutragen sein. Wenn es mir dann gelingt die Teil-Codes zu einem Gesamtwerk zusammenzuführen (und hier bin ich noch skeptisch) sollte mein Plan aufgehen...
Ich berichte morgen - ähh mittlerweile heute Abend...
Viele Grüße
MiSchi
PS die Umlaute sollten dabei auch erkannt werden - aber interessant (bzw gut zu wissen) dass DIR hier nicht funktioniert.
AW: auch die SubDirs
15.12.2021 19:01:44
AlterDresdner
Hallo,
wer Lesen kann, ist klar im Vorteil. Den Link zu CASE und Deinen Text dazu habe ich locker übersehen.
Anbei eine Version zum Test auf der Basis CASE. Die Sache mit den Umlauten: nicht Dir sondern Name a as b kommt damit nicht klar.
Gruß der AlteDresdner
Option Explicit
Dim objFSO As Object, objFOL As Object, objFIL As Object, objFO As Object, objFU As Object
Dim Dateinamen() As String, lstrDatName, anz As Long
'unter Nutzung von Subs von CASE
Sub DateiName_csv()
Dim Links1, Links2, Rechts1, Rechts2, Tag, Mon, Jahr, lstrAlterDatname
Dim objShell As Object
Dim strTMP As String
Set objShell = CreateObject("Shell.Application")
Application.ScreenUpdating = False
On Error Resume Next
strTMP = ThisWorkbook.Path
On Error GoTo 0
On Error GoTo Fin
If strTMP "" And Left(strTMP, 2) "::" Then
If Right(strTMP, 1) "\" Then strTMP = strTMP & "\"
End If
Set objFSO = CreateObject("Scripting.FileSystemObject")
ReDim Dateinamen(1 To 1)
anz = 0
GetSubFolders_Files strTMP
If Dateinamen(1) "" Then
For Each lstrDatName In Dateinamen
lstrAlterDatname = lstrDatName
Links1 = Left(lstrDatName, InStrRev(lstrDatName, "_") - 1)
Rechts1 = Right(lstrDatName, Len(lstrDatName) - InStrRev(lstrDatName, "_"))
Links2 = Left(Links1, InStrRev(Links1, "_") - 1)
Rechts2 = Right(Links1, Len(Links1) - InStrRev(Links1, "_")) 'Datum
Tag = Left(Rechts2, 2)
Mon = Mid(Rechts2, 4, 2)
Jahr = Right(Rechts2, 4)
lstrDatName = Links2 & "_" & Jahr & "-" & Mon & "-" & Tag & "_" & Rechts1
On Error Resume Next
Name lstrAlterDatname As lstrDatName
If Err Then MsgBox "Datei " & lstrAlterDatname & " nicht umbenannt (Umlaute)"
Err.Clear
Next
End If
Fin:
Application.ScreenUpdating = True
If Err.Number 0 Then MsgBox "Fehler: " & Err.Number & " " & Err.Description
Set objShell = Nothing
End Sub

Private Function GetSubFolders_Files(ByVal strPath As String) As String
Set objFO = objFSO.GetFolder(strPath)
Set objFU = objFO.SubFolders
For Each objFIL In objFO.Files
If Right(objFIL.Path, 4) = ".csv" Then
anz = anz + 1
If anz > UBound(Dateinamen) Then ReDim Preserve Dateinamen(1 To anz)
Dateinamen(anz) = objFIL.Path
End If
Next objFIL
For Each objFOL In objFU
GetSubFolders_Files objFOL.Path
Next objFOL
End Function

AW: auch die SubDirs
15.12.2021 22:03:55
MiSchi
Danke AlterDresdner!
Möglicherweise haben wir nun einen sehr ähnlichen Ansatz parallel zueinander umgesetzt.
Ich habe wie geschrieben weiter gebastelt, was allerdings mangels Kenntnisse dauerte...
Deine beiden Codes mit SubDir habe ich in M82 bzw. M83 Kopiert. Leider enstehen bei mir nur leere Einträge für Dateinamen. Ich habe mit beigefügter Struktur das Macro getestet. Test enthält 3 Unterverz mit jeweils einem weiteren Uvz und txt-Dateien.
Keine Idee wo ich den Fehler mache, vielleicht erkennst Du den Fehler. Abweichend zum Threadverlauf wurde mit txt-Dateien getestet.
Interessant wie Du das Problem über die beiden Funktionen gelöst hast.
Mir ist es gelungen aus der Vorlage von Case, das auf Basis von FSO arbeitet und Deinem Code das Modul M3_NurDateiArray zusammen zu führen. Es endet mit der Aufzählung der Dateien inkl. Pfad - an diese Stelle soll dann der Teil zum Dateien umbennen von Thorsten eingefügt werden.
Bei meiner kleinen Testumgebung habe ich keinen Fehler erkennen können.
Ich habe 2 Alternativen ausprobiert. 1. Direkt im Verlauf des SUB, 2. in einem aufgrufenen SUB. Dadurch könnte der Aufbau modulargestaltet werden - meine ich, ohne es wirklich zu wissen.
Inhaltsverzeichnis mit SubDirs mittels FSO
M1_Case: Inhaltsverzeichnis nach Case, alles in Spalte A, mit Hyperlink
M2_Case: Inhaltsverzeichnis nach Case, mit Versatz ausgegeben, die Datei- und Ordnernamen sind verlinkt
M3_NurDatei: M1_Case alles auskommentiert, was zum Schreiben in das Arbeitsplatz benötigt wird - Idee den kompletten Pfad mit Dateinamen mit Debug.Print ausgeben. Wenn das funktioniert, müsste auch eine Übergabe in ein Array möglich sen.
M3_NurDateiArray: Umsetzung Array
unter M8x finden sich die Codes von Dir
M81_VorhandeneDateien - Einlesen der vohandenen Dateien in ein Array
M82_auch_SubDir - Einlesen der vohandenen Dateien in ein Array, mit 1. Ebene
M83_alle_Subdirs - Einlesen der vohandenen Dateien in ein Array,alle SubDirs, Umlaute problematisch
https://www.herber.de/bbs/user/149832.zip
Viele Grüße
MiSchi
AW: auch die SubDirs
16.12.2021 10:59:01
MiSchi
Hallo AlterDresdner!
Wie bereits "befürchtet" sind wir zum quasi selben Ergebnis gelangt. Vielen Dank, dass Du Dich nochmal meinem Problem widmeste!
Vermutlich hast Du das im Bruchteil meiner Zeit erledigt...
Interesant, Du verwendest
Dateinamen(anz) = objFIL.Path
ich
Dateinamen(anz) = objFIL
der Wert ist der selbe. Ich hätte bei path nur den Pfad (Speicherort) als Wert erwartet.
Wo finde ich eine Tabelle, die mir alle Eigenschaften von objFil anzeigt und erklärt?
Klar objFil ist nur ein von uns erdachter Name - allerdings gehört dieses Objekt einer Klasse? an, die wurde wo definiert und heißt?
Mit F2 konnte ich den Objektkatalog öffnen - dann hätte ich mein Objekt FileSystem zugeordnet... dort finde ich nicht das erwartete.
Gebe ich objFIL. ein erscheint leider kein Auswahlmenue mit gültigen Vorschlägen.
Kennst Du eine Seite wo alle Objekte mit ihren Eigenschaften erklärt gibt?
Kannst Du mir mit einer Erklärung/Einführung helfen? Die ergoolten Tutorials zeigen, dass es den Objektkatalog gibt, aber ich weiß nicht wie ich nun damit arbeite.
Viele Grüße
Michael
was ist objFil
16.12.2021 12:59:35
AlterDresdner
Hallo Michael,
objFil kann im Objektkatalog nicht auftreten, da es eine von Dir vereinbarte Variable ist.
Set objFO = objFSO.GetFolder(strPath)
For Each objFIL In objFO.Files
Es über nimmt die EIgenschaften von objFO.Files, wie auch immer die sind. Diese über den Objektkatalog zu ergründen, könnte dauern.
EInfacher ist es, die Variable objFil in die Überwachung aufzunehmen (markieren und Brille in Debug-Schaltflächenleiste).
Dann eine Stopppunkt in der Schleife nach For each objFil setzen. Dann kannst Du in aller Ruhe EIgenschaften und Inhalte von objFil ansehen.
Auf diesem Wege habe ich auch objFil.Path gefunden, mit Erwartungen ist in dieser Gegend etwas schwierig zu operieren.
Gruß der Martin
AW: was ist objFil
16.12.2021 17:12:19
MiSchi
Guter Tip Martin, vielen Dank!
Klasse, das Projekt funktioniert dank Deiner großen Hilfe!
Eine schöne Weihnachtszeit - bleibe gesund!
Michael

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige