Excel vba - Dir (путь и файл) не возвращает все соответствующие файлы

У меня есть странная головоломка: команда DIR() возвращает файлы, как и ожидалось, за исключением нескольких случаев.

        MyFile = Dir(FilePath & FileLook)
        FileFound = ""
        FileKt = 0
        Do While MyFile <> ""
            FileFound = MyFile
            FileKt = FileKt + 1
            MyFile = Dir
        Loop

FilePath = каталог, в котором находятся файлы (например: C:\Folder\ )

FileLook = шаблон, ищущий определенный файл, который обычно имеет формат ЧЧММ после ГГГГММДД (например, ERROR_FILE_20201129*)

Исключением, которое не работает, является файл без расширения (.txt; .zip и т. д.) и . разделители в названии

XXXXXX.XXX.PROJ.EVENT_YYYYMMDD

Пример поиска, который вернул файл (большинство): FileLook = ERROR_FILE_20201029* вернул ERROR_FILE_202010291112.txt

Примечание. В качестве исключения я пробовал поиск со звездочкой * и без нее.


person Jan    schedule 29.10.2020    source источник
comment
FilePath — это каталог, в котором находятся файлы (в том числе обучающие). FileLook — это шаблон для конкретного поиска — я изменю вопрос, чтобы было понятно   -  person Jan    schedule 29.10.2020
comment
Я не могу воспроизвести вашу проблему. Но я не понимаю, почему вы ожидаете, что XXXXXX.XXX.PROJ.EVENT_YYYYMMDD будет соответствовать ERROR_FILE_20201129* Возможно, если вы опубликуете точный шаблон, который вы используете; и точный полный путь к файлу, который, по вашему мнению, должен совпадать, но это не так.   -  person Ron Rosenfeld    schedule 29.10.2020
comment
Спасибо, Рон - поиск ERROR_FILE_20201129 * был примером успешной находки - «проблемный ребенок» не имеет расширения и .s в имени, что может запутать поиск файлов.   -  person Jan    schedule 29.10.2020
comment
Мы не общаемся. Успешная находка — это имя найденного файла. ERROR_FILE_20201129* не является допустимым именем файла. (звездочки не допускаются в именах файлов в Windows 10), поэтому вы не могли успешно найти этот файл.   -  person Ron Rosenfeld    schedule 29.10.2020
comment
Звездочка действительна в команде DIR() — в цикле можно найти все подходящие файлы. ERROR_FILE_20201129* был в FileLook, ERROR_FILE_202010291112.txt был возвращен в MyFile   -  person Jan    schedule 29.10.2020
comment
И какой файл был НЕ возвращен с FileLook = ERROR_FILE_20201129*, который, по вашему мнению, должен был быть?   -  person Ron Rosenfeld    schedule 29.10.2020
comment
И, конечно же, звездочка допустима в команде DIR — это подстановочный знак.   -  person Ron Rosenfeld    schedule 29.10.2020
comment
Не могли бы вы поделиться значением FileLook, которое вы использовали для успешного поиска большинства файлов.   -  person VBasic2008    schedule 30.10.2020


Ответы (2)


Чтобы найти только ERROR_FILE_202011291112.txt, вы можете использовать

FileLook = 'ERROR_FILE_20201129*.*' 

Но любые .s перед * делают фильтр недействительным.

По общему признанию, обходной путь, но вы также можете найти все файлы в каталоге, разрешив FileLook = и применив фильтр, внешний по отношению к команде Dir.

MyFile = Dir(FilePath)
FileFound = ""
FileKt = 0
Do While MyFile <> ""
    If MyFile Like FileLook Then
        FileFound = MyFile
        FileKt = FileKt + 1
    End If
    MyFile = Dir
Loop

Следующие имена файлов были в папке, с которой я тестировал это.

  • ОШИБКА_ФАЙЛ_2020.11.29.1112
  • ФАЙЛ_ОШИБКИ_2020.11.29.1112.txt
  • ERROR_FILE_202011291112.txt

Все три файла были оценены с использованием FileLook =

Надеюсь, это сработает для вас.

person BZngr    schedule 29.10.2020
comment
Ваше решение НЕ было решением, но оно заставило меня найти обходной путь. - person Jan; 30.10.2020

Спасибо БЗнгр! Вы указали мне на обходной путь. Оригинал

MyFile = Dir(FilePath & FileLook)

хранился. При повторном тестировании я обнаружил, что оператором Dir() не было найдено ни одного файла, когда в определенной точке были только числа.

  • PROJ.EVENT_20201030* Возвращено
  • PROJ.EVENT_2020* Возвращено
  • PROJ.EVENT_202* Возвращено
  • PROJ.EVENT_20* Возвращено PROJ.EVENT_202010301421 Почему? ♪Музыка Twilight Zone♪ В папке много файлов, вот почему я хотел ограничить зацикливание ненужных файлов. По крайней мере, так я могу ограничиться текущим веком.
person Jan    schedule 30.10.2020
comment
Рад слышать, что ответ помог вам найти решение. - person BZngr; 31.10.2020