You may want to understand dialog boxes better. All dialog boxes ar
par tof the comdlg32.dll (common dialog) in the windows\system32 folder
Excel dates back to Office 97 and the standard VBA Getopenfilename
only impliments the feature available at the time Office 97 was release
so Excel stys upward compatible from version to version.
GetOpenfile name in VBA is only a wrapper which calls the comdlg32.dll
Yo can get the complete definition of the Current GetOPenfilename fro
the DLL library definition at
'GetOpenFileName Function ()
(
http://msdn.microsoft.com/en-us/library/ms646927(VS.85).aspx)
From VBA you can call any DLL by simply defining the library call.
Below is some code I wrote which uses the Folder Picker using the sam
DLL. I was working with somebody who was using Excel 2000 which didn'
have this dialog built into VBA. Actually the File Picker Dialo
(GETOPENFILENAME) and the folder Picker Dialog are vfery similar an
just called the same low level routines with different options.
Private Const BIF_RETURNONLYFSDIRS As Long = &H1
Private Const BIF_DONTGOBELOWDOMAIN As Long = &H2
Private Const BIF_RETURNFSANCESTORS As Long = &H8
Private Const BIF_BROWSEFORCOMPUTER As Long = &H1000
Private Const BIF_BROWSEFORPRINTER As Long = &H2000
Private Const BIF_BROWSEINCLUDEFILES As Long = &H4000
Private Const MAX_PATH As Long = 260
Type BrowseInfo
hOwner As Long
pidlRoot As Long
pszDisplayName As String
lpszINSTRUCTIONS As String
ulFlags As Long
lpfn As Long
lParam As Long
iImage As Long
End Type
Type SHFILEOPSTRUCT
hwnd As Long
wFunc As Long
pFrom As String
pTo As String
fFlags As Integer
fAnyOperationsAborted As Boolean
hNameMappings As Long
lpszProgressTitle As String
End Type
Declare Function SHGetPathFromIDListA Lib "shell32.dll" ( _
ByVal pidl As Long, _
ByVal pszBuffer As String) As Long
Declare Function SHBrowseForFolderA Lib "shell32.dll" ( _
lpBrowseInfo As BrowseInfo) As Long
Function BrowseFolder(Optional Caption As String = "") As String
Dim BrowseInfo As BrowseInfo
Dim FolderName As String
Dim ID As Long
Dim Res As Long
With BrowseInfo
.hOwner = 0
.pidlRoot = 0
.pszDisplayName = String$(MAX_PATH, vbNullChar)
.lpszINSTRUCTIONS = Caption
.ulFlags = BIF_RETURNONLYFSDIRS
.lpfn = 0
End With
FolderName = String$(MAX_PATH, vbNullChar)
ID = SHBrowseForFolderA(BrowseInfo)
If ID Then
Res = SHGetPathFromIDListA(ID, FolderName)
If Res Then
BrowseFolder = Left$(FolderName, InStr(FolderName, vbNullChar)
1)
End If
End If
End Function