VBA: seleccionar una carpeta y hacer referencia a ella como ruta para un código separado

StackOverflow https://stackoverflow.com//questions/25087412

  •  02-01-2020
  •  | 
  •  

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.

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top