Funktion aufrufen

Hallo,

ich habe folgendes Problem und zwar habe ich eine Funktion:

Public Function SelectDirectory(DialogText As String, \_
 DefaultPath As String, \_
 OwnerhWnd As Long) As String

Diese möchte ich so aufrufen:

Sub GetDirectory()
 Dim directory As String
 directory = SelectDirectory("Select a directory", "C:\", "Me.hWnd")
 MsgBox "directory"
End Sub

Ich bekomme aber einen Laufzeitfehler „Type mismatch“ und zwar in dieser Zeile: directory = SelectDirectory(…). Kann mir jemand bitte helfen? Ich bin im Voraus dankbar.

Viele Grüße,
UnR3al

Hallo,

ich habe folgendes Problem und zwar habe ich eine Funktion:

Public Function SelectDirectory(DialogText As String, _
DefaultPath As String, _
OwnerhWnd As Long ) As String

Das Handle wird als Long erwartet …

Diese möchte ich so aufrufen:

Sub GetDirectory()
Dim directory As String
directory = SelectDirectory(„Select a directory“, „C:“,
"Me.hWnd" )

… und als String übergeben.

MsgBox „directory“
End Sub

Ich bekomme aber einen Laufzeitfehler „Type mismatch“ und zwar
in dieser Zeile: directory = SelectDirectory(…).

Laß die Anführungszeichen bei ‚Me.hWnd‘ weg.

Gruß, Rainer

Hallo Rainer,

danke schon erst einmal für deine Antwort.

Laß die Anführungszeichen bei ‚Me.hWnd‘ weg.

Habe ich jetzt gemacht und bekomme folgenden Fehler: „Compile error: Invalid use of Me keyword“. Weißt du zufällig, woran es liegt?

Danke!
Michael

Hallo Michael,

Laß die Anführungszeichen bei ‚Me.hWnd‘ weg.

Habe ich jetzt gemacht und bekomme folgenden Fehler: „Compile
error: Invalid use of Me keyword“. Weißt du zufällig, woran es
liegt?

nicht präzise, ich habe nur eine verschwommene Vorstellung. Ich fürchte, daß Du das Handle nicht so übergeben darfst, schreib es doch mal in eine Variable und dann die Variable in den Aufruf der Funktion.
Ich hatte beim aufruf von Funktionen auch schon das Problem, daß ich da keine Eigenschaft von Objekten eintragen konnte, der ‚Umweg‘ über Variablen hat dann geholfen.

Grußm Rainer

Hallo.

Laß die Anführungszeichen bei ‚Me.hWnd‘ weg.

Habe ich jetzt gemacht und bekomme folgenden Fehler: „Compile
error: Invalid use of Me keyword“. Weißt du zufällig, woran es
liegt?

Könnte das am Punkt liegen? Ich kenne VB zwar hauptsächlich aus dem Access-Beritt - aber nach meinem Verständnis bezeichnet der Punkt eine Eigenschaft oder Methode des Objekts. Versuch mal ein Ausrufezeichen, also Me!hWnd.

Ansonsten stellt sich die Frage, wer „Me“ zur Laufzeit ist. Es soll ja wohl das aktuelle Fenster sein … ist es das? Oder wird „Me“ hier von einem anderen Objekt belegt? Dann müsstest Du ActiveWindow.hWnd oder was weiß denn ich (s.o.) übergeben.

Sorry für Schwammizität - habe hier kein VB (könnte erst zu Hause nachgucken).

Gruß Eillicht zu Vensre

Hallo,

Könnte das am Punkt liegen?

nein, die Syntax ist korrekt.

Ich kenne VB zwar hauptsächlich
aus dem Access-Beritt - aber nach meinem Verständnis
bezeichnet der Punkt eine Eigenschaft oder Methode des
Objekts.

Ja genau, das Objekt ist das Fenster der Form.

Versuch mal ein Ausrufezeichen, also Me!hWnd.

Nein, das geht nicht.

Ansonsten stellt sich die Frage, wer „Me“ zur Laufzeit ist. Es
soll ja wohl das aktuelle Fenster sein … ist es das?

Das Fenster der Form, in dem dieser Code steht. Das muß nicht das aktuelle Fenster sein. Die Eigenschaft ist auch verfügbar, wenn das Fenster gerade unsichtbar ist.

Oder
wird „Me“ hier von einem anderen Objekt belegt?

Nein, Me ist ein Schlüsselwort, das kann man nicht anders verwenden.

Dann müsstest
Du ActiveWindow.hWnd oder was weiß denn ich (s.o.) übergeben.

Das wäre dann nicht immer das richtige Fenster.

Gruß, Rainer

Hallo,

Habe ich jetzt gemacht und bekomme folgenden Fehler: „Compile
error: Invalid use of Me keyword“. Weißt du zufällig, woran es
liegt?

noch eine Vermutung … hast Du den Befehl in einer Prozedur einer Form verwendet? Im Modul geht das nicht, da weiß der Compiler nicht, welches Fenster gemeint ist, dann schreibe statt Me den Namen der Form.

Gruß, Rainer

Hallo Rainer,

noch eine Vermutung … hast Du den Befehl in einer Prozedur
einer Form verwendet? Im Modul geht das nicht, da weiß der
Compiler nicht, welches Fenster gemeint ist, dann schreibe
statt Me den Namen der Form.

vielen Dank für deine Tipps, ich werde am Freitag versuchen sie anzuwenden. Das Ergebnis werde ich dann hier posten.

Viele Grüße,
Michael

Hallo Rainer,

noch eine Vermutung … hast Du den Befehl in einer Prozedur
einer Form verwendet? Im Modul geht das nicht, da weiß der
Compiler nicht, welches Fenster gemeint ist, dann schreibe
statt Me den Namen der Form.

Ich habe den kompletten Code inklusive der Prozedur in einem Modul. Mit VB kenne ich mich kaum aus, besteht keine Möglichkeit das ganze in einem Modul zu lassen? Eigentlich wollte ich nur Excel-Makro schreiben, mit dem ich mit Hilfe eines Dialogs ein Verzeichnis bestimmen kann und dieses dann als String zurückbekomme.

Wenn es nicht anders geht, schreibe ich in die Form die Prozedur und rufe von dort die Funktion aus? Die Definition der Funktion befindet sich aber in einem Modul, benötige ich dann eine „inlcude“-Anweisung für das Modul, wie in anderen Programmiersprachen?

Für deine Hilfe bin ich dir im Voraus sehr dankbar.

Viele Grüße,
Michael

Hallo,

Ich habe den kompletten Code inklusive der Prozedur in einem
Modul. Mit VB kenne ich mich kaum aus, besteht keine
Möglichkeit das ganze in einem Modul zu lassen?

Ja. Du hast nur die Lösung übersehen, die ich Dir schon geschrieben habe.

Me.hWnd

geht im Modul nicht, das hat Dir VB ja gesagt. Statt Me. mußt Du den Namen der Form schreiben, Beispiel:

Form1.hWnd

Dann geht es auch aus dem Modul. Ich weiß nicht, wie Deine Form heißt, Du mußt den richtigen Namen eintragen.

Gruß, Rainer

Hallo Rainer,

ich hoffe, du hast noch etwas Geduld mit mir.

geht im Modul nicht, das hat Dir VB ja gesagt. Statt Me. mußt
Du den Namen der Form schreiben.

Ich habe keine Form erstellt, mein kompletter Code befindet sich in einem Modul. Mein VB-Projekt sieht folgendermaßen aus:
Modul1, Sheet1, ThisWorkbook. Folgenden Code habe ich ins das Modul1 kopiert. Muss ich damit es läuft noch eine Form erstellen? Wenn ja, welchen Teil vom Code muss dort schreiben?

Ich danke dir vielmals für deine Mühe.

Viele Grüße,
Michael

Option Explicit

' == Dialog-Einstellungen ================================

' String, der vor dem aktuell ausgewählen Verzeichnis angezeigt wird,
' falls der ShowCurrentPath-Paramter True ist.
Private Const DIALOG\_CURRENT\_SELECTION\_TEXT As String = "Auswahl: "


' == API-Deklarationen ===================================

Private Type BROWSEINFO
 hOwner As Long
 pidlRoot As Long
 pszDisplayName As String
 lpszTitle As String
 ulFlags As Long
 lpfnCallback As Long
 lParam As Long
 iImage As Long
End Type

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

Private Type Size
 cx As Long
 cy As Long
End Type

Private Declare Function SHBrowseForFolder Lib "shell32.dll" \_
 Alias "SHBrowseForFolderA" ( \_
 lpBrowseInfo As BROWSEINFO) As Long

Private Declare Function SHGetPathFromIDList Lib "shell32.dll" \_
 Alias "SHGetPathFromIDListA" ( \_
 ByVal lPIDL As Long, \_
 ByVal pszPath As String) As Long

Private Declare Sub CoTaskMemFree Lib "ole32.dll" ( \_
 ByVal pv As Long)

Private Declare Function SendMessage Lib "user32" \_
 Alias "SendMessageA" ( \_
 ByVal hwnd As Long, \_
 ByVal wMsg As Long, \_
 ByVal wParam As Long, \_
 lParam As Any) As Long

Private Declare Sub CopyMemory Lib "kernel32" \_
 Alias "RtlMoveMemory" ( \_
 pDest As Any, \_
 pSource As Any, \_
 ByVal dwLength As Long)

Private Declare Function ILCreateFromPath Lib "shell32" \_
 Alias "#157" ( \_
 ByVal sPath As String) As Long

Private Declare Function LocalAlloc Lib "kernel32" ( \_
 ByVal uFlags As Long, \_
 ByVal uBytes As Long) As Long

Private Declare Function LocalFree Lib "kernel32" ( \_
 ByVal hmem As Long) As Long

Private Declare Function lstrcpyA Lib "kernel32" ( \_
 lpString1 As Any, \_
 lpString2 As Any) As Long

Private Declare Function lstrlenA Lib "kernel32" ( \_
 lpString As Any) As Long

Private Declare Function FindWindowEx Lib "user32.dll" \_
 Alias "FindWindowExA" ( \_
 ByVal hWnd1 As Long, \_
 ByVal hWnd2 As Long, \_
 ByVal lpsz1 As String, \_
 ByVal lpsz2 As String) As Long

Private Declare Function GetWindowDC Lib "user32.dll" ( \_
 ByVal hwnd As Long) As Long

Private Declare Function GetWindowRect Lib "user32.dll" ( \_
 ByVal hwnd As Long, \_
 ByRef lpRect As RECT) As Long

Private Declare Function GetTextExtentPoint Lib "gdi32.dll" \_
 Alias "GetTextExtentPointA" ( \_
 ByVal hDC As Long, \_
 ByVal lpszString As String, \_
 ByVal cbString As Long, \_
 ByRef lpSize As Size) As Long

Private Declare Function PathCompactPath Lib "shlwapi.dll" \_
 Alias "PathCompactPathA" ( \_
 ByVal hDC As Long, \_
 ByVal pszPath As String, \_
 ByVal dx As Long) As Long

Private Const MAX\_PATH = 260

Private Const WM\_USER = &H400

Private Const BFFM\_INITIALIZED = 1
Private Const BFFM\_SELCHANGED As Long = 2
Private Const BFFM\_SETSTATUSTEXTA As Long = (WM\_USER + 100)
Private Const BFFM\_SETSTATUSTEXTW As Long = (WM\_USER + 104)
Private Const BFFM\_ENABLEOK As Long = (WM\_USER + 101)
Private Const BFFM\_SETSELECTIONA As Long = (WM\_USER + 102)
Private Const BFFM\_SETSELECTIONW As Long = (WM\_USER + 103)

Private Const BIF\_NEWDIALOGSTYLE As Long = &H40
Private Const BIF\_RETURNONLYFSDIRS As Long = &H1
Private Const BIF\_BROWSEINCLUDEFILES As Long = &H4000
Private Const BIF\_STATUSTEXT As Long = &H4

Private Const LMEM\_FIXED = &H0
Private Const LMEM\_ZEROINIT = &H40
Private Const LPTR = (LMEM\_FIXED Or LMEM\_ZEROINIT)

' Zeigt den BrowseForFolder-Dialog an.
Public Function BrowseForFolder(DialogText As String, \_
 DefaultPath As String, \_
 OwnerhWnd As Long, \_
 Optional ShowCurrentPath As Boolean = True, \_
 Optional RootPath As Variant, \_
 Optional NewDialogStyle As Boolean = False, \_
 Optional IncludeFiles As Boolean = False) As String

 ' Parameter:
 ' o DialogText Dialogtext, der oben im Dialog angezeigt wird.
 ' o DefaultPath Standardmäßig ausgewähltes Verzeichnis.
 ' o OwnerhWnd hWnd des übergeordneten Fensters (in den meisten
 ' Fällen Me.hWnd).
 ' o ShowCurrentPath Legt fest, ob die aktuelle Verzeichnisauswahl
 ' angezeigt werden soll. Verfügbar ab
 ' Internet Explorer 4.0 (-\> PathCompactPath).
 ' o RootPath Root-Verzeichnis. Wird es angegeben, werden nur die
 ' Ordner unterhalb dieses Verzeichnisses angezeigt.
 ' o NewDialogStyle Legt fest, ob der Dialog in der neuen Darstellung
 ' angezeigt werden soll (Dialog kann vergrößert/
 ' verkleinert werden, es ist eine Schaltfläche zum
 ' Anlegen eines neuen Ordners vorhanden, es können
 ' Dateioperationen wie löschen etc. ausgeführt
 ' werden, ...). Ist dieser Parameter True, hat der
 ' Parameter ShowCurrentPath keine Wirkung. Verfügbar
 ' unter WinME und Betriebsystemen ab Win2000.
 ' o IncludeFiles Legt fest, ob auch Dateien im Dialog angezeigt und
 ' ausgewählt werden können.
 ' Verfügbar ab Win98 und Internet Explorer 4.0 (bei
 ' frühreren Windowsversionen muss IE4 inkl. der
 ' Integrated Shell installiert sein).

 Dim biBrowseInfo As BROWSEINFO
 Dim lPIDL As Long
 Dim sBuffer As String
 Dim lBufferPointer As Long

 With biBrowseInfo
 ' Handle des übergeordneten Fensters
 .hOwner = OwnerhWnd

 ' PIDL des Rootordners zuweisen
 If Not IsMissing(RootPath) Then .pidlRoot = PathToPIDL(RootPath)

 ' Dialogtext zuweisen
 If ShowCurrentPath And DialogText = "$" Then DialogText = "" ' Wird intern nicht zugelassen
 .lpszTitle = DialogText

 ' Stringbuffer für aktuell selektierten Pfad zuweisen
 If ShowCurrentPath Then .pszDisplayName = sBuffer

 ' Dialogeinstellungen zuweisen
 .ulFlags = BIF\_RETURNONLYFSDIRS + \_
 IIf(ShowCurrentPath, BIF\_STATUSTEXT, 0) + \_
 IIf(NewDialogStyle, BIF\_NEWDIALOGSTYLE, 0) + \_
 IIf(IncludeFiles, BIF\_BROWSEINCLUDEFILES, 0)

 ' Callbackfunktion-Adresse zuweisen
 .lpfnCallback = FARPROC(AddressOf CallbackString)

 ' PIDL des vorselektierten Ordnerpfades zuweisen (wird im
 ' lpData-Parameter an die Callback-Funktion weitergeleitet)
 .lParam = PathToPIDL(DefaultPath)
 End With

 ' BrowseForFolder-Dialog anzeigen
 lPIDL = SHBrowseForFolder(biBrowseInfo)

 If lPIDL Then
 ' Stringspeicher reservieren
 sBuffer = Space$(MAX\_PATH)

 ' Selektierten Pfad aus der zurückgegebenen PIDL ermitteln
 SHGetPathFromIDList lPIDL, sBuffer

 ' Nullterminierungszeichen des Strings entfernen
 sBuffer = Left$(sBuffer, InStr(sBuffer, vbNullChar) - 1)

 ' Selektierten Pfad zurückgeben
 BrowseForFolder = sBuffer

 ' Reservierten Task-Speicher wieder freigeben
 Call CoTaskMemFree(lPIDL)
 End If

 ' Stringspeicher wieder freigeben
 If ShowCurrentPath Then Call LocalFree(lBufferPointer)
End Function

Private Function CallbackString(ByVal hwnd As Long, ByVal uMsg As Long, \_
 ByVal lParam As Long, ByVal lpData As Long) As Long

 ' Callback-Funktion des BrowseForFolder-Dialogs. Wird bei
 ' eintretenden Ereignissen des Dialogs aufgerufen.

 Dim sBuffer As String
 Dim lStaticWnd As Long
 Dim lStaticDC As Long
 Dim sPath As String
 Dim rctStatic As RECT
 Dim szTextSize As Size

 ' Meldungen herausfiltern
 Select Case uMsg
 Case BFFM\_INITIALIZED
 ' Dialog wurde initialisiert

 ' Standardmäßig markierten Pfad (dessen PIDL wurde in lpData
 ' übergeben) im Dialog selektieren
 Call SendMessage(hwnd, BFFM\_SETSELECTIONA, False, ByVal lpData)
 Case BFFM\_SELCHANGED
 ' Selektion hat sich geändert

 ' Stringspeicher reservieren
 sBuffer = Space$(MAX\_PATH)

 ' Aktuell selektierten Pfad ermitteln und anzeigen, wenn möglich
 If SHGetPathFromIDList(lParam, sBuffer) Then
 ' Temporäre Zeichenfolge an das Anzeigelabel senden, um
 ' dessen Handle anhand dieser Zeichenfolge ermitteln zu können
 SendMessage hwnd, BFFM\_SETSTATUSTEXTA, 0&, ByVal "$"

 ' Handle und DeviceContext des Anzeigelabels ermitteln
 lStaticWnd = FindWindowEx(hwnd, ByVal 0&, ByVal "Static", ByVal "$")
 lStaticDC = GetWindowDC(lStaticWnd)

 ' Abmessungen des Anzeigelabels ermitteln
 GetWindowRect lStaticWnd, rctStatic

 ' Textabmessungen der Zeichenfolge "Auswahl: " im Anzeigelabel
 ' ermitteln
 GetTextExtentPoint lStaticDC, ByVal DIALOG\_CURRENT\_SELECTION\_TEXT, \_
 ByVal Len(DIALOG\_CURRENT\_SELECTION\_TEXT), szTextSize

 ' Anzuzeigenden Pfad auf die Abmessungen des Anzeigelabels
 ' kürzen; falls dies nicht möglich ist, gesamten Pfad anzeigen
 sPath = sBuffer
 If PathCompactPath(ByVal lStaticDC, sPath, ByVal (rctStatic.Right - \_
 rctStatic.Left - szTextSize.cx + 80)) = 0 Then sPath = sBuffer

 ' Nullterminierung entfernen
 sPath = Left$(sPath, InStr(1, sPath, vbNullChar) - 1)

 ' Pfad im Dialog anzeigen
 Call SendMessage(hwnd, BFFM\_SETSTATUSTEXTA, 0&, \_
 ByVal DIALOG\_CURRENT\_SELECTION\_TEXT & sPath)
 Else
 ' Pfadanzeige leeren
 SendMessage hwnd, BFFM\_SETSTATUSTEXTA, 0&, ByVal ""
 End If
 End Select
End Function

Private Function FARPROC(FunctionPointer As Long) As Long
 ' Funktion wird benötigt, um Funktions-Adresse ermitteln
 ' zu können, dessen Adresse mit AddressOf übergeben und
 ' anschließend wieder zurückgegeben wird.

 FARPROC = FunctionPointer
End Function

' Gibt die lPIDL zum übergebenen Pfad zurück.
Private Function PathToPIDL(ByVal sPath As String) As Long
 Dim lRet As Long

 lRet = ILCreateFromPath(sPath)
 If lRet = 0 Then
 sPath = StrConv(sPath, VbStrConv.vbUnicode)
 lRet = ILCreateFromPath(sPath)
 End If

 PathToPIDL = lRet
End Function

Sub GetDirectory()
 Dim directory As String
 directory = BrowseForFolder("Select a directory", "C:\", Me.hwnd, True, , True, False)
 MsgBox "directory"
End Sub

Hallo,

ich hoffe, du hast noch etwas Geduld mit mir.

mit der Geduld habe ich kein Problem. :smile: Ich hoffe nur, daß ich auch wirklich helfen kann, ich verstehe Deinen Code nämlich nicht vollständig. Beim ersten lesen, überfliegen ist mir nur bei der Durchsicht der Deklarationen aufgefallen, daß Du mit Subclassing in den Nachrichtenstrom eingreifen willst und Manipulationen des Arbeitsspeichers vor hast. Die Stelle, wo das passiert habe ich dann aber nicht gefunden … :smile:

Zu Deinem Problem.

Warum hst Du Me.hWnd überhaupt verwendet? Welches Handle möchtest Du da übergeben? In der Funktion, die Du aufrufst, …

’ Zeigt den BrowseForFolder-Dialog an.
Public Function BrowseForFolder(DialogText As String, _
DefaultPath As String, _
OwnerhWnd As Long, _
Optional ShowCurrentPath As Boolean = True, _
Optional RootPath As Variant, _
Optional NewDialogStyle As Boolean = False, _
Optional IncludeFiles As Boolean = False) As String

… steht OwnerhWnd (‚Eigentümer-Handle‘) was immer das auch heißen mag. An einer anderen Stelle des Codes übergibst Du den Inhelt einer Variabeln ‚OwnerhWnd‘

With biBrowseInfo
’ Handle des übergeordneten Fensters
.hOwner = OwnerhWnd

Ich habe keine Form erstellt, mein kompletter Code befindet
sich in einem Modul. Mein VB-Projekt sieht folgendermaßen aus:
Modul1, Sheet1, ThisWorkbook.

VBA. Das kann ich noch nicht mal testen, ich arbeite nur mit VB, Excel habe ich gar nicht installiert. :smile:

Folgenden Code habe ich ins das
Modul1 kopiert. Muss ich damit es läuft noch eine Form
erstellen? Wenn ja, welchen Teil vom Code muss dort schreiben?

Nein, eher nicht. Nur Me.hWnd kannst Du eben nicht verwenden, weil Me. eben ein Objekt ist, die Form … und wenn keine Form da ist, muß das einen Fehler auslösen. Wo hast Du das her? Welches Handle (Identifikationsnummer eines Fensters) willst Du übergeben? Um welches Fenster geht es? Das habe ich nicht verstanden.

Und nur mal der Neugierde halber, ob das hilft, das Problem zu verstehen, weiß ich noch nicht … Was soll der Code eigentlich machen? Irgendwie beschleicht mich beim Lesen der Verdacht, Du willst einen Commondialog nachbauen? Bist Du sicher, daß Du in den Nachrichtenstrom eingreifen mußt, um Dein Ziel zu erreichen? Das ist etwas für die Profis, das Programm stürzt dabei gern mal ab und reißt auch schon mal Windows mit … Ich lasse davon immer gern die Finger, wenn es sich vermeiden läßt. Auch CopyMemory ist nicht ganz ungefählich, wenn man nicht genau weiß, was man tut. Ein Byte zu viel kopiert und der Task schmiert ab.

Noch ein Lösungsvorschlag.

Übergib doch vorläufig erst mal das Handle des aktuellen Fensters, das ist aber nur dann das richtige Fenster, wenn Dein Programm im Vordergrund ist. Wenn ich im folgenden Programm auf den Button klicke, bekomme ich drei identische Werte, drei mal das selbe Handle, weil Me. das aktive Fenster und im Vordergrund ist.

Option Explicit

Private Declare Function GetActiveWindow Lib "user32" () As Long
Private Declare Function GetForegroundWindow Lib "user32" () As Long

Private Sub Command1\_Click()
 Label1.Caption = Me.hWnd
 Label2.Caption = GetActiveWindow()
 Label3.Caption = GetForegroundWindow()
End Sub

Eventuell hilft das ja.

Gruß, Rainer

Hallo Rainer,

vielen Dank für deine erneute Hilfe.

Und nur mal der Neugierde halber, ob das hilft, das Problem zu
verstehen, weiß ich noch nicht … Was soll der Code
eigentlich machen?

Ich wollte eigentlich einen Dialog bauen, mit dem ich ein Verzeichnis auswählen kann um dieses dann als String zu verarbeiten.

Irgendwie beschleicht mich beim Lesen der
Verdacht, Du willst einen Commondialog nachbauen?

Dein Verdacht ist richtig. Ich wußte allerdings nicht, ob man mein o.g. Problem mit dem Commondialog lösen kann. Wenn du vielleicht irgendwelche Tipps dazu hättest, wäre ich dir sehr dankbar. Denn nach dem du alle Gefahren aufgezählt hast, werde ich das selbstgebastelte Dialog erst einmal zur Seite legen.

Viele Grüße,
Michael

Hallo Michael,

Dein Verdacht ist richtig. Ich wußte allerdings nicht, ob man
mein o.g. Problem mit dem Commondialog lösen kann. Wenn du
vielleicht irgendwelche Tipps dazu hättest, wäre ich dir sehr
dankbar. Denn nach dem du alle Gefahren aufgezählt hast, werde
ich das selbstgebastelte Dialog erst einmal zur Seite legen.

Hmmm, in VB kein Problem, aber wie macht man das mit VBA?

Was genau willst Du machen? Wenn Du ein Unterverzeichnis wählen willst, muß ja eine Auswahl angezeigt werden. Wenn Du keine Form hast, kann es das ja nicht sein, oder irre ich mich da?
Willst Du eventuell nur den Pfad des übergeordneten Verzeichnisses haben?

dann reicht:

Private Sub Parent()
 Label1.Caption = CurDir
 For i = Len(CurDir) To 1 Step -1
 If Mid(CurDir, i, 1) = "\" Then
 Exit For
 End If
 Next
 If i \> 1 Then
 Label2.Caption = Left(CurDir, i - 1)
 Else
 Label2.Caption = CurDir
 End If
End Sub

Gruß, Rainer

Hallo Michael,

ich habe inzwischen mal etwas ‚gebastelt‘. :smile:
Ich nehme doch an, daß Du auch an die Unterverzeichnisse möchtset, dafür bietet sich das FSO an. Wie Du die zur Auswahl stellst, weißt Du sicher am Besten, wie Du sie findest, zeigt der folgende Code.
In meinem VB-Programm listet die Prozedur folgendes auf:

  • Das ‚parent‘-Verzeichnis

  • Das aktuelle Verzeichnis

  • Alle Unterverzeichnisse

    Private Sub ListFolder()
    Dim fld As String
    fld = „C:\Programme“
    Set fso = CreateObject(„Scripting.FileSystemObject“)
    List1.AddItem fso.GetParentFolderName(fld)
    List1.AddItem fso.GetFolder(fld)
    For Each Subfolder In fso.GetFolder(fld).SubFolders
    List1.AddItem Subfolder
    Next
    End Sub

Das dürfte das sein, was Du wolltest. Nun ist das etwas kürzer geworden und kommt ohne hooks aus.

Gruß, Rainer

Hallo Rainer,

vielen Dank. Du hast mir sehr geholfen.

Viele Grüße,
Michael