lexi Пользователь Сообщений: 16 |
Ребята, срочно нужна помощь. Что и куда добавить в текст макроса: http://planetaexcel.ru/techniques/12/45/#5990 чтобы список файлов выводился по маске? Пример: мне нужен список файлов из папок и подпапок с расширением *.jpg. |
JayBhagavan Пользователь Сообщений: 11833 ПОЛ: МУЖСКОЙ | Win10x64, MSO2019x64 |
Изучите. <#0> |
lexi Пользователь Сообщений: 16 |
#4 26.02.2016 10:41:07 Спасибо, но я в VBA никак.
|
||
JayBhagavan Пользователь Сообщений: 11833 ПОЛ: МУЖСКОЙ | Win10x64, MSO2019x64 |
#5 26.02.2016 12:51:43
Не проверял. <#0> |
||
Апострофф Пользователь Сообщений: 720 |
#6 26.02.2016 13:15:53
На всякий пожарный —
|
||||
JayBhagavan Пользователь Сообщений: 11833 ПОЛ: МУЖСКОЙ | Win10x64, MSO2019x64 |
Апострофф, Вы как всегда правы. Изменено: JayBhagavan — 26.02.2016 13:16:35 <#0> |
lexi Пользователь Сообщений: 16 |
#8 26.02.2016 19:49:52 JayBhagavan, Апострофф, огромное спасибо за помощь! |
Функция FilenamesCollection предназначена для получения списка файлов из папки, с учётом выбранной глубины поиска в подпапках.
Используется рекурсивный перебор папок, до заданного уровня вложенности.
В процессе перебора папок, пути у найденным файлам помещаются в коллекцию (объект типа Collection) для последующего перебора.
К статье прикреплено 2 примера файла с макросами на основе этой функции:
- Пример в файле FilenamesCollection.xls выводит список файлов на чистый лист новой книги (формируя заголовки)
- Пример в файле FilenamesCollectionEx.xls более функционален — он, помимо списка файлов из папки, отображает размер файла, и дату его создания, а также формирует в ячейках гиперссылки на найденные файлы.
Вывод списка производится на лист запуска, параметры поиска файлов задаются в ячейках листа (см. скриншот)
Смотрите также расширенную версию макроса на базе этой функции:
Макрос FolderStructure выводит в таблицу Excel список файлов и подпапок с отображением структуры (вложенности файлов и подпапок)
ПРИМЕЧАНИЕ: Если вы выводите на лист список имен файлов картинок (изображений), то при помощи этой надстройки вы сможете вставить сами картинки в ячейки соседнего столбца (или в примечания к этим ячейкам)
Внимание: если требуется, чтобы поиск не зависел от регистра символов в маске файла
(к примеру, обнаруживались не только файлы .txt, но и .TXT и .Txt),
поставьте первой строкой в модуле директиву Option Compare Text
Function FilenamesCollection(ByVal FolderPath As String, Optional ByVal Mask As String = "", _ Optional ByVal SearchDeep As Long = 999) As Collection ' © EducatedFool excelvba.ru/code/FilenamesCollection ' Получает в качестве параметра путь к папке FolderPath, ' маску имени искомых файлов Mask (будут отобраны только файлы с такой маской/расширением) ' и глубину поиска SearchDeep в подпапках (если SearchDeep=1, то подпапки не просматриваются). ' Возвращает коллекцию, содержащую полные пути найденных файлов ' (применяется рекурсивный вызов процедуры GetAllFileNamesUsingFSO) Set FilenamesCollection = New Collection ' создаём пустую коллекцию Set FSO = CreateObject("Scripting.FileSystemObject") ' создаём экземпляр FileSystemObject GetAllFileNamesUsingFSO FolderPath, Mask, FSO, FilenamesCollection, SearchDeep ' поиск Set FSO = Nothing: Application.StatusBar = False ' очистка строки состояния Excel End Function Function GetAllFileNamesUsingFSO(ByVal FolderPath As String, ByVal Mask As String, ByRef FSO, _ ByRef FileNamesColl As Collection, ByVal SearchDeep As Long) ' перебирает все файлы и подпапки в папке FolderPath, используя объект FSO ' перебор папок осуществляется в том случае, если SearchDeep > 1 ' добавляет пути найденных файлов в коллекцию FileNamesColl On Error Resume Next: Set curfold = FSO.GetFolder(FolderPath) If Not curfold Is Nothing Then ' если удалось получить доступ к папке ' раскомментируйте эту строку для вывода пути к просматриваемой ' в текущий момент папке в строку состояния Excel ' Application.StatusBar = "Поиск в папке: " & FolderPath For Each fil In curfold.Files ' перебираем все файлы в папке FolderPath If fil.Name Like "*" & Mask Then FileNamesColl.Add fil.Path Next SearchDeep = SearchDeep - 1 ' уменьшаем глубину поиска в подпапках If SearchDeep Then ' если надо искать глубже For Each sfol In curfold.SubFolders ' перебираем все подпапки в папке FolderPath GetAllFileNamesUsingFSO sfol.Path, Mask, FSO, FileNamesColl, SearchDeep Next End If Set fil = Nothing: Set curfold = Nothing ' очищаем переменные End If End Function
‘ Пример использования функции в макросе:
Sub ОбработкаФайловИзПапки() On Error Resume Next Dim folder$, coll As Collection folder$ = ThisWorkbook.Path & "Платежи" If Dir(folder$, vbDirectory) = "" Then MsgBox "Не найдена папка «" & folder$ & "»", vbCritical, "Нет папки ПЛАТЕЖИ" Exit Sub ' выход, если папка не найдена End If Set coll = FilenamesCollection(folder$, "*.xls") ' получаем список файлов XLS из папки If coll.Count = 0 Then MsgBox "В папке «" & Split(folder$, "")(UBound(Split(folder$, "")) - 1) & "» нет ни одного подходящего файла!", _ vbCritical, "Файлы для обработки не найдены" Exit Sub ' выход, если нет файлов End If ' перебираем все найденные файлы For Each file In coll Debug.Print file ' выводим имя файла в окно Immediate Next End Sub
Этот код позволяет осуществить поиск нужных файлов в выбранной папке (включая подпапки), и выводит полученный список файлов на лист книги Excel:
Sub ПримерИспользованияФункции_FilenamesCollection() ' Ищем на рабочем столе все файлы TXT, и выводим на лист список их имён. ' Просматриваются папки с глубиной вложения не более трёх. Dim coll As Collection, ПутьКПапке As String ' получаем путь к папке РАБОЧИЙ СТОЛ ПутьКПапке = CreateObject("WScript.Shell").SpecialFolders("Desktop") ' считываем в колекцию coll нужные имена файлов Set coll = FilenamesCollection(ПутьКПапке, ".txt", 3) Application.ScreenUpdating = False ' отключаем обновление экрана ' создаём новую книгу Dim sh As Worksheet: Set sh = Workbooks.Add.Worksheets(1) ' формируем заголовки таблицы With sh.Range("a1").Resize(, 3) .Value = Array("№", "Имя файла", "Полный путь") .Font.Bold = True: .Interior.ColorIndex = 17 End With ' выводим результаты на лист For i = 1 To coll.Count ' перебираем все элементы коллекции, содержащей пути к файлам sh.Range("a" & sh.Rows.Count).End(xlUp).Offset(1).Resize(, 3).Value = _ Array(i, Dir(coll(i)), coll(i)) ' выводим на лист очередную строку DoEvents ' временно передаём управление ОС Next sh.Range("a:c").EntireColumn.AutoFit ' автоподбор ширины столбцов [a2].Activate: ActiveWindow.FreezePanes = True ' закрепляем первую строку листа End Sub
Ещё один пример использования:
Sub ЗагрузкаСпискаФайлов() ' Ищем файлы в заданной папке по заданной маске, ' и выводим на лист список их параметров. ' Просматриваются папки с заданной глубиной вложения. Dim coll As Collection, ПутьКПапке$, МаскаПоиска$, ГлубинаПоиска% ПутьКПапке$ = [c1] ' берём из ячейки c1 МаскаПоиска$ = [c2] ' берём из ячейки c2 ГлубинаПоиска% = Val([c3]) ' берём из ячейки c3 If ГлубинаПоиска% = 0 Then ГлубинаПоиска% = 999 ' без ограничения по глубине ' считываем в колекцию coll нужные имена файлов Set coll = FilenamesCollection(ПутьКПапке$, МаскаПоиска$, ГлубинаПоиска%) Application.ScreenUpdating = False ' отключаем обновление экрана ' выводим результаты (список файлов, и их характеристик) на лист For i = 1 To coll.Count ' перебираем все элементы коллекции, содержащей пути к файлам НомерФайла = i ПутьКФайлу = coll(i) ИмяФайла = Dir(ПутьКФайлу) ДатаСоздания = FileDateTime(ПутьКФайлу) РазмерФайла = FileLen(ПутьКФайлу) ' выводим на лист очередную строку Range("a" & Rows.Count).End(xlUp).Offset(1).Resize(, 5).Value = _ Array(НомерФайла, ИмяФайла, ПутьКФайлу, ДатаСоздания, РазмерФайла) ' если нужна гиперссылка на файл во втором столбце ActiveSheet.Hyperlinks.Add Range("b" & Rows.Count).End(xlUp), ПутьКФайлу, "", _ "Открыть файл" & vbNewLine & ИмяФайла DoEvents ' временно передаём управление ОС Next End Sub
PS: Найти подходящие имена файлов в коллекции можно при помощи следующей функции:
Function CollectionAutofilter(ByRef coll As Collection, ByVal filter$) As Collection ' Функция перебирает все элементы коллекции coll, ' оставляя лишь те, которые соответствуют маске filter$ (например, filter$="*некий текст*") ' Возвращает коллекцию, содержащую только подходящие элементы ' Если элементы не найдены - возвращается пустая коллекция (содержащая 0 элементов) On Error Resume Next: Set CollectionAutofilter = New Collection For Each Item In coll If Item Like filter$ Then CollectionAutofilter.Add Item Next End Function
- 301801 просмотр
Не получается применить макрос? Не удаётся изменить код под свои нужды?
Оформите заказ у нас на сайте, не забыв прикрепить примеры файлов, и описать, что и как должно работать.
0 / 0 / 0 Регистрация: 18.02.2017 Сообщений: 4 |
|
1 |
|
Список файлов по заданной маске23.03.2017, 18:13. Показов 9021. Ответов 4
Добрый день, подскажите, везде искал ничего подобного не смог найти. Хочу реализовать следующий макрос:
0 |
es geht mir gut 11264 / 4746 / 1183 Регистрация: 27.07.2011 Сообщений: 11,437 |
|
23.03.2017, 18:25 |
2 |
Что-то уже начали делать?
0 |
0 / 0 / 0 Регистрация: 18.02.2017 Сообщений: 4 |
|
24.03.2017, 14:23 [ТС] |
3 |
Дело в том что я даже не знаю с чего начать, я с vba только начал знакомство
0 |
es geht mir gut 11264 / 4746 / 1183 Регистрация: 27.07.2011 Сообщений: 11,437 |
|
24.03.2017, 15:20 |
4 |
Есть файл на Листе1 задаю шапку в первой строке Ну вот файл-то у Вас уже есть?
0 |
aequit 223 / 134 / 45 Регистрация: 08.09.2012 Сообщений: 283 Записей в блоге: 1 |
||||||
24.03.2017, 15:46 |
5 |
|||||
я даже не знаю с чего начать С Уокенбаха, «Профессиональное программирование на VBA». Или не пропускать лекции и слушать преподавателя, который Вам такие задания даёт Как потом работу искать, и, главное — работать?
Вложения
0 |
Функция VBA для получения списка файлов из папки, с учётом выбранной глубины поиска в подпапках
Внимание: если требуется, чтобы поиск не зависел от регистра символов в маске файла (к примеру, обнаруживались не только файлы .TXT, но и .txt и .Txt), поставьте первой строкой в модуле эту директиву:
Option Compare Text
Пример в файле FilenamesCollection.xls выводит список файлов на чистый лист новой книги (формируя заголовки)
Пример в файле FilenamesCollectionEx.xls более функционален — он, помимо списка файлов из папки, отображает размер файла, и дату его создания, а также формирует в ячейках гиперссылки на найденные файлы. Вывод списка производится на лист запуска, параметры поиска файлов задаются в ячейках листа (см. скриншот)
ПРИМЕЧАНИЕ: Если вы выводите на лист список имен файлов картинок (изображений), то при помощи этой надстройки вы сможете вставить сами картинки в ячейки соседнего столбца (или в примечания к этим ячейкам)
Function FilenamesCollection(ByVal FolderPath As String, Optional ByVal Mask As String = «», _
Optional ByVal SearchDeep As Long = 999) As Collection
‘ Получает в качестве параметра путь к папке FolderPath,
‘ маску имени искомых файлов Mask (будут отобраны только файлы с такой маской/расширением)
‘ и глубину поиска SearchDeep в подпапках (если SearchDeep=1, то подпапки не просматриваются).
‘ Возвращает коллекцию, содержащую полные пути найденных файлов
‘ (применяется рекурсивный вызов процедуры GetAllFileNamesUsingFSO)
Set FilenamesCollection = New Collection ‘ создаём пустую коллекцию
Set FSO = CreateObject(«Scripting.FileSystemObject») ‘ создаём экземпляр FileSystemObject
GetAllFileNamesUsingFSO FolderPath, Mask, FSO, FilenamesCollection, SearchDeep ‘ поиск
Set FSO = Nothing: Application.StatusBar = False ‘ очистка строки состояния Excel
End Function
Function GetAllFileNamesUsingFSO(ByVal FolderPath As String, ByVal Mask As String, ByRef FSO, _
ByRef FileNamesColl As Collection, ByVal SearchDeep As Long)
‘ перебирает все файлы и подпапки в папке FolderPath, используя объект FSO
‘ перебор папок осуществляется в том случае, если SearchDeep > 1
‘ добавляет пути найденных файлов в коллекцию FileNamesColl
On Error Resume Next: Set curfold = FSO.GetFolder(FolderPath)
If Not curfold Is Nothing Then ‘ если удалось получить доступ к папке
‘ раскомментируйте эту строку для вывода пути к просматриваемой
‘ в текущий момент папке в строку состояния Excel
‘ Application.StatusBar = «Поиск в папке: » & FolderPath
For Each fil In curfold.Files ‘ перебираем все файлы в папке FolderPath
If fil.Name Like «*» & Mask Then FileNamesColl.Add fil.Path
Next
SearchDeep = SearchDeep — 1 ‘ уменьшаем глубину поиска в подпапках
If SearchDeep Then ‘ если надо искать глубже
For Each sfol In curfold.SubFolders ‘ перебираем все подпапки в папке FolderPath
GetAllFileNamesUsingFSO sfol.Path, Mask, FSO, FileNamesColl, SearchDeep
Next
End If
Set fil = Nothing: Set curfold = Nothing ‘ очищаем переменные
End If
End Function
Этот код позволяет осуществить поиск нужных файлов в выбранной папке (включая подпапки), и выводит полученный список файлов на лист книги Excel:
Sub ПримерИспользованияФункции_FilenamesCollection()
‘ Ищем на рабочем столе все файлы TXT, и выводим на лист список их имён.
‘ Просматриваются папки с глубиной вложения не более трёх.
Dim coll As Collection, ПутьКПапке As String
‘ получаем путь к папке РАБОЧИЙ СТОЛ
ПутьКПапке = CreateObject(«WScript.Shell»).SpecialFolders(«Desktop»)
‘ считываем в колекцию coll нужные имена файлов
Set coll = FilenamesCollection(ПутьКПапке, «.txt», 3)
Application.ScreenUpdating = False ‘ отключаем обновление экрана
‘ создаём новую книгу
Dim sh As Worksheet: Set sh = Workbooks.Add.Worksheets(1)
‘ формируем заголовки таблицы
With sh.Range(«a1»).Resize(, 3)
.Value = Array(«№», «Имя файла», «Полный путь»)
.Font.Bold = True: .Interior.ColorIndex = 17
End With
‘ выводим результаты на лист
For i = 1 To coll.Count ‘ перебираем все элементы коллекции, содержащей пути к файлам
sh.Range(«a» & sh.Rows.Count).End(xlUp).Offset(1).Resize(, 3).Value = _
Array(i, Dir(coll(i)), coll(i)) ‘ выводим на лист очередную строку
DoEvents ‘ временно передаём управление ОС
Next
sh.Range(«a:c»).EntireColumn.AutoFit ‘ автоподбор ширины столбцов
[a2].Activate: ActiveWindow.FreezePanes = True ‘ закрепляем первую строку листа
End Sub
Ещё один пример использования:
Sub ЗагрузкаСпискаФайлов()
‘ Ищем файлы в заданной папке по заданной маске,
‘ и выводим на лист список их параметров.
‘ Просматриваются папки с заданной глубиной вложения.
Dim coll As Collection, ПутьКПапке$, МаскаПоиска$, ГлубинаПоиска%
ПутьКПапке$ = [c1] ‘ берём из ячейки c1
МаскаПоиска$ = [c2] ‘ берём из ячейки c2
ГлубинаПоиска% = Val([c3]) ‘ берём из ячейки c3
If ГлубинаПоиска% = 0 Then ГлубинаПоиска% = 999 ‘ без ограничения по глубине
‘ считываем в колекцию coll нужные имена файлов
Set coll = FilenamesCollection(ПутьКПапке$, МаскаПоиска$, ГлубинаПоиска%)
Application.ScreenUpdating = False ‘ отключаем обновление экрана
‘ выводим результаты (список файлов, и их характеристик) на лист
For i = 1 To coll.Count ‘ перебираем все элементы коллекции, содержащей пути к файлам
НомерФайла = i
ПутьКФайлу = coll(i)
ИмяФайла = Dir(ПутьКФайлу)
ДатаСоздания = FileDateTime(ПутьКФайлу)
РазмерФайла = FileLen(ПутьКФайлу)
‘ выводим на лист очередную строку
Range(«a» & Rows.Count).End(xlUp).Offset(1).Resize(, 5).Value = _
Array(НомерФайла, ИмяФайла, ПутьКФайлу, ДатаСоздания, РазмерФайла)
‘ если нужна гиперссылка на файл во втором столбце
ActiveSheet.Hyperlinks.Add Range(«b» & Rows.Count).End(xlUp), ПутьКФайлу, «», _
«Открыть файл» & vbNewLine & ИмяФайла
DoEvents ‘ временно передаём управление ОС
Next
End Sub
Вот отсюда:
http://excelvba.ru/code/FilenamesCollection
там же качаются файлы примеров
Sub абырвалг() Dim sFolder As String Dim sFiles As String Dim arr() As String Dim iFls As Integer Dim sFilesShablon As String With Application.FileDialog(msoFileDialogFolderPicker) If .Show = False Then Exit Sub sFolder = .SelectedItems(1) End With sFilesShablon = Trim(Sheets(1).Range("A1")) sFolder = sFolder & IIf(Right(sFolder, 1) = Application.PathSeparator, "", Application.PathSeparator) sFiles = Dir(sFolder & "*" & sFilesShablon & "*.xls*") iFls = 0 ReDim arr(iFls) Do While sFiles <> "" ReDim Preserve arr(iFls) arr(iFls) = sFolder & sFiles sFiles = Dir iFls = iFls + 1 Loop For iFls = 0 To UBound(arr) Sheets(2).Cells(iFls + 1, 1) = arr(iFls) Next iFls Sheets(2).Activate End Sub