Excel VBA与Microstation文件夹search

我目前有这个代码在工作的macros之一。 它位于用于浏览要查看的文件夹的button下,并且将获得.DGN并将它们添加到列表框中。

我完全不明白代码完全是希望有人能够让我快速跑下来。 此外,代码只会查看.DGNs的选定文件夹,我希望它也查看子文件夹,这是可能的吗?

Dim myFSO As New Scripting.FileSystemObject Dim myFolder As Scripting.Folder Dim myFile As Scripting.File Dim myShell As New Shell32.Shell Dim myRootFolder As Shell32.Folder3 Set myRootFolder = myShell.BrowseForFolder(0, "Pick", 0) If myRootFolder Is Nothing Then Exit Sub Set myFolder = myFSO.GetFolder(myRootFolder.Self.path) txtCurrentFolder.Text = myRootFolder.Self.path lstFilesInFolder.Clear For Each myFile In myFolder.Files Select Case UCase(Right(myFile.Name, 3)) Case "DGN" If IsFileIn(myFile.path, lstFilesToProcess) = False Then lstFilesInFolder.AddItem myFile.path End If End Select Next 

该代码显示一个GUI来select一个文件夹,然后遍历该文件夹的子文件,testing它们的名称是否以DGN结尾,如果是,则testing该文件是否已经存在于某个集合(lstFilesInFolder)中,如果不是则添加它。

我觉得这个方法似乎有点复杂(挑选一个文件夹(s)可以简单地通过Application.FileDialog不使用Shell来完成),我不能判断一些部分(比如是否需要testinglstFilesInFolder等),而没有其余的代码,就我个人而言,我不喜欢使用myX作为variables的命名约定。 尽pipe如此,它看起来像是要做的。

我喜欢基于堆栈/队列的方法来“recursion”,而不是实际的recursion调用。

将代码转换为在子文件夹中查找的示例是:(请参阅我添加的行中的注释)

 Dim myFSO As Scripting.FileSystemObject 'changed from late-binding Set myFSO = New Scripting.FileSystemObject Dim folderQueue As Collection 'queue Set folderQueue = New Collection 'instantiate Dim myFolder As Scripting.Folder Dim subfolder As Scripting.Folder 'var for enumerating subfolders Dim myFile As Scripting.File Dim myShell As New Shell32.Shell Dim myRootFolder As Shell32.Folder3 Set myRootFolder = myShell.BrowseForFolder(0, "Pick", 0) If myRootFolder Is Nothing Then Exit Sub folderQueue.Add myFSO.GetFolder(myRootFolder.Self.path) 'enqueue Do While folderQueue.Count > 0 ''recursive' loop Set myFolder = folderQueue(1) 'get next folder folderQueue.Remove 1 'dequeue txtCurrentFolder.Text = myRootFolder.Self.path lstFilesInFolder.Clear For Each subfolder in myFolder.SubFolders 'loop through subfolders adding for processing folderQueue.Add subfolder 'enqueue Next For Each myFile In myFolder.Files Select Case UCase(Right(myFile.Name, 3)) Case "DGN" If IsFileIn(myFile.path, lstFilesToProcess) = False Then lstFilesInFolder.AddItem myFile.path End If End Select Next Loop 

作为最后一点,在向其他用户发布之前,将引用的使用切换到特定版本的Scripting库(对于静态types来说很好),有时候被认为是很好的做法,例如使用CreateObject(“Scripting.FileSystemObject”)使用引用有时会导致问题。