PDA

Vollständige Version anzeigen : Verzeichnisauswahldialog für Access 2000/XP


Günther Kramer
28.12.2002, 10:34
<img src="images/codearchiv/verzeichnisauswahldialog.gif" border=0><br><br>Mit dieser Funktion stellen Sie einen Auswahldialog zur Verfügung, mit dessen Hilfe der Anwender ein gewünschtes Verzeichnis auswählen kann. Der Verzeichnispfad wird als String an die Funktion zurückgegeben.<br>Die besonderheit bei diesem Beispiel ist, dass man hier auch ein Startverzeichnis angeben kann.<br><b>Achtung:</b>Der folgenden Quellcode arbeitet nicht mit Access 97! Den Quellcode für Access 97 finden Sie <a href="http://www.ms-office-wissen.de/askdrmof/details.php?id=32" TARGET="_blank" class="link">hier (Tipp für die Version Access 97)</a>.<br><br>
Erstellen Sie ein neues Modul und fügen Sie nachfolgenden Code ein:

<div><link href="http://www.ms-office-forum.net/forum/externals/codeconv.css" rel="stylesheet"><pre><span class="TOKEN">Option</span> <span class="TOKEN">Compare</span> <span class="TOKEN">Database</span>
<span class="TOKEN">Option</span> <span class="TOKEN">Explicit</span>
&nbsp;
<span class="TOKEN">Private</span> <span class="TOKEN">Type</span> BROWSEINFO
hOwner <span class="TOKEN">As</span> <span class="TOKEN">Long</span>
pidlRoot <span class="TOKEN">As</span> <span class="TOKEN">Long</span>
pszDisplayName <span class="TOKEN">As</span> <span class="TOKEN">String</span>
lpszTitle <span class="TOKEN">As</span> <span class="TOKEN">String</span>
ulFlags <span class="TOKEN">As</span> <span class="TOKEN">Long</span>
lpfn <span class="TOKEN">As</span> <span class="TOKEN">Long</span>
lParam <span class="TOKEN">As</span> <span class="TOKEN">Long</span>
iImage <span class="TOKEN">As</span> <span class="TOKEN">Long</span>
<span class="TOKEN">End</span> <span class="TOKEN">Type</span>
&nbsp;
<span class="TOKEN">Private</span> <span class="TOKEN">Declare</span> <span class="TOKEN">Function</span> SHGetPathFromIDList <span class="TOKEN">Lib</span> &quot;shell32.dll&quot; <span class="TOKEN">Alias</span> _
&quot;SHGetPathFromIDListA&quot; (<span class="TOKEN">ByVal</span> pidl <span class="TOKEN">As</span> Long, _
<span class="TOKEN">ByVal</span> pszPath <span class="TOKEN">As</span> <span class="TOKEN">String</span>) <span class="TOKEN">As</span> <span class="TOKEN">Long</span>
&nbsp;
<span class="TOKEN">Private</span> <span class="TOKEN">Declare</span> <span class="TOKEN">Function</span> SHBrowseForFolder <span class="TOKEN">Lib</span> &quot;shell32.dll&quot; <span class="TOKEN">Alias</span> _
&quot;SHBrowseForFolderA&quot; (lpBrowseInfo <span class="TOKEN">As</span> BROWSEINFO) _
<span class="TOKEN">As</span> <span class="TOKEN">Long</span>
&nbsp;
<span class="TOKEN">Private</span> <span class="TOKEN">Declare</span> <span class="TOKEN">Function</span> SendMessage <span class="TOKEN">Lib</span> &quot;user32.dll&quot; <span class="TOKEN">Alias</span> &quot;SendMessageA&quot; _
(<span class="TOKEN">ByVal</span> hWnd <span class="TOKEN">As</span> Long, <span class="TOKEN">ByVal</span> Msg <span class="TOKEN">As</span> Long, wParam <span class="TOKEN">As</span> Any, _
lParam <span class="TOKEN">As</span> Any) <span class="TOKEN">As</span> <span class="TOKEN">Long</span>
&nbsp;
<span class="TOKEN">Private</span> <span class="TOKEN">Const</span> BIF_RETURNONLYFSDIRS = &amp;H1
<span class="TOKEN">Private</span> <span class="TOKEN">Const</span> BFFM_SETSELECTION = &amp;H466
<span class="TOKEN">Private</span> <span class="TOKEN">Const</span> BFFM_INITIALIZED = 1
&nbsp;
<span class="TOKEN">Global</span> StartDir <span class="TOKEN">As</span> <span class="TOKEN">String</span>
&nbsp;
<span class="TOKEN">Public Function</span> VerzeichnisSuchen(szDialogTitle <span class="TOKEN">As</span> String, _
StartVerzeichnis <span class="TOKEN">As</span> <span class="TOKEN">String</span>) <span class="TOKEN">As</span> <span class="TOKEN">String</span>
&nbsp;
<span class="TOKEN">Dim</span> X <span class="TOKEN">As</span> <span class="TOKEN">Long</span>
<span class="TOKEN">Dim</span> bi <span class="TOKEN">As</span> BROWSEINFO
<span class="TOKEN">Dim</span> dwIList <span class="TOKEN">As</span> <span class="TOKEN">Long</span>
<span class="TOKEN">Dim</span> szPath <span class="TOKEN">As</span> <span class="TOKEN">String</span>
<span class="TOKEN">Dim</span> wPos <span class="TOKEN">As</span> <span class="TOKEN">Integer</span>
&nbsp;
StartDir = StartVerzeichnis
&nbsp;
<span class="TOKEN">With</span> bi
.hOwner = hWndAccessApp
.lpszTitle = szDialogTitle
.ulFlags = BIF_RETURNONLYFSDIRS
.lpfn = DummyFunc(<span class="TOKEN">AddressOf</span> BrowseCallbackProc)
<span class="TOKEN">End</span> <span class="TOKEN">With</span>
&nbsp;
dwIList = SHBrowseForFolder(bi)
szPath = Space$(512)
X = SHGetPathFromIDList(<span class="TOKEN">ByVal</span> dwIList, <span class="TOKEN">ByVal</span> szPath)
&nbsp;
<span class="TOKEN">If</span> X <span class="TOKEN">Then</span>
wPos = InStr(szPath, Chr(0))
VerzeichnisSuchen = Left$(szPath, wPos - 1)
<span class="TOKEN">Else</span>
VerzeichnisSuchen = &quot;&quot;
<span class="TOKEN">End</span> <span class="TOKEN">If</span>
<span class="TOKEN">End</span> <span class="TOKEN">Function</span>
<span class="TOKEN">Public Function</span> BrowseCallbackProc(<span class="TOKEN">ByVal</span> hWnd <span class="TOKEN">As</span> Long, <span class="TOKEN">ByVal</span> uMsg <span class="TOKEN">As</span> Long, _
<span class="TOKEN">ByVal</span> lParam <span class="TOKEN">As</span> Long, <span class="TOKEN">ByVal</span> lpData <span class="TOKEN">As</span> <span class="TOKEN">Long</span>) <span class="TOKEN">As</span> <span class="TOKEN">Long</span>
&nbsp;
<span class="TOKEN">Dim</span> pathstring <span class="TOKEN">As</span> <span class="TOKEN">String</span>
<span class="TOKEN">Dim</span> retval <span class="TOKEN">As</span> <span class="TOKEN">Long</span>
&nbsp;
Select Case uMsg
Case BFFM_INITIALIZED
pathstring = StartDir
retval = SendMessage(hWnd, BFFM_SETSELECTION, _
<span class="TOKEN">ByVal</span> <span class="TOKEN">CLng</span>(1), <span class="TOKEN">ByVal</span> pathstring)
<span class="TOKEN">End</span> Select
&nbsp;
BrowseCallbackProc = 0
&nbsp;
<span class="TOKEN">End</span> <span class="TOKEN">Function</span>
<span class="TOKEN">Public Function</span> DummyFunc(<span class="TOKEN">ByVal</span> param <span class="TOKEN">As</span> <span class="TOKEN">Long</span>) <span class="TOKEN">As</span> <span class="TOKEN">Long</span>
&nbsp;
DummyFunc = param
&nbsp;
<span class="TOKEN">End</span> <span class="TOKEN">Function</span></pre></div>

