Umgang mit Dateien und Verzeichnissen...per Dialog
Hier wird eine kleinere Sammlung von Codebeispielen zum Umgang mit
Dateinamen und Verzeichnissen vorgestellt. Wenn wir den Pfad zu einer Datei genau kennen und auch den nötigen Dateinamen wissen, dann können wir diese Informationen im VBA Code direkt notieren. Aber oft ist es erforderlich, den Anwender selber einen Pfad, eine Datei oder beides wählen oder suchen zu lassen. Das kann zum Beispiel erforderlich sein, wenn das VBA Programm in unterschiedlichen Umgebungen eingesetzt wird und der Programmierer deshalb die nötigen Informationen nicht haben kann. Auch wenn der Anwender den Speicherort frei wählen können soll, ist es besser einen Dateidialog zu starten, als die nötigen Informationen per InputBox von Hand eingeben zu lassen. Das geht zum einen sehr viel komfortabler und Fehler in Form von Verschreiben sind ausgeschlossen. Hierzu gibt es sehr nützliche und zum Teil auch sehr mächtige Funktionen, wovon einige hier in loser Reihenfolge vorgestellt werden. Wird bei Gelegenheit ständig erweitert. Auf Wunsch können auch gerne Beispiele von Lesern eingefügt werden. |
GetOpenFilename kann laut VBA-Hilfe unter Umständen das aktuelle Verzeichnis neu festlegen. Sehr witzig ist die Betonung auf "kann". Bei mir funktioniert das immer. Dennoch sei darauf hingewiesen, dass Microsoft dieses "kann" sicher nicht völlig ohne Grund angegeben hat. Zur Sicherheit bitte zusätzlich den eingelesenen Pfad mit ChDrive und ChDir festlegen, wenn GetOpenFilename darin einmal versagen sollte. Ausserdem kann man mit ChDrive und ChDir das Startverzeichnis für GetOpenFilename sehr komfortabel festlegen. Dann muss der Anwender nicht soviel mit der Maus klicken. |
Sub DateiEineDatei() 'Name und Pfad einer Datei einlesen Dim varDatei As Variant 'Startverzeichnis festlegen: ChDrive "G:" 'erst das Laufwerk voreinstellen (bes. im Netzwerk oder bei mehreren Festplatten) ChDir "G:\My Music Folder1" 'dann erst den Pfad vorbelegen varDatei = Application.GetOpenFilename _ ("MP3-Dateien (*.mp3), *.mp3") If varDatei = False Then Exit Sub 'weitere Programmausführung hier ausserhalb von If...End If Debug.Print varDatei Debug.Print Dir(varDatei) Debug.Print Left(varDatei, Len(varDatei) - Len(Dir(varDatei))) End Sub
Sub DateiEineDatei2() 'Name und Pfad einer Datei einlesen Dim varDatei As Variant varDatei = Application.GetOpenFilename("Excel-Arbeitsmappen,*.xls," & _ "Alle Excel-Dateien,*.xl?", 2, "Bitte wählen Sie eine Datei aus!") If varDatei = False Then MsgBox "Sie haben abgebrochen." Exit Sub Else 'weitere Programmausführung hier innerhalb von If...End If Debug.Print "Sie haben '" & varDatei & "' ausgewählt." End If End Sub
Sub DateiMehrereDateien() 'Name und Pfad mehrerer Dateien einlesen Dim varDatei As Variant Dim i As Integer 'Optionale Voreinstellung des Pfades: ChDrive "G:" 'erst das Laufwerk voreinstellen ChDir "G:\My Shared Folder1" 'dann erst den Pfad vorbelegen 'Die VBA Hilfe erklärt die Funktion GetOpenFilename sehr verständlich varDatei = Application.GetOpenFilename("MP3-Dateien,*.mp3," & _ "Alle Musik-Dateien,*.mp3;*.ogg, Nur OGG-Dateien,*.ogg", 2, "Musikdatei auswählen", , True) 'weitere Programmausführung hier innerhalb von If...End If If IsArray(varDatei) Then For i = 1 To UBound(varDatei) 'Ubound Gibt einen Wert vom Typ Long zurück, der den größten 'verfügbaren Index für die angegebene Dimension eines Datenfeldes enthält. 'Hier: des Datenfeldes "varDatei" 'schreibt nur den Dateinamen in A1, A2, A3.... : Range("A" & i).Value = Dir(varDatei(i)) 'schreibt nur den Pfad in B1, B2, B3.... : Range("B" & i).Value = Left(varDatei(i), Len(varDatei(i)) - Len(Dir(varDatei(i)))) Next MsgBox "Fertig!" & vbCrLf & "Glückwunsch" Else MsgBox "Abbruch durch User" End If End Sub
Sub DateiMehrereDateien2() 'Name und Pfad mehrerer Dateien einlesen Dim varDatei As Variant Dim i As Integer 'Optionale Voreinstellung des Pfades: ChDrive "G:" 'erst das Laufwerk voreinstellen ChDir "G:\My Shared Folder1" 'dann erst den Pfad vorbelegen 'Die VBA Hilfe erklärt die Funktion GetOpenFilename sehr verständlich varDatei = Application.GetOpenFilename("MP3-Dateien,*.mp3," & _ "Alle Musik-Dateien,*.mp3;*.ogg, Nur OGG-Dateien,*.ogg", 2, "Musikdatei auswählen", , True) If Not IsArray(varDatei) Then MsgBox "Abbruch durch User" End If 'weitere Programmausführung hier ausserhalb von If...End If For i = 1 To UBound(varDatei) 'Ubound Gibt einen Wert vom Typ Long zurück, der den größten 'verfügbaren Index für die angegebene Dimension eines Datenfeldes enthält. 'Hier: des Datenfeldes "varDatei" 'schreibt nur den Dateinamen in A1, A2, A3.... : Range("A" & i).Value = Dir(varDatei(i)) 'schreibt nur den Pfad in B1, B2, B3.... : Range("B" & i).Value = Left(varDatei(i), Len(varDatei(i)) - Len(Dir(varDatei(i)))) Next MsgBox "Fertig!" & vbCrLf & "Glückwunsch" End Sub