Live-Forum - Die aktuellen Beiträge
Datum
Titel
24.04.2024 19:29:30
24.04.2024 18:49:56
24.04.2024 17:19:09
Anzeige
Archiv - Navigation
868to872
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
868to872
868to872
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Dialog um Ordner ODER Datei auszuwählen

Dialog um Ordner ODER Datei auszuwählen
10.05.2007 10:19:00
yogi
Tach allerseits
FileDialog kann ich mit Auswahl von msoFileDialogFilePicker oder msoFileDialogFolderPicker so starten, dass entweder eine Datei oder ein Ordner ausgewählt werden kann. Ich brauche nun aber einen Dialog, mit dem der Benutzer entscheidet, ob er einen Ordner ODER eine Datei auswählen will, ohne dies vorher angeben zu müssen.
Gibt es da was?
Gruss yogi

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Dialog um Ordner ODER Datei auszuwählen
10.05.2007 17:03:00
Nepumuk
Hallo Yogi,
Beispiel:
' **********************************************************************
' Modul: Modul2 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

Private Declare Function MoveWindow Lib "user32.dll" ( _
    ByVal hwnd As Long, _
    ByVal x As Long, _
    ByVal y As Long, _
    ByVal nWidth As Long, _
    ByVal nHeight As Long, _
    ByVal bRepaint As Long) As Long
Private Declare Function GetSystemMetrics Lib "user32.dll" ( _
    ByVal nIndex As Long) As Long
Private Declare Function GetWindowRect Lib "user32.dll" ( _
    ByVal hwnd As Long, _
    ByRef lpRect As RECT) As Long
Private Declare Function SHBrowseForFolder Lib "shell32.dll" ( _
    ByRef lpbi As InfoT) As Long
Private Declare Function CoTaskMemFree Lib "ole32.dll" ( _
    ByVal hMem As Long) As Long
Private Declare Function lstrcat Lib "kernel32.dll" Alias "lstrcatA" ( _
    ByVal lpStr1 As String, _
    ByVal lpStr2 As String) As Long
Private Declare Function SHGetPathFromIDList Lib "shell32.dll" ( _
    ByVal pList As Long, _
    ByVal lpBuffer As String) As Long
Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" ( _
    ByVal lpClassname As String, _
    ByVal lpWindowName As String) As Long
Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" ( _
    ByVal hwnd As Long, _
    ByVal Msg As Long, _
    ByRef wParam As Any, _
    ByRef lParam As Any) As Long

Private Type InfoT
    hwnd As Long
    Root As Long
    DisplayName As Long
    Title As Long
    Flags As Long
    FName As Long
    lParam As Long
    Image As Long
End Type

Private Type RECT
    Left As Long
    Top As Long
    Right As Long
    Bottom As Long
End Type

Private Enum BIF_Flag
    BIF_RETURNONLYFSDIRS = &H1
    BIF_DONTGOBELOWDOMAIN = &H2
    BIF_STATUSTEXT = &H4
    BIF_RETURNFSANCESTORS = &H8
    BIF_EDITBOX = &H10
    BIF_VALIDATE = &H20
    BIF_NEWDIALOGSTYLE = &H40
    BIF_BROWSEINCLUDEURLS = &H80
    BIF_BROWSEFORCOMPUTER = &H1000
    BIF_BROWSEFORPRINTER = &H2000
    BIF_BROWSEINCLUDEFILES = &H4000
    BIF_SHAREABLE = &H8000
End Enum

Private Const SM_CXFULLSCREEN = &H10
Private Const SM_CYFULLSCREEN = &H11
Private Const BFFM_SETSELECTION = &H466
Private Const BFFM_INITIALIZED = &H1
Private Const GC_CLASSNAMEMSEXCEL = "XLMAIN"

Private s_BrowseInitDir As String

