Excel vba список файлов в папке

Конференция VBStreets

Весь вкус программирования!

  • Список форумовVisual BasicVisual Basic 1–6
  • Изменить размер шрифта
  • FAQ
  • Вход

Получить список файлов в папке

Получить список файлов в папке

beat_swamp » 06.12.2005 (Вт) 11:30

alibek » 06.12.2005 (Вт) 11:32

Matew » 06.12.2005 (Вт) 11:41

alibek
beat_swamp
Переделаешь сам? Это перебирает папки:
Код: Выделить всё Private Function FindFilesAPI2(Path As String, SearchStr As String, FileCount As Integer, DirCount As Integer, sFound() As String, Optional oldpath As String)
On Error Resume Next
‘KPD-Team 1999
‘Улучшения (c) hCORe 2004
‘E-Mail: KPDTeam@Allapi.net
‘ vb6@mail.ru
‘URL: http://www.allapi.net/
‘ http://amelso.narod.ru

Dim FileName As String ‘ Переменная для имени.
Dim DirName As String ‘ Папка
Dim dirNames() As String ‘ Буфер папок
Dim nDir As Integer ‘ количество директорий
Dim i As Integer ‘ счетчик цикла.
Dim hSearch As Long ‘ дескриптор поиска
Dim WFD As WIN32_FIND_DATA
Dim Cont As Integer
If Right(Path, 1) <> «» Then Path = Path & «»
‘ Поиск подпапок.
nDir = 0
ReDim dirNames(nDir)
Cont = True
‘ Пройти по всем папкам и
‘ просуммировать размеры файлов.
hSearch = FindFirstFile(Path & SearchStr, WFD)
Cont = True
ReDim sFound(0) As String
If hSearch <> INVALID_HANDLE_VALUE Then
While Cont
DoEvents
FileName = StripNulls(WFD.cFileName)
If (FileName <> «.») And (FileName <> «..») Then
FindFilesAPI2 = FindFilesAPI2 + (WFD.nFileSizeHigh _
* MAXDWORD) + WFD.nFileSizeLow
FileCount = FileCount + 1
If Len(FileName) <> 0 Then
If Right(FileName, 3) = «.md» Or Right(FileName, 3) = «.MD» Then
If Right$(Path, 9) <> «NEW_STRU» Then
ReDim Preserve _
MasBaz(UBound(MasBaz) _
+ 1)
MasBaz(UBound(MasBaz) — 1) = Path ‘& FileName
‘ Err.Clear
DirCount = DirCount + 1
End If
End If
End If
End If
‘ Получить дескриптор следующего файла
Cont = FindNextFile(hSearch, WFD)
Wend
End If
Cont = FindClose(hSearch)
hSearch = FindFirstFile(Path & «*», WFD)
If hSearch <> INVALID_HANDLE_VALUE Then
Do While Cont
DoEvents
DirName = StripNulls(WFD.cFileName)
‘ Пропустить текущую и родительскую папку.
If (DirName <> «.») And (DirName <> «..») Then
‘ If Len(DirName) <> 0 Then
‘ If Right(DirName, 3) = «.md» Or Right(DirName, 3) = «.MD» Then
‘ If Right$(Path, 9) <> «NEW_STRU» Then
‘ ReDim Preserve _
‘ sFound(UBound(sFound) _
‘ + 1)
‘ If Len(oldpath) <> 0 Then
‘ sFound(UBound(sFound) — _
‘ 1) = Path
‘ Else
‘ sFound(UBound(sFound) — _
‘ 1) = Path
‘ End If
‘ End If
‘ End If
‘ End If
‘ Проверка на атрибуты.
If GetFileAttributes(Path & DirName) And _
FILE_ATTRIBUTE_DIRECTORY Then

Form1.Caption = Path & DirName

