VBA – Folder Picker – imposta da dove iniziare

Ho una piccola applicazione Access VBA che richiede agli utenti di selezionare una cartella. Mi chiedevo se c’è un modo per dire a VBA il percorso in cui avviare il raccoglitore di cartelle. vale a dire avviare il selettore di cartelle in C:\data\forms . Attualmente sembra che stia iniziando dalla directory precedentemente utilizzata. C’è anche un modo per limitare ciò che può accedere al selezionatore di cartelle. Quindi può accedere a qualsiasi cosa all’interno di C:\data ma non in qualsiasi altra cosa in C:

Ho usato con successo il seguente codice ( Not My Code ) per molti anni.

inserisci la descrizione dell'immagine qui

 Sub Sample() Dim Ret '~~> Specify your start folder here Ret = BrowseForFolder("C:\") End Sub Function BrowseForFolder(Optional OpenAt As Variant) As Variant 'Function purpose: To Browser for a user selected folder. 'If the "OpenAt" path is provided, open the browser at that directory 'NOTE: If invalid, it will open at the Desktop level Dim ShellApp As Object 'Create a file browser window at the default folder Set ShellApp = CreateObject("Shell.Application"). _ BrowseForFolder(0, "Please choose a folder", 0, OpenAt) 'Set the folder to that selected. (On error in case cancelled) On Error Resume Next BrowseForFolder = ShellApp.self.Path On Error GoTo 0 'Destroy the Shell Application Set ShellApp = Nothing 'Check for invalid or non-entries and send to the Invalid error 'handler if found 'Valid selections can begin L: (where L is a letter) or '\\ (as in \\servername\sharename. All others are invalid Select Case Mid(BrowseForFolder, 2, 1) Case Is = ":" If Left(BrowseForFolder, 1) = ":" Then GoTo Invalid Case Is = "\" If Not Left(BrowseForFolder, 1) = "\" Then GoTo Invalid Case Else GoTo Invalid End Select Exit Function Invalid: 'If it was determined that the selection was invalid, set to False BrowseForFolder = False End Function 

Ecco un metodo veloce e sporco che uso sempre. La funzione seguente consentirà all’utente solo di selezionare la cartella in cui desidera iniziare – Penso che il modo più semplice per limitare l’accesso a un determinato percorso sia controllare il nome di GetFolderName sotto il percorso (i) che si desidera limitare ad esempio

 If GetFolderName = "C:\" then MsgBox("This folder is not for you buddy") Exit Sub end if 

Inoltre non il mio codice 🙂

 Public Function GetFolderName(Optional OpenAt As String) As String Dim lCount As Long GetFolderName = vbNullString With Application.FileDialog(msoFileDialogFolderPicker) .InitialFileName = OpenAt .Show For lCount = 1 To .SelectedItems.Count GetFolderName = .SelectedItems(lCount) Next lCount End With End Function 

Se non hai bisogno di limitare la visualizzazione delle cartelle al tuo utente, ti suggerirei di utilizzare il metodo FileDialog (l’interfaccia è più intuitiva di ciò che ti dà la chiamata alla shell). Per ulteriori dettagli, puoi leggere ulteriori informazioni sul sito di CPearson. Ha un lungo articolo sulla navigazione delle cartelle usando VBA (modi multipli, l’opzione FileDialog è proprio alla fine):

 Function BrowseFolder(Title As String, _ Optional InitialFolder As String = vbNullString, _ Optional InitialView As Office.MsoFileDialogView = _ msoFileDialogViewList) As String Dim V As Variant Dim InitFolder As String With Application.FileDialog(msoFileDialogFolderPicker) .Title = Title .InitialView = InitialView If Len(InitialFolder) > 0 Then If Dir(InitialFolder, vbDirectory) <> vbNullString Then InitFolder = InitialFolder If Right(InitFolder, 1) <> "\" Then InitFolder = InitFolder & "\" End If .InitialFileName = InitFolder End If End If .Show On Error Resume Next Err.Clear V = .SelectedItems(1) If Err.Number <> 0 Then V = vbNullString End If End With BrowseFolder = CStr(V) End Function 

Questa funzione richiede due parametri. Il primo, Title è una stringa che specifica il titolo da visualizzare con la finestra di dialogo del file. La seconda InitialFolder, che è facoltativa, specifica la cartella iniziale in cui deve essere aperta la finestra di dialogo. Il terzo parametro, anche opzionale, InitialView specifica il tipo di vista. Vedere MsoFileDialogView nel Visualizzatore oggetti per i valori validi di questo parametro. La funzione restituisce il nome di cartella completo selezionato dall’utente o una stringa vuota se l’utente ha annullato la finestra di dialogo.

Ecco un modo molto più semplice. Questo snippet di codice consente all’utente di selezionare una cartella e quindi di stampare l’indirizzo di tale cartella sullo schermo:

 Sub PrintSelectedFolder() Dim selectedFolder With Application.FileDialog(msoFileDialogFolderPicker) .Show selectedFolder = .SelectedItems(1) End With 'print to screen the address of folder selected MsgBox (selectedFolder) End Sub 

Per gli utenti Mac:

 Sub Select_Folder_On_Mac() Dim folderPath As String Dim RootFolder As String On Error Resume Next RootFolder = MacScript("return (path to desktop folder) as String") 'Or use RootFolder = "Macintosh HD:Users:YourUserName:Desktop:TestMap:" folderPath = MacScript("(choose folder with prompt ""Select the folder""" & _ "default location alias """ & RootFolder & """) as string") On Error GoTo 0 If folderPath <> "" Then MsgBox folderPath End If End Sub 

Trafugato da http://www.rondebruin.nl/mac/mac017.htm 😉