Um den Dialog aufzurufen und das Ergebnis einem Feld innerhalb des Formulars zurückzugeben erstellen Sie bitte eine Schaltfläche mit dem Namen <b>Verzeichnisauswahl</b>. Der im Beispiel verwendete Namen für das Feld, in welches der Verzeichnispfad zurückgeschrieben wird, lautet <b>Verzeichnis</b>. Beide Namen (Schaltfläche & Feld) können Sie natürlich anders benennen.

<div><link href="http://www.ms-office-forum.net/forum/externals/codeconv.css" rel="stylesheet"><pre><span class="TOKEN">Private Sub</span> Verzeichnisauswahl_Click()
&nbsp;
<span class="TOKEN">Dim</span> strVerzeichnisName <span class="TOKEN">As</span> <span class="TOKEN">String</span>
&nbsp;
<span class="TOKEN">If</span> IsNull(Me!Verzeichnis) <span class="TOKEN">Then</span>
Me!Verzeichnis = &quot;&quot;
<span class="TOKEN">End</span> <span class="TOKEN">If</span>
&nbsp;
strVerzeichnisName = VerzeichnisSuchen _
(&quot;W&auml;hlen Sie bitte das Verzeichnis aus!&quot;, Me!Verzeichnis)
&nbsp;
<span class="TOKEN">If</span> ((<span class="TOKEN">Not</span> IsNull(strVerzeichnisName)) <span class="TOKEN">And</span> (strVerzeichnisName &lt;&gt; &quot;&quot;)) <span class="TOKEN">Then</span>
Me!Verzeichnis = strVerzeichnisName
<span class="TOKEN">End</span> <span class="TOKEN">If</span>
&nbsp;
<span class="TOKEN">End</span> <span class="TOKEN">Sub</span></pre></div>