FindFilesAPI2 Path & DirName, SearchStr, _
FileCount, DirCount, sFound(), Path
End If
End If
‘Перейти в следующую подпапку.
Cont = FindNextFile(hSearch, WFD)
Loop
Cont = FindClose(hSearch)
End If
End Function
‘Пример использования:
‘FindFilesAPI2 «C:» ,»*.*», 0, 0, myArray()

beat_swamp » 06.12.2005 (Вт) 11:42

RayShade » 06.12.2005 (Вт) 13:35

Код: Выделить всё for each fName in createobject(«scripting.filesystemobject»).getfolder(«c:123»).files
debug.pring fName.name
next fname

keks-n » 06.12.2005 (Вт) 14:14

beat_swamp » 06.12.2005 (Вт) 14:54

BV » 06.12.2005 (Вт) 16:09

keks-n » 06.12.2005 (Вт) 16:18

beat_swamp » 06.12.2005 (Вт) 16:24

keks-n » 06.12.2005 (Вт) 16:31

keks-n » 06.12.2005 (Вт) 16:34

Пример из API-Guide:

‘Create a form with a command button (command1), a list box (list1)
‘and four text boxes (text1, text2, text3 and text4).
‘Type in the first textbox a startingpath like c:
‘and in the second textbox you put a pattern like *.* or *.txt

Private Declare Function FindFirstFile Lib «kernel32» Alias «FindFirstFileA» (ByVal lpFileName As String, lpFindFileData As WIN32_FIND_DATA) As Long
Private Declare Function FindNextFile Lib «kernel32» Alias «FindNextFileA» (ByVal hFindFile As Long, lpFindFileData As WIN32_FIND_DATA) As Long
Private Declare Function GetFileAttributes Lib «kernel32» Alias «GetFileAttributesA» (ByVal lpFileName As String) As Long
Private Declare Function FindClose Lib «kernel32» (ByVal hFindFile As Long) As Long

Const MAX_PATH = 260
Const MAXDWORD = &HFFFF
Const INVALID_HANDLE_VALUE = -1
Const FILE_ATTRIBUTE_ARCHIVE = &H20
Const FILE_ATTRIBUTE_DIRECTORY = &H10
Const FILE_ATTRIBUTE_HIDDEN = &H2
Const FILE_ATTRIBUTE_NORMAL = &H80
Const FILE_ATTRIBUTE_READONLY = &H1
Const FILE_ATTRIBUTE_SYSTEM = &H4
Const FILE_ATTRIBUTE_TEMPORARY = &H100

Private Type FILETIME
dwLowDateTime As Long
dwHighDateTime As Long
End Type

Private Type WIN32_FIND_DATA
dwFileAttributes As Long
ftCreationTime As FILETIME
ftLastAccessTime As FILETIME
ftLastWriteTime As FILETIME
nFileSizeHigh As Long
nFileSizeLow As Long
dwReserved0 As Long
dwReserved1 As Long
cFileName As String * MAX_PATH
cAlternate As String * 14
End Type
Function StripNulls(OriginalStr As String) As String
If (InStr(OriginalStr, Chr(0)) > 0) Then
OriginalStr = Left(OriginalStr, InStr(OriginalStr, Chr(0)) — 1)
End If
StripNulls = OriginalStr
End Function

Получить список файлов Excel в папке с помощью VBA

мне нужно получить имена всех файлов Excel в папке, а затем вносить изменения в каждый файл. Я разобрался с частью «внести изменения». Есть ли способ получить список .xlsx файлы в одной папке, скажем D:Personal и сохраните его в строковом массиве.

затем мне нужно перебрать список файлов и запустить макрос на каждом из файлов, которые я решил, что могу сделать с помощью:

Читать еще:  Как в таблице эксель сделать нумерацию

на этой, однако, я не смог открыть файлы вызывают сохранение имен в .

короче говоря, как я могу использовать VBA для получения списка имен файлов Excel в определенной папке?

