Tipps & Tricks: Detail

Hier finden Sie zu dem ausgewählten Tipp oder Trick die detaillierten Angaben.

Wenn in den folgenden Erläuterungen Texte wie MsgBox formatiert sind, handelt es sich um konkret einzugebende Inhalte wie VBA-Code oder die Eingabe von Werten. Menüs wie Datei Speichern sind wie hier zu sehen formatiert. Schaltflächen oder Registerkarten auf Dialogen werden wie Menüs behandelt.

Alle Tipps sind nach bestem Wissen geprüft, aber selbstverständlich ohne Gewähr. Sollten Sie doch einen Fehler darin entdecken, würden wir uns freuen, wenn Sie uns per E-Mail Bescheid sagen.

Dateinamen ermitteln ID 380 Top-Tipp!

Es ist schon ein bißchen peinlich, dass gerade beim Aufruf einer Windows-Funktion, nämlich dem Anzeigen des DateiÖffnen- oder DateiSpeichernUnter-Dialogs jedes MS-Office-Programm sein eigenes VBA-Süppchen kocht. Dabei müßte eigentlich nur der systeminterne API-Befehl weitergereicht werden. Immerhin gibt es bei Excel (anders als bei den anderen) zwei fertige Funktionen, die das machen, auch wenn die so gut versteckt sind, dass man sie eher zufällig entdeckt.

Um eine vorhandene Datei auswählen zu können, existiert die GetOpenFileName-Funktion, die jedoch im Gegensatz zu praktisch allen anderen Funktionen immer mit ihrem Elternobjekt Application zusammen genutzt werden muss:

Sub DateiEinzelAuswahl()
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."
Else
MsgBox "Sie haben '" & varDatei & "' ausgewählt."
End If
End Sub

Die Variable varDatei für den Dateinamen muss vom Datentyp Variant sein, weil beim Abbruch des DateiÖffnen-Dialogs der Wert False zurückgegeben wird, was in der Bedingung geprüft wird.

Der erste Parameter der GetOpenFileName-Funktion gibt die Filterliste an, wobei immer abwechselnd ein beliebiger Text und ein Filter mit Jokerzeichen durch Kommata getrennt wird. Wenn Sie einen Filter aus der Liste vorbesetzen wollen, geben Sie als zweites Argument dessen Index an, der hier ausnahmsweise mal mit 1 beginnt. Das dritte Argument erlaubt es, den Titel des Dialogs zu öffnen. Die Beschriftung der Öffnen-Schaltfläche lässt sich nur auf dem Mac ändern, unter Windows wird es ignoriert.

Auch wenn der DateiÖffnen-Dialog täuschend echt aussieht: er öffnet nicht und soll das auch nicht. Er ist lediglich eine systemkonforme Methode, auf eine Datei zu zeigen und dabei beispielsweise auch Pfad und Laufwerk wechseln zu können. Was Sie anschließend mit der Datei machen, regelt Ihr VBA-Code, hier wird nur ein gültiger Name samt Pfad von einer garantiert vorhandenen Datei ermittelt.

Wie Sie vielleicht am nächsten, hier noch nicht benutzten Parameter MultiSelect schon gesehen haben, lassen sich damit auch mehrere Dateien gleichzeitig auswählen, indem Sie True angeben:

Sub DateiMehrfachAuswahl()
Dim varDatei As Variant
Dim strDateien As String
Dim i As Integer
 
varDatei = Application.GetOpenFilename("Excel-Arbeitsmappen,*.xls," & _
"Alle Excel-Dateien,*.xl?", 2, "Bitte wählen Sie eine Datei aus!", , True)
If IsArray(varDatei) Then
For i = 1 To UBound(varDatei)
strDateien = strDateien & varDatei(i) & vbCrLf
Next
MsgBox "Sie haben diese Dateien ausgewählt:" & vbCrLf & strDateien
Else
MsgBox "Sie haben abgebrochen."
End If
End Sub

Alternativ zu dem ersten Beispiel können Sie die Variable varDatei auch daraufhin prüfen, ob sie ein Array enthält, denn nun werden alle ausgewählten Dateien in einem solchen übergeben. Auch hier folgt in einer MsgBox lediglich die Namensliste, ohne dass eine der Dateien geöffnet würde.

Während der DateiÖffnen-Dialog sicherstellt, dass es diese Datei auch gibt, erlaubt der DateiSpeichernUnter-Dialog im Gegenteil, einen neuen Dateinamen vorzugeben. Eigentlich sollte er auch überprüfen und warnen, wenn der Dateiname schon existiert, aber das ist bei GetSaveAsFilename nicht der Fall:

Sub DateiSpeichernUnter()
Dim strDatei As String
Dim strVorschlag As String
 
strVorschlag = "Beispiel" & Format(Now(), "yyyy_MM_dd") & ".xls"
strDatei = Application.GetSaveAsFilename(strVorschlag, _
"Excel-Dateien,*.xls", 1, "Daten sichern")
MsgBox "Diese Datei soll als '" & strDatei & "' gesichert werden."
End Sub

Das Prinzip der Filter funktioniert genauso, aber es gibt zusätzlich die Möglichkeit, einen Dateinamen vorzugeben, wie es hier gezeigt ist.

Um den Pfad zu beeinflussen, der beim Öffnen der Datei-Auswahldialoge angezeigt wird, können Sie die "MSDOS-Befehle" ChDrive und ChDir einsetzen, die auch in VBA entsprechend heißen.