Vba excel поиск файла по маске

 

nurgaliev

Пользователь

Сообщений: 6
Регистрация: 08.02.2016

#1

08.02.2016 07:28:48

Всем здравствуйте,

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

Нижеприведенный код, копирует все файлы с подпапок (чьи имена взяты с отдельной колонки, SubFolder) без учета маски (взятой тоже c колонки, sMask) в папку с именем текстбокса (txt_banum) на рабочий стол пользователя.
Также, создается выборка — таблица фильтруется по txt_banum.Value и копируется на отдельный файл.

Как все же осуществить поиск по маске файлов во всех подпапках (без SubFolder)?
Через FSO пробовал, не получилось =(

Код
Private Sub cmd_ok_Click()
Dim sFilesPath As String, sNewPath As String, sMask As String
Dim sFolder As String, sFiles As String, SubFolder As String, sDoc As String
Dim sFile As String

If txt_banum.Text = "" Or Len(txt_banum.Text) < 13 Then
    MsgBox "НЕДОСТАТОЧНО СИМВОЛОВ!", vbCritical
    'Selection.AutoFilter
    Exit Sub
End If

lLastRow = Cells.SpecialCells(xlLastCell).Row
Set iskk = Sheets(2).Range("A:A").Find(txt_banum.Text, lookat:=xlWhole)

If Not iskk Is Nothing Then
ActiveSheet.Range("$A$1:$D$" & lLastRow).AutoFilter Field:=1, Criteria1:=txt_banum.Text

Range("$A$1:$D$" & lLastRow).Copy
Sheets("CurrData").Cells.Delete
Selection.Copy Sheets("CurrData").Range("A1")
Sheets("CurrData").Columns("A:D").ColumnWidth = 20

Selection.AutoFilter
Dim username1
Dim path As String

username1 = Environ("USERNAME")
path = "C:Users" & "" & username1 & "" & "Desktop" & "" & txt_banum.Value
check = Dir(path & Application.PathSeparator, vbDirectory)

With ThisWorkbook.Sheets("CurrData")
        If Len(check) > 0 Then
        MsgBox ("Папка " & txt_banum.Value & " уже существует")
        Else
        MkDir path
        End If
        NewPath = path & Application.PathSeparator & "Summary" & ".xlsx"
        ThisWorkbook.Sheets("CurrData").Copy
        ActiveWorkbook.SaveAs (NewPath)
        ActiveWorkbook.Close
End With
ThisWorkbook.Activate

sNewPath = path & Application.PathSeparator 'куда перемещать файлы

Application.ScreenUpdating = False
        kon = Sheets("CurrData").Range("I10000").End(xlUp).Row
            'kona = Sheets("CurrData").Range("C10000").End(xlUp).Row
        For i = 2 To kon
            SubFolder = Sheets("CurrData").Cells(i, 9).Value
            sDoc = Sheets("CurrData").Cells(i, 3).Value

sFilesPath = ThisWorkbook.path & "" & SubFolder & Application.PathSeparator 'откуда перемещать файлы
sMask = sDoc

    sFolder = sFilesPath
    sFiles = Dir(sFolder)
    
    Do While sFiles <> ""
        If InStr(sFiles, sMask) < 2 Then
    
            FileCopy sFolder & Application.PathSeparator & sFiles, sNewPath & Application.PathSeparator & sFiles
        End If
        sFiles = Dir
    Loop

    Application.ScreenUpdating = True
Next

txt_banum.Value = ""
MsgBox "Пакет документов создан в директории " & path

uf_main.Hide

Selection.AutoFilter
        Else: MsgBox "Номер не Найден!", vbCritical
        Sheets("CurrData").Cells.Delete
        Sheets(2).Select
        lLastRow = Cells.SpecialCells(xlLastCell).Row
        End If
End Sub
 

Юрий

Пользователь

Сообщений: 741
Регистрация: 03.01.2013

 

Апострофф

Пользователь

Сообщений: 720
Регистрация: 06.04.2015

 

nurgaliev

Пользователь

Сообщений: 6
Регистрация: 08.02.2016

Да, я попутно запостил вопросы еще на несколько форумов.

Быть может знаете как справиться с проблемой?

Изменено: nurgaliev08.02.2016 11:07:12

 

Апострофф

Пользователь

Сообщений: 720
Регистрация: 06.04.2015

#5

08.02.2016 08:43:36

Знаем, вот только желания тратить время впустую нет.

http://www.planetaexcel.ru/forum/index.php?PAGE_NAME=rules

Цитата
4. Не рекомендуется
   4.1. Создавать одинаковые темы или сообщения в разных форумах (cross-posting). Публикуя один и тот же вопрос в разных форумах и на дружественных сайтах вы заставляете сразу нескольких людей параллельно думать над вашей задачей и обесцениваете усилия тех, кто даст ответ вторым-третьим и т.д.
 

nurgaliev

Пользователь

Сообщений: 6
Регистрация: 08.02.2016

Мне просто нужен код для поиска по маске и копирования его в папку.  

 

Апострофф

Пользователь

Сообщений: 720
Регистрация: 06.04.2015

#7

08.02.2016 09:05:44

Поиск по маске —

Код
fn=dir(маска)
while fn>""
msgbox fn
fn=dir
wend

Копирование в папку —

Код
filecopy fn,папка + fn
 

Юрий М

Модератор

Сообщений: 60575
Регистрация: 14.09.2012

Контакты см. в профиле

#8

08.02.2016 10:27:42

Цитата
nurgaliev написал: Мне просто нужен код

А нам нужно, чтобы Вы информировали — где ещё разместили свои вопросы.

 

The_Prist

Пользователь

Сообщений: 14182
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

Вот еще кросс:

http://www.excel-vba.ru/forum/index.php?topic=4291.0

там основное решение и дали, но автор изменил предложенное, т.к. оказалось, что еще какие-то ТекстБоксы участие принимают и т.д. Файл Excel со всеми этими элементами автор выкладывать не хочет, следовательно, помогать проблематично по голому коду. А каждый раз писать, что нужен файл уже надоело, тем более что автор не может взять свой файл с формой и выложить только нужное — там много какой-то секретной информации.

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

nurgaliev

Пользователь

Сообщений: 6
Регистрация: 08.02.2016

Прикрепляю файл примера моего макроса. при активации листа Example выплывает текстбокс, куда нужно ввести, к примеру, Watches Casio 1500. Далее — фильтрация и создание выборки на отдельном файле в папке Watches Casio 1500 на рабочем столе юзера. Проблема в том, что идет копирование всех файлов из папок, а не файлов по маске).

