Хитрости »
20 Июль 2012 137514 просмотров
Просмотреть все файлы в папке
Иногда необходимо проделать однотипные операции с несколькими файлами, расположенными в одной папке. Можно открывать каждый по очереди:
Workbooks.Open «C:Новая папкаКнига1.xlsx»
Workbooks.Open «C:Новая папкаКнига2.xlsx»
и т.д.
Но если файлов много и все с разными именами, то это не очень практично и совсем лишено гибкости. При помощи Visual Basic for Application можно решить проблему. При этом файлы можно просматривать как в одной папке, так и включая вложенные «подпапки».
- Все файлы в папке
- Все файлы включая подпапки
- Просмотреть все диски
Все файлы в папке
Ниже приведен код, который перебирает все файлы в папке, открывает их и на первом листе каждого файла записывает текст
«www.excel-vba.ru»
в ячейку
A1
:
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
sFiles = Dir(sFolder & «*.xls*») — Строка отвечает за тип перебираемых файлов. В примере будут просмотрены любые файлы Excel. Звездочка на конце означает любой символ или набор символов. Т.е. если указать без неё — «*.xls», то будут просмотрены только файлы с расширением xls, а если указать xlsx — то файлы с расширением xlsx и никакие другие.
Если хотите перебрать файлы других форматов, а не Excel, то просто замените «*.xls» на нужное расширение. Например «*.doc». Также, если хотите собрать только файлы с определенными символами/словами в имени, то можно указать так: sFiles = Dir(sFolder & «*отчет*.xls*»). Будут просмотрены все файлы, содержащие в имени слово «отчет»(например «отчет за июнь.xls», «отчет за июль.xls», «сводный отчет.xls» и т.п.).
Все файлы включая подпапки
В коде выше есть одна проблема: что если необходимо открыть файлы не только в указанной папке, но и во всех её подпапках? В версиях Excel 2003 и младше это решалось с помощью метода
.FileSearch
, но в старших версиях данный метод по каким-то причинам был заблокирован разработчиками Microsoft. И осталось действовать только через рекурсивный метод перебора папок. Ниже приведен код, который открывает все файлы Excel в указанной папке, включая все подпапки.
Для этого используется встроенная в офис библиотека
File System Object
:
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
Код делает тоже самое, что и первый, но открывает и изменяет ячейку A1 первого листа для всех файлов Excel в выбранной папке и всех её подпапках(включая все вложенные до последнего уровня).
If Replace(objFile.Name, objFSO.GetBaseName(objFile), "") Like ".xls*" Then
Строка отвечает за тип перебираемых файлов. В примере будут просмотрены любые файлы Excel. Звездочка на конце означает любой символ или набор символов. Т.е. если указать без неё — «*.xls», то будут просмотрены только файлы с расширением xls, а если указать xlsx — то файлы с расширением xlsx и никакие другие.
Если добавить условие: If objFSO.GetBaseName(objFile) Like «*книга*» Then
то будут обработаны файлы, которые в имени содержат слово «книга». При этом регистр букв имеет значение. Т.е. если файл содержит в имени слово «Книга», то он не будет обработан.
Думаю теперь Вы легко сможете проделать необходимые операции с множеством файлов.
Скачать пример:
Все файлы в папке и подпапках.xls (61,5 KiB, 8 202 скачиваний)
В примере я закомментировал строки, открывающие файл и вносящие изменения в ячейку
A1
и заменил это созданием списка имен всех файлов в папках и подпапках. По окончании работы кода имена всех файлов записываются в столбец «А» нового листа(лист создается автоматически). Сделано для того, чтобы при тестировании кода случайно не повредить информацию в файлах.
Просмотреть все файлы на всех дисках
В последнее время участились вопросы как просмотреть еще и все диски на ПК. Ниже выкладываю код, который просматривает все подключенные диски и просматривает все файлы во всех папках дисков:
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
Для работы кода необходимо разместить его в том же модуле, что и код просмотра файлов в подпапках. Без него код просмотра дисков работать не будет, т.к. обращается к процедуре GetSubFolders(которая и приведена в коде перебора файлов в подпапках).
Скачать пример:
Все файлы в папке и подпапках.xls (61,5 KiB, 8 202 скачиваний)
В примере код сканирует все диски и выводит в столбец А нового листа(лист создается автоматически) пути ко всем файлам.
Так же см.:
Как средствами VBA переименовать/переместить/скопировать файл
Как сменить формат сразу для нескольких файлов Excel
Как удалить папку или все файлы из папки через VBA
Собрать и просуммировать данные из разных файлов при помощи PowerQuery
Статья помогла? Поделись ссылкой с друзьями!
Видеоуроки
Поиск по меткам
Access
apple watch
Multex
Power Query и Power BI
VBA управление кодами
Бесплатные надстройки
Дата и время
Записки
ИП
Надстройки
Печать
Политика Конфиденциальности
Почта
Программы
Работа с приложениями
Разработка приложений
Росстат
Тренинги и вебинары
Финансовые
Форматирование
Функции Excel
акции MulTEx
ссылки
статистика
RAN Пользователь Сообщений: 7091 |
#1 17.07.2018 22:51:17 Мяв.
А как выполнить «показать в папке»? Т.е. открыть папку с выделенным файлом? PS И, ежели можно, чем отличается «Wscript.Shell» и «Shell.Application» (в пределах данной задачи), и что предпочтительней? Изменено: RAN — 17.07.2018 23:04:20 |
||
папку, обычно, открывают с какой-то целью: Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете! |
|
БМВ Модератор Сообщений: 21378 Excel 2013, 2016 |
#3 17.07.2018 23:08:30 Брысь
по отличию — мне кажется для данного случая отличий мало, но то что есть особенности — точно Wscript.Shell Изменено: БМВ — 18.07.2018 00:19:48 По вопросам из тем форума, личку не читаю. |
||
RAN Пользователь Сообщений: 7091 |
Игорь, самоцель — выполнить указанное действие. По аналогии кнопки в Скайпе, или менеджере закачек браузера. |
RAN Пользователь Сообщений: 7091 |
Похоже, в примере не совсем удачно. ShellExecute(<File>,<Arguments>,<Directory>,<Operation>,<Show>) Но никакого действия с файлом кодом выполнять не нужно. |
Inexsu Пользователь Сообщений: 758 |
Привет! Сравнение прайсов, таблиц — без настроек |
RAN Пользователь Сообщений: 7091 |
#7 17.07.2018 23:42:50
А вот тоже, но не в командной строке? |
||
Inexsu Пользователь Сообщений: 758 |
#8 17.07.2018 23:43:50
В Excel Макрос VBA ? Сравнение прайсов, таблиц — без настроек |
||
RAN Пользователь Сообщений: 7091 |
|
БМВ Модератор Сообщений: 21378 Excel 2013, 2016 |
RAN, При таком раскладе #6 самый простой. Даже сишники таким путем идут. По вопросам из тем форума, личку не читаю. |
RAN Пользователь Сообщений: 7091 |
Я и не спорю. |
БМВ Модератор Сообщений: 21378 Excel 2013, 2016 |
#12 18.07.2018 00:12:12 не верю
Ну конечно ждать или не ждать закрытия окна — это тоже надо прописать в параметрах RUN Изменено: БМВ — 18.07.2018 00:13:12 По вопросам из тем форума, личку не читаю. |
||
bedvit Пользователь Сообщений: 2477 Виталий |
RAN, по-моему можно через shell на vba запустить командную строку. Не за компом, завтра накидаю, если раньше не помогут. «Бритва Оккама» или «Принцип Калашникова»? |
БМВ Модератор Сообщений: 21378 Excel 2013, 2016 |
bedvit, ну да По вопросам из тем форума, личку не читаю. |
RAN Пользователь Сообщений: 7091 |
#15 18.07.2018 00:22:04
открывает Избранное PS пардон, все работает, сам, дурень, создал файл 1, а в макросе написал 01 Изменено: RAN — 18.07.2018 00:31:39 |
||||
БМВ Модератор Сообщений: 21378 Excel 2013, 2016 |
#16 18.07.2018 00:25:13
ну вот где в моем коде пробел после запятой? Где? Изменено: БМВ — 18.07.2018 00:26:56 По вопросам из тем форума, личку не читаю. |
||
bedvit Пользователь Сообщений: 2477 Виталий |
БМВ, VBA shell не пользуюсь, пользуюсь Wscript.Shell. Можно не ждать выполнения, вот и ассинхронность, почти параллельность (из соседней темы). «Бритва Оккама» или «Принцип Калашникова»? |
БМВ Модератор Сообщений: 21378 Excel 2013, 2016 |
#18 18.07.2018 00:33:48
тогда уж .не run a Exec. там совсем ассинхронность с контролем и …… По вопросам из тем форума, личку не читаю. |
||
Inexsu Пользователь Сообщений: 758 |
#19 18.07.2018 00:45:07
Сравнение прайсов, таблиц — без настроек |
||
RAN Пользователь Сообщений: 7091 |
#20 18.07.2018 00:48:43 В общем, вполне себе получилось
Еще раз всем спасибо. |
||
БМВ Модератор Сообщений: 21378 Excel 2013, 2016 |
RAN, Андрей, хорошо что все получилось, но: Изменено: БМВ — 18.07.2018 01:02:56 По вопросам из тем форума, личку не читаю. |
RAN Пользователь Сообщений: 7091 |
#22 18.07.2018 01:03:37
поподробнее плз… |
||
БМВ Модератор Сообщений: 21378 Excel 2013, 2016 |
#12, #14, #19 («explorer.exe /select,»«» & ThisWorkbook.FullName & «»»») Будучи приученным к командной строке, я предпочитаю перебдеть. нежели удивится. Изменено: БМВ — 18.07.2018 01:07:50 По вопросам из тем форума, личку не читаю. |
RAN Пользователь Сообщений: 7091 |
#24 18.07.2018 01:22:00 Миш, разницы не заметил, но замечания принял.
|
||
Дмитрий(The_Prist) Щербаков Пользователь Сообщений: 14182 Профессиональная разработка приложений для MS Office |
#25 18.07.2018 11:42:29
Пока не появилось пробелов и лишних символов в пути и имени файла и код не распространился на другие ПК Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы… |
||
RAN Пользователь Сообщений: 7091 |
Э, нет. Вчера специально в имя файла пробелов напихивал. |
А другие ПК? Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы… |
|
RAN Пользователь Сообщений: 7091 |
Не пробовал. Возможно, поэтому и не заметил. Но ждать, когда замечу, не стал. Поверил на слово. |
БМВ Модератор Сообщений: 21378 Excel 2013, 2016 |
RAN, Андрей, к стати вспомнил про пока еще действующее ограничением в 260 символов. Как поведет себя конструкция при превышении и что откроет — надо проверять. Может открыть снова избранное По сему лучше сразу проверить и ….. ну тут по задаче. По вопросам из тем форума, личку не читаю. |
Андрей VG Пользователь Сообщений: 11878 Excel 2016, 365 |
#30 18.07.2018 16:55:27 Доброе время суток.
|
||
Открыть папку (каталог) в проводнике Windows для просмотра из кода VBA Excel с помощью функции Shell и ключевых слов explorer и cmd. Передача фокуса открытой папке.
Открытие папки в проводнике
Открытие папки (каталога) в проводнике Windows для просмотра с помощью функции Shell и ключевого слова explorer:
Shell «explorer C:UsersPublicТекущая папка», vbNormalFocus |
vbNormalFocus означает, что окно Windows Explorer получает фокус и восстанавливает свое исходное положение и размер.
Преимущество способа: имя папки может содержать пробелы.
Недостаток способа: если открываемая папка уже открыта, открывается второй экземпляр, затем третий и т.д.
То же преимущество и тот же недостаток у следующего способа:
ThisWorkbook.FollowHyperlink «C:UsersPublicТекущая папка» |
Открытие или передача фокуса
Открытие папки (каталога) в проводнике Windows для просмотра или передача папке фокуса, если она уже открыта, с помощью функции Shell и ключевого слова cmd:
Shell «cmd /C start C:UsersPublic», vbNormalFocus |
При реализации этого способа происходит кратковременное отображение на экране окна командной строки (cmd.exe). Если убрать параметр vbNormalFocus
, окно командной строки мелькать не будет, но и окно проводника, при повторном его вызове, не получит фокус.
Преимущество способа: если открываемая папка уже открыта, ей передается фокус, а второй экземпляр этой папки не открывается.
Недостаток способа: имя папки не должно содержать пробелы.
От недостатка этого способа можно избавиться с помощью экранирующих кавычек:
Shell «cmd /C start ««»» ««C:UsersPublicТекущая папка»«», vbNormalFocus |
Для себя на заметку, какие кавычки что экранируют:
«[cmd /C start ««[неиспользуемый параметр]»» ««[C:UsersPublicТекущая папка]»«]» |
Смотрите как открывать из кода VBA Excel файлы других приложений и интернет-сайты.
Уже прогресс !
Вставил в процедуру, пока, код от petr-sev. Открывает, однако, общую папку с Книгой и папкой с документами Word. Эта общая папка не активна. Макрос должен открывать только папку с документами. Необходимо, очевидно, указать путь.
Добавлено через 1 час 18 минут
Указав путь выходим на нужную папку с документами
Visual Basic | ||
|
Однако папка с документами свёрнута или не активна, её ярлык видно на панели уведомлений. Для выхода на файлы в папке ещё необходимо нажать ярлык папки на панели уведомлений.
Такой вопрос — какую ещё добавить команду, чтобы папка с документами появлялась активной, тоесть, чтобы были видны непосредственно ярлыки внутренних файлов Word в папке ?
Открыть папку макросом |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |