Добрый день! Подскажите пожалуйста, где я ошибаюсь. Задача следующаяя: имеются файлы, которые эксель определяет. В этих файлах хранится текстовая информация. В главном файле задается критерий для поиска и кноркой активируется поиск, после чего найденные записи по всем файлам выводятся на лист главного. Но при поиске он ищет почему-то только в самом себе, а не в нужных.
[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%)
' выводим результаты (список файлов, и их характеристик) на лист 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
' если нужна гиперссылка на файл во втором столбце 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]
Добрый день! Подскажите пожалуйста, где я ошибаюсь. Задача следующаяя: имеются файлы, которые эксель определяет. В этих файлах хранится текстовая информация. В главном файле задается критерий для поиска и кноркой активируется поиск, после чего найденные записи по всем файлам выводятся на лист главного. Но при поиске он ищет почему-то только в самом себе, а не в нужных.
[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%)
' выводим результаты (список файлов, и их характеристик) на лист 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
[/vba] Сюда записывается только Номер найденной строки, а если необхожимо что бы записывалось сама ячейка и ее адрес И как потом вывод в цикле организовать [vba]
' если нужна гиперссылка на файл во втором столбце ActiveSheet.Hyperlinks.Add Range("b" & Rows.Count).End(xlUp), pathtothefile, "", _ "Открыть файл" & vbNewLine & Filename Next
[/vba]
Спасибо, все заработало!) Помогите, пожалуйста с выводом данных [vba]
[/vba] Сюда записывается только Номер найденной строки, а если необхожимо что бы записывалось сама ячейка и ее адрес И как потом вывод в цикле организовать [vba]
' если нужна гиперссылка на файл во втором столбце ActiveSheet.Hyperlinks.Add Range("b" & Rows.Count).End(xlUp), pathtothefile, "", _ "Открыть файл" & vbNewLine & Filename Next
Ну надо, что бы в конце вывод выводилась информация о файле (filenumber, Filename, pathtothefile, creationdate, filesize)и тут же текст найденной ячейки и ее адрес (формат А1), наверно нужно доп массив заводить
Ну надо, что бы в конце вывод выводилась информация о файле (filenumber, Filename, pathtothefile, creationdate, filesize)и тут же текст найденной ячейки и ее адрес (формат А1), наверно нужно доп массив заводитьscofield
Сообщение отредактировал scofield - Понедельник, 28.09.2015, 13:20
что бы в конце вывод выводилась информация о файле
можно объявить на уровне модуля [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]
Код
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
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.]
и я бы написал так: [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