Ок хорошо это может работать для вас, функция, которая принимает путь и возвращает массив имен файлов в папке. Вы можете использовать оператор if для получения только файлов excel при циклическом прохождении через массив.

было бы неплохо, если бы мы могли просто получить доступ к файлам в объекте files по номеру индекса, но это, похоже, сломано в VBA по какой-либо причине (ошибка?).

вы можете использовать встроенную функцию Dir или FileSystemObject.

для простого списка файлов команда dir довольно проста в использовании. Он также поддерживает подстановочные знаки, что полезно, если вы не хотите каждый файл. Фокус в том, чтобы использовать его, чтобы понять, как его называть с параметром отличается, что вызов без одного.

Если вы хотите intellisense и больше возможностей, помимо получения имени файла, я бы предложил FileSystemObject. Вы можете добавить ссылку на » Windows Script Host Object Model «(или» Windows Scripting Runtime») и объявить свои объекты следующим образом:

Если вы не хотите intellisense, вы можете сделать это, не устанавливая ссылку:

Получение списка файлов в папке

В Excel, путём проведения нехитрых махинаций, имеется возможность получения списка файлов, находящихся в папке компьютера. Для этого копируем путь к файлам в папке и вставляем его в нужную ячейку, при этом в конце пути необходимо указать маску поиска файлов вида:

2. *.xl* – все файлы Excel (xls, xlsx, xlsm, xlsb и т.д.);

3. *.exe – все исполняемые файлы (программы);

4. *.docx (doc, docm) – все документы Word. Добавив ключевое слово Рок*.docx в список войдут все названия файлов, начинающиеся со слова «Рок».

Дальше нажатием Ctrl+F3 или на вкладке «Формулы» — «Диспетчер имён», в открывшемся окне создадим новое имя Список_файлов и введём в строку Диапазон следующую формулу =ФАЙЛЫ(Лист1!$A$1) где «Лист1» – это название листа, а «А1» – ячейка с адресом

Теперь в созданном нами названии «Список_файлов» уже содержатся нужные имена файлов, осталось их оттуда извлечь. Для этого используем в ячейке А3 следующую формулу и протянем её вниз: =ЕСЛИОШИБКА(ИНДЕКС(Список_файлов;СТРОКА()-2);””)

Функция ЕСЛИОШИБКА нужна, чтобы спрятать ошибку #ССЫЛКА, которая возникает, когда мы протягиваем формулу «с запасом», т.е. на больший по размеру диапазон, чем количество имеющихся у нас файлов.

Функция ИНДЕКС извлекает из массива элемент по номеру, например, формула =ИНДЕКС(Список_файлов; 5) выдаст имя пятого по счету файла в папке.

Функция СТРОКА, выдает порядковый номер текущей строки, из которого мы вычитаем 2, т.к. первая ячейка, куда выводится имя, в нашем случае А3.

`ls /path/to/dir | grep -e ‘regex’`

Это смотря для чего.

У меня описанное ТС-ом работает в макросе сбора данных из текстовых файлов генерируемых CMM машиной.

Файл с макросом копируется в папку с выбранной горой текстовых отчетов и макрос делает из кучи барахла удобокопируемые данные.

Если бы делал для себя- может и морочился бы с текстовым файлом и батниками. Но задача была сделать файл для работы необученого ничему оператора. Чтобы нажал кнопку и всё получилось.

Использование экселя для получения данных, безусловно, удобно когда потом эти же данные надо обрабатывать в экселе. Но в общем случае использовать. Эксель для получения списка файлов менее удобно, чем воспользоваться программами, которые прямо для этого и предназначены (не уверен что dir это программа, а не команда оболочки — сам я по юниксам).

P.S. Конкретно в вашем случае я бы складывал это все в какую-нибудь СУБД, после чего эти данные можно удобно обработать и проанализировать, скорее всего гораздо быстрее, чем в экселе, если данных ДЕЙСТВИТЕЛЬНО много (гигабайты и больше). Я бы смотрел в сторону Clickhouse.

