Aktuelle Seite:
/api/oeffnendialog.htm
Letzte Änderung: 24.06.2006

Getestet unter Word2000Getestet unter WordXPGetestet unter Win2000  
Beispiel anzeigen
Makro/Datei speichern
Print

Möchte man aus einem Makro heraus eine beliebige Datei öffnen und dem Benutzer dabei die Möglichkeit bieten, das Laufwerk, das Verzeichnis und den Dateinamen selber festzulegen, steht eigentlich nur eine Funktion zur Verfügung: Das Word-interne Dialogfeld Dialogs(wdDialogsFileOpen) (siehe  wd-Konstanten der Dialogfelder).

Dieses Dialogsfeld besitzt aber den Nachteil, dass nur vordefinierte Formattypen ausgewählt werden können. Möchte man z.B. ein Dialogfenster ähnlich dem der VBAIDE zum Import eines Moduls oder Userform verwenden, stösst man auf das Problem, dass die entsprechenden Formattypen nicht angeboten werden.
Um diese Einschränkung zu umgehen, kann auf das API GetOpenFileName aus der CommonDialog32-Bibliothek zurückgegriffen werden, sofern diese Datei comdlg32.dll auf dem Rechner vorhanden und registriert ist.
Dieses API stellt ein Datei-speichern Dialogsfenster zur Verfügung, das über Parameter flexibel angepasst werden kann: z.B. mit eigenen Formattypen.
Dieser auf den ersten Blick sehr einfache API-Aufruf verbirgt seine Möglichkeiten hinter der Parameter-Struktur  OPENFILENAME: Diese Struktur beinhaltet nicht nur Initialisierungsinformationen für das Dialogfenster, sondern liefert auch Informationen über den ausgewählten Dateinamen, Dateipfad und Verzeichnis zurück.

Public Declare Function GetOpenFileName Lib "comdlg32.dll" _
  Alias "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long 

Dieser API-Aufruf liefert jedoch keine Informationen zurück, wenn der Benutzer den Dialog abbricht oder wenn ein Fehler auftritt. Um diese Fehler abzufangen, kann das API CommDlgExtendedError verwendet werden:

Public Type OPENFILENAME
    lStructSize As Long 
    hwndOwner As Long 
    hInstance As Long 
    lpstrFilter As String 
    lpstrCustomFilter As String 
    nMaxCustFilter As Long 
    nFilterIndex As Long 
    lpstrFile As String 
    nMaxFile As Long 
    lpstrFileTitle As String 
    nMaxFileTitle As Long 
    lpstrInitialDir As String 
    lpstrTitle As String 
    flags As Long 
    nFileOffset As Integer 
    nFileExtension As Integer 
    lpstrDefExt As String 
    lCustData As Long 
    lpfnHook As Long 
    lpTemplateName As String 
End Type  

Das folgende Beispiel öffnet ein Dialogfenster zum Importieren einer VBA-Prozedur (Userforms,Module oder Klassenmodule) mit dem angegebenen Titel. Über die festgelegten Filter kann die Dateiauswahl auf die angegebenen Dateiendungen eingeschränkt werden.

Wichtig
Diese Funktion liefert als Rückgabewert nur den ausgewählten Dateinamen inkl. Pfad, öffnet aber selbst noch nicht die Datei. Dieses muss der jeweiligen Umgebung, in der das API verwendet wird, angepasst werden:
Soll ein Modul in die VBA-IDE importiert werden, wird die .Import-Methode benötigt; soll ein Word-Dokument geöffnet werden, wird die .Open-Methode benötigt.


Function fkt_FileOpen() As String  
'used in call setup  
Dim sFilters, sType As String 
Dim pos As Integer 
'used after call  
Dim buff As String 
Dim sLname As String 
Dim sSname As String 
sFilters = "VB-Dateien (*.frm;*.bas;*.cls)" & vbNullChar & _
           "*.frm;*.bas;*.cls" & vbNullChar & _
           "Formulardateien(*.frm)" & vbNullChar & "*.frm" & vbNullChar & _
           "Basic-Dateien (*.bas)" & vbNullChar & "*.bas" & vbNullChar & _
           "Klassendateien (*.cls)" & vbNullChar & "*.cls" & vbNullChar
With OFName
  'Setzt die Größe der OPENFILENAME Struktur  
  .lStructSize = Len(OFName)
  'Der Window Handle ist bei VBA fast immer &O0  
  .hwndOwner = &O0
  ' Formattyp-Filter setzen  
  .lpstrFilter = sFilters
  .nFilterIndex = 1
  ' Buffer für Dateinamen erzeugen  
  .lpstrFile = sModul & Space$(1024) & vbNullChar & vbNullChar
  ' Maximale Anzahl der Dateinamen-Zeichen  
  .nMaxFile = Len(.lpstrFile)
  ' Buffer für Titel erzeugen  
  .lpstrFileTitle = Space$(254)
  ' Maximale Anzahl der Titel-Zeichen  
  .nMaxFileTitle = 255
  ' Anfangsverzeichnis vorgeben  
  .lpstrInitialDir = "c:\temp"
  ' Titel des Dialogfester festlegen  
  .lpstrTitle = "Modul exportieren"
  ' Flags zum Festlegen eines bestimmten Verhaltens,  
  ' OFN_LONGNAMES = lange Dateinamen verwenden  
  .flags = OFN_LONGNAMES
End With 
' API aufrufen und evtl. Fehler abfangen  
If GetOpenFileName(OFName) Then 
  fkt_FileOpen = Left(OFName.lpstrFile, InStr(1, OFName.lpstrFile, Chr(0)) - 1)
ElseIf intError = 0 Then 
  ' Abbruch durch Benutzer oder Fehler
End If 
End Function 

Der Aufruf dieser Funktion sieht folgendermaßen aus:

Sub DateiDialog()  
Dim sPfad As String 
sPfad = fkt_FileOpen
MsgBox "Ausgewählte Datei: " & sPfad, vbInformation, "Dateiauswahl"
End Sub  

 www.chf-online.de/api/oeffnendialog.htm © 2001-11 Christian Freßdorf (Zaphod-Systems)