Получение списка файлов в указанной папке с помощью кода VBA Excel. Коллекция Files объекта Folder, возвращенного методом FileSystemObject.GetFolder.
Коллекция Files объекта Folder
Для получения списка файлов в указанной папке используется свойство Files
объекта Folder
. Объект Folder
в VBA Excel возвращается методом GetFolder
объекта FileSystemObject по полному имени папки в качестве аргумента.
Если в указанной папке нет файлов, применение свойства Folder.Files
приведет к возникновению ошибки. Для корректного завершения программы используйте обработчик ошибок или условие, проверяющее наличие файлов в папке.
Получение списка файлов в папке
Пример 1
Код VBA Excel для получения списка файлов в указанной папке и записи полных имен файлов в массив (с поздней привязкой объектов к переменным):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
Sub Primer1() Dim fso, myPath, myFolder, myFile, myFiles(), i 'Записываем в переменную myPath полное имя папки myPath = "C:\DATA\Текущая папка" 'Создаем новый экземпляр FileSystemObject Set fso = CreateObject("Scripting.FileSystemObject") 'Присваиваем переменной myFolder ссылку на объект Folder Set myFolder = fso.GetFolder(myPath) 'Проверяем, есть ли файлы в папке myFolder If myFolder.Files.Count = 0 Then MsgBox "В папке «" & myPath & "» файлов нет" Exit Sub End If 'Задаем массиву размерность ReDim myFiles(1 To myFolder.Files.Count) 'Загружаем в массив полные имена файлов For Each myFile In myFolder.Files i = i + 1 myFiles(i) = myFile.Path Next 'Просматриваем первый элемент массива MsgBox myFiles(1) End Sub |
Используемые переменные:
- fso – ссылка на экземпляр объекта FileSystemObject;
- myPath – полное имя папки;
- myFolder – ссылка на объект Folder (папка);
- myFile – ссылка на один объект File из коллекции myFolder.Files;
- myFiles() – массив для записи имен файлов;
- i – счетчик элементов массива.
Пример 2
Получение списка файлов в указанной папке и запись имен файлов в ячейки первого столбца рабочего листа Excel (с ранней привязкой объектов к переменным):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
Sub Primer2() Dim myPath, myFolder As Folder, myFile As File, i 'Записываем в переменную myPath полное имя папки myPath = "C:\DATA\Текущая папка" 'Создаем новый экземпляр FileSystemObject Dim fso As New FileSystemObject 'Присваиваем переменной myFolder ссылку на объект Folder Set myFolder = fso.GetFolder(myPath) 'Проверяем, есть ли файлы в папке myFolder If myFolder.Files.Count = 0 Then MsgBox "В папке «" & myPath & "» файлов нет" Exit Sub End If 'Записываем имена файлов в первый столбец активного листа For Each myFile In myFolder.Files i = i + 1 Cells(i, 1) = myFile.Name Next End Sub |
Ранняя привязка позволяет использовать подсказки свойств и методов объектов при написании кода VBA Excel.
Как получить список папок до 3 уровней вложенности, смотрите в статье VBA Excel. Список папок.
Фразы для контекстного поиска: обход файлов.
Здравствуйте!
Можно ли получить одно имя файла из списка коллекции Files используя свойство Folder.Files, при этом не используя цикл For Each?
Добрый день!
Одно имя получить можно, но только указав это самое имя, так как у коллекции Folder.Files есть только два свойства: Count и Item.
Item — свойство по умолчанию — его можно не указывать.
без явного указания имени в myFolder.Files.Item(«Зимняя картинка.doc»). Нужно получить имя файла не зная явно его имени. Попытка использования номера индекса myFolder.Files.Item(1) выдает ошибку.
Свойство Folder.Files.Item не работает с индексами. Скорее всего, за файлами в папке никакие индексы или номера по порядку не закреплены. По крайней мере те, которые может распознать .Item.
В итоге, существует ли способ получить одного имени файла из нескольких в папке, не используя запись в массив посредством цикла?
Нет.
Спасибо!
Dim myPath, myFolder As Folder, myFile As File, i
Где определяется что за пользовательский тип у Folder и File?
Добрый день, Сергей!
Это не пользовательские, а встроенные типы (классы) объектов, такие же, как, например, Worksheet или Range.
Забыли сказать, что необходимо подключить Scripting Runtime Library. Иначе код ругается на каждую переменную.
Если ее не подключать то необходимо для переменных myFile, myFolder и fso либо указать тип as Object либо не объявлять тип, тогда будет as Variant. И во втором примере сделать так:
Добрый день подскажите как сделать список файлов, если путь к ним прописать в ячейке A1?
Здравствуйте, Юрий!
Спасибо!
Евгений добрый день, а не подскажите если такой макрос который применяет макрос к файлам в разных папках? Можно так чтоб указать начальную папку и он в подпапках искал нужные файлы и применял макрос или так например все пути файлов прописаны в столбце и применить макрос к данным файлам?
Добрый день, Юрий! Информация по вашему вопросу есть здесь.
Здравствуйте, как получить список я понимаю, а как к данному списку применить свой макрос, при том чтоб файлы открывались и закрывались сами?
Добрый день, Юрий!
Во втором примере из статьи замените блок
на блок
Добрый день, Евгений!
Есть вопрос!
На диске D имеется папка с названием Проба, в ней 10 файлов эксель.
Полученные файлы по почте, скидываются в папку Проба, при помощи копирование и вставить с заменой.
В файле эксель с названием Первый на Листе1 имеется таблица, в столбце А названия 10 файлов эксель.
Пожелание получить на Листе1 в таблице заливающуюся ячейку (или надпись «Обновлено»), после того как произведется вставка с заменой в папке Проба.
Это для того, чтобы было видно, какие файлы надо открыть, чтобы данные по ссылкам появились в файле Первый.
Подскажите?
Обсуждение закрыто.