0

私は現在、仕事用のマクロの1つにこのコードを持っています。参照するフォルダーを参照するためのボタンの下にあり、.DGN を取得してリストボックスに追加します。

誰かが私に簡単な概要を教えてくれることを望んでいたので、コードを完全には理解していません。また、コードは .DGN の選択されたフォルダーのみを調べます。サブフォルダーも調べたいのですが、それは可能ですか?

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 を介してシェルを使用せずに簡単に行うことができます)。残りのコードがないと、一部の部分を判断できません (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 に答える