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.

È stato utile?

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
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top