Список файлов в папке

Иногда бывает необходимо заполучить на лист Excel список файлов в заданной папке и ее подпапках. В моей практике такое встречалось неоднократно, например:

  • перечислить в приложении к договору на проведение тренинга список файлов из раздаточных материалов для особо щепетильных юристов в некоторых компаниях
  • создать список файлов для ТЗ проекта
  • сравнить содержимое папок (оригинал и бэкап, например)

Для реализации подобной задачи можно использовать несколько способов.

Способ 1. Скелет из шкафа - функция ФАЙЛЫ

Этот способ использует древнюю функцию ФАЙЛЫ (FILES), оставшуюся в Microsoft Excel с далеких девяностых. Вы не найдете эту функцию в общем списке функций, но для совместимости, она всё ещё остаётся внутри движка Excel, и мы вполне можем её использовать.

Механизм таков:

1. В любую ячейку листа (например, в А1) введём путь к папке, список файлов из которой мы хотим получить.

Путь к папке

Обратите внимание, что путь должен оканчиваться шаблоном со звездочками:

  • *.* - любые файлы
  • *.xlsx - книги Excel (только с расширением xlsx)
  • *.xl* - любые файлы Excel
  • *отчет* - файлы, содержащие слово отчет в названии

и т.д.

2. Создадим именованный диапазон с помощью вкладки Формулы - далее кнопка Диспетчер имен - Создать (Formulas - Names Manger - Create). В открывшемся окне введем любое имя без пробелов (например Мои_файлы) и в поле диапазона выражение:

=ФАЙЛЫ(Лист1!$A$1)

Создаем именованный диапазон с функцией ФАЙЛЫ

После нажатия на ОК будет создан именованный диапазон с именем Мои_файлы, где хранится список всех файлов из указанной в А1 папки. Останется их оттуда только извлечь.

3. Чтобы извлечь имена отдельных файлов из созданной переменной, используем функцию ИНДЕКС (INDEX), которая в Excel вытаскивает данные из массива по их номеру:

Список файлов

Если лениво делать отдельный столбец с нумерацией, то можно воспользоваться костылем в виде функции СТРОКИ (ROWS), которая будет подсчитывать количество заполненных строк с начала списка автоматически:

=ИНДЕКС(Мои_файлы; ЧСТРОК($B$3:B3))

Ну, и скрыть ошибки #ССЫЛКА! в конце списка (если вы протягиваете формулу с запасом) можно стандартной функцией ЕСЛИОШИБКА (IFERROR):

=ЕСЛИОШИБКА(ИНДЕКС(Мои_файлы; ЧСТРОК($B$3:B3)); "")

Важное примечание: формально функция ФАЙЛЫ относится к макро-функциям, поэтому необходимо будет сохранить ваш файл в формате с поддержкой макросов (xlsm или xlsb).

Способ 2. Готовый макрос для ленивых

Если вы знакомы с макросами (не в смысле их программирования, а в смысле копипастинга готовых кодов на VBA), то вам, возможно, отлично зайдёт небольшой макрос, добавляющий в текущую книгу новый пустой лист и выводящий на него список всех файлов с их параметрами из заданной пользователем папки.

Для добавления макроса в вашу книгу нажмите сочетание клавиш Alt+F11, или кнопку Visual Basic на вкладке Разработчик (Developer), в открывшемся окне редактора Visual Basic вставьте новый модуль через меню Insert - Module и скопируйте туда текст этого макроса:

Sub FileList()
    Dim V As String
    Dim BrowseFolder As String
    
    'открываем диалоговое окно выбора папки
    With Application.FileDialog(msoFileDialogFolderPicker)
        .Title = "Выберите папку или диск"
        .Show
        On Error Resume Next
        Err.Clear
        V = .SelectedItems(1)
        If Err.Number <> 0 Then
            MsgBox "Вы ничего не выбрали!"
            Exit Sub
        End If
    End With
    BrowseFolder = CStr(V)
    
    'добавляем лист и выводим на него шапку таблицы
    ActiveWorkbook.Sheets.Add
    With Range("A1:E1")
        .Font.Bold = True
        .Font.Size = 12
    End With
    Range("A1").Value = "Имя файла"
    Range("B1").Value = "Путь"
    Range("C1").Value = "Размер"
    Range("D1").Value = "Дата создания"
    Range("E1").Value = "Дата изменения"
    
    'вызываем процедуру вывода списка файлов
    'измените True на False, если не нужно выводить файлы из вложенных папок
    ListFilesInFolder BrowseFolder, True
