VBA: seleccionar una carpeta y hacer referencia a ella como ruta para un código separado
Pregunta
Puedo usar este código para seleccionar una carpeta:
Sub ChooseFolder()
Dim fldr As FileDialog
Dim sItem As String
Set fldr = Application.FileDialog(msoFileDialogFolderPicker)
With fldr
.Title = "Select a Folder"
.AllowMultiSelect = False
.InitialFileName = strPath
If .Show <> -1 Then GoTo NextCode
sItem = .SelectedItems(1)
End With
NextCode:
GetFolder = sItem
Set fldr = Nothing
End Sub
También tengo este código, que funciona cuando la ruta de la carpeta está codificada.Básicamente, me da una lista de nombres de archivos y rutas de archivos que uso más adelante en una sección separada.Actualmente tengo la ruta de la carpeta codificada comentada y estoy intentando usar el código anterior para seleccionar la carpeta cada vez para que sea más fácil de usar.
Private Sub btn_LeaveReport()
Dim objFSO As Object
Dim objFolder As Object
Dim objFile As Object
Dim i As Integer
'Create an instance of the FileSystemObject
Set objFSO = CreateObject("Scripting.FileSystemObject")
'Get the folder object
'Set objFolder = objFSO.GetFolder("D:\Administration\Time Sheets")
Set objFolder = objFSO.GetFolder(ChooseFolder)
i = 3
'loops through each file in the directory and prints their names and path
For Each objFile In objFolder.Files
'print file name
Cells(i + 1, 2) = objFile.Name
'print file path
Cells(i + 1, 3) = objFile.Path
i = i + 1
Next objFile
End Sub
Sin embargo, no estoy seguro de cómo hacer que los dos conjuntos de códigos diferentes funcionen juntos.Supongo que la única parte que necesito cambiar es esta:
Set objFolder = objFSO.GetFolder(ChooseFolder)
Lo tengo como ChooseFolder, que es el subtítulo anterior por ahora, pero claramente esa no es la forma de hacerlo.También lo probé con sItem pero no parece funcionar.
Solución
Solo para ampliar mi comentario con una mejor explicación, has definido ChooseFolder
como Sub.Los subs no devuelven valores.Sin embargo, lo estás usando como una función cuando haces esto:
Set objFolder = objFSO.GetFolder(ChooseFolder)
porque estás pasando el resultado de correr ChooseFolder
a la FSO GetFolder
función.
lo que hay que hacer es declarar ChooseFolder
como una función.
Básicamente, reemplace su ChooseFolder
Sub con esto:
Function ChooseFolder() As String
Dim fldr As FileDialog
Dim sItem As String
Set fldr = Application.FileDialog(msoFileDialogFolderPicker)
With fldr
.Title = "Select a Folder"
.AllowMultiSelect = False
.InitialFileName = strPath
If .Show <> -1 Then GoTo NextCode
sItem = .SelectedItems(1)
End With
NextCode:
ChooseFolder = sItem
Set fldr = Nothing
End Function
y entonces debería hacer lo que esperas.El resto de tu código está bien.
Otros consejos
Hágase Elegirfolder () en una función y luego hacer referencia:
Public Function ChooseFolder()
Dim fldr As FileDialog
Dim sItem As String
Set fldr = Application.FileDialog(msoFileDialogFolderPicker)
With fldr
.Title = "Select a Folder"
.AllowMultiSelect = False
.InitialFileName = strPath
If .Show <> -1 Then GoTo NextCode
sItem = .SelectedItems(1)
End With
NextCode:
ChooseFolder = sItem
Set fldr = Nothing
End Function
Private Sub btn_LeaveReport()
Dim objFSO As Object
Dim objFolder As Object
Dim objFile As Object
Dim i As Integer
Dim sFldr As String
'Create an instance of the FileSystemObject
Set objFSO = CreateObject("Scripting.FileSystemObject")
sFldr = ChooseFolder()
Set objFolder = objFSO.GetFolder(sFldr)
i = 3
'loops through each file in the directory and prints their names and path
For Each objFile In objFolder.Files
'print file name
Cells(i + 1, 2) = objFile.Name
'print file path
Cells(i + 1, 3) = objFile.Path
i = i + 1
Next objFile
End Sub