В моем случае это был статистический контроль.

Данные доступны были или в ПДФ-ках, из каждой надо было скопировать 10-20 числовых значений и вставить в ексель. Таких ПДФ-ок приходилось в день открывать сотруднику порядка 50-100 штук. И создание отчета занимало несколько дней (ведь была еще и другая работа). И отследить ошибки вообще было нереально. И еще оборудование генерило текстовые файлы. Вот из них и кромсал данные макрос.

Получилось достаточно удобно. Деталь промеряли- текстовики скинули в отдельную папку — туда же ексель-файл- нажали на кнопочку и всего 1 раз скопировали-вставили куда надо.

Получение списка файлов в папке и подпапках средствами VBA

Функция VBA для получения списка файлов из папки,
с учётом выбранной глубины поиска в подпапках

Пример в файле FilenamesCollection.xls выводит список файлов на чистый лист новой книги (формируя заголовки)

Пример в файле FilenamesCollectionEx.xls более функционален — он, помимо списка файлов из папки, отображает размер файла, и дату его создания, а также формирует в ячейках гиперссылки на найденные файлы.

Читать еще:  Как в excel пронумеровать таблицу в

Вывод списка производится на лист запуска, параметры поиска файлов задаются в ячейках листа (см. скриншот)

ПРИМЕЧАНИЕ: Если вы выводите на лист список имен файлов картинок (изображений), то при помощи этой надстройки вы сможете вставить сами картинки в ячейки соседнего столбца (или в примечания к этим ячейкам)

выполненной на основе функции FilenamesCollection,
а также со способом добавления в таблицу значений ячеек из найденных файлов

‘ Пример использования функции в макросе:

Этот код позволяет осуществить поиск нужных файлов в выбранной папке (включая подпапки), и выводит полученный список файлов на лист книги Excel:

Ещё один пример использования:

PS: Найти подходящие имена файлов в коллекции можно при помощи следующей функции:

  • 234684 просмотра

Комментарии

Так вроде и то и другое выводится
Код открыт ведь, — поменяйте как вам надо, если лишний столбец мешает.

Возможно я слепой или плохо читаю, но я не увидел что-то подобное в коментах. Поэтому мой вопрос следующий: можно как-то сделать так, чтобы выводило только название файла а не весь путь?

Отбой, разобрался. Виноват оказался не этот макрос, а тот, который его результаты использовал. Мораль — люди, не юзайте Dir, если вам нужно что-то сделать с папкой, к которой он обращается.

В моём макросе нет MoveFolder — так что мой макрос точно не виноват в вашей проблеме.
Проблема — либо в неверном использовании MoveFolder (не то или не туда перемещаете), либо нет прав доступа на перемещение в заданное место.

Игорь, всё это прекрасно. Непонятно только, что нужно сделать с Вашим макросом, чтобы после его вызова с папкой можно было бы ещё и что-нибудь сделать, например, переместить. Сейчас после вызова FSO.MoveFolder вылетает с ошибкой Access denied. Проверено, виноват именно Ваш макрос — если закомментировать ТОЛЬКО его вызов, FSO.MoveFolder отрабатывает нормально.

Спасибо, ОГРОМНОЕ.
Выручайте ребята! макрос в целом отличный, но для моих целе нужно немного переделать.
Нужно чтоб все файлы находящиеся в каждой папке были в одной ячейке через разделитель ( | )
Например:
C:images4-20161032g.jpg|C:images4-20161033g.jpg|C:images4-20161033g.jpg

Да, сделал.
Высылайте на почту подробное задание (что и как должно выглядеть, для чего это вообще нужно, и т.д.)
Тогда озвучу сроки и стоимость

Добрый день!
Скажите, пожалуйста, сделали ли вы макрос для Александра?
Если да, то за сколько его можно приобрести?
Если нет, то какие сроки выполнения?
Спасибо!