Sascha Trowitzsch
29.07.2003, 13:02
Alternativen gibt es auch unter http://www.ms-office-forum.net/forum/showthread.php?s=&threadid=95650

dänu
14.01.2005, 10:18
Diese Beschreibung funktioniert einwandfrei...
aber wenn man ein Laufwerk auswählt (z.B. c:), dann ist der übergebene String "C:\". Wenn man aber C:\Temp auswählt, dann wird der String "C:\Temp" (ohne Backslash am Schluss)

Dies ist mühsam, da es bei mir Fehler gibt, wenn man auf ein Laufwerk speichern will.
Wie kann ich dies umgehen?

edit:
sorry für das ausgraben eines so alten Threads...

Arne Dieckmann
14.01.2005, 11:09
Dann kontrolliere einfach das rechte Zeichen des Übergabewertes:
If Right(strVerzeichnisName,1)<>"\" Then
strVerZeichnisName=strVerzeichnisName & "\"
End If

dänu
14.01.2005, 11:29
aaah... :)
vielen Dank für den Tipp!

woormsen
13.09.2005, 09:35
Hallo Forum, wie kann man denn die Verzeichnispfadauswahl auf eine Dateiauswahl erweitern ?? der Hintergrund: ich möchte eine txt. , mdb. oder xls. -Datei auswählen und diese dann in eine Tabelle importieren. bin aber ein armer asp.net Entwickler
und sitze seit genau einem 1 Tag und 2 Stunden vor Access mit VBA & mein VB.Net Wissen hilft mir bei der Aufgabe bisher nicht weiter. Danke im voraus und Gruss, Thomas

woormsen
13.09.2005, 10:14
oops... hab noch einen fehler, den ich nicht handeln kann --> wenn ich die access -db auf ein netzlaufwerk lege und eine verknüpfung auf den desktop eines anderen rechners lege , kommt folgender fehler, wenn ich ein verzeichnis auswählen möchte: kann bibliothek nicht finden und verweist auf den codeteil

szPath = Space$(512)

gruss thomas

petrowsky
26.08.2009, 10:44
Hallo
leider kann ich diesen schönen Code nicht nutzen,
ich bekomme folgende Fehler.

Private Const BIF_RETURNONLYFSDIRS = &H1
Private Const BFFM_SETSELECTION = &H466
Private Const BFFM_INITIALIZED = 1

Global StartDir As String


Konstanten, Zeichenfolgen fester Länge, Datenfelder, benutzerdefinierte Typen und Declare-Anweisungen sind nicht als Public-Elemente von Klassen- oder Formularmodulen zugelassen

hcscherzer
27.08.2009, 08:27
Hast Du es versucht mit Public StartDir As String