End Sub


Private Sub ListFilesInFolder(ByVal SourceFolderName As String, ByVal IncludeSubfolders As Boolean)

    Dim FSO As Object
    Dim SourceFolder As Object
    Dim SubFolder As Object
    Dim FileItem As Object
    Dim r As Long

    Set FSO = CreateObject("Scripting.FileSystemObject")
    Set SourceFolder = FSO.getfolder(SourceFolderName)

    r = Range("A65536").End(xlUp).Row + 1   'находим первую пустую строку
    'выводим данные по файлу
    For Each FileItem In SourceFolder.Files
        Cells(r, 1).Formula = FileItem.Name
        Cells(r, 2).Formula = FileItem.Path
        Cells(r, 3).Formula = FileItem.Size
        Cells(r, 4).Formula = FileItem.DateCreated
        Cells(r, 5).Formula = FileItem.DateLastModified
        r = r + 1
        X = SourceFolder.Path
    Next FileItem
    
    'вызываем процедуру повторно для каждой вложенной папки
    If IncludeSubfolders Then
        For Each SubFolder In SourceFolder.SubFolders
            ListFilesInFolder SubFolder.Path, True
        Next SubFolder
    End If

    Columns("A:E").AutoFit

    Set FileItem = Nothing
    Set SourceFolder = Nothing
    Set FSO = Nothing

End Sub

Для запуска макроса нажмите сочетание клавиш Alt+F8,или кнопку Макросы (Macros) на вкладке Разработчик (Developer), выберите наш макрос FileList и нажмите кнопку Выполнить (Run). В диалоговом окне выберите любую папку или диск и - вуаля!

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

Cells(r, 2).Formula = FileItem.Path

на

