Возврат массива в функции самозвонка в VBA - PullRequest
1 голос
/ 20 марта 2019

Я пытаюсь выяснить, как вернуть строковый массив в функцию, которая сама вызывает.Это функция, которая просматривает все папки и подпапки в определенном пути, чтобы сформировать список текстовых файлов и их местоположение.Прямо сейчас подпрограмма All_Folder.Ранее я пытался сделать All_Folder функцией и пытаться вернуть значение из функции, но это ни к чему не привело.Теперь это мой код:

Public file_locations() As String
Sub Some_Subroutine()
    Dim pathway As String: pathway = "C:\Users"
    Dim FileSystem As Object
    Set FileSystem = CreateObject("Scripting.FileSystemObject")
    All_Folder FileSystem.GetFolder(pathway)

    ...

End Sub
Public Sub All_Folder(Folder)
    Dim filetype as string: filetype = "*.txt"
    Dim Counter As Integer: Counter = 0
    Dim SubFolder: Dim File
    For Each SubFolder in Folder.SubFolders
        All_Folder SubFolder
    Next
    For Each File in Folder.Files
        If Dir(Folder & "\" & filetype) <> "" Then
            ReDim Preserve file_locations(Counter)
            file_locations(Counter) = CallByName(File, Path, VbGet)
            Counter = Counter + 1
        End If
    Next
End Sub

Моя проблема в том, что каждый раз, когда эта функция запускается, вывод в file_locations всегда перезаписывается тем, что находится в следующем вызываемом каталоге.

У меня есть список к концу подпрограммы All_Folder, мне просто нужно иметь возможность сохранить / добавить его в текущий список file_locations.

1 Ответ

0 голосов
/ 20 марта 2019

Как подсказали Тим Уильямс и PeH , я не установил свой Counter в качестве глобальной переменной. Вот будет обновленный код:

Public file_locations() As String
Public Counter As Integer
Sub Some_Subroutine()
    Dim pathway As String: pathway = "C:\Users"
    Counter = 0
    Dim FileSystem As Object
    Set FileSystem = CreateObject("Scripting.FileSystemObject")
    All_Folder FileSystem.GetFolder(pathway)

    ...

End Sub
Public Sub All_Folder(Folder)
    Dim filetype as string: filetype = "*.txt"
    Dim SubFolder: Dim File
    For Each SubFolder in Folder.SubFolders
        All_Folder SubFolder
    Next
    For Each File in Folder.Files
        If Dir(Folder & "\" & filetype) <> "" Then
            ReDim Preserve file_locations(Counter)
            file_locations(Counter) = CallByName(File, Path, VbGet)
            Counter = Counter + 1
        End If
    Next
End Sub

Спасибо вам обоим за помощь.

...