Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Поиск по файлам - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Поиск по файлам (Макросы/Sub)
Поиск по файлам
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
 
Ответить
СообщениеДобрый день! Подскажите пожалуйста, где я ошибаюсь. Задача следующаяя: имеются файлы, которые эксель определяет. В этих файлах хранится текстовая информация. В главном файле задается критерий для поиска и кноркой активируется поиск, после чего найденные записи по всем файлам выводятся на лист главного. Но при поиске он ищет почему-то только в самом себе, а не в нужных.

[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]

Автор - scofield
Дата добавления - 28.09.2015 в 11:29
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
 
Ответить
СообщениеДобрый день!
Открывайте так: [vba]
Код
Set WB = Workbooks.Open(Filename:=pathtothefile)
[/vba] а потом ищите так: [vba]
Код
Set РезультатПоиска = WB.ActiveSheet.Cells.Find(ТекстДляПоиска, LookAt:=xlPart)
[/vba]

Автор - KSV
Дата добавления - 28.09.2015 в 11:58
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]
 
Ответить
СообщениеСпасибо, все заработало!)
Помогите, пожалуйста с выводом данных
[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]

Автор - scofield
Дата добавления - 28.09.2015 в 12:30
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
 
Ответить
Сообщение
необхожимо что бы записывалось сама ячейка
не понял вопрос...
вам так надо? [vba]
Код
СписокАдресовНайденныхЯчеек.Add РезультатПоиска.Address(0, 0), РезультатПоиска.Address(0, 0) ' в формате A1
СписокАдресовНайденныхЯчеек.Add РезультатПоиска.Address(,,,1), РезультатПоиска.Address.Address(,,,1) ' в формате [имя файла книги]Лист1!$A$1
[/vba]

Автор - KSV
Дата добавления - 28.09.2015 в 13:11
scofield Дата: Понедельник, 28.09.2015, 13:15 | Сообщение № 5
Группа: Пользователи
Ранг: Прохожий
Сообщений: 4
Репутация: 0 ±
Замечаний: 0% ±

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


Сообщение отредактировал scofield - Понедельник, 28.09.2015, 13:20
 
Ответить
СообщениеНу надо, что бы в конце вывод выводилась информация о файле (filenumber, Filename, pathtothefile, creationdate, filesize)и тут же текст найденной ячейки и ее адрес (формат А1), наверно нужно доп массив заводить

Автор - scofield
Дата добавления - 28.09.2015 в 13:15
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
 
Ответить
Сообщение
текст найденной ячейки и ее адрес
можно так [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
Дата добавления - 28.09.2015 в 14:32
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:\Users\User\Downloads\DDE", "*.xls*" ' добавляем в коллекцию файлы *.xls, *.xlsb, *.xlsm, *.xlsx
End Sub
[/vba][/p.s.]


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


Сообщение отредактировал KSV - Понедельник, 28.09.2015, 15:41
 
Ответить
Сообщениеи я бы написал так: [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:\Users\User\Downloads\DDE", "*.xls*" ' добавляем в коллекцию файлы *.xls, *.xlsb, *.xlsm, *.xlsx
End Sub
[/vba][/p.s.]

Автор - KSV
Дата добавления - 28.09.2015 в 15:39
scofield Дата: Понедельник, 28.09.2015, 16:04 | Сообщение № 8
Группа: Пользователи
Ранг: Прохожий
Сообщений: 4
Репутация: 0 ±
Замечаний: 0% ±

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

Автор - scofield
Дата добавления - 28.09.2015 в 16:04
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Поиск по файлам (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!