Selezionare una Cartella (o un File) con BrowseForFolder

Con BrowseForFolder senza alcun componente esterno, possiamo selezionare qualsiasi cartella o file nel nostro Sistema.

Inserire in un modulo bas:

Option Explicit

Private Type BrowseInfo
hWndOwner As Long
pIDLRoot As Long
pszDisplayName As Long
lpszTitle As Long
ulFlags As Long
lpfnCallback As Long
lParam As Long
iImage As Long
End Type
Public Const BIF_RETURNONLYFSDIRS = &H1&
'// flag per la ricerca per cartelle
Public Const BIF_DONTGOBELOWDOMAIN = &H2&
'// flag per la ricerca per computer
Public Const BIF_BROWSEINCLUDEFILES = &H4000&
'// flag per ricerca anche dei File
Const MAX_PATH = 260

Private Declare Sub CoTaskMemFree Lib "ole32.dll" (ByVal hMem As Long)
Private Declare Function lstrcat Lib "kernel32" Alias "lstrcatA" (ByVal lpString1 As String, ByVal lpString2 As String) As Long
Private Declare Function SHBrowseForFolder Lib "shell32" (lpbi As BrowseInfo) As Long
Private Declare Function SHGetPathFromIDList Lib "shell32" (ByVal pidList As Long, ByVal lpBuffer As String) As Long

Public Function BrowseForFolder(ByVal hWndOwner As Long, ByVal sPrompt As String, _
Optional ByVal lFlags As Long = BIF_RETURNONLYFSDIRS) As String
' Visualizza la finestra di dialogo delle cartelle di Windows
' Parametri iniziali:

' hWnd del form
' Titolo della finestra
' Con lFlags si può specificare quello che si potrà selezionare:

' BIF_BROWSEINCLUDEFILES, etc.
' BIF_RETURNONLYFSDIRS
'
Dim iNull As Integer
Dim lpIDList As Long
Dim lResult As Long
Dim sPath As String
Dim udtBI As BrowseInfo

With udtBI
    .hWndOwner = hWndOwner
    .lpszTitle = lstrcat(sPrompt & vbCrLf, "")
    .ulFlags = lFlags
End With

'Mostra la finestra di dialogo di 'BrowseForFolder'
lpIDList = SHBrowseForFolder(udtBI)
If lpIDList Then
    'Se si è selezionata una cartella...
    sPath = String$(MAX_PATH, 0)
    'Ottiene il percorso dalla IDList
    SHGetPathFromIDList lpIDList, sPath
    'libera il blocco di memoria
    CoTaskMemFree lpIDList
    iNull = InStr(sPath, vbNullChar)
    If iNull Then
        sPath = Left$(sPath, iNull - 1)
    End If
Else
   
' Se si è premuto annulla...
    sPath = ""
End If
BrowseForFolder = sPath
End Function

In un Form inserire:
- un CheckBox dandogli il nome: chkIncludiFile
- un CommandButton dandogli il nome: cmdSelDir
- il seguente codice:

Option Explicit

Private Sub cmdSelDir_Click()
Dim sDir As String
Dim lFlags As Long

lFlags = BIF_RETURNONLYFSDIRS
'Se questo CheckBox è selezionato si vedono anche i File
If chkIncludiFile Then
    lFlags = lFlags Or BIF_BROWSEINCLUDEFILES
End If
sDir = BrowseForFolder(Me.hWnd, "Selezionare la cartella", lFlags)
If sDir <> "" Then
    MsgBox "Cartella selezionata: " & sDir
Else
    MsgBox "Non è stata selezionata alcuna cartella"
End If
End Sub


Testato su: Windows 98, Windows Me, Windows 2000 Professional