Напишите на почту стоимость и сроки выполнения

Александр, в этом случае нужен более сложный макрос.
Могу сделать под заказ.

Здравствуйте, Макрос хороший. Всё отлично выводит. Но как сделать дерево? Имеется несколько папок, далее нажимаешь на папку или плюс или еще что-то, она открывается, появляется подпапки, опять жмешь на подпапку появляются подпапки и т.д.

Спасибо, отличный макрос

В ответ на:
Андрей, 15 Мар 2018 — 15:13.#3
Добрый день.
файл 148 знаков (рус.буквы) не обрабатывается,
и сам файл на сервере (если файл на раб.столе то все работает)
какая максимальная длина имени и можно-ли ее обойти.

Ограничение на полное имя файла, включая расширение — 259 символов. Соответственно, все файлы, имеющие более длинное имя при выполнении
Set curfold = FSO.GetFolder(FolderPath)
будут проигнорированы. Тестировал на EX2010, W7 и MSServer 2008. У меня из 28 (curfold.Соunt) файлов реально в коллекции только 15 (curfold.items(1). curfold.items(15))

А как сделать макрос чтобы он мне показал только пустые папки?

Ограничений по длине имени файла, вроде как, нет (по крайней мере, за много лет использования этого кода на тысячах компов, с проблемами не сталкивался)

Добрый день.
файл 148 знаков (рус.буквы) не обрабатывается,
и сам файл на сервере (если файл на раб.столе то все работает)
какая максимальная длина имени и можно-ли ее обойти.

Адаптировал к access — все работает, спасибо, очень помогло

Ринат, посмотрите макрос обработки файлов из папки.
Там выводится диалоговое окно папки, и обрабатываются все файлы в ней (независимо от имён файлов)

Добрый день!
Такой вопрос, в отделе каждый месяц сотрудник ведет отчет по своей работе в табличной форме в ексель каждый в своем файле, а начальству необходимо данные отчеты ввести в свою итоговую таблицу для себя, то есть скопировать данные отчетов с файлов каждого сотрудника в свой отдельный файл. Я создал макрос, для скопирования данных с файлов каждого сотрудника в таблицу файла начальству указывая путь к каждому файлу. Но при этом возникает определенные неудобства, каждый месяц нужно пути к файлам прописывать заново, так как на следующий месяц создаются новые файлы по отчетам, и пути к ним необходимо обновлять. Подскажите пожалуйста, как можно сделать так, чтоб пути к файлам привязывались не по конкретному расположению файла, а например указыванием месяца и года можно было сформировать единый отчет на определенный месяц. Спасибо заранее!

Читать еще:  Как в excel сравнить два списка

Большое спасибо автору! Список использую для каталогизации архива сканов документов.

Да, можем сделать такой макрос под заказ.
Минимальная стоимость заказа 1500 руб.

добрый день
подскажите можно ли написать макрос под следующие цели
необходимо что бы в ячеке которую выделил вписывались имена файлов фотографий, если их несколько выбираешь тогда добавляются все через запятую или точку запятую только имя файла и расширение
например как вставить фото в ячейку но вставляется не фото а именно имя

или например на основе Вашего FilenamesCollectionEx.xls нашел все файлы на диске/папке нужные -нажимаешь на файл и ты нужен выбрать ячейку куда вписать имя файла
заранее спасибо

У меня почему-то размер файла в байтах выводится абсолютно иной, иногда даже с отрицательным значением.
Пример:
1.вес файла 3 840 327 Кб или 3,66 Гб, а таблица выдает «-362 472 675»
2.вес файла 5 082 087 Кб или 4,84 Гб, таблица выдает «909 089 137»

Василий, да, можно добавить.
Пример код можете здесь посмотреть:
http://excelvba.ru/code/MCI

Добрый день! Подскажите, возможно ли добавить столбцы «продолжительность» и «ширина кадра», которые имеются в данных файлов?

