nurgaliev Пользователь Сообщений: 6 |
#1 08.02.2016 07:28:48 Всем здравствуйте, Необходимо чтобы файлы, находящиеся в одной папке (и подпапках) с рабочей книгой, находились по маске и копировались в отдельную директорию. Нижеприведенный код, копирует все файлы с подпапок (чьи имена взяты с отдельной колонки, SubFolder) без учета маски (взятой тоже c колонки, sMask) в папку с именем текстбокса (txt_banum) на рабочий стол пользователя. Как все же осуществить поиск по маске файлов во всех подпапках (без SubFolder)?
|
||
Юрий Пользователь Сообщений: 741 |
|
Апострофф Пользователь Сообщений: 720 |
|
nurgaliev Пользователь Сообщений: 6 |
Да, я попутно запостил вопросы еще на несколько форумов. Быть может знаете как справиться с проблемой? Изменено: nurgaliev — 08.02.2016 11:07:12 |
Апострофф Пользователь Сообщений: 720 |
#5 08.02.2016 08:43:36 Знаем, вот только желания тратить время впустую нет. http://www.planetaexcel.ru/forum/index.php?PAGE_NAME=rules
|
||
nurgaliev Пользователь Сообщений: 6 |
Мне просто нужен код для поиска по маске и копирования его в папку. |
Апострофф Пользователь Сообщений: 720 |
#7 08.02.2016 09:05:44 Поиск по маске —
Копирование в папку —
|
||||
Юрий М Модератор Сообщений: 60575 Контакты см. в профиле |
#8 08.02.2016 10:27:42
А нам нужно, чтобы Вы информировали — где ещё разместили свои вопросы. |
||
The_Prist Пользователь Сообщений: 14182 Профессиональная разработка приложений для MS Office |
Вот еще кросс: http://www.excel-vba.ru/forum/index.php?topic=4291.0 там основное решение и дали, но автор изменил предложенное, т.к. оказалось, что еще какие-то ТекстБоксы участие принимают и т.д. Файл Excel со всеми этими элементами автор выкладывать не хочет, следовательно, помогать проблематично по голому коду. А каждый раз писать, что нужен файл уже надоело, тем более что автор не может взять свой файл с формой и выложить только нужное — там много какой-то секретной информации. Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы… |
nurgaliev Пользователь Сообщений: 6 |
Прикрепляю файл примера моего макроса. при активации листа Example выплывает текстбокс, куда нужно ввести, к примеру, Watches Casio 1500. Далее — фильтрация и создание выборки на отдельном файле в папке Watches Casio 1500 на рабочем столе юзера. Проблема в том, что идет копирование всех файлов из папок, а не файлов по маске). Необходимо реализовать копирование лишь тех файлов, что соответствуют маске. |
Апострофф Пользователь Сообщений: 720 |
#11 09.02.2016 11:14:49 Глядим в книгу, видим знамо что —
|
||
nurgaliev Пользователь Сообщений: 6 |
всем спасибо) все получилось) есть вопрос: как сделать поиск не в определенной папке, а в во всей директории, включая все подпапки? (не беря за основу название папки, где производить поиск) |
Апострофф Пользователь Сообщений: 720 |
#13 11.02.2016 08:10:31
Что за беспомощность такая?
|
||||
nurgaliev Пользователь Сообщений: 6 |
#14 15.02.2016 14:04:51 И снова у меня проблема: Код
я адаптировал, но при запуске макрос выводит сообщение «Нет Доступа..» и продолжает долго бесконечно грузится. Код ниже отображает копирование из нынешней директории найденного файла, в новую указанную мной. Быть может ошибка здесь?
|
||||
Функция 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
- 301791 просмотр
Не получается применить макрос? Не удаётся изменить код под свои нужды?
Оформите заказ у нас на сайте, не забыв прикрепить примеры файлов, и описать, что и как должно работать.
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 |
Формулировка задачи:
Знаю, много тем было… почерпал информацию там, но остался один вопрос,
как мне сделать, что в имени файла не было типа файла — в моем случае txt.
например у меня в папке фаайлы 1.txt и 2.txt, то нужно вывести просто 1 и 2. Не знаю как сделать
Код к задаче: «Поиск файлов»
textual
ИмяФайлаБезРасширения = FSO.GetBaseName(ИмяФайла)
Полезно ли:
8 голосов , оценка 4.500 из 5
Поиск по файлам |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |