код показывает графический интерфейс для выбора папки, а затем итерации через тестирование дочерних файлов в папке, если их имена заканчиваются в 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») перед тем, как освободить других пользователей, поскольку использование ссылки может иногда вызывать проблемы.
В общем, макрос просматривает каждый файл, расположенный в том же каталоге, что и рабочая тетрадь, проверяя, заканчивается ли имя «DGN», а затем добавляется в словарь/коллекцию. Лучшим способом просмотра всех подпапок является использование рекурсии. [Вот сообщение] (http://stackoverflow.com/questions/20687810/vba-macro-that-search-for-file-in-multiple-subfolders), который показывает несколько примеров. (Только первое, что появилось в моем поиске, я не выбрал особую причину) –