lenok Пользователь Сообщений: 39 |
Помогите, пожалуйста. |
Johny Пользователь Сообщений: 2737 |
А файл какой? Excel? There is no knowledge that is not power |
lenok Пользователь Сообщений: 39 |
да. в 2003 экселе пытаюсь написать |
Johny Пользователь Сообщений: 2737 |
#4 23.05.2013 11:40:58
There is no knowledge that is not power |
||
lenok Пользователь Сообщений: 39 |
|
lenok Пользователь Сообщений: 39 |
а как сделать, чтобы выбор варианта ответа при появлении диалогового окна был автоматический, или чтобы оно вообще не вылазило??? |
Johny Пользователь Сообщений: 2737 |
#7 24.05.2013 14:28:11
Изменено: Johny — 24.05.2013 14:28:36 There is no knowledge that is not power |
||
lenok Пользователь Сообщений: 39 |
а можно ли сделать, чтобы он искал документ в поддиректориях??? |
Johny Пользователь Сообщений: 2737 |
#9 31.05.2013 17:18:58 Ставим галку: Tools -> References -> Microsoft Scripting Runtime
Изменено: Johny — 31.05.2013 17:19:49 There is no knowledge that is not power |
||
Hugo Пользователь Сообщений: 23255 |
#10 31.05.2013 17:29:09 Я чего-то не понимаю?
|
||
Юрий М Модератор Сообщений: 60586 Контакты см. в профиле |
Я тоже не понимаю смысла в поиске… |
KuklP Пользователь Сообщений: 14868 E-mail и реквизиты в профиле. |
Я сам — дурнее всякого примера! … |
lenok Пользователь Сообщений: 39 |
Просто документов очень много. и постоянно открывать файлы под определенными названиями….. смысл тогда составления макроса… Пишу для автоматизации процессов обработки информации, и остановилась на этом моменте.
|
Hugo Пользователь Сообщений: 23255 |
Если например ситуации такие: |
lenok Пользователь Сообщений: 39 |
Есть огромный отчет. после обработки макросом, надо, чтобы он брал имя файла из определенной ячейки и открывал фаил с таким именем. информации много, и такой отчет обрабатывается каждый месяц. примерное кол-во файлов на один отчет больше 1000, поэтому, сами понимаете, что открывать каждый, это рутина. таких отчетов за один месяц 30 штук. соответственно, около 30000 существующих файлов…вот как-то так все глобально…… просто открыть, с этим мы разобрались….. но некоторые файлы находятся в поддиректориях, и постоянно происходят какие-то перемещения в этой директории… |
Hugo Пользователь Сообщений: 23255 |
#16 03.06.2013 11:32:43 В теме http://www.planetaexcel.ru/forum/index.php?PAGE_NAME=read&FID=8&TID=25457 есть файл http://www.planetaexcel.ru/bitrix/components/bitrix/forum.interface/show_file.php?fid=40202&action=download Там есть такой код:
и т.д. |
||
lenok Пользователь Сообщений: 39 |
что-то я не могу разобраться совсем |
anvg Пользователь Сообщений: 11878 Excel 2016, 365 |
Пробуйте, первый запуск будет долгим. Далее быстрее. Если есть подозрение, что файлы в папке и подпапках изменили положение или имя, то нажать «Обновить». Путь к начальной папке задаётся константой baseFolder в методе InitializeFindю |
lenok Пользователь Сообщений: 39 |
#19 04.06.2013 07:29:04
я так понимаю, здесь надо прописать адрес самой папки, это понятно… |
||
anvg Пользователь Сообщений: 11878 Excel 2016, 365 |
#20 04.06.2013 07:50:49
Из активной ячейки (в ней только имя, без расширения) Изменено: anvg — 04.06.2013 07:52:42 |
||
lenok Пользователь Сообщений: 39 |
#21 04.06.2013 08:07:46 все, поняла….. все работает…спасибо большое…. и еще один вопрос, если можно….: до этого было прописано так, но он только с одной папки так открывает….
Изменено: lenok — 04.06.2013 23:58:03 |
||
KuklP Пользователь Сообщений: 14868 E-mail и реквизиты в профиле. |
#22 04.06.2013 08:24:36 А на кой тут цикл? Если имя файла известно, зачем перебирать все файлы?
Я сам — дурнее всякого примера! … |
||
lenok Пользователь Сообщений: 39 |
он не открывает тогда файл в поддиректории |
KuklP Пользователь Сообщений: 14868 E-mail и реквизиты в профиле. |
Ага. А с циклом, следовательно, открывает? Я сам — дурнее всякого примера! … |
lenok Пользователь Сообщений: 39 |
неа… тоже не открывает…. а надо, чтобы открывал… там мне уже без разницы, есть цикл или нет… надо, чтобы он поддиректории просматривал |
anvg Пользователь Сообщений: 11878 Excel 2016, 365 |
#26 04.06.2013 09:43:56
|
|
lenok Пользователь Сообщений: 39 |
|
Sandero Пользователь Сообщений: 14 |
#28 18.06.2019 13:20:28
Добрый день!
|
||||
Функция 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
- 301904 просмотра
Не получается применить макрос? Не удаётся изменить код под свои нужды?
Оформите заказ у нас на сайте, не забыв прикрепить примеры файлов, и описать, что и как должно работать.
0 / 0 / 0 Регистрация: 05.05.2013 Сообщений: 57 |
|
1 |
|
Поиск файла в папке по тексту из ячейки книги05.05.2013, 16:53. Показов 17658. Ответов 5
Добрый день форумчане. Прошу помощи у Вас.
0 |
Alex77755 11482 / 3773 / 677 Регистрация: 13.02.2009 Сообщений: 11,147 |
||||
05.05.2013, 20:24 |
2 |
|||
Для начала:
1 |
Казанский 15136 / 6410 / 1730 Регистрация: 24.09.2011 Сообщений: 9,999 |
||||
06.05.2013, 00:38 |
3 |
|||
Нужен код vba который смог бы пересмотреть эти файлы в папке Включая подпапки или нет? Добавлено через 3 часа 28 минут
2 |
0 / 0 / 0 Регистрация: 05.05.2013 Сообщений: 57 |
|
06.05.2013, 15:52 [ТС] |
4 |
Спасибо огромное, это именно то что мне нужно.
0 |
0 / 0 / 0 Регистрация: 05.05.2013 Сообщений: 57 |
|
14.05.2013, 14:32 [ТС] |
5 |
Доброго времени суток. Как то я сразу не подумал, и вот возникла в данном случае очередная проблема. Связана она с тем, что если вдруг в папке ктонибудь открывает старый файл и закрывает его потом с сохранением изменений, макросом потом этот файл воспринимается как самый свежий. Это не допустимо. Есть возможность сохранять файлы с датой, напимер «счет 12.05.2013». в таком случае необходима сортитовка по дате в названии файла. Как это сделать?
0 |
undefined7 259 / 7 / 1 Регистрация: 22.01.2013 Сообщений: 47 |
||||||||
14.05.2013, 14:58 |
6 |
|||||||
Доброго времени суток. Как то я сразу не подумал, и вот возникла в данном случае очередная проблема. Связана она с тем, что если вдруг в папке ктонибудь открывает старый файл и закрывает его потом с сохранением изменений, макросом потом этот файл воспринимается как самый свежий. Это не допустимо. Есть возможность сохранять файлы с датой, напимер «счет 12.05.2013». в таком случае необходима сортитовка по дате в названии файла. Как это сделать? Вот 2 макроса, первый — создаёт лист и в нём записывает все файлы которые есть в текущей книги, можно соаздавать такой лист, а потом оттуда отсортировать и открыть нужный
0 |
Skip to content
Как определить существует ли книга в папке
На чтение 2 мин. Просмотров 1.4k.
Что делает макрос: Данный макрос позволяет найти путь к определенному файлу, и проверить, существует ли книга в папке на компьютере.
Содержание
- Как макрос работает
- Код макроса
- Как работает этот код
- Как использовать
Как макрос работает
Данное действие называется функцией, а не процедурой sub. Данный макрос позволяет найти путь к любому файлу. В макросе, мы используем функцию Dir. Данная функция задает строку, представляющую собой имя файла, которого мы ищем. Эта функция может быть использована во многих отношениях, но в данный момент, мы используем его, чтобы найти путь к нужному нам файлу.
Код макроса
Function FileExists(FPath As String) As Boolean 'Шаг 1: Определить переменные. Dim FName As String 'Шаг 2: Использовать функцию Dir, чтобы получить Имя файла FName = Dir(FPath) 'Шаг 3: Если файл существует, возвращаем ИСТИНА, иначе ЛОЖЬ If FName <> "" Then FileExists = True _ Else: FileExists = False End Function
Как работает этот код
- Определяем переменную строку, содержащую имя файла, определённого из функции Dir. FName – это имя переменной строки.
- На шаге 2 устанавливаем переменную FName. Это выполняется посредством передачи переменной FPath к функции Dir. Переменная FPath проходит через выявленные функции (см. первую строку кода). Такой поиск позволяет четко прописать путь к файлу, ища его в качестве переменной.
- Если переменная FName не может быть выявлена, то это означает, что файла нет. Шаг 3 показывает либо ложный, либо истинный результат.
Как использовать
Для реализации этого макроса, вы можете скопировать и вставить его в стандартный модуль:
- Активируйте редактор Visual Basic, нажав ALT + F11.
- Щелкните правой кнопкой мыши имя проекта / рабочей книги в окне проекта.
- Выберите Insert➜Module.
- Введите или вставьте код во вновь созданном модуле.
Поиск файлов в каталоге по части имени из столбца таблицы |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |