Просмотреть все файлы в папке
Иногда необходимо проделать однотипные операции с несколькими файлами, расположенными в одной папке. Можно открывать каждый по очереди:
Workbooks.Open "C:\Новая папка\Книга2.xlsx"
и т.д.
Но если файлов много и все с разными именами, то это не очень практично и совсем лишено гибкости. При помощи Visual Basic for Application можно решить проблему. При этом файлы можно просматривать как в одной папке, так и включая вложенные "подпапки".
Ниже приведен код, который перебирает все файлы в папке, открывает их и на первом листе каждого файла записывает текст
Sub Get_All_File_from_Folder() Dim sFolder As String, sFiles As String Dim wb As Workbook 'диалог запроса выбора папки с файлами With Application.FileDialog(msoFileDialogFolderPicker) If .Show = False Then Exit Sub sFolder = .SelectedItems(1) End With sFolder = sFolder & IIf(Right(sFolder, 1) = Application.PathSeparator, "", Application.PathSeparator) 'отключаем обновление экрана, чтобы наши действия не мелькали Application.ScreenUpdating = False sFiles = Dir(sFolder & "*.xls*") Do While sFiles <> "" 'открываем книгу Set wb = Application.Workbooks.Open(sFolder & sFiles) 'действия с файлом 'Запишем на первый лист книги в ячейку А1 - www.excel-vba.ru wb.Sheets(1).Range("A1").Value = "www.excel-vba.ru" 'Закрываем книгу с сохранением изменений wb.Close True 'если поставить False - книга будет закрыта без сохранения sFiles = Dir Loop 'возвращаем ранее отключенное обновление экрана Application.ScreenUpdating = True End Sub |
Если хотите перебрать файлы других форматов, а не Excel, то просто замените "*.xls" на нужное расширение. Например "*.doc". Также, если хотите собрать только файлы с определенными символами/словами в имени, то можно указать так:
В коде выше есть одна проблема: что если необходимо открыть файлы не только в указанной папке, но и во всех её подпапках? В версиях Excel 2003 и младше это решалось с помощью метода
Для этого используется встроенная в офис библиотека
Option Explicit Dim objFSO As Object, objFolder As Object, objFile As Object Sub Get_All_File_from_SubFolders() Dim sFolder As String With Application.FileDialog(msoFileDialogFolderPicker) If .Show = False Then Exit Sub sFolder = .SelectedItems(1) End With sFolder = sFolder & IIf(Right(sFolder, 1) = Application.PathSeparator, "", Application.PathSeparator) Application.ScreenUpdating = False Set objFSO = CreateObject("Scripting.FileSystemObject") GetSubFolders sFolder Set objFolder = Nothing Set objFSO = Nothing Application.ScreenUpdating = True End Sub Private Sub GetSubFolders(sPath) Dim sPathSeparator As String, sObjName As String Dim wb As Workbook Set objFolder = objFSO.GetFolder(sPath) For Each objFile In objFolder.Files If Replace(objFile.Name, objFSO.GetBaseName(objFile), "") Like ".xls*" Then 'открываем книгу Set wb = Application.Workbooks.Open(sPath & objFile.Name) 'действия с файлом 'Запишем на первый лист книги в ячейку А1 - www.excel-vba.ru wb.Sheets(1).Range("A1").Value = "www.excel-vba.ru" wb.Close True 'wb.Close False '- если в коде надо будет закрывать книгу без сохранения End If Next For Each objFolder In objFolder.SubFolders GetSubFolders objFolder.Path & Application.PathSeparator Next End Sub |
Код делает тоже самое, что и первый, но открывает и изменяет ячейку
If Replace(objFile.Name, objFSO.GetBaseName(objFile), "") Like ".xls*" Then |
Строка отвечает за тип перебираемых файлов. В примере будут просмотрены любые файлы Excel. Звездочка на конце означает любой символ или набор символов. Т.е. если указать без неё -
Если добавить условие:
то будут обработаны файлы, которые в имени содержат слово "книга". При этом регистр букв имеет значение. Т.е. если файл содержит в имени слово "Книга", то он не будет обработан.
Думаю теперь Вы легко сможете проделать необходимые операции с множеством файлов.
Все файлы в папке и подпапках.xls (61,5 KiB, 8 271 скачиваний)
В примере я закомментировал строки, открывающие файл и вносящие изменения в ячейку
В последнее время участились вопросы как просмотреть еще и все диски на ПК. Ниже выкладываю код, который просматривает все подключенные диски и просматривает все файлы во всех папках дисков:
Sub Get_All_drives() Dim objDrives As Object, objDrive As Object Set objFSO = CreateObject("Scripting.FileSystemObject") Set objDrives = objFSO.Drives For Each objDrive In objDrives If objDrive.IsReady Then GetSubFolders objDrive.DriveLetter & ":\" End If Next objDrive End Sub |
Для работы кода необходимо разместить его в том же модуле, что и код просмотра файлов в подпапках. Без него код просмотра дисков работать не будет, т.к. обращается к процедуре
Все файлы в папке и подпапках.xls (61,5 KiB, 8 271 скачиваний)
В примере код сканирует все диски и выводит в столбец А нового листа(лист создается автоматически) пути ко всем файлам.
Так же см.:
Как средствами VBA переименовать/переместить/скопировать файл
Как сменить формат сразу для нескольких файлов Excel
Как удалить папку или все файлы из папки через VBA
Собрать и просуммировать данные из разных файлов при помощи PowerQuery
Статья помогла? Поделись ссылкой с друзьями!

Поиск по меткам
Access apple watch Multex Power Query и Power BI VBA управление кодами Бесплатные надстройки Дата и время Записки ИП Надстройки Печать Политика Конфиденциальности Почта Программы Работа с приложениями Разработка приложений Росстат Тренинги и вебинары Финансовые Форматирование Функции Excel акции MulTEx ссылки статистикаКомментарии, не имеющие отношения к комментируемой статье, могут быть удалены без уведомления и объяснения причин. Если есть вопрос по личной проблеме - добро пожаловать на Форум
Подскажите, а как сделать, чтобы сканировал определенную папку и выводил название папок (не файлов), хранящихся в первоначальной папке. Т.е. есть папка A в ней хранятся папки C, D и т.д., нужно чтобы Excel вывел название папки виде таблицы (отображал наименование, дату создания, размер) и при добавление новых папок отображал в списке?!
Спасибо большое за очень полезный скрипт! Он у меня работает на отлично, если нужно выполнить какие-то простые операции в файлах. Однако, если я вставляю в код действий с файлом операции с функцией Dir (например, мне нужно, чтобы программа создала файл с определённым именем, а затем при открытии следующего файла из указанной папки проверила, есть ли уже файл с таким именем или нет), программа не переходит на следующую ступень цикла и не открывает следующий файл - ругается на строчку sFiles = Dir . Как можно избежать такой проблемы? В программировании я профан, пытаюсь написать свой первый макрос для обработки данных.
Возникла такая проблема:Программа 1С Предприятие перестала читать формат xls и xlsx, и теперь видит только txt,пожалуйста подскажите как зделать так чтобы программа опять видела xls и xlsx ?
Все очень просто: найти сайт посвященный 1С, а не Excel. Excel-то у Вас видит эти файлы? Значит проблема явно не в нем...
спасибо
Добрый день!
Подскажите, пожалуйста, как открыть файлы с определёнными именами с помощью цикла? Например, file1, file2, file3 и т.д.
Чтобы скопировать тексты приведенных программ можно выделить весь текст (Ctrl+A), вставить в текстовой редактор, а оттуда уж выдрать нужное ;)
Леон, куда проще навести мышкой на код, в строке меню для окна кода выбрать "Показать код в новом окне" и уже там Ctrl+A. Скопируется вообще только нужное :-)
как вариант: в окне с кодом при наведении мышкой на него появляется строка с кнопками, там есть кнопка Copy, щелкнуть по ней, затем нажать комбинацию ctrl+c
очень полезный код, очень мне помог. скажите, как можно ограничить файлы, которые открываются при работе этого кода датой создания? например только вчерашние...
Про какой именно код идет речь не знаю(только в папке или включая подпапки), но для открытия только вчерашних надо проверять дату последнего сохранения файла перед открытием. Что-то вроде:
Суперрешение! (первый макрос в статье) - универсально для большинства задач по работе (крупный банк). Помогло автоматизировать часть банковского процесса, которая выполнялась вручную и отнимало массу драгоценного рабочего времени. Спасибо автору!
Спасибо большое за код, который помог автоматизировать процесс!
Но есть одна непонятность или ошибка...
В папке есть файлы с названиями функций в таком порядке:
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.
Попробовал оставить только эти два файла - отрабатывает без проблем.
Не могу понять закономерности, где может быть ошибка?
Алексей, никаких причин подобного поведения не вижу. Скорее всего проблема не в коде, раз значения в переменных правильные. Может быть книги открываются верные, но в скрытом режиме?
Проблем действительно не в коде, но очень странная.
При открытии проблемных файлов его имя в шапке документа изменяется. Так происходит не со всеми файлами, а только с некоторыми, закономерность непонятна. И в разных папках тоже есть подобные файлы.
Теперь понятно, почему скрипт не отработал на них - у них просто такое же имя, как и у файлов, уже присутствующих в папке.
И это происходит только на виртуальной машине с подкюченной папкой с этими файлами. На реальной машине имя файлов не меняется.
Доброе время суток Дмитрий, подскажите в чем причина такого поведения. Нужно перебрать все файлы расширения xls , но даже если поменять
sFiles = Dir(sFolder & "*.xls*")
sFiles = Dir(sFolder & "*.xls") все равно и xls и, xlsx и, xlsm и, xlsb.
Благодарю за внимание!
Спасибо огромное! Это макрос просто супер!