Надстройка для загрузки списка файлов на лист Excel

Скриншот формы поиска файлов в заданной папке

Надстройка, позволяющая загрузить из выбранной папки список файлов на лист Excel.

Автор: VictorM

Особенности надстройки:

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

 

Основой для надстройки загрузки списка файлов послужила функция FilenamesCollection

Вы также можете посмотреть другие примеры загрузки списка файлов на лист Excel 

 

Для запуска главной формы надстройки запустите прикреплённый к статье файл,
и нажмите в Excel комбинацию клавиш Ctrl + Alt + S

Далее, выберите папку, в которой будет производиться поиск файлов,
задайте маску поиска (если маска не задана, в результат будут выведены все файлы в папке),
и укажите глубину поиска в подпапках (если глубина = 0, производится поиск во всех вложенных подпапках)

Вложения:

Комментарии

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".

Спасибо, отличная надстройка. Формирую небольшой проект, очень помог Ваш код.

Здравствуйте! Помогите, пожалуйста восстановить гиперссылку в Eexele, после отключения электричество перестали работать гиперссылки на файлы.

Не выводит в список файлы, в названии которых есть символы ° и Ø, функция Dir(ПутьКФайлу) возвращает пустое значение, хотя значение переменной ПутьКФайлу не пустое и если присвоить переменной ИмяФайла значение переменной ПутьКФайлу в списке отображаются пути с правильными названиями файлов.

Подскажите начинающему познавать excel.

Как скачать надстройку и куда ее сохранить, чтобы ей пользоваться.

Ребят, помогите (дуб я в макросах): есть файл с тучей гиперссылок на папки и PDF файлы, но пришлось всю базу проектов перелопатить и все ссылки похерились.
Руками исправлять ссылки (не формульные =ГИПЕРССЫЛКА()) я умру. Для вас пара пустяков написать макрос, т.к. все эти фичи есть в разных макросах, но я даже объединить их не могу. Суть: брать существующую ссылку, откинуть всё до последнего знака "\" (т.к. ссылки не только на файлы но и на папки), по оставшемуся делать поиск в заданной папке и заменять ссылку на найденное.
Пример:
старая ссылка - 3G/0001 АТС-35/БС/2-34-0001-БС (АТС-35).pdf
берем из неё - 2-34-0001-БС(АТС-35).pdf
ищем в папке d:\Мои документы\!ПРОЕКТЫ\
находится - d:\Мои документы\!ПРОЕКТЫ\001_АТС-35\2-34-0001 АТС-35\БС\2-34-0001-БС (АТС-35).pdf
меняем ссылку на - 001_АТС-35\2-34-0001 АТС-35\БС\2-34-0001-БС (АТС-35).pdf

Ведь понимаю, что просто, но реализовать не могу (

надстройка перестала работать в excel 2010... имена файлов, дата создания и размерфайла пустые значения... :( а ведь в 2003 все работало)

Ребята спасибо за надстроечку :)
Очень пригодилоась для естренной разовой работы с перебором каталогов. Самому уже поздно что либо программировать...
Еще раз СПАСИБО!!!

Игорь, доброго времени суток.
Посмотрел Вашу надстройку.
Есть баг: в коде формы в процедуре Private Sub cb_очистить_Click()
в последней строке опечатка : вместо Worksheets.Count написано woksheets.Count , что, естественно, вызывает ошибку, но из-за On Error Resume Next она игнорируется и в результате после удаления листа "Поиск файлов" ещё и закрывается книга, в которую его вставила надстройка.
Есть вопросы:
1. Не понятно зачем сделан двухступенчатый вызов cb_выбрать_Click -> FilenamesCollection -> GetAllFileNamesUsingFSO когда вполне можно было напрямую вызывать cb_выбрать_Click -> GetAllFileNamesUsingFSO, т.к. в FilenamesCollection практически ничего не делается?
Но это практически не тормозит работу.
2. А вот то, что Вы выводите на лист не "в одно движение" из массива, а по группам ячеек при большом числе файлов сильно тормозит работу.
3. DoEvents наверное следует поставить не в код формы, а в сам код рекурсивной функции. Иначе при долгих рекурсиях прервать их будет невозможно.

P.S. Я сделал свою процедуру "по мотивам" этой.
Но вместо коллекции использовал словарь (из него просто "одним махом" можно считать массив .Items )
А в сами элементы записывал не пути к найденным файлам, а массивы-строки, сформированные из параметров файла: (0)-№№ (= количеству элементов словаря+1), (1)-Name, (2)-Path, (3)-DateCreated, (4)-Size, (5)-DateLastModified

Получилось вполне элегантно. Спасибо за пример рекурсии по FileSystemObject

Раньше все работало, но после серии добавлений разных модулей и форм стала появляться ошибка

Вообще-то типичное положение вещей. Возникнуть оно может из-за неоднозначных имен процедур и функций.
Просто из-за того, что добавляя модули и формы из разных проектов, надстроек могут продублироваться эти самые имена.
В частности, у меня была такая ситуация, когда я делал собственную надстройку из "кусков" кодов и надстроек автора сайта.
Настоятельно рекомендуется, при таком вот добавлении, каждый раз запускать Debug - Compile VBAProject.

В некоторых случаях требуется отобразить листа файла надстройки перед копированием.
(временно установить свойство IsAddin в FALSE)

И вообще, кому это надо - мне, или вам?
Если вам - то почему экономите слова (даже не говоря номер и описание ошибки)?
Мне надоело играть в телепата, и строить предположения, не видя файла.
Обращайтесь на форумы по Excel, выкладывайте там свою надстройку, - спецы помогут разобраться в причинах.

Один в один сделано. Тишина...

А лист СПИСОК, который вы пытаетесь скопировать из надстройки, он точно видимый?

Убедитесь, что лист видимый, задайте ему кодовое имя (выделено на скриншоте), и пробуйте упрощённый макрос:

Sub Скопировать_Лист_Список()
    On Error Resume Next    ' на случай, если ни одна книга не открыта
    spisok.Copy Worksheets(Worksheets.Count)
End Sub

Засада...
Не работает решение...нет даже ошибок и лист не появляется. Название листа и макроса точны.

Эх, много лишнего у вас в коде...

Попробуйте так - ошибка должна исчезнуть:

Sub Скопировать_Лист_Список()
    On Error Resume Next    ' на случай, если ни одна книга не открыта
    ThisWorkbook.Worksheets("Список").Copy _
            ActiveWorkbook.Worksheets(ActiveWorkbook.Worksheets.Count)
End Sub

Обратите внимание - я использую Worksheets вместо Sheets

Можно ли вопрос не по теме...
У меня в моей надстройке есть листы, которые выводятся соответственно в любой книге. Раньше все работало, но после серии добавлений разных модулей и форм стала появляться ошибка и к сожалению я не могу "откатиться" назад, много прошло времени.
Макрос вызова листа у меня:
Sub Вывести_Лист_Список() ' Макрос кнопки в надстройке
Dim wbFrom As Workbook
Set wbFrom = Workbooks("НАЗВАНИЕ_НАДСТРОЙКИ.xlam")

Dim wbTo As Workbook
Set wbTo = ActiveWorkbook

Dim n As Integer
n = wbTo.Sheets.Count

wbFrom.Sheets("НАЗВАНИЕ-ЛИСТА").Copy After:=wbTo.Sheets(n)

Set wbFrom = Nothing
Set wbTo = Nothing
End Sub

Ошибка на : wbFrom.Sheets("НАЗВАНИЕ-ЛИСТА").Copy After:=wbTo.Sheets(n)

Есть ли решение ?
Может есть другие способы вызова листа.

Браво Маэстро...!
Все заработало. Спасибо.

Значит, где-то в глубинах вашего файла есть глобальная переменная путь или PS, определённая с типом Object, Range или т.п.

Решение - заменить названия переменных:

Private Sub cb_выбор_Click()
    FolderPath = ""
    PathSep = Application.PathSeparator
    With Application.FileDialog(msoFileDialogFolderPicker)
        .ButtonName = "Выбрать"
        .Title = "Выберите папку"
        .InitialFileName = "c:\"
        If .Show = -1 Then FolderPath = .SelectedItems(1)
        If Not Right$(FolderPath, 1) = PathSep Then FolderPath = FolderPath & PathSep
    End With
    Me.tb_Путь.Value = FolderPath
End Sub

После этого всё должно заработать и в вашем файле.

PS: Отсюда вывод: глобальные переменные в большой программе - это зло, от них надо избавляться.

Если ничего и никуда не копировать, то в оригинале работает отлично...Не могу понять, как связана данная ошибка при переносе модуля и формы в другой файл...!?

Спасибо за реакцию на вопрос.
Еще раз повторюсь, я в свою надстройку скопировал Ваши модуль и форму. При запуске макроса в моей надстройке "ВызовФормы" появляется форма. При нажатии на выбор папки появляется ошибка (выше указал). Ошибка на второй строке в форме " ПУТЬ = "" "

Код выбора папки, в принципе, простейший, - таких ошибок выдавать не должен.
Ещё раз протестировал надстройку в Excel 2003 и 2007 - что только ей не задавал в качестве папки, и ну никак не смог получить ошибку.

Так что, скорее всего, вы что-то намудрили при копировании.
Хотя бы скажите, на какой строке кода вылетает ошибка (какая строка макроса подсвечивается желтым?)

Если не копировать ничего никуда, а просто запустить прикреплённый файл, - тоже вылетает ошибка?

PS: Я хоть и не автор надстройки, но участвовал в доработке формы

Уважаемый автор, я с удовольствием отслеживаю Ваши решения и собираю интересные решения в одну надстройку для себя. Вот и это решение "тупо" скопировал (модуль и форму) к себе, но при выборе папки выдает ошибку
Run-time error "424"
Object Required

Ничего не могу поделать...
Что не правильно ?

Отправить комментарий

Содержание этого поля является приватным и не предназначено к показу.
CAPTCHA
Подтвердите, пожалуйста, что вы - человек:
  _____                 ____    ____    ____  
| ___| ___ _ __ | ___| | _ \ | _ \
| |_ / __| | '_ \ |___ \ | |_) | | |_) |
| _| \__ \ | |_) | ___) | | _ < | _ <
|_| |___/ | .__/ |____/ |_| \_\ |_| \_\
|_|
Введите код, изображенный в стиле ASCII-арт.

Не получается применить макрос? Не удаётся изменить код под свои нужды?

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