Вывести список файлов определенного шаблона с помощью Excel VBA - PullRequest
1 голос
/ 17 февраля 2009

Как вывести список всех файлов, которые соответствуют определенному шаблону, в указанном пользователем каталоге? Это должно работать рекурсивно внутри вложенных папок выбранного каталога. Мне также нужен удобный способ (например, управление деревом) их перечисления.

Ответы [ 5 ]

3 голосов
/ 15 сентября 2013

Похоже, что пара ответов говорит о рекурсии, а один о регулярных выражениях. Вот некоторый код, который объединяет две темы. Я взял код с http://vba -tutorial.com

Sub FindPatternMatchedFiles()

    Dim objFSO As Object
    Set objFSO = CreateObject("Scripting.FileSystemObject")

    Dim objRegExp As Object
    Set objRegExp = CreateObject("VBScript.RegExp")
    objRegExp.pattern = ".*xlsx"
    objRegExp.IgnoreCase = True

    Dim colFiles As Collection
    Set colFiles = New Collection

    RecursiveFileSearch "C:\Path\To\Your\Directory", objRegExp, colFiles, objFSO

    For Each f In colFiles
        Debug.Print (f)
        'Insert code here to do something with the matched files
    Next

    'Garbage Collection
    Set objFSO = Nothing
    Set objRegExp = Nothing

End Sub

Sub RecursiveFileSearch(ByVal targetFolder As String, ByRef objRegExp As Object, _
                ByRef matchedFiles As Collection, ByRef objFSO As Object)

    Dim objFolder As Object
    Dim objFile As Object
    Dim objSubFolders As Object

    'Get the folder object associated with the target directory
    Set objFolder = objFSO.GetFolder(targetFolder)

    'Loop through the files current folder
    For Each objFile In objFolder.files
        If objRegExp.test(objFile) Then
            matchedFiles.Add (objFile)
        End If
    Next

    'Loop through the each of the sub folders recursively
    Set objSubFolders = objFolder.Subfolders
    For Each objSubfolder In objSubFolders
        RecursiveFileSearch objSubfolder, objRegExp, matchedFiles, objFSO
    Next

    'Garbage Collection
    Set objFolder = Nothing
    Set objFile = Nothing
    Set objSubFolders = Nothing

End Sub
1 голос
/ 30 октября 2009

Я вижу, что люди выше меня уже ответили, как пройти через дерево файлов. Это может заинтересовать вас в поиске шаблонов в имени файла / файла. Это функция для VBA, которая позволяет использовать регулярные выражения.

Private Function RegularExpression(SearchString As String, Pattern As String) As String

    Dim RE As Object, REMatches As Object

    'Create the regex object' 
    Set RE = CreateObject("vbscript.regexp")
    With RE
        .MultiLine = False
        .Global = False
        .IgnoreCase = True
        'set the search pattern using parameter Pattern'
        .Pattern = Pattern 
    End With

    'Search for the pattern' 
    Set REMatches = RE.Execute(SearchString) 
    If REMatches.Count > 0 Then
        'return the first match'
        RegularExpression = REMatches(0) 
    Else
        'nothing found, return empty string'
        RegularExpression = ""
    End If

End Function

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

1 голос
/ 17 февраля 2009

Попробуйте Windows Scripting - объекты файловой системы. Этот COM-объект, который может быть создан из vba, имеет функции для перечисления каталогов и т. Д.

Документацию можно найти на MSDN

1 голос
/ 08 октября 2009

Не совсем то, что вы просили, но я подумал, что опубликую это здесь, поскольку оно связано.

Это изменено из кода, найденного в http://www.cpearson.com/excel/FOLDERTREEVIEW.ASPX

Для этого требуется ссылка Microsoft Scripting Runtime .

Sub ListFilePaths()

    Dim Path As String
    Dim Files As Long

    Path = "C:\Folder"

    Files = GetFilePaths(Path, "A", 1)

    MsgBox "Found " & Files - 1 & " Files"

End Sub

Function GetFilePaths(Path As String, Column As String, StartRow As Long) As Long

    Dim Folder As Scripting.Folder
    Dim SubFolder As Scripting.Folder
    Dim File As Scripting.File
    Dim FSO As Scripting.FileSystemObject
    Dim CurrentRow As Long

    Set FSO = New Scripting.FileSystemObject
    Set Folder = FSO.GetFolder(folderpath:=Path)

    CurrentRow = StartRow

    For Each File In Folder.Files
        Range(Column & CurrentRow).Value = File.Path
        CurrentRow = CurrentRow + 1
    Next File

    For Each SubFolder In Folder.SubFolders
        CurrentRow = GetFilePaths(SubFolder.Path, Column, CurrentRow)
    Next SubFolder

    GetFilePaths = CurrentRow

    Set Folder = Nothing
    Set FSO = Nothing
End Function
1 голос
/ 17 февраля 2009

В качестве общего указателя взгляните на Application.FileSearch, рекурсивные функции, пользовательские формы и элемент управления Microsoft TreeView.

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

Имейте в виду, что существуют предварительно встроенные функции / элементы управления, которые можно использовать для отображения файловых систем, например, Application.GetOpenFileName, Application.GetSaveAsFileName, Microsoft WebBrowser (с указанием URL-адреса file: // ...).

...