【问题标题】:Excel VBA with Microstation Folder Search带有 Microstation 文件夹搜索的 Excel VBA
【发布时间】:2015-01-27 07:49:14
【问题描述】:

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

【问题讨论】:

  • 一般来说,宏会查看与工作簿位于同一目录中的每个文件,检查名称是否以“DGN”结尾,然后将其添加到字典/集合中。查看所有子文件夹的最佳方法是使用递归。 Here is a post 显示了一些示例。 (只是我搜索中出现的第一个,我没有特别选择它的原因)

标签: vba excel microstation


【解决方案1】:

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

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

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

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

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") 在发布给其他用户之前作为引用的使用有时会导致问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-07
    • 2015-08-04
    • 1970-01-01
    • 1970-01-01
    • 2015-03-24
    • 1970-01-01
    • 2017-02-12
    • 2013-02-12
    相关资源
    最近更新 更多