Здравствуйте, Елизавета.
Причин может быть несколько, навскидку:
— проблемный файл, или файл, к которому у вас нет доступа (ошибка 53 — файл не найден)
— слишком длинное имя папки (много уровней вложенности) и/или файла
— сбой в файловой системе
— ошибка в макросе (что-то в коде не учтено)

Техподдержка по бесплатным макросам не предоставляется
Если готовы оплатить помощь, — звоните в скайп, могу подключиться к вашему компу и всё исправить.

Игорь, огромное вам спасибо за эту работу!
Несколько лет использую ваш файл для классификации фильмов, но пару недель назад почему-то он перестал работать. Никакой критичности в этом нет, т.к. главное исправила благодаря обсуждениям тут, но мне непонятно и жутко интересно, почему так происходит. Может, это связано с активацией офиса(примерно в то же время было)? Офис 10й.
У меня 2 вкладки в этом файле, обновляю список на 2й, и затем новые позиции копирую в первую (накапливаю). При обновлении списка, после 60-70 позиций, макрос останавливается и сообщает об ошибке Run-time error 53 со сслыкой на строку ДатаСоздания = FileDateTime(ПутьКФайлу). Дело не файле, т.к. его удаление не помогло. Я добавила в скрипт «On Error Resume Next», список обновляется до конца, но перестают запускаться фильмы по гиперссылке в 1й вкладке «не удается открыть указанный файл» (во 2й работают), хотя файл и макросы одни и те же. Знаете, в чем может быть причина?

Список файлов на листе Excel

В Excel существуют неочевидная возможность вывести на лист список имен файлов из заданной папки. [1] Способ связан с использованием макрофункции (подробнее см. Функция Получить.Ячейку). Этот метод существенно проще написания макроса VBA. Начните с создания именованной формулы. Пройдите по меню Формулы –> Определенные имена –> Присвоить имя, и в окне Создание имени введите данные, как указано на рисунке:

Рис. 1. Диалоговое окно создания именованной формулы

Скачать заметку в формате Word или pdf, примеры в формате Excel (с макросами)

Обратите внимание: функция =ФАЙЛЫ(Лист1!$A$1) не относится к стандартным функциям рабочего листа. Это макрофункция, написанная в старом XLM-стиле и предназначенная для использования на специальном листе макросов. Она принимает один аргумент – путь к каталогу и описание файла (или файловый шаблон) и возвращает массив имен файлов, содержащихся в данном каталоге и удовлетворяющих описанию файла (шаблону). Обычные формулы рабочего листа не могут использовать подобные XLM- функции, а определенные имена — могут.

Определив именованную формулу, введите в ячейку А1 путь к каталогу и описание файла. Например, D:Dropbox!Сайт7_Библиотека*.*

Следующая формула отобразит первый найденный файл: =ИНДЕКС(Список;1). Если изменить второй аргумент на 2, то будет отображен второй найденный файл и т.д. Следующая формула, введенная в ячейку В1 (рис. 2), и скопированная вдоль столбца, позволит вывести все файлы: =ИНДЕКС(Список;СТРОКА()).

Рис. 2. Использование xlm-макрофункции в именованной формуле позволяет создать на листе список имен файлов

Функция СТРОКА, используемая здесь, генерирует ряд последовательных натуральных чисел: 1, 2, 3 и т.д. Эти числа используются в качестве второго аргумента функции ИНДЕКС. Когда все файлы будут выведены на лист, формула начнет возвращать ошибку: #ССЫЛКА! Если изменить каталог или описание файла в ячейке А1, то формулы обновляются и выводят имена новых файлов.

Книгу Excel нужно сохранить как файл с поддержкой макросов (в формате *.xlsm).

[1] По материалам книги Джон Уокенбах. Excel 2013. Трюки и советы. – СПб.: Питер, 2014. – С. 44, 45

Похожие статьи

Ссылка на основную публикацию
Похожие публикации
Adblock
detector