VBA - L oop через несколько подпапок в сетевом местоположении с критериями поиска по дате / Повышение скорости поиска - PullRequest
0 голосов
/ 27 мая 2020

Цель моего вопроса и кода VBA: получить определенные c данные (пара столбцов) из каждого файла "table.csv" в сетевом каталоге. Каждый сетевой каталог / подпапки01 / подпапки02 содержит один файл «table.csv», но 100 других подпапок включены в каждую сеть / подпапки01. Остальные папки не нужны, нас интересует только subfolder02 для каждой subfolder01. Количество вложенных папок01 в сетевом каталоге составляет около 15000. Однако мне нужны только вложенные папки01 с января по апрель 2020 года, например (200 вложенных папок). Конечная цель - анализировать данные.

Проблема: я пытаюсь понять, как можно улучшить код VBA, который я использую в настоящее время. Этот код просматривает каждую подпапку одну за другой, а затем проверяет дату и имя файла. Мне интересно, есть ли способ добавить какие-либо критерии фильтров поиска для даты и имени подпапки, чтобы иметь более быстрый l oop. Как мы можем избежать ввода кода go в каждую подпапку?

Пожалуйста, посмотрите ниже код, который я использую, я очень ценю ваше время и надеюсь, что мой запрос понятен.

'' '

Function GetFiles(startPath As String) As Collection 
Dim fso As Object, rv As New Collection, colFolders As New Collection, fpath As String
Dim subFolder As Object, f, dMinfold, dtMod
Set fso = CreateObject("Scripting.FileSystemObject")

dMinfold = ThisWorkbook.Sheets("Enter_Date").Cells(2, 1)

colFolders.Add startPath

Do While colFolders.Count > 0
    fpath = colFolders(1)
    colFolders.Remove 1
    'process subfolders
    For Each subFolder In fso.getfolder(fpath).subfolders
        If subFolder.DateLastModified >= dMinfold Then
            colFolders.Add subFolder.Path
        End If
    Next subFolder
    'process files
    f = Dir(fso.buildpath(fpath, "*Table.csv"), vbNormal)
    Do While f <> ""
        f = fso.buildpath(fpath, f)
        dtMod = FileDateTime(f)
        If dtMod >= dMinfold And Right(f, 3) = "csv" Then
            rv.Add f
        End If

        f = Dir()
    Loop
Loop
Set GetFiles = rv
End Function'''

Тогда у меня есть код для получения данных передачи из каждого файла. Спасибо.

1 Ответ

0 голосов
/ 29 мая 2020

Я добавлю скриншоты, чтобы прояснить метод Get & Transform, поскольку это подход GUI, а не код.

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

Вот начальный экран для получения данных из папки Initial results for get data from folder

Затем вы можете отфильтровать дорожка. В вашем случае это будет основано на дате из имени папки. enter image description here

Теперь, когда он отфильтрован, вы можете расширять контент с помощью кнопки заголовка. enter image description here

Внутренний контент, вам придется снова развернуть, чтобы преобразовать из csv в таблицу Excel enter image description here

Выбрать / переименовать столбцы по мере необходимости, затем нажмите «закрыть и загрузить», чтобы перетащить его в Excel. По умолчанию используется новая таблица, но вы можете «загрузить в», если требуется что-то большее. enter image description here

Вот ваш результат. При необходимости вы можете щелкнуть правой кнопкой мыши refre sh или refre sh из vba. enter image description here

Редактировать. Просто заметил, что я использовал .txt, а не .csv для файлов. Может изменить внешний вид шага или двух посередине, но общая идея остается той же.

...