VBA / Excel: поиск и фильтрация переменных папок в проводнике windows, выбор папки и импорт ее файлов - PullRequest
1 голос
/ 13 апреля 2020

Цель состоит в том, чтобы иметь возможность выполнить поиск в каталоге на основе выбранной ячейки в Excel и ее ячейки «классификации» под ней и вернуть все папки в каталоге, имена которых содержат эту выбранную информацию. Оттуда я хочу иметь возможность выбрать папку из этого списка и импортировать ее текстовые файлы в лист Excel рядом с первоначально выбранной ячейкой.

В идеале я бы хотел, чтобы это работало в al oop, где он будет повторять этот процесс четыре раза и импортировать данные из четырех разных папок в новые столбцы. Все это ради автоматизации некоторых сравнений данных.

Насколько я понимаю, нет способа отфильтровать результаты папок в функции VBA Application.FileDialog(msoFileDialogFolderPicker), поэтому я пытался найти обходной путь. Используя некоторый код из других постов здесь, я смог заставить VBA воссоздать функцию поиска и открыть ее в окне проводника, однако я не понимаю, как использовать эту строку поиска в функции импорта файлов. Вот мой текущий код, который возвращает меня к нужному мне окну отфильтрованной папки:

Sub SearchExplorerForSelection()

Dim d As String
Dim searchpath As String
Dim searchlocation As String

Dim PartNumber As Range
Dim GenType As Range
' Cancel = True
d = Selection.Value

Set PartNumber = Selection 'Get desired part number from selected cell
Set GenType = PartNumber.Offset(2) 'Get PN's classification
PartNumberSearch = GenType & "*" & PartNumber 'Set full search keywords

searchpath = "search-ms:displayname=Search%20Results%20in%20" & GenType & "&crumb=filename%3A~" & PartNumberSearch
'copy string from manual search (e.g. my documents replace USERNAME)

searchlocation = "%20OR%20System.Generic.String%3A" & PartNumberSearch & "&crumb=location:Z%3A%5CTest%5CCalibration_Data_Generators%5C" & GenType
If Not d = "" Then
    Call Shell("explorer.exe """ & searchpath & searchlocation, 1)
   'src: https://stackoverflow.com/questions/24376850/open-explorer-search-from-excel-hyperlink

End If

End Sub

Я очень плохо знаком с работой с VBA.

1 Ответ

2 голосов
/ 13 апреля 2020

РЕДАКТИРОВАТЬ - я думаю, что, возможно, неправильно прочитал ваш вопрос как вопрос о поиске файла контент , но на самом деле речь идет о поиске по имени папки.

Я думаю, что в этом случае лучше всего использовать Dir () или FileSystemObject для l oop над всеми папками в папке "root" и вернуть список соответствующих имен папок в пользователь в списке - это может быть рабочий лист или форма пользователя. Затем они могут выбрать из этого списка.


Sub Tester2()

    Dim col As Collection, f

    Set col = GetFolderMatches("C:\Users\blahblah\Stuff", "Mail")

    For Each f In col
        Debug.Print f  '<< add to a list for the user to pick from
    Next f
End Sub



'Return a collection of folder paths given a starting folder and a term to search on
'  e.g. "*.txt"
'Pass False for last parameter if don't want to check subfolders
Function GetFolderMatches(startFolder As String, nameIncludes As String, _
                    Optional subFolders As Boolean = True) As Collection

    Dim fso, fldr, f, subFldr
    Dim colFolders As New Collection
    Dim colSub As New Collection

    Set fso = CreateObject("scripting.filesystemobject")
    colSub.Add startFolder

    Do While colSub.Count > 0
        Set fldr = fso.getfolder(colSub(1))
        colSub.Remove 1
        If LCase(fldr.Name) Like "*" & LCase(nameIncludes) & "*" Then
            colFolders.Add fldr.Path
        End If
        If subFolders Then
            For Each subFldr In fldr.subFolders
                colSub.Add subFldr.Path
            Next subFldr
        End If
    Loop
    Set GetFolderMatches = colFolders
End Function

Код ниже не ответ на ваш вопрос, но оставив его здесь, потому что это интересно ...

Вы можете получить доступ к Windows Поиск непосредственно из VBA с помощью ADO (добавьте ссылку на «Библиотеку объектов Microsoft ActiveX vx.x» в своем проекте VBA)

Sub Tester()

    Dim conn As New ADODB.Connection, rs As ADODB.Recordset

    conn.Open "Provider=Search.CollatorDSO;Extended Properties='Application=Windows';"

    Set rs = conn.Execute("SELECT System.ItemPathDisplay " & _
                          " FROM SYSTEMINDEX WHERE " & _
                          " SCOPE = 'C:\Users\blahblah\Desktop\Temp' " & _
                          " and contains('validated')")

    Do While Not rs.EOF
        Debug.Print rs(0).Value
        rs.MoveNext
    Loop

End Sub

На основе: http://www.thejoyofcode.com/Using_Windows_Search_in_your_applications.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...