Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Auswahl eines Ordners mit Standard-Datei-Dialogfeld (Excel 97)

57 views
Skip to first unread message

Tobias

unread,
Jul 13, 1998, 3:00:00 AM7/13/98
to
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.

Im Voraus vielen Dank
Gruss Tobias

Hans W. Herber

unread,
Jul 13, 1998, 3:00:00 AM7/13/98
to
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
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...

Bernd Held

unread,
Jul 13, 1998, 3:00:00 AM7/13/98
to Tobias
Hallo Tobias,
hatte vorher schonmal geantwortet, aber ich glaub das Teil ist nicht in der
NG angekommen - also für alle Fälle - doppelt hält besser.

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.
>

Tobias

unread,
Jul 14, 1998, 3:00:00 AM7/14/98
to
Hallo Hans,

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
> ...

Hans W. Herber

unread,
Jul 16, 1998, 3:00:00 AM7/16/98
to
Hallo Tobias,

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)
>

0 new messages