-
I know how to get the saveas filename, but how do you get the directory to save a file in?
Right now my workaround consists of getting a saveas filename, then cycling throught the string to get rid of the file selected. This leaves the path only.
The problem is that if there is not already a file in the directory, I can't get the saveas filename and therefore can't determine the directory.
-
Code:
Option Explicit
Private Const MAX_PATH = 260
Public Enum browseInfoFlags
BIF_NONE = 0 ' No Flags
BIF_RETURNONLYFSDIRS = &H1& ' For finding a folder to start document searching
BIF_DONTGOBELOWDOMAIN = &H2& ' For starting the Find Computer
BIF_STATUSTEXT = &H4&
BIF_RETURNFSANCESTORS = &H8&
BIF_EDITBOX = &H10&
BIF_VALIDATE = &H20& ' insist on valid result (or CANCEL)
BIF_BROWSEFORCOMPUTER = &H1000& ' Browsing for Computers.
BIF_BROWSEFORPRINTER = &H2000& ' Browsing for Printers
BIF_BROWSEINCLUDEFILES = &H4000& ' Browsing for Everything
End Enum
Private Type BROWSEINFO
hWndOwner As Long
pidlRoot As Long
pszDisplayName As String
lpszTitle As String
ulFlags As browseInfoFlags
lpfn As Long
lParam As Long
iImage As Long
End Type
' for SHGetPathFromIDList, pszString must be at least MAX_PATH (260) chars
Private Declare Function SHBrowseForFolder Lib "shell32" Alias "SHBrowseForFolderA" (lpbi As BROWSEINFO) As Long
Private Declare Function SHGetPathFromIDList Lib "shell32" (ByVal pidl As Long, ByVal pszPath As String) As Long
Private Declare Sub CoTaskMemFree Lib "ole32" (ByVal ptr As Long)
' BrowseForFolder() returns a path if the user picks a good one, or "" if they don't.
Public Function BrowseForFolder(ByVal hWndOwner As Long, Optional ByVal dlgTitle$ = "Please select a folder.", Optional ByVal flags As browseInfoFlags = BIF_RETURNONLYFSDIRS) As String
Dim bif As BROWSEINFO, pidl As Long, buf$
With bif
.hWndOwner = hWndOwner
.pidlRoot = 0 ' desktawp
.pszDisplayName = Space$(MAX_PATH)
.lpszTitle = dlgTitle$
.ulFlags = flags
.lpfn = 0&
.lParam = 0&
.iImage = 0&
End With
pidl = SHBrowseForFolder(bif)
If (pidl = 0) Then Exit Function
buf$ = Space$(MAX_PATH)
If (SHGetPathFromIDList(pidl, buf$) = 0) Then
buf$ = ""
Else
buf$ = Left$(buf$, InStr(1, buf$, vbNullChar) - 1)
End If
CoTaskMemFree pidl
BrowseForFolder = buf$
End Function
-
Thank you for the code!
VBA doesn't recognize "Enum" (neither do I!). Is there another way around this? Is there someplace I can find an explanation of the Enum concept?
Thanks again for your help.
-
Yes, there are two ways since it's just a way to make programming easier.
1. Replace the enum values with constants
2. Use the values directly
For turning the hex values into dec just paste them into immediate, put a ? before it and press enter
-
"Const" works. Now the code hangs on
ulFlags As browseInfoFlags
and says "User-defined type not defined"
is "browsInfoFlags" a standard type in VB?
Thanks again for all your help.
-
Well if it says userdefined, then there's isn't any standard type matching it. Try search for it and declare it