VBA – Selector de carpetas: establezca dónde comenzar

Tengo una pequeña aplicación Access VBA que requiere que los usuarios seleccionen una carpeta. Me preguntaba si hay una forma de decirle a VBA la ruta en la que iniciar el selector de carpetas. es decir, inicie el selector de carpetas en C:\data\forms . Actualmente parece estar comenzando desde el directorio que se utilizó anteriormente. También hay una manera de limitar lo que el selector de carpetas puede acceder. Entonces puede acceder a cualquier cosa dentro de C:\data pero no a nada más en C:

He estado usando el siguiente código ( Not My Code ) con éxito durante muchos años.

enter image description here

 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 

Aquí hay un método rápido y sucio que uso todo el tiempo. La siguiente función solo permitirá al usuario seleccionar la carpeta en la que desea comenzar: creo que la forma más sencilla de limitar el acceso a una ruta dada es tal vez comprobar GetFolderName continuación en la (s) ruta (s) que desea restringir, por ejemplo

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

También no es mi código 🙂

 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 

Si no necesita restringir la vista de carpeta a su usuario, le sugiero usar el método FileDialog (la interfaz es más intuitiva que lo que le da invocar al shell). Para obtener más detalles, puede leer más en el sitio de CPearson. Tiene un extenso artículo sobre cómo buscar carpetas usando VBA (varias formas, la opción FileDialog está al final):

 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 

Esta función toma dos parámetros. El primero, Título es una cadena que especifica el título que se mostrará con el cuadro de diálogo del archivo. El segundo InitialFolder, que es opcional, especifica la carpeta inicial a la que debe abrirse el diálogo. El tercer parámetro, también opcional, InitialView especifica el tipo de vista. Consulte MsoFileDialogView en el Examinador de objetos para conocer los valores válidos de este parámetro. La función devuelve el nombre completo de la carpeta seleccionada por el usuario o una cadena vacía si el usuario canceló el diálogo.

Aquí hay una manera mucho más simple. Este fragmento de código permite al usuario elegir una carpeta y luego imprime esa dirección de carpeta en la pantalla:

 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 

Para usuarios de 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 

Robado de http://www.rondebruin.nl/mac/mac017.htm 😉