Cells(r, 2).Formula = "=HYPERLINK(""" & FileItem.Path & """)"

Способ 3. Мощь и красота - надстройка Power Query

Power Query - это очень мощная и при этом бесплатная надстройка для Excel от Microsoft, упрощающая множество задач по загрузке и трансформации данных. В нашей ситуации она тоже может здорово помочь.

Если у вас Excel 2016 или новее, то Power Query уже встроена в Excel по умолчанию, поэтому просто на вкладке Данные выберите команду Создать запрос / Получить данные - Из файла - Из папки (Create Query / Get Data - From file - From folder). Если у вас Excel 2010-2013, то Power Query нужно будет скачать с сайта Microsoft и установить как отдельную надстройку и она появится у вас в Excel в виде отдельной вкладки Power Query. На ней будет аналогичная кнопка Из файла - Из папки (From file - From folder).

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

Предварительный просмотр списка файлов в Power Query

Если внешний вид списка вас устраивает, то можно смело жать внизу кнопку Загрузить (Load), чтобы залить эти данные на новый лист. Если же хочется дополнительно обработать список (удалить лишние столбцы, отобрать только нужные файлы и т.п.), то нужно выбрать команду Изменить / Преобразовать данные (Edit / Transform Data).

Поверх окна Excel откроется окно редактора Power Query, где мы увидим список всех наших файлов в виде таблицы:

Окно Power Query

Дальше возможны несколько вариантов:

  • Если нужны только файлы определенного типа, то их можно легко отобрать с помощью фильтра по столбцу Extension:

    Фильтр по расширению файла

  • Аналогичным образом фильтрами по столбцам Date accessed, Date modified или Date created можно отобрать файлы за нужный период (например, созданные только за последний месяц и т.п.):

    Фильтры по дате

  • Если нужно получить данные не из всех папок, то фильтруем по столбцу Folder Path, чтобы оставить только те строки, где путь содержит/не содержит нужные имена папок:

    Фильтры по пути и папкам

  • Там же можно выполнить сортировку файлов по любому столбцу, если требуется.

После того, как необходимые файлы отобраны, можно смело удалить ненужные столбцы, щелкнув по заголовку столбца правой кнопкой мыши и выбрав команду Удалить (Remove column). Это, кстати, уже никак не повлияет на фильтрацию или сортировку нашего списка:

Готовый список

Если в будущем планируется подсчитывать количество файлов в каждой папке (например, для контроля поступивших заявок или подсчета статистики по заявкам), то имеет смысл дополнительно сделать ещё пару действий:

  • Щелкните правой кнопкой мыши по столбцу Folder Path и выберите команду Дублировать столбец (Duplicate Column).
  • Выделите скопированный столбец и на вкладке Преобразование (Transform) выберите Разделить столбец - По разделителю (Split Column - By delimiter)

Мы получим рядом с нашими данными еще несколько столбцов, где будут продублированы имена вложенных папок - это пригодится нам чуть позже для подсчета статистики с помощью сводной таблицы:

Разделить столбец пути по разделителю

Получившиеся столбцы можно переименовать (Диск, Папка1, Папка2 и т.д.), просто щёлкнув дважды по заголовку каждого.

И, наконец, когда список готов, то его можно выгрузить на лист с помощью команды Главная - Закрыть и загрузить - Закрыть и загрузить в... (Home - Close & Load - Close & Load to...):

Выгруженные на лист результаты

И, само-собой, теперь можно построить по нашей таблице сводную (вкладка Вставка - Сводная таблица), чтобы легко подсчитать количество файлов в каждой папке:

Сводная со статистикой по каждой папке

Дополнительным бонусом можно сделать еще один столбец с функцией ГИПЕРССЫЛКА (HYPERLINK), которая создаст красивые стрелочки-ссылки для моментального перехода к каждому файлу:

Функция ГИПЕРССЫЛКА

Мелочь, а приятно :)

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

Ссылки по теме

 


Страницы: 1  2  3  
19.07.2019 18:02:43
Друзья! А можно выводить еще кол-во листов в файле. У меня куча файлов pdf в которых несколько листов, хотелось бы знать сколько при выгрузке?
26.08.2019 18:10:16
Николай, добрый день!
Не перестаю удивляться.
Вы гений!
Сэкономили массу времени и сил.
03.02.2020 08:42:01
Добрый день Всем,
Помогите решить такой вопрос.
Мне нужно из одной папке где очень много разных папок и файлов вытащить все наименования папок которые есть внутри
через макрос не получилось т.к. на 9563 строчке он остановился и дальше не загрузил информацию. Через Power Query тоже не получилось, т.к. не может загрузить более 700 строк.
Все файлы находятся в сетевом файлообменнике.
12.02.2020 16:41:54
Добрый день!
Power Query отличная штука. Легко получил список файлов и рассортировал как нужно под свои задачи.
НО!
Столкнулся с таким нюансом - при встройке в макрос таблиц полученных через Power Query, получается затык с обновлением списков.
Макрос не ждет пока обновятся таблицы в книге и берет в работу их практически в неизменном виде.

Пока не нашел решения на просторах интернета. Кто-то сталкивался с таким? Как решили?
02.03.2020 14:42:39
первый способ в последнем "офис 365" уже не рабочий: при создании нового файла и прописывании всего - всё работает, сохраняемся в эксель с макросом, переоткрываем и всё, функция файлы уже не работает.
07.03.2020 13:49:15
Не гоните волну - все работает.
Проверьте защиту от макросов и сохранение в формате xlsm.
07.03.2020 14:06:15
С другого ПК действительно заработало, хотя сохранялся в xlsm раньше.
Не знаете, как сделать ,чтобы не прописывать весь путь, а работало по умолчанию с той папкой, где находится экселя файл?
29.07.2020 20:47:03
Макрос, к сожалению, не делает выгрузку имен файлов без расширения, приходится убирать их формулами.
27.08.2020 16:53:57
Способ 2. Готовый макрос для ленивых-Бомба, сократил рабочий процесс минут на 15-20. А как сделать чтоб при запуске макроса при открытии окна открывалась не библиотека, а папка в которой лежит файл. Т.е. файл (шаблон) кочует по разным папкам в которых есть еще одна папка из которой и нужно вытягивать данные. А указывать полный путь к папке нудное занятие(сократить путь к папке не получится).
02.10.2020 10:54:00
Добрый день!
Спасибо за макрос, но как сделать, чтобы создавался список только из файлов определенного формата? Например, только из PDF?
Tim
13.11.2020 13:54:18
Отличная статья! Огромное спасибо автору!
Скажите, пожалуйста, как с помощью Power Query получить столбец с указанием размера файла.
Необходимо произвести итог всех файлов в папке, не смог найти, как можно добавить этот столбец в запросе.
Спасибо!
02.02.2021 22:49:52
Добрый день!
Спасибо, макрос чумовой!!!!
Подскажите, как его расширить в части формирования списка из папки отдельно разных форматов🙏🏼
27.04.2021 23:11:38
Спасибо, легко и просто вспомнить.
Такой вопрос, я могу здесь выложить надстройку для Excel?
Она по теме поиска файлов и не только.
К
10.06.2021 13:59:08
Добрый день, Николай, спасибо за решение с Power Query! Очень пригодилось.
Подскажите, пожалуйста, как решить проблему: я добавила столбцы с данными вручную уже в выгруженную из PQ таблицу, и мне нужно "привязать" эти данные к конкретному файлу, примерно как ВПРом. Когда обновляю, данные сползают, т.к. внутри подпапок удаляются/добавляются файлы, которые также поддтягиваются в выгрузку. Я придумала только делать новую умную таблицу из выгрузки, а потом "приклеивать" в конец новые файлы. Но каждый раз делать новую УТ, когда дописываю данные, неудобно. Есть ли красивый способ фиксировать новые данные напротив имени файла в PQ?
09.07.2021 11:25:36
Добрый день. Спасибо за статью.
Возник вопрос. При попытке выгрузить из папки с помощью PQ список из сетевого ресурса (сервер) PQ выдает ошибку. Корректно работает если папка находится на диске компьютера. В чем может быть проблема и есть ли возможность ее решить?
В дополнение. С одиночными файлами с сервера работает. Проблема только при попытке запросить из папки.
19.11.2021 15:38:20
Эх, жаль Power Query на excel в mac os не работает(( Офигенная идея и очень нужная, а тут не то что Power Query но макрос не хочет работать. Печалька
Здравствуйте, подскажите, а можно вывести при помощи данного макроса продолжительность mp3 файла?
22.02.2022 10:01:32
Добрый день,
Недавно столкнулся с обратной задачей - есть БД. в которой уже прописаны адреса файлов (протокол тестирования в pdf), расположенных в разных папках. По внутренней процедуре компании, необходимо отправлять Клиенту протоколы на согласование (как вложение в электронной почте), перед тем как выставить счет. Когда протоколов до 10 нет проблем, ручками attache и т.д. Но когда их 80 - это уже проблема. Вопрос - позволяет ли Excel каким то образом загрузить выбранный список файлов в Outlook в виде вложения?
Заранее спасибо
15.03.2022 15:39:17
Отличная работа! Спасибо!
Подскажите а можно ли добавить к таблице файлов через Power Query добавить имя владельца файла, на работе разные люди создают разные файлы и чтобы понять где чей файл необходима такая функция. Спасибо за ранее)
12.04.2022 17:11:35
Добрый день, как доработать макрос чтоб он путь брал из ячейки A1 и выводил только название файлов из этой папки ниже?
13.05.2022 12:15:49
Макрос просто супер. У меня тоже есть вопрос. А можно как-то выводить информацию (на момент построения списка (в списке)) файл занят (открыт кем-то) или нет? Типа дополнительного столбца и текста (файл открыт.... или свободен...) Заранее спасибо.
17.08.2022 20:35:17
А как преобразовать в текст и добавить в список содержимое тегов аудиофайлов. имеется большой список файлов. вместо названия номер. само название в теге...
07.02.2023 19:25:02
Николай, замечательное решение с PQ, но есть нюанс, каждый раз при обновлении PQ все форму слетают (в данном случае гиперссылки), возможно ли как-то решить данную задачу (что бы формулы не слетали при обновлении)?
Обновляем запрос несколько раз в день, для мониторинга наполнения файлов.
07.02.2023 20:00:02
      Николай, прошу помочь так же с проблемой, в пути "Folder Path" есть папки начинающиеся на # (например: База\# Проекты\) и на них процесс дальнейшего прохода по пути к файлу в столбце "Name" останавливается. Провёл эксперимент, убрал все решётки и доступ возобновился, но файлы системные и изменить нет возможности, прошу подсказать как решить проблему
05.05.2023 14:50:44
Было бы здорово, если макрос был бы в PLEX.
01.07.2023 17:59:22
Эх, кабы PQ ещё и размер файла выводил в таблицу, цены бы не было решению...
Страницы: 1  2  3  
Наверх