Programmieren - alles kontrollieren 4.941 Themen, 20.708 Beiträge

Dateiname per VBA ändern?

A.G. / 3 Antworten / Flachansicht Nickles

Hallo,


 


Ich bin ein Anfänger.Ich möchte ein Programm schreiben, dass Dateien aus den verschiedenen Ordnern einliest, dann jeden Dateinamen ändert. Und zwar ich habe um 2000 Karaoke Dateien in 33 ordnern nach Alphabet und dann in X Ordnern nach Sängern, die sind leider in kyrillischen Schrift, und  Karaokeplayer  erkennt leider diesen Zeichensatz nicht. Benenne ich die datei mit lateinischen Schrift um, funktionier tlles bestens. Ich wollte das schon manuell machen, aber bei der etwa 200-sten Änderung hatte ich keinen Spass mehr. Na ja ich bin noch nicht soweit, selbst ein Programm zu programmieren, aber vielleicht kann mir einer Tipps geben, wie ich es doch alleine schaffen könnte.


So stelle ich mir das grob vor:


 


Schritt 1: Hauptvererzeichnis X bis Ende (also kein Hauptverzeichnis mehr) einlesen, jetzt beginne mit Unterverzeichnis x bis Ende;


Schritt2: lese jetzt  jede Datei ein, ändern jede Buchstabe mit einer Case Anweisung, also eingelesenes kyrillisches k to lateinisches k bis Dateiende dabei speichere neuen Dateinamen in einem Array, Update neuen Dateiname aus dem Array *,Lese nächsten Dateiname, wenn Ende vom Unterverzeichnis erreicht (keine Datei mehr) gehe zum nächsten Unterverzeichnis und wiederhole schritt 2, Sonst zum Schritt 1.


 


* Ergebnis (alter Dateiname Калинка  neuer Dateiname Kalinka)


 


Ich bitte nicht ein Programm für mich zu schreiben (wenn jemand das machen würde wäre ich Ihm unbeschreiblich dankbar! Hat er vielleicht dann Interesse an meinen Karaoke Datein, würde ich ihm diese gerne auch schicken), sondern mir Tipps zu geben.


 


Ich habe Office XP


Welche Funktion aus Objektkatallog (VBA, Accescs, DAO, ADO usw) benutze ich um einen dateinamen einzulesen?


Und aller wichtigste - Welche Funktion editiert den Dateinamen?


 


Weiss jemand gute Archive über VBA?

bei Antwort benachrichtigen
T-Rex A.G. „Dateiname per VBA ändern?“
Optionen

Hi,

VBA ist dafür nur begrenzt geeignet, da man anscheinend keine eigenen Events in Klassen unterbringen kann.

Hier mal eine Möglichkeit, das mit VB zu machen:
Schritt 1:
Folgende Klasse kannst Du in Deine Anwendung einbauen:
' clsFindFile
Option Explicit

Private blnIncludeSubDirs As Boolean

Public Event FileFound(ByVal strFileName As String, ByVal enmFileAttr As VBA.VbFileAttribute)

Public Property Get IncludeSubDirectories() As Boolean
IncludeSubDirectories = blnIncludeSubDirs
End Property

Public Property Let IncludeSubDirectories(ByVal blnNewData As Boolean)
blnIncludeSubDirs = blnNewData
End Property

Public Sub FindFile(ByVal strSourcePath As String, Optional ByVal strSearchMask As String = "*.*", Optional ByVal enmFileAttr As VBA.VbFileAttribute = vbNormal Or vbDirectory)
Dim strFile As String
Dim strSubDirs As String
Dim enmAttr As VBA.VbFileAttribute

' Das Quellverzeichnis, ab dem gesucht werden soll, benennen
strSubDirs = strSourcePath

' Solange noch Verzeichnisse zum Suchen vorliegen, den Code ausführen
Do While Len(strSubDirs) 0
' Sind mindestens zwei Verzeichnisse vorhanden?
If (InStr(1, strSubDirs, ";") 0) Then
' Ja, erstes Verzeichnis aus der Liste nehmem
strSourcePath = Left$(strSubDirs, InStr(1, strSubDirs, ";") - 1)
strSubDirs = Mid$(strSubDirs, InStr(1, strSubDirs, ";") + 1)
Else
' Nein, letztes Verzeichnis aus der Liste nehmen
strSourcePath = strSubDirs
strSubDirs = vbNullString
End If

' Sicherstellen, daß das Verzeichnis mit einem BackSlash endet
If Right$(strSourcePath, 1) "\" Then
strSourcePath = strSourcePath & "\"
End If

' Erste Datei im Verzeichnis suchen
strFile = Dir$(strSourcePath & "*", enmFileAttr)

' Ist eine Datei oder ein Verzeichnis gefunden worden?
Do While (Len(strFile) 0)
' Datei-Attribute auslesen
enmAttr = GetAttr(strSourcePath & strFile)

' Ja, handelt es sich um die Spezialverzeichnisse '.' und '..'?
If (strFile ".") And (strFile "..") Then
' Nein, Ist es ein Verzeichnis und soll es in die Suche einbezogen werden?
If (blnIncludeSubDirs) And ((enmAttr And vbDirectory) = vbDirectory) Then
' Ja, Verzeichnis in die Liste aufnehmen
If (Len(strSubDirs) = 0) Then
strSubDirs = strSourcePath & strFile
Else
strSubDirs = strSubDirs & ";" & strSourcePath & strFile
End If
End If

' Trifft die Suchmaske auf die Datei zu?
If strFile Like strSearchMask Then
' Ja, diese Datei an den aufrufenden Prozess liefern
RaiseEvent FileFound(strSourcePath & strFile, GetAttr(strSourcePath & strFile))
End If
End If

' Nächste Datei im Verzeichnis suchen
strFile = Dir$
Loop
Loop
End Sub

Private Sub Class_Initialize()
blnIncludeSubDirs = False
End Sub


Der Aufruf erfolgt so:
' Form1
Option Explicit

Private WithEvents objFindFile As clsFindFile

Private Sub Command1_Click()
Set objFindFile = New clsFindFile
Call objFindFile.FindFile("c:\My Music", "*.mp3")
Set objFindFile = Nothing
End Sub

Private Sub objFindFile_FileFound(ByVal strFileName As String, ByVal enmFileAttr As VbFileAttribute)
If ((enmFileAttr And vbDirectory) = vbDirectory) Then
Debug.Print "[Directory] ";
End If
Debug.Print strFileName
End Sub

Statt die Datei einfach ins Debug-Fenster zu schreiben, kannst Du sie auch umbenennen.

Schritt 2:
FAQ 0073: Wie kann ich eine Datei umbenennen?
Ich weiß aber nicht, ob die darin gezeigten Wege Unicode unterstützen. Das mußt Du mal ausprobieren.

Access, ADO und DAO brauchst Du gar nicht.

 GrüßeT-Rex 
bei Antwort benachrichtigen