0

我目前在其中一个工作宏中有此代码。它位于用于浏览要查看的文件夹的按钮下方,它将获取 .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
4

1 回答 1

1

该代码显示了一个用于选择文件夹的 GUI,然后遍历文件夹的子文件,测试它们的名称是否以 DGN 结尾,如果是,则测试文件是否已经在某个集合 (lstFilesInFolder) 中,如果没有,则添加它。

我认为这种方法似乎有点复杂(选择一个文件夹可以简单地完成,而无需通过 Application.FileDialog 使用 Shell)并且我无法判断某些部分(例如是否有必要测试 lstFilesInFolder 等)没有其余的代码, 就我个人而言,我不喜欢使用 myX 作为变量命名约定。尽管如此,它还是做了它看起来应该做的事情。

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

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

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

最后一点,有时将使用对脚本库的特定版本的引用(对静态类型很好)切换为使用例如 CreateObject("Scripting.FileSystemObject") 是一种很好的做法,然后再将其发布给其他用户作为使用参考有时会导致问题。

于 2014-11-28T19:45:25.383 回答