Хитрости »
20 Июль 2012 137544 просмотров
Просмотреть все файлы в папке
Иногда необходимо проделать однотипные операции с несколькими файлами, расположенными в одной папке. Можно открывать каждый по очереди:
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 204 скачиваний)
В примере я закомментировал строки, открывающие файл и вносящие изменения в ячейку
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 204 скачиваний)
В примере код сканирует все диски и выводит в столбец А нового листа(лист создается автоматически) пути ко всем файлам.
Так же см.:
Как средствами VBA переименовать/переместить/скопировать файл
Как сменить формат сразу для нескольких файлов Excel
Как удалить папку или все файлы из папки через VBA
Собрать и просуммировать данные из разных файлов при помощи PowerQuery
Статья помогла? Поделись ссылкой с друзьями!
Видеоуроки
Поиск по меткам
Access
apple watch
Multex
Power Query и Power BI
VBA управление кодами
Бесплатные надстройки
Дата и время
Записки
ИП
Надстройки
Печать
Политика Конфиденциальности
Почта
Программы
Работа с приложениями
Разработка приложений
Росстат
Тренинги и вебинары
Финансовые
Форматирование
Функции Excel
акции MulTEx
ссылки
статистика
Друзья, добрый день. Помогите пожалуйста доработать макрос. На текущий момент он работает неправильно. Задача следующая: 1. Необходимо по очереди открыть все файлы в папке с разрешением html. В папке будет много файлов с разными названиями 2. Скопировать содержимое каждого отдельного файла html 3. Создать вкладку в файле «Макрос» и вставить содержимое html в отдельную вкладку 3. Закрыть файлы с разрешением html. Прикрепленные файлы
Изменено: Maksimelyan — 05.08.2018 08:09:29 |
|
Мотя Пользователь Сообщений: 3218 |
См. вариант: макрос. Изменено: Мотя — 05.08.2018 22:14:10 |
RAN Пользователь Сообщений: 7091 |
#3 05.08.2018 20:49:37
|
||
RAN,Спасибо,супер Ваш вариант работает. Небольшое уточнение, а можно сделать так чтоб информация копировалась как значения? |
|
Мотя, у меня выдаёт ошибку. НАзвание папки имеет значение? Прикрепленные файлы
|
|
Мотя Пользователь Сообщений: 3218 |
#6 06.08.2018 08:15:22
Разумеется, НЕТ! |
||
Мотя Пользователь Сообщений: 3218 |
#7 06.08.2018 08:33:04
Разумеется, можно!
на:
Изменено: Мотя — 06.08.2018 08:34:18 |
||||||
Nordheim Пользователь Сообщений: 3154 |
По моему в файле Мотя, в папке должны содержаться только файлы «HTML», потому, что массив обрабатывает все файлы в папке независимо от расширения. Хотя навряд ли в этом ошибка. Уважаемая Мотя, позвольте полюбопытствовать, почему Вы в макросах упорно продолжаете использовать «Select» и «Activate»,хотя не раз на форуме упоминалось о вреде использования данных методов? Изменено: Nordheim — 06.08.2018 09:09:22 «Все гениальное просто, а все простое гениально!!!» |
Dost1369 Пользователь Сообщений: 76 |
#9 06.08.2018 09:27:45
А можно ссылочку на обсуждения? Буду повышать свой уровень знаний. |
||
Дмитрий(The_Prist) Щербаков Пользователь Сообщений: 14182 Профессиональная разработка приложений для MS Office |
#10 06.08.2018 09:28:37
Select и Activate — зачем нужны и нужны ли? Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы… |
||
Dost1369 Пользователь Сообщений: 76 |
|
Мотя Пользователь Сообщений: 3218 |
#12 06.08.2018 10:07:39
Уважаемый Nordheim ! |
||
Юрий М Модератор Сообщений: 60585 Контакты см. в профиле |
#13 06.08.2018 20:53:42
Но Вы же показываете плохой пример другим ) |
||
Мотя, Разобрался, действительно файлы переименовал и файл с макросом убрал из папки где лежат html. Все сработало. извините что напрягаю, но хорошая мысля приходит опосля, и у меня такой вопрос. 1. Как прописать вариант чтобы не нужно было выбирать папку а положил в папку с файлами и обработка шла в этой папке? 2. Как прописать вариант чтобы макрос при выборе основной папке обрабатывал файлы которые лежат в отдельных папках основной папки. Изменено: Maksimelyan — 06.08.2018 21:57:55 |
|
Nordheim Пользователь Сообщений: 3154 |
#15 06.08.2018 21:39:46
На счет «Тривиальности» можно поспорить, у вас настолько оригинальные макросы, что ходу сложно понять что откуда берется . Изменено: Nordheim — 06.08.2018 21:43:31 «Все гениальное просто, а все простое гениально!!!» |
||
Мотя Пользователь Сообщений: 3218 |
#16 06.08.2018 21:53:54
Результат: вновь созданные листы (кроме листа «111») в файле Maksimelyan.xlsb с именами — Dir(FILE). |
||
Maksimelyan Пользователь Сообщений: 25 |
#17 06.08.2018 22:01:49
Да,всё работает спасибо. Мотя а уточните какую роль играет вкладка 111 -она всегда должна быть? |
||
RAN Пользователь Сообщений: 7091 |
#18 06.08.2018 22:05:58
В книге должен быть хотя-бы 1 лист. Все остальное, связанное с 111 — от
Моти |
||
Мотя Пользователь Сообщений: 3218 |
#19 06.08.2018 22:06:09
Один лист в файле всегда должен присутствовать.
|
||||
Мотя Пользователь Сообщений: 3218 |
Макрос я писала почти «от Балды», поэтому умнее «изменения» названия листа — не придумала! |
RAN, уточните пожалуйста как в Вашем варианте прописать чтобы информация копировалась как значение? Изменено: Maksimelyan — 06.08.2018 22:20:11 |
|
Мотя Пользователь Сообщений: 3218 |
#22 06.08.2018 22:17:34
Макросный файл, по умолчанию, не должен лежать в папке html-файлов. |
||
RAN Пользователь Сообщений: 7091 |
#23 06.08.2018 22:20:35
Лично мне не удалось найти ни одной формулы. Если я суслика не вижу, а он есть, его нужно показать. |
||
Мотя Пользователь Сообщений: 3218 |
#24 06.08.2018 22:21:32
Для этого надо в макросе жестко задать имя этой папки: но это же неудобно! |
||
Мотя Пользователь Сообщений: 3218 |
#25 06.08.2018 22:26:55
Над этим надо думать, а это иногда бывает — ОЧЕНЬ ЛЕНИВО… |
||
Nordheim Пользователь Сообщений: 3154 |
#26 06.08.2018 22:26:56
Путь к папке в которой находится книга с макросом.
«Все гениальное просто, а все простое гениально!!!» |
||||
Nordheim Пользователь Сообщений: 3154 |
#27 06.08.2018 22:28:48
Тут нужно воспользоваться FileSystemObject. но это уже совсем другая история. Хотя можно и через Dir Изменено: Nordheim — 06.08.2018 22:29:43 «Все гениальное просто, а все простое гениально!!!» |
||
Maksimelyan Пользователь Сообщений: 25 |
#28 06.08.2018 22:34:18
Формул действительно нет, но я потом планирую как раз использовать формулы ВПР для обработки данных и так как там есть ячейки объединенные и мне нужны от туда данные, то хотел чтобы информация была вставлена как значение |
||
RAN Пользователь Сообщений: 7091 |
#29 06.08.2018 22:36:31
А это будет интересно. |
||
Maksimelyan Пользователь Сообщений: 25 |
#30 06.08.2018 22:37:00
Ваш Вариант работает,мне это было не под силу. Так что для меня Вы профессионал. Спасибо что уделили время, вы мне очень помогли. |
||
Skip to content
Как открыть все рабочие книги в папке
На чтение 2 мин. Просмотров 3.6k.
Что делает макрос: Представьте, вы написали классный макрос, который автоматизирует работу одного Excel- файла. Теперь проблема заключается в том, что вам нужно перейти в папку, открыть каждую
книгу, запустить макрос, сохранить изменения, закрыть книгу, а затем открыть следующую.
Открытие каждой рабочей книги в папке, как правило, ручной процесс, который отнимает много времени.
Этот макрос решает проблему, как открыть все рабочие книги папки.
Содержание
- Как макрос работает
- Код макроса
- Как работает этот код
- Как использовать
Как макрос работает
В этом макросе, мы используем функцию Dir. Функция Dir возвращает строку, которая представляет собой имя файла. С её помощью в указанной папке мы возьмём имя каждого файла (с расширением “.xlsx”), затем будем открывать каждый файл, запускать макрос и, наконец, закрывать файл после сохранения.
Код макроса
Sub OtkritVseKnigi() 'Шаг 1:Объявляем переменные Dim MyFiles As String 'Шаг 2: Укажите нужную папку MyFiles = Dir("C:Temp*.xlsx") Do While MyFiles <> “” 'Шаг 3: Открываем файлы один за другим Workbooks.Open "C:Temp" & MyFiles 'Код макроса с действиями MsgBox ActiveWorkbook.Name ActiveWorkbook.Close SaveChanges:=True 'Шаг 4: Следующий файл в папке MyFiles = Dir Loop End Sub
Как работает этот код
- Объявляем переменную MyFiles (тип строчный), которая будет фиксировать имя каждого файла.
- В шаге 2, макрос использует функцию DIR, чтобы указать Тип файла и адрес папки. Обратите внимание, что код ищет файлы в формате xlsx. Это означает, что только .xlsx файлы будут передаваться. Если вы ищете .xls файлы, вам необходимо изменить расширение.
- Открываем файл, делаем некоторые действия (вы должны поместить в код макроса требуемые действия), а затем мы сохраняем и закрываем файл. В этом простом примере, мы вызываем окно с сообщением, чтобы показать имя каждого файла.
- Ищем снова по кругу, чтобы найти больше файлов. Если нет файлов, переменная MyFiles пустая.
Если это так, то цикл и макрос завершается.
Как использовать
Для реализации этого макроса, вы можете скопировать и вставить его в стандартный модуль:
- Активируйте редактор Visual Basic, нажав ALT + F11.
- Щелкните правой кнопкой мыши имя проекта / рабочей книги в окне проекта.
- Выберите Insert➜Module.
- Введите или вставьте код во вновь созданном модуле.
nt_dmn 0 / 0 / 0 Регистрация: 28.04.2011 Сообщений: 60 |
||||
1 |
||||
Открытие по очереди всех файлов из каталога04.10.2011, 17:07. Показов 26276. Ответов 7 Метки нет (Все метки)
Здравствуйте, подскажите как правильно написать строку Application.Workbooks.Open («c:Âõîäÿùèå3.xls»), что бы в имени файла была переменная. В моем случае s
0 |
Казанский 15136 / 6410 / 1730 Регистрация: 24.09.2011 Сообщений: 9,999 |
||||||||
04.10.2011, 17:35 |
2 |
|||||||
Если номера идут по очереди, без пропусков, то так:
Добавлено через 4 минуты
2 |
0 / 0 / 0 Регистрация: 28.04.2011 Сообщений: 60 |
|
04.10.2011, 17:37 [ТС] |
3 |
Спасибо!
0 |
Казанский 15136 / 6410 / 1730 Регистрация: 24.09.2011 Сообщений: 9,999 |
||||
04.10.2011, 18:00 |
4 |
|||
Тогда еше проще.
1 |
nt_dmn 0 / 0 / 0 Регистрация: 28.04.2011 Сообщений: 60 |
||||
04.10.2011, 19:03 [ТС] |
5 |
|||
Сейчас попробую Добавлено через 8 минут Добавлено через 46 минут
что бы документ закрывался без сохранения? Спасибо!
0 |
Казанский 15136 / 6410 / 1730 Регистрация: 24.09.2011 Сообщений: 9,999 |
||||
04.10.2011, 21:39 |
6 |
|||
Можно открыть файл для чтения (на всякий случай) и закрыть без сохранения:
Добавлено через 4 минуты
2 |
0 / 0 / 0 Регистрация: 28.04.2011 Сообщений: 60 |
|
05.10.2011, 10:19 [ТС] |
7 |
Спасибо огромное!
0 |
NikolayHAOS -3 / 2 / 0 Регистрация: 29.10.2013 Сообщений: 178 |
||||||||
08.10.2017, 11:02 |
8 |
|||||||
Казанский,
Нужно отрыть файлы содержащие в названии символ № Добавлено через 23 минуты
0 |
I want to open all files in a specified folder and have the following code
Sub OpenFiles()
Dim MyFolder As String
Dim MyFile As String
MyFolder = "\ILAFILESERVERPublicDocumentsRenewable EnergyFiTs1 Planning
DepartmentMarks TrackerQuality Control Reports"
MyFile = Dir(MyFolder & "*.xlsx")
Do While MyFile <> ""
Workbooks.Open Filename:=MyFolder & "" & MyFile
Loop
End Sub
The problem I have is that it just keeps trying to open the first file in the folder repeatedly and won’t move on. Can anybody help, I’m a bit of a novice at VBA and could really do with some assistance. I’m trying to open around 30 reports that are all in .xlsx format. Many thanks in advance.
asked Jun 22, 2012 at 8:41
Ross McLaughlinRoss McLaughlin
1911 gold badge2 silver badges4 bronze badges
1
You have to add this line just before loop
MyFile = Dir
Loop
answered Jun 22, 2012 at 8:58
Siddharth RoutSiddharth Rout
146k17 gold badges206 silver badges250 bronze badges
1
You can use Len(StrFile) > 0
in loop check statement !
Sub openMyfile()
Dim Source As String
Dim StrFile As String
'do not forget last backslash in source directory.
Source = "E:Planning3"
StrFile = Dir(Source)
Do While Len(StrFile) > 0
Workbooks.Open Filename:=Source & StrFile
StrFile = Dir()
Loop
End Sub
answered May 19, 2015 at 4:25
Try the below code:
Sub opendfiles()
Dim myfile As Variant
Dim counter As Integer
Dim path As String
myfolder = "D:temp"
ChDir myfolder
myfile = Application.GetOpenFilename(, , , , True)
counter = 1
If IsNumeric(myfile) = True Then
MsgBox "No files selected"
End If
While counter <= UBound(myfile)
path = myfile(counter)
Workbooks.Open path
counter = counter + 1
Wend
End Sub
ZygD
21k39 gold badges77 silver badges98 bronze badges
answered Feb 15, 2013 at 9:37