Ich hab mal wieder ein Problem:
Ich moechte aus meinem VBA-Programm (Excel 97) den Benutzer ueber einen
windowsueblichen Dialog nach einem Verzeichnis fragen, um spaeter in
diesem Verzeichniss mehrere Dateien abzuspeichern.
Bisher hab ich es aber nur geschafft eine Datei (incl. Pfad) abzufregan:
mit
Application.GetOpenFilename
Meine bisherige Notloesung:
ich frage mit dieser Funktion eine Dummy-Datei ab und schneide den
Dateinamen ab.
- nicht sehr elegant
- funktioniert bei leeren Verzeichnissen nicht
Kann mir jemand einen Tip geben, wie ich "nur" ein Verzeichnis abfragen
kann.
Im Voraus vielen Dank
Gruss Tobias
nachfolgend ein API-Aufruf zu diesem Thema. Ich glaube, von Stephen
Bullen, weiß es aber nicht mehr so genaus:
Public Type BROWSEINFO
hOwner As Long
pidlRoot As Long
pszDisplayName As String
lpszTitle As String
ulFlags As Long
lpfn As Long
lParam As Long
iImage As Long
End Type
'32-bit API-Deklarationen
Declare Function SHGetPathFromIDList Lib "shell32.dll" _
Alias "SHGetPathFromIDListA" (ByVal pidl As Long, ByVal pszPath As
String) As Long
Declare Function SHBrowseForFolder Lib "shell32.dll" _
Alias "SHBrowseForFolderA" (lpBrowseInfo As BROWSEINFO) As Long
Sub DirAuswahl()
Dim msg As String
msg = "Wählen Sie bitte einen Ordner aus:"
MsgBox getdirectory(msg)
End Sub
Function getdirectory(Optional msg) As String
Dim bInfo As BROWSEINFO
Dim Path As String
Dim r As Long, x As Long, pos As Integer
' Ausgangsordner = Desktop
bInfo.pidlRoot = 0&
' Dialogtitel
If IsMissing(msg) Then
bInfo.lpszTitle = "Wählen Sie bitte einen Ordner aus."
Else
bInfo.lpszTitle = msg
End If
' Rückgabe des Unterverzeichnisses
bInfo.ulFlags = &h1
' Dialog anzeigen
x = SHBrowseForFolder(bInfo)
' Ergebnis gliedern
Path = Space$(512)
r = SHGetPathFromIDList(ByVal x, ByVal Path)
If r Then
pos = InStr(Path, Chr$(0))
getdirectory = Left(Path, pos - 1)
Else
getdirectory = ""
End If
End Function
mfg hans
########################################################
# Herber's Excel-Server - letztes Update: 13.07.98 #
# http://www.herber.de - Microsoft MVP - Excel #
# NewsGroup-Regeln: http://www.herber.de/excelng.htm #
# Autoren dieser NG: http://www.herber.de/dejanews.htm #
########################################################
Tobias <tobias....@studbox.uni-stuttgart.de> schrieb in Nachricht
35A9F4DB...@studbox.uni-stuttgart.de...
Sub DialogOpen()
Dialogs(xlDialogFileOpen).Show
End Sub
Viele Grüße
Bernd
Tobias schrieb:
> Hallo Leute!
>
> Ich hab mal wieder ein Problem:
>
> Ich moechte aus meinem VBA-Programm (Excel 97) den Benutzer ueber einen
> windowsueblichen Dialog nach einem Verzeichnis fragen, um spaeter in
> diesem Verzeichniss mehrere Dateien abzuspeichern.
>
> Bisher hab ich es aber nur geschafft eine Datei (incl. Pfad) abzufregan:
> mit
> Application.GetOpenFilename
>
> Meine bisherige Notloesung:
> ich frage mit dieser Funktion eine Dummy-Datei ab und schneide den
> Dateinamen ab.
> - nicht sehr elegant
> - funktioniert bei leeren Verzeichnissen nicht
>
> Kann mir jemand einen Tip geben, wie ich "nur" ein Verzeichnis abfragen
> kann.
>
vielen Dank für die tolle Lösung - genau das, was ich mir vorgestellt
habe.
(An dieser Stelle auch mal ein allgemeines Lob an die ganze Newsgroup
- auch wenn man kein konkretes Problem hat kann man viel Lernen
- und die Antworten kommen echt superschnell)
Aber zurück zum eigentlichen Thema:
Ich muß zugeben, daß ich nicht so ganz verstehe, wie die Routine
Funktioniert.
Liegt wohl daran, daß hier (vermutlich) direkt auf Windows-routinen
zugegriffen wird
(API-Aufruf??) und nicht mehr viel von VBA gemacht wird.
Wie auch immer, als "Black-Box" läßt sich die Funktion wunderbar nutzen.
Meine Fragen nun:
- Kann ich dieser "Black-Box" nun beibringen, in welchem Verzeichnis
gestartet wird?
z.B. d:\daten\steuerung\
ich vermute, daß in irgendeiner Form folgende Zeile dafür
verantwortlich ist:
> ' Ausgangsordner = Desktop
> bInfo.pidlRoot = 0&
aber leider sagt mir dieses 0& nichts
- Kann ich die "Black-Box" dazu bewegen, nicht im oberen Eck
reingequetscht aufzugehen,
sondern schön mittig auf dem Bildschirm?
Zugegeben, das sind nur noch die letzten Schönheitskorrekturen, die
nichts mehr mit der
Funktionalität zu tun haben. Aber, wenn alles gut funktioniert wird man
schnell übermütig.
Und das Auge "ißt" doch mit.
Letzte Frage:
- gibt es eine empfehlenswerte Quelle (Buch, Internet-Seite, ...), in
der das mit diesen
API-Aufrufen gut erklärt wird? Scheint mir ein mächtiges Werkzeug zu
sein um schwierige
Probleme zu lösen.
Also wenn jemand eine Antwort hat - toll, wenn nicht - auch nicht
schlimm -> das Programm
funktioniert (zumindest dieser Teil)
Bis zum nächsten Problem
Gruß Tobias
P.S. dies ist der 2. Versuch die Antwort (eigentlich Frage) an die NG zu
schicken.
mein Netscape hat sich mit der Fehlermeldung "... more included
than new Text.."
geweigert sie zu verschicken.
also hab ich den Beispielcode doch kürzen müssen (den ganzen in der
Antwort von Hans)
Hans W. Herber schrieb:
>
> Hallo Tobias,
>
> nachfolgend ein API-Aufruf zu diesem Thema. Ich glaube, von Stephen
> Bullen, weiß es aber nicht mehr so genaus:
>
> Public Type BROWSEINFO
> hOwner As Long
> pidlRoot As Long
> pszDisplayName As String
> lpszTitle As String
> ...
> ...
> ' Ausgangsordner = Desktop
> bInfo.pidlRoot = 0&
>
> ' Dialogtitel
> If IsMissing(msg) Then
> bInfo.lpszTitle = "Wählen Sie bitte einen Ordner aus."
> ...
> ...
> End Function
>
> mfg hans
> ...
bedanke mich für die NG.
Du hast recht, verantwortlich für das Startverzeichnis ist die Zeile:
bInfo.pidlRoot = 0&
Die 0 steht für das Desktop-Verzeichnis. Du kannst hier ja mit Ziffern
rumprobieren. Excel-Abstürze solltest Du einkalkulieren.
Anders als bei Excel-Dialogen sehe ich hier keine Möglichkeit der
Zentrierung.
mfg hans
########################################################
# Herber's Excel-Server - letztes Update: 13.07.98 #
# http://www.herber.de - Microsoft MVP - Excel #
# NewsGroup-Regeln: http://www.herber.de/excelng.htm #
# Autoren dieser NG: http://www.herber.de/dejanews.htm #
########################################################
Tobias <tobias....@studbox.uni-stuttgart.de> schrieb in Nachricht
35AB3F98...@studbox.uni-stuttgart.de...
>(An dieser Stelle auch mal ein allgemeines Lob an die ganze Newsgroup
>- auch wenn man kein konkretes Problem hat kann man viel Lernen
>- und die Antworten kommen echt superschnell)
>