VBA - Selezione di una cartella e riferindola come percorso per un codice separato
Domanda
Sono in grado di utilizzare questo codice per selezionare una cartella:
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
.
Ho anche questo codice, che funziona quando il percorso della cartella è hardcoded.Fondamentalmente, mi dà un elenco di nomi di file e percorsi di file che uso più avanti in una sezione separata.Attualmente ho commentato il percorso della cartella hardcoded e sto cercando di utilizzare il codice sopra per selezionare la cartella ogni volta che è più facile da usare.
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
.
Tuttavia, non sono sicuro di come ottenere i due diversi set di codice per lavorare insieme.Immagino che l'unica parte che devo cambiare è questa:
Set objFolder = objFSO.GetFolder(ChooseFolder)
.
Lo ho come choosefolder che è il sub sopra per ora ma non è chiaramente il modo di farlo.Ho provato anche con Sitem ma non sembra funzionare.
Soluzione
Solo per costruire il mio commento con una spiegazione migliore, hai definito ChooseFolder
come sub.I sottomissione non restituiscono i valori.Tuttavia, lo stai usando come funzione quando fai questo:
Set objFolder = objFSO.GetFolder(ChooseFolder)
.
Perché stai passando il risultato del ChooseFolder
in esecuzione alla funzione GetFolder
del FSO.
Cosa devi fare è dichiarare ChooseFolder
come funzione.
Fondamentalmente, sostituisci il tuo ChooseFolder
sub con questo:
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
.
E dovrebbe quindi fare ciò che ti aspetti.Il resto del tuo codice va bene.
Altri suggerimenti
Make choosefolderer () in una funzione e quindi Riferimento:
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
.