Private Function fncGetFolder( _
        Optional ByVal sMsg As String = "Bitte wählen Sie ein Verzeichnis", _
        Optional ByVal lFlag As BIF_Flag = BIF_RETURNONLYFSDIRS, _
        Optional ByVal sPath As String = "C:\") As String

    Dim xl As InfoT, IDList As Long, RVal As Long, FolderName As String
    s_BrowseInitDir = sPath
    With xl
        .hwnd = FindWindow(GC_CLASSNAMEMSEXCEL, Application.Caption)
        .Root = 0
        .Title = lstrcat(sMsg, "")
        .Flags = lFlag
        .FName = FuncCallback(AddressOf BrowseCallback)
    End With
    IDList = SHBrowseForFolder(xl)
    If IDList <> 0 Then
        FolderName = Space(256)
        RVal = SHGetPathFromIDList(IDList, FolderName)
        CoTaskMemFree (IDList)
        FolderName = Trim$(FolderName)
        FolderName = Left$(FolderName, Len(FolderName) - 1)
    End If
    fncGetFolder = FolderName
End Function

Private Function BrowseCallback( _
        ByVal hwnd As Long, _
        ByVal uMsg As Long, _
        ByVal wParam As Long, _
        ByVal lParam As Long) As Long

    If uMsg = BFFM_INITIALIZED Then
        Call SendMessage(hwnd, BFFM_SETSELECTION, ByVal 1&, ByVal s_BrowseInitDir)
        Call CenterDialog(hwnd)
    End If
    BrowseCallback = 0
End Function

Private Function FuncCallback(ByVal nParam As Long) As Long
    FuncCallback = nParam
End Function

Private Sub CenterDialog(hwnd As Long)
    Dim WinRect As RECT, ScrWidth As Integer, ScrHeight As Integer
    Dim DlgWidth As Integer, DlgHeight As Integer
    GetWindowRect hwnd, WinRect
    DlgWidth = WinRect.Right - WinRect.Left
    DlgHeight = WinRect.Bottom - WinRect.Top
    ScrWidth = GetSystemMetrics(SM_CXFULLSCREEN)
    ScrHeight = GetSystemMetrics(SM_CYFULLSCREEN)
    MoveWindow hwnd, (ScrWidth - DlgWidth) / 2, _
        (ScrHeight - DlgHeight) / 2, DlgWidth, DlgHeight, 1
End Sub

Public Sub test()
    Dim sFolder As String
    sFolder = Trim$(fncGetFolder("Bitte Verzeichnis oder Datei wählen", _
        BIF_BROWSEINCLUDEFILES, "D:\Eigene Dateien\"))
    If sFolder <> "" Then MsgBox sFolder
End Sub

Gruß
Nepumuk

Anzeige
AW: Dialog um Ordner ODER Datei auszuwählen
14.05.2007 08:34:59
yogi
Super !!!!!!!!!!!
Kleine Frage: Das Makro ist ja für Excel geschrieben. In Word und Powerpoint läuft es ebenfalls. Wenn ich es nun auch noch in Outlook integriere, kommt bei
.hwnd = FindWindow(GC_CLASSNAMEMSEXCEL, Application.Caption)
eine Fehlermeldung. Wird diese Zeile auskommentiert, läufts. Was bewirkt diese Zeile?
Warum das ganze? Wir haben eine Makro-Suite, die alle unsere Vorlagen, Richtlinien und Mails bearbeitet. Werden nun einzelne Dateien oder ganze Ordner verschoben, müssen Hyperlinks angepasst werden. Um diese Anpassung zu vereinfachen, soll nun entweder eine einzelne Datei oder eben ein Ordner angegeben werden können, ohne zuerst noch angeben zu müssen, ob nun eine Datei oder ein Ordner gewählt werden soll.
Gruss
yogi

Anzeige
AW: Dialog um Ordner ODER Datei auszuwählen
14.05.2007 09:43:00
Nepumuk
Hallo Yogi,
damit ermittelt man das Fensterhandle. Eine von Windows vergebene Zugriffsnummer. Mit dieser wird das Auswahlfenster an die Anwendung gebunden und kann nicht in dessen Hintergrund gelangen. Da jedes Fenster eine andere Klasse ist, musst du natürlich den Klassennamen anpassen. In Excel ist das eben "XLMAIN", in Word "OpusApp", in Outlook "rctrl_renwnd32" und in Powerpoint "PP11FrameClass". Warum da jetzt eine Fehlermeldung kam, liegt wahrscheinlich daran, dass Excel nicht geöffnet war. Ich habe jetzt aber keine Zeit, das zu testen.
Gruß
Nepumuk

Anzeige
AW: Dialog um Ordner ODER Datei auszuwählen
14.05.2007 09:53:00
yogi
Tach Nepumuk
vielen Dank für die schnelle Antwort.
Excel war offen, aber ich habe schon öfters festgestellt, dass was in der Hilfe der einzelnen Office-Anwendungen angegeben ist, nicht für alle gilt.
Wie dem auch sei, ich werde es schon hinkriegen, vielen Dank.
Gruss yogi

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige