Используйте Dir для возврата файлов из папки в порядке файловой системы - PullRequest
4 голосов
/ 01 января 2012

PixPath - это полный путь к папке jpg, и я использую код, подобный следующему, для обработки каждого jpg.

fileName = Dir(PixPath)
Do Until fileName = ""
   If Right$(fileName, 4) = ".jpg" Then   
      fileName = Dir()

      <process this jpg>

   End If
Loop

Это работает нормально, за исключением того, что файлы возвращаются в алфавитно-цифровом порядке., а не порядок, в котором файлы отображаются в списке в папке.Есть ли способ обойти это?

Ответы [ 2 ]

4 голосов
/ 01 января 2012

Вы не можете сделать это с Dir.

Альтернатива:

  • Используйте FileSystemObject для доступа ко всем файлам в вашем каталоге
  • Считать все файлы .jpg в массив X
  • Используйте Val для сравнения .jpg s по значению для сортировки в порядке возрастания чисел
  • Конечный массив X содержит отсортированные файлы

    Sub Test()
    Dim objFSO As Object
    Dim objFolder As Object
    Dim objFiles As Object
    Dim objFile As Object
    Dim X
    Dim lngFileCnt As Long
    Dim lngCnt As Long
    Dim i As Long
    Dim j As Long
    Dim strBuffer1 As String
    Dim strFolder As String
    
    Set objFSO = CreateObject("Scripting.fileSystemObject")
    strFolder = "C:\temp"
    Set objFolder = objFSO.getFolder(strFolder)
    Set objFiles = objFolder.Files
    lngFileCnt = objFiles.Count
    ReDim X(1 To lngFileCnt)
    
    'grab all jpg files        
    For Each objFile In objFiles
        If Right$(objFile.Name, 3) = "jpg" Then
            lngCnt = lngCnt + 1
            X(lngCnt) = objFile.Name
        End If
    Next
    
    'resize array to number of jpg files
    ReDim Preserve X(1 To lngCnt)
    
    'sort array by numeric value
    For i = 1 To lngCnt
        For j = (i + 1) To lngCnt
            If Val(X(i)) > Val(X(j)) Then
                strBuffer1 = X(j)
                X(j) = X(i)
                X(i) = strBuffer1
            End If
        Next
    Next
    MsgBox Join(X, ";")
    End Sub
    

    См. здесь для получения дополнительной информации об использовании FileSystemObject.

2 голосов
/ 02 января 2012

Ответ от brettdj (спасибо, brettdj) работает хорошо и, вероятно, я буду использовать метод, но я нашел кое-что еще, что также работает и может дать преимущество в других ситуациях. Во-первых, он сохраняет чрезвычайную простоту использования Dir для циклического перемещения по папкам.

В Excel 11 я использую Dir (как описано в вопросе), чтобы создать список файлов jpg из каждой папки (по одной папке за раз), отсортировав буквенно-цифровые значения в столбце A. Затем я использую пользовательский список для сортируйте Col A (поддельной) числовой сортировкой, чтобы я мог обрабатывать мои jpg в последовательном порядке. Затем очистите Col A и повторите со следующей папкой.

Чтобы создать пользовательский список:

в строке 1 рабочего столбца введите

 =ROW() & ".jpg"

и Fill Down до любой масти. В моем случае я использовал 1000 элементов в своем пользовательском списке, потому что это максимальное количество jpg, которое я ожидаю в любой папке.

Пользовательские списки принимают только текст (или «простой текст» согласно справке MS), поэтому вновь созданный список формул необходимо преобразовать в текст, используя Вставить> Специальные> Значения, перед импортом в качестве Пользовательского списка. Каждый элемент в списке является одним из ожидаемых имен файлов. Окончательный пользовательский список выглядит следующим образом:

 1.jpg
 2.jpg
 3.jpg
 …
 …
 1000.jpg

После того, как я импортирую свой новый пользовательский список (Инструменты> Параметры> Пользовательские списки> Импорт), он становится доступным выбором в раскрывающемся меню в меню «Данные»> «Сортировка»> «Параметры»> «Порядок сортировки по первому ключу».

Если вы делаете это с VBA, то вот что предоставляет Recorder:

Range("A:A").Select
Selection.Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlGuess, _
    OrderCustom:=6, MatchCase:=False, Orientation:=xlTopToBottom, _
    DataOption1:=xlSortNormal

Первые 5 пользовательских списков встроены в Excel, поэтому OrderCustom: = 6 - это новый пользовательский список. Не забудьте изменить это обратно на OrderCustom: = False при обычной сортировке. Пользовательские списки остаются прикрепленными к Wkb, в котором они созданы, до тех пор, пока они не будут удалены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...