2014-11-28 2 views
0

У меня этот код есть в одном из макросов для работы. Он расположен под кнопкой для просмотра папки, в которую нужно посмотреть, и он получит .DGN и добавит их в список.Excel VBA с Microstation Folder Search

Я не совсем понимаю, что код полностью надеялся, что кто-то может быстро убежать. Кроме того, код только смотрит на выбранную папку для .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 
+1

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

ответ

1

код показывает графический интерфейс для выбора папки, а затем итерации через тестирование дочерних файлов в папке, если их имена заканчиваются в 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») перед тем, как освободить других пользователей, поскольку использование ссылки может иногда вызывать проблемы.

Смежные вопросы