1

ユーザー指定のディレクトリ内の特定のパターンに一致するすべてのファイルを一覧表示するにはどうすればよいですか?これは、選択したディレクトリのサブフォルダ内で再帰的に機能するはずです。また、それらを一覧表示する便利な方法(ツリー制御など)も必要です。

4

5 に答える 5

3

いくつかの回答が再帰について話しているようで、1つは正規表現について話しているようです。2 つのトピックをまとめたコードを次に示します。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
于 2013-09-15T03:14:15.427 に答える
1

私の上の人々はすでにファイルツリーを再帰する方法に答えているようです。これはファイル/ファイル名のパターンを検索することに興味があるかもしれません。これは、正規表現を使用できるようにする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

これを使用して、ファイル名でパターンを検索できます。正規表現の使用方法の詳細については、正規表現のホームをお勧めします

于 2009-10-30T02:59:13.620 に答える
1

一般的な指針として、Application.FileSearch、再帰関数、ユーザーフォーム、および「MicrosoftTreeViewControl」を見てください。

FileSearchを使用して、パターンに一致するフォルダー内のファイルを検索できます。再帰関数は、すべてのパスがなくなるまで自分自身を呼び出すことができます。UserFormは、データを表示するためのコントロールをホストでき、TreeViewコントロールはファイルシステムを表示できます。

Application.GetOpenFileName、Application.GetSaveAsFileName、Microsoft WebBrowser(「file:// ...」URLを指定)など、ファイルシステムの表示に使用できるビルド済みの関数/コントロールがあることに注意してください。

于 2009-02-17T08:15:34.587 に答える
1

あなたが求めたものとは正確には異なりますが、関連しているため、ここに投稿すると思いました。

これは、 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
于 2009-10-08T17:32:07.807 に答える
1

Windows スクリプティング - ファイル システム オブジェクトを試してください。vba から作成できるこの COM オブジェクトには、ディレクトリを一覧表示する機能などがあります。

MSDNでドキュメントを見つけることができます

于 2009-02-17T08:48:54.053 に答える