Последовательное чтение имен файлов в папке с использованием Excel VBA - PullRequest
0 голосов
/ 09 февраля 2020

Я пытаюсь прочитать почти 1000 файлов в папке, используя VBA. Я sh код для выбора имени файла в инкрементном порядке, таких как Dummy3_1, Dummy3_2, Dummy3_3 и т. Д. c. Но вместо этого текущий код выбирает Dummy3_10 после Dummy3_1. Как я мог сделать код, чтобы прочитать имя файла последовательно. Спасибо

Application.ScreenUpdating = False
    With Application.FileDialog(msoFileDialogFolderPicker)
        .Title = "Please select a folder"
        .ButtonName = "Pick Folder"
        If .Show = 0 Then
            MsgBox "Nothing was selected"
            Exit Sub
        Else
            FileDir = .SelectedItems(1) & "\"
        End If
    End With
FiletoList = Dir(FileDir & "")
    Do Until FiletoList = ""

Ответы [ 3 ]

1 голос
/ 09 февраля 2020

Dir не гарантирует возврат файлов в каком-либо конкретном порядке ( см. Здесь и здесь ).

Чтобы получить их в отсортированном порядке, вам нужно будет прочитать все файлы в какую-то структуру данных и отсортировать их перед возвратом в список.

Как описал Мэтью, порядок сортировки будет зависеть от структуры имени файла и ваших правил сортировки.

0 голосов
/ 09 февраля 2020
Option Explicit

Sub test()

    Dim folder
    With Application.FileDialog(msoFileDialogFolderPicker)
        .Title = "Please select a folder"
        .ButtonName = "Pick Folder"
        If .Show = 0 Then
            MsgBox "Nothing was selected"
            Exit Sub
        Else
            folder = .SelectedItems(1) & "\"
        End If
    End With
    With CreateObject("Scripting.FileSystemObject")
        Dim i
        For i = 1 To 1000
            Dim path
            path = folder & "Dummy3_" & i
            If .FileExists(path) Then
                '
                ' your code here
                Debug.Print path
                '
                '
            End If
        Next
    End With

End Sub
0 голосов
/ 09 февраля 2020

Команда Dir возвращает имена файлов «в произвольном порядке» (см. Ответ Криса Нейлсена для ссылок), поэтому вы не гарантированно получите нужный порядок.

Кроме того, при работе со строками компьютер отсортирует их в алфавитном порядке. С буквами вы должны видеть, что они расположены в алфавитном порядке:

b
ba
c

Числа не отличаются, когда они в строках. Правильный алфавитный порядок для этих чисел:

1
10
2

Если вы хотите, чтобы числа автоматически сортировались «должным образом» в числовом порядке, когда они являются частью строк, вам нужно дополнить их начальными нулями, чтобы эти числа и в алфавитном порядке (например, строки) и в числовом порядке (например, числа)

01
02
10

У вас есть два варианта в вашем случае. (РЕДАКТИРОВАТЬ: Исходя из поведения команды Dir, опция # 1 не так проста, как я бы подумал)

1) Если вы управляете входными файлами, самый простой (а также лучший способ) способ справиться с этим, чтобы создать файлы с добавленными номерами, поэтому вместо Dummy3_1, Dummy3_10 и т. д. c вы бы выбрали число нулей, которое будет содержать наибольшее количество файлов, которое вы можете иметь (вы сказали, что более 1000, и я примет менее 10k) и дополнит имена, поэтому назовите файлы Dummy3_0001, Dummy3_0010 и т. д. c. Если вы можете сделать это, ваш код должен просто начать работать без изменений.

2) Если вы не управляете именами файлов, вы не можете использовать команду Dir в том виде, как она есть. Вам нужно будет прочитать файлы в массив, разделить их на часть «Заголовок» (в вашем случае Dummy3_) и часть «цифра c» (все после _), а затем самостоятельно отсортировать список по нумерации c заказ. Это немного работы.

Надеюсь, это поможет вам.

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