Необходимо реализовать копирование лишь тех файлов, что соответствуют маске.  

 

Апострофф

Пользователь

Сообщений: 720
Регистрация: 06.04.2015

#11

09.02.2016 11:14:49

Глядим в книгу, видим знамо что —

Код
sMask = "*" & sDoc & "*" '!!!

    sFolder = sFilesPath
    
    
    sFiles = Dir(sFolder & sMask)

    Do While sFiles <> ""
        'If InStr(sFiles, sMask) < 2 Then 'чушь какая-то!!!

            FileCopy sFolder & Application.PathSeparator & sFiles, sNewPath & Application.PathSeparator & sFiles

        'End If
        sFiles = Dir
    Loop
 

nurgaliev

Пользователь

Сообщений: 6
Регистрация: 08.02.2016

всем спасибо) все получилось)

есть вопрос: как сделать поиск не в определенной папке, а в во всей директории, включая все подпапки? (не беря за основу название папки, где производить поиск)

 

Апострофф

Пользователь

Сообщений: 720
Регистрация: 06.04.2015

#13

11.02.2016 08:10:31

Цитата
nurgaliev написал:
как сделать поиск не в определенной папке, а в во всей директории

Что за беспомощность такая?
Сеть завалена примерами, да только всё не то — любимая отговорка.

Код
Option Compare Text

Sub MAIN()
 Dim FSO As Object
   Set FSO = CreateObject("Scripting.FileSystemObject")
   Search FSO.GetFolder("D:"), "*ABC*.JPG" 'ИЩЕМ В УКАЗАННОЙ ПАПКЕ ФАЙЛ С ЗАДАННОЙ МАСКОЙ
 End Sub
 
 Sub Search(Fold As Object, MASK$)
 Dim SubFold As Object
 Dim File As Object
   For Each File In Fold.Files
     If File.Name Like MASK Then MsgBox File.Path
   Next File
   On Error GoTo ErrHandle
   For Each SubFold In Fold.SubFolders
     Debug.Print SubFold.Path
     Search SubFold, MASK
   Next SubFold
   Exit Sub
ErrHandle:
   MsgBox "Нет допуска к папке """ & Fold.Path & """"
   Err.Clear
 End Sub
 

nurgaliev

Пользователь

Сообщений: 6
Регистрация: 08.02.2016

#14

15.02.2016 14:04:51

И снова у меня проблема: Код

Цитата
Апостроффа

я адаптировал, но при запуске макрос выводит сообщение «Нет Доступа..» и продолжает долго бесконечно грузится.

Код ниже отображает копирование из нынешней директории найденного файла, в новую указанную мной. Быть может ошибка здесь?

Код
For Each File In Fold.Files
     If File.Name Like MASK Then FSO.CopyFile File.Path, sNewPath & File.Name
   Next File

Макрос VBA загрузки списка файлов из папки

Функция 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


Студворк — интернет-сервис помощи студентам

Добрый день, подскажите, везде искал ничего подобного не смог найти. Хочу реализовать следующий макрос:
1. Есть файл на Листе1 задаю шапку в первой строке. (к примеру ячейка А1 Название B1 Описание и тд)
2. Потом запускаю макрос, выбираю нужный каталог и идет поиск по всем файлам ексель и ищет такую же шапку как я задал на Листе1, далее выводит файлы у которых шапки совпадают на Лист2 где выводит имя файла и путь к нему. Спасибо



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

Цитата
Сообщение от Vladimir287
Посмотреть сообщение

Есть файл на Листе1 задаю шапку в первой строке

Ну вот файл-то у Вас уже есть?



0



aequit

223 / 134 / 45

Регистрация: 08.09.2012

Сообщений: 283

Записей в блоге: 1

24.03.2017, 15:46

5

Цитата
Сообщение от Vladimir287
Посмотреть сообщение

я даже не знаю с чего начать

С Уокенбаха, «Профессиональное программирование на VBA». Или не пропускать лекции и слушать преподавателя, который Вам такие задания даёт Как потом работу искать, и, главное — работать?
И научитесь различать «шапку» и имя файла…

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Sub абырвалг()
    Dim sFolder As String
    Dim sFiles As String
    Dim arr() As String
    Dim iFls As Integer
    Dim sFilesShablon As String
    
    With Application.FileDialog(msoFileDialogFolderPicker)
        If .Show = False Then Exit Sub
        sFolder = .SelectedItems(1)
    End With
   
    sFilesShablon = Trim(Sheets(1).Range("A1"))
    sFolder = sFolder & IIf(Right(sFolder, 1) = Application.PathSeparator, "", Application.PathSeparator)
    sFiles = Dir(sFolder & "*" & sFilesShablon & "*.xls*")
    iFls = 0
    ReDim arr(iFls)
    Do While sFiles <> ""
        ReDim Preserve arr(iFls)
        arr(iFls) = sFolder & sFiles
        sFiles = Dir
        iFls = iFls + 1
    Loop
    For iFls = 0 To UBound(arr)
        Sheets(2).Cells(iFls + 1, 1) = arr(iFls)
    Next iFls
    Sheets(2).Activate
End Sub

Вложения

Тип файла: xls Files345.xls (40.5 Кб, 48 просмотров)



0



Формулировка задачи:

Знаю, много тем было… почерпал информацию там, но остался один вопрос,
как мне сделать, что в имени файла не было типа файла — в моем случае txt.
например у меня в папке фаайлы 1.txt и 2.txt, то нужно вывести просто 1 и 2. Не знаю как сделать

Код к задаче: «Поиск файлов»

textual

ИмяФайлаБезРасширения = FSO.GetBaseName(ИмяФайла)

Полезно ли:

8   голосов , оценка 4.500 из 5

Поиск по файлам

scofield

Дата: Понедельник, 28.09.2015, 11:29 |
Сообщение № 1

Группа: Пользователи

Ранг: Прохожий

Сообщений: 4


Репутация:

0

±

Замечаний:
0% ±


Excel 2013

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

[vba]

Код

Private Sub CommandButton1_Click()
ТекстДляПоиска = «ант»
[c1] = «C:UsersАдминистраторDesktopГУН»
‘ Ищем файлы в заданной папке по заданной маске,
‘ и выводим на лист список их параметров.
‘ Просматриваются папки с заданной глубиной вложения.

Dim coll As Collection, FolderPath$, searchmask$, searchdepth%
On Error Resume Next
FolderPath$ = [c1] ‘ берм из ячейки c1
searchmask$ = «*.*xl*» ‘ берм из ячейки c2
searchdepth% = 1 ‘ берм из ячейки c3
If searchdepth% = 0 Then searchdepth% = 999 ‘ без ограничения по глубине

‘ считываем в колекцию coll нужные имена файлов
Set coll = FilenamesCollection(FolderPath$, searchmask$, searchdepth%)

Application.ScreenUpdating = False ‘ отключаем обновление экрана

‘ выводим результаты (список файлов, и их характеристик) на лист
For i = 1 To coll.Count ‘ перебираем все элементы коллекции, содержащей пути к файлам

filenumber = i
pathtothefile = coll(i)
Filename = Dir(pathtothefile)
creationdate = FileDateTime(pathtothefile)
filesize = FileLen(pathtothefile)
filesize = FileOrFolderSize(filesize)
‘——————————————————————
ТекстДляПоиска = «*» & «ант» & «*»
Set СписокНомеровНайденныхСтрок = New Collection
On Error Resume Next ‘ отключаем останов при ошибке

Workbooks.Open Filename:=pathtothefile
Workbooks(pathtothefile).Activate
With ThisWorkbook.Worksheets(«Лист1»)
‘——————————————————————
ПоследняяСтрокаБД = .Range(«a» & .Rows.Count).End(xlUp).Row ‘ вычисляем номер последней строки
Dim РезультатПоиска As Range, АдресПервойНайденнойЯчейки As String

Set РезультатПоиска = Cells.Find(ТекстДляПоиска, LookAt:=xlPart) ‘ начинаем поиск

If Not РезультатПоиска Is Nothing Then ‘ если нашли хоть одну подходящую ячейку
АдресПервойНайденнойЯчейки = РезультатПоиска.Address ‘ запоминаем Адрес Первой Найденной Ячейки
НомерСтроки = РезультатПоиска.Row ‘ получаем номер строки, в которой найдена подходящая ячейка
СписокНомеровНайденныхСтрок.Add НомерСтроки, CStr(НомерСтроки) ‘ записываем номер строки в список
Do
‘ ищем следующую ячейку
Set РезультатПоиска = Cells.FindNext(РезультатПоиска)

If Not РезультатПоиска Is Nothing Then ‘ если нашли очередную подходящую ячейку
НомерСтроки = РезультатПоиска.Row ‘ получаем номер строки, в которой найдена подходящая ячейка
СписокНомеровНайденныхСтрок.Add НомерСтроки, CStr(НомерСтроки) ‘ записываем номер строки в список
End If

‘ повторяем поиск до тех пор, пока не дойдм до Первой Найденной Ячейки
Loop While РезультатПоиска.Address <> АдресПервойНайденнойЯчейки
End If
‘——————————————————————
End With
ActiveWorkbook.Close False

On Error GoTo 0 ‘ отключение режима пропуска ошибок
‘——————————————————————
Range(«a» & Rows.Count).End(xlUp).Offset(1).Resize(, 5).Value = _
Array(filenumber, Filename, pathtothefile, creationdate, filesize)

‘ если нужна гиперссылка на файл во втором столбце
ActiveSheet.Hyperlinks.Add Range(«b» & Rows.Count).End(xlUp), pathtothefile, «», _
«Открыть файл» & vbNewLine & Filename

Next

On Error GoTo 0

Range(«a:e»).EntireColumn.AutoFit ‘ автоподбор ширины столбцов
End Sub

[/vba]

Заранее благодарен. Просьба не судить за русскоязычные переменные, знаю что это не правильно.
[moder]Оформите код тегами (кнопка #)[/moder]

К сообщению приложен файл:

6067555.xlsm
(31.5 Kb)

Сообщение отредактировал scofieldПонедельник, 28.09.2015, 11:34

 

Ответить

KSV

Дата: Понедельник, 28.09.2015, 11:58 |
Сообщение № 2

Группа: Друзья

Ранг: Ветеран

Сообщений: 770


Репутация:

255

±

Замечаний:
0% ±


Excel 2013

Добрый день!
Открывайте так: [vba]

Код

Set WB = Workbooks.Open(Filename:=pathtothefile)

[/vba] а потом ищите так: [vba]

Код

Set РезультатПоиска = WB.ActiveSheet.Cells.Find(ТекстДляПоиска, LookAt:=xlPart)

[/vba]

К сообщению приложен файл:

8095689.xlsm
(29.6 Kb)


KSV.VBA@gmail.com
Яндекс.Деньги: 410011921213333

 

Ответить

scofield

Дата: Понедельник, 28.09.2015, 12:30 |
Сообщение № 3

Группа: Пользователи

Ранг: Прохожий

Сообщений: 4


Репутация:

0

±

Замечаний:
0% ±


Excel 2013

Спасибо, все заработало!)
Помогите, пожалуйста с выводом данных
[vba]

Код

СписокНомеровНайденныхСтрок.Add НомерСтроки, CStr(НомерСтроки)

[/vba]
Сюда записывается только Номер найденной строки, а если необхожимо что бы записывалось сама ячейка и ее адрес
И как потом вывод в цикле организовать
[vba]

Код

For j = 1 To СписокНомеровНайденныхСтрок.Count

                   НомерСтроки = СписокНомеровНайденныхСтрок.Item(j)

                        Range(«a» & Rows.Count).End(xlUp).Offset(1).Resize(, 6).Value = _
         Array(filenumber, Filename, pathtothefile, creationdate, filesize, НомерСтроки)

            ‘ если нужна гиперссылка на файл во втором столбце
         ActiveSheet.Hyperlinks.Add Range(«b» & Rows.Count).End(xlUp), pathtothefile, «», _
                    «Открыть файл» & vbNewLine & Filename
         Next

[/vba]

 

Ответить

KSV

Дата: Понедельник, 28.09.2015, 13:11 |
Сообщение № 4

Группа: Друзья

Ранг: Ветеран

Сообщений: 770


Репутация:

255

±

Замечаний:
0% ±


Excel 2013

необхожимо что бы записывалось сама ячейка

не понял вопрос…
вам так надо? [vba]

Код

СписокАдресовНайденныхЯчеек.Add РезультатПоиска.Address(0, 0), РезультатПоиска.Address(0, 0) ‘ в формате A1
СписокАдресовНайденныхЯчеек.Add РезультатПоиска.Address(,,,1), РезультатПоиска.Address.Address(,,,1) ‘ в формате [имя файла книги]Лист1!$A$1

[/vba]


KSV.VBA@gmail.com
Яндекс.Деньги: 410011921213333

 

Ответить

scofield

Дата: Понедельник, 28.09.2015, 13:15 |
Сообщение № 5

Группа: Пользователи

Ранг: Прохожий

Сообщений: 4


Репутация:

0

±

Замечаний:
0% ±


Excel 2013

Ну надо, что бы в конце вывод выводилась информация о файле (filenumber, Filename, pathtothefile, creationdate, filesize)и тут же текст найденной ячейки и ее адрес (формат А1), наверно нужно доп массив заводить

Сообщение отредактировал scofieldПонедельник, 28.09.2015, 13:20

 

Ответить

KSV

Дата: Понедельник, 28.09.2015, 14:32 |
Сообщение № 6

Группа: Друзья

Ранг: Ветеран

Сообщений: 770


Репутация:

255

±

Замечаний:
0% ±


Excel 2013

текст найденной ячейки и ее адрес

можно так [vba]

Код

СписокАдресовНайденныхЯчеек.Add РезультатПоиска.Value, РезультатПоиска.Address(0, 0)

[/vba]

что бы в конце вывод выводилась информация о файле

можно объявить на уровне модуля [vba]

Код

Dim coll As New Collection

[/vba]
и в GetAllFileNamesUsingFSO сохранять инфу о файле [vba]

Код

    For Each fil In curfold.Files    ‘ перебираем все файлы в папке FolderPath
         coll.Add Array(fil.Name, fil.Path, fil.DateCreated, fil.Size)
     Next

[/vba]
а потом ее можно выводить так [vba]

Код

    ‘ выводим результаты (список файлов, и их характеристик) на лист
     For i = 1 To coll.Count    ‘ перебираем все элементы коллекции, содержащей пути к файлам

                   ‘…

                   With Range(«a» & Rows.Count).End(xlUp).Offset(1)
             .Value = i                    ‘ номер файла
             .Offset(, 1).Resize(, 4).Value = coll(i)    ‘ инфа о файле
             With .Cells(, 2)
                 Filename = .Value
                 .Hyperlinks.Add .Cells(1), .Cells(, 2), , «Открыть файл» & vbNewLine & Filename, Filename
             End With
         End With
     Next

[/vba]


KSV.VBA@gmail.com
Яндекс.Деньги: 410011921213333

 

Ответить

KSV

Дата: Понедельник, 28.09.2015, 15:39 |
Сообщение № 7

Группа: Друзья

Ранг: Ветеран

Сообщений: 770


Репутация:

255

±

Замечаний:
0% ±


Excel 2013

и я бы написал так: [vba]

Код

Dim colFileInfo As New Collection

Sub GetFilesInfo(ByVal DirPath As String, Optional ByVal FileMask As String = «*», _
                     Optional ByVal SearchDeep As Long = 999)
      ‘ Получает в качестве параметра путь к папке DirPath,
      ‘ маску имени искомых файлов Mask (будут отобраны только файлы с такой маской/расширением)
      ‘ и глубину поиска SearchDeep в подпапках (если SearchDeep=1, то подпапки не просматриваются).
      ‘ Возвращает коллекцию, содержащую полные пути найденных файлов
      ‘ (применяется рекурсивный вызов процедуры GetAllFileNamesUsingFSO)
      Dim FSO As Object
      Set FSO = CreateObject(«Scripting.FileSystemObject»)                ‘ создаём экземпляр FileSystemObject
      GetFilesInfoUsingFSO FSO.GetFolder(DirPath), FileMask, SearchDeep   ‘ поиск
      Set FSO = Nothing: Application.StatusBar = False                    ‘ очистка строки состояния Excel
End Sub

      Private Function GetFilesInfoUsingFSO(objFolder As Object, ByVal FileMask As String, ByVal SearchDeep As Long)
      ‘ перебирает все файлы и подпапки, используя объект FSO
      ‘ перебор папок осуществляется в том случае, если SearchDeep > 1
      ‘ добавляет пути найденных файлов в коллекцию colFileInfo

              ‘ раскомментируйте эту строку для вывода пути к просматриваемой
      ‘ в текущий момент папке в строку состояния Excel
      ‘Application.StatusBar = «Поиск в папке: » & objFolder.Path

              Dim objFile As Object
      For Each objFile In objFolder.Files ‘ перебираем все файлы в папке
          With objFile
              If .Name Like FileMask Then colFileInfo.Add Array(.Name, .Path, .DateCreated, .Size)
          End With
      Next

              SearchDeep = SearchDeep — 1                     ‘ уменьшаем глубину поиска в подпапках
      If SearchDeep Then                    ‘ если надо искать глубже
          For Each objFolder In objFolder.SubFolders  ‘ перебираем все подпапки в папке
              GetFilesInfoUsingFSO objFolder, FileMask, SearchDeep
          Next
      End If
End Function

[/vba]
[p.s.]для заполнения коллекции colFileInfo нужно вызвать процедуру GetFilesInfo [vba]

Код

Sub test()
      GetFilesInfo «C:UsersUserDownloadsDDE», «*.xls*» ‘ добавляем в коллекцию файлы *.xls, *.xlsb, *.xlsm, *.xlsx
End Sub

[/vba][/p.s.]


KSV.VBA@gmail.com
Яндекс.Деньги: 410011921213333

Сообщение отредактировал KSVПонедельник, 28.09.2015, 15:41

 

Ответить

scofield

Дата: Понедельник, 28.09.2015, 16:04 |
Сообщение № 8

Группа: Пользователи

Ранг: Прохожий

Сообщений: 4


Репутация:

0

±

Замечаний:
0% ±


Excel 2013

Спасибо большое за помощь, все заработало как надо

 

Ответить

Понравилась статья? Поделить с друзьями:
  • Vba excel поиск файла если
  • Vba excel поиск текста в ячейке
  • Vba excel поиск текста в файле
  • Vba excel поиск текста в массиве
  • Vba excel поиск текста в диапазоне