Хитрости »
Основные понятия (22)
Сводные таблицы и анализ данных (7)
Графики и диаграммы (5)
Работа с VB проектом (11)
Power BI и Power Query (11)
Условное форматирование (5)
Списки и диапазоны (5)
Макросы(VBA процедуры) (62)
Разное (37)

Просмотреть все файлы в папке

Иногда необходимо проделать однотипные операции с несколькими файлами, расположенными в одной папке. Можно открывать каждый по очереди:
Workbooks.Open "C:\Новая папка\Книга1.xlsx"
Workbooks.Open "C:\Новая папка\Книга2.xlsx"
и т.д.
Но если файлов много и все с разными именами, то это не очень практично и уж точно не компактно. А т.к. немногие начинающие могут сразу найти желаемое, я решил выложить код, который перебирает все файлы в папке и открывает их:

sFiles = Dir(sFolder & "*.xls*") - Строка отвечает за тип перебираемых файлов. В примере будут просмотрены любые файлы Excel. Звездочка на конце означает любой символ или набор символов. Т.е. если указать без неё - "*.xls", то будут просмотрены только файлы с расширением xls, а если указать xlsx - то файлы с расширением xlsx и никакие другие.
Если хотите перебрать файлы других форматов, а не Excel, то просто замените "*.xls" на нужное расширение. Например "*.doc". Также, если хотите собрать только файлы с определенными символами/словами в имени, то можно указать так: sFiles = Dir(sFolder & "*отчет*.xls*"). Будут просмотрены все файлы, содержащие в имени слово "отчет"(например "отчет за июнь.xls", "отчет за июль.xls", "сводный отчет.xls" и т.п.).

Но есть и еще одна проблема: что если необходимо открыть файлы не только в указанной папке, но и во всех её подпапках? Указанные выше код не подойдет в данной ситуации. В версиях Excel 2003 и младше это решалось с помощью метода .FileSearch, но в старших версиях данный метод по каким-то причинам был заблокирован разработчиками Microsoft. И осталось действовать только через рекурсивный метод перебора папок. Ниже приведен код, который открывает все файлы Excel в указанной папке, включая все подпапки:

Строка отвечает за тип перебираемых файлов. В примере будут просмотрены любые файлы Excel. Звездочка на конце означает любой символ или набор символов. Т.е. если указать без неё - "*.xls", то будут просмотрены только файлы с расширением xls, а если указать xlsx - то файлы с расширением xlsx и никакие другие.
Если добавить условие: If objFSO.GetBaseName(objFile) Like "*книга*" Then
то будут обработаны файлы, которые в имени содержать слово "книга". При этом регистр букв имеет значение. Т.е. если файл содержит в имени слово "Книга", то он не будет обработан.
Думаю теперь Вы легко сможете проделать необходимые операции с множеством файлов.

Скачать пример:

  Tips_Macro_Get_All_Files_from_Folder.xls (56,5 KiB, 3 894 скачиваний)


В примере я закомментировал строки, открывающие файл и вносящие изменения в ячейку А1 и заменил это созданием массива имен всех файлов в папках и подпапках. По окончании имена всех файлов заносятся в столбец "А". Сделано для того, чтобы Вы случайно не повредили информацию в файлах.

В последнее время участились вопросы как просмотреть еще и все диски. Поэтому решил выложить код, который просматривает все подключенные диски и выводит список всех файлов в них. Для работы кода достаточно разместить его в одном модуле с кодом выше:


Статья помогла? Поделись ссылкой с друзьями!
  Плейлист   Видеоуроки

Поиск по меткам

Access Multex Outlook Power Query и Power BI VBA работа в редакторе VBA управление кодами Бесплатные надстройки Дата и время Диаграммы и графики Записки Защита данных Интернет Картинки и объекты Листы и книги Макросы и VBA Настройка Печать Поиск данных Почта Программы Работа с приложениями Работа с файлами Разработка приложений Сводные таблицы Списки Тренинги и вебинары Финансовые Форматирование Формулы и функции Функции Excel Функции VBA Ячейки и диапазоны акции MulTEx анализ данных ссылки
Обсуждение: 31 комментарий
  1. Сергей:

    Подскажите, а как сделать, чтобы сканировал определенную папку и выводил название папок (не файлов), хранящихся в первоначальной папке. Т.е. есть папка A в ней хранятся папки C, D и т.д., нужно чтобы Excel вывел название папки виде таблицы (отображал наименование, дату создания, размер) и при добавление новых папок отображал в списке?!

    0
  2. Екатерина:

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

    0
  3. Vlad:

    Возникла такая проблема:Программа 1С Предприятие перестала читать формат xls и xlsx, и теперь видит только txt,пожалуйста подскажите как зделать так чтобы программа опять видела xls и xlsx ?

    0
  4. Виктория:

    Добрый день!
    Подскажите, пожалуйста, как открыть файлы с определёнными именами с помощью цикла? Например, file1, file2, file3 и т.д.

    0
  5. Леон:

    Чтобы скопировать тексты приведенных программ можно выделить весь текст (Ctrl+A), вставить в текстовой редактор, а оттуда уж выдрать нужное ;)

    0
    • Леон, куда проще навести мышкой на код, в строке меню для окна кода выбрать "Показать код в новом окне" и уже там Ctrl+A. Скопируется вообще только нужное :-)

      0
      • Дима:

        как вариант: в окне с кодом при наведении мышкой на него появляется строка с кнопками, там есть кнопка Copy, щелкнуть по ней, затем нажать комбинацию ctrl+c

        0
  6. Сергей:

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

    0
    • Про какой именно код идет речь не знаю(только в папке или включая подпапки), но для открытия только вчерашних надо проверять дату последнего сохранения файла перед открытием. Что-то вроде:

      0
  7. Павел:

    Суперрешение! (первый макрос в статье) - универсально для большинства задач по работе (крупный банк). Помогло автоматизировать часть банковского процесса, которая выполнялась вручную и отнимало массу драгоценного рабочего времени. Спасибо автору!

    0
  8. Алексей:

    Спасибо большое за код, который помог автоматизировать процесс!
    Но есть одна непонятность или ошибка...

    В папке есть файлы с названиями функций в таком порядке:
    ERROR_TYPE.xlsx
    INFO.xlsx
    ISEVEN.xlsx
    ISLOGICAL.xlsx
    ISNONCONTEXT.xlsx
    ISODD.xlsx
    N.xlsx
    TYPE.xlsx
    Код макроса оставлен без изменений, действия над файлом роли не играют.
    For Each objFile In objFolder.Files
    If Replace(objFile.Name, objFSO.GetBaseName(objFile), "") Like strTypeOfFile Then
    Workbooks.Open sPath & objFile.Name
    Проблема в том, что последние 2 файла (N и TYPE) не обрабатываются.
    В дебаге вижу в objFile попадает правильное название файла N.xlsx и путь к нему, но фактически открывается файл ISEVEN.xlsx.
    Попробовал оставить только эти два файла - отрабатывает без проблем.
    Не могу понять закономерности, где может быть ошибка?

    0
    • Алексей, никаких причин подобного поведения не вижу. Скорее всего проблема не в коде, раз значения в переменных правильные. Может быть книги открываются верные, но в скрытом режиме?

      0
      • Алексей:

        Проблем действительно не в коде, но очень странная.
        При открытии проблемных файлов его имя в шапке документа изменяется. Так происходит не со всеми файлами, а только с некоторыми, закономерность непонятна. И в разных папках тоже есть подобные файлы.
        Теперь понятно, почему скрипт не отработал на них - у них просто такое же имя, как и у файлов, уже присутствующих в папке.
        И это происходит только на виртуальной машине с подкюченной папкой с этими файлами. На реальной машине имя файлов не меняется.

        0
  9. Александр:

    Доброе время суток Дмитрий, подскажите в чем причина такого поведения. Нужно перебрать все файлы расширения xls , но даже если поменять
    sFiles = Dir(sFolder & "*.xls*")
    sFiles = Dir(sFolder & "*.xls") все равно и xls и, xlsx и, xlsm и, xlsb.
    Благодарю за внимание!

    0
Поделитесь своим мнением

Комментарии, не имеющие отношения к комментируемой статье, могут быть удалены без уведомления и объяснения причин. Если есть вопрос по личной проблеме - добро пожаловать на Форум


Для оформления сообщений Вы можете использовать следующие тэги:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">

Тренинги

Заказать
Наши партнеры
Перейти
Перейти
Счетчики
Анализ сайта

Яндекс.Метрика
© 2017 Excel для всех  Войти
Авторизация
*
*
Регистрация
*
*
*
Пароль не введен
*
captcha
Генерация пароля