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

Вход

Регистрация

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

 

= Мир MS Excel/Поиск слова в файле (ах) из папки - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Поиск слова в файле (ах) из папки (Макросы/Sub)
Поиск слова в файле (ах) из папки
Yar4i Дата: Четверг, 23.03.2017, 16:32 | Сообщение № 1
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 137
Репутация: 1 ±
Замечаний: 0% ±

Excel 2010
Добрый вечер дамы и господа :D
Наткнулся на макрос поиска по группе Excel файлов по заданному слову/цифре:
[vba]
Код
Option Explicit
Sub Поиск()
Dim iShtName$, iPath$, iFileName$, firstAddress$
Dim iSheet As Worksheet, iFoundSht As Worksheet
Dim iTempWB As Workbook, iBazaWB As Workbook
Dim TextToFind As Variant, iFoundRng As Range
Dim FD As FileDialog, iLastRow&
Dim FoundAny As Boolean
    TextToFind = Application.InputBox("Введите текст для поиска:", "Поиск")
    If TextToFind = "" Or TextToFind = False Then Exit Sub
    TextToFind = Trim(TextToFind)
    Set FD = Application.FileDialog(msoFileDialogFilePicker)
    With FD
        .AllowMultiSelect = False
        .Title = "Укажите любой файл в папке"
        .ButtonName = "Выбрать папку"
        If .Show = False Then Exit Sub Else iPath = Mid(.SelectedItems(1), 1, InStrRev(.SelectedItems(1), "\"))
    End With
    Set FD = Nothing
    Workbooks.Add
    Sheets.Add.Name = "Поиск"
    Set iFoundSht = ActiveSheet
    iFoundSht.Cells(1, 1) = "Ищем: " & TextToFind
    iFoundSht.Cells(1, 1).Font.Bold = True
    With Application
        .ScreenUpdating = False
        .Calculation = xlManual
        .StatusBar = "Идёт поиск..."
        .ShowWindowsInTaskbar = False
        iFileName = Dir(iPath & "*.xls*")
        Do While iFileName$ <> ""
            Set iTempWB = Workbooks.Open(Filename:=iPath & iFileName, UpdateLinks:=False, ReadOnly:=True)
            For Each iSheet In iTempWB.Sheets
                If iSheet.FilterMode = True Then iSheet.ShowAllData
                Set iFoundRng = iSheet.Cells.Find(What:=TextToFind, LookIn:=xlFormulas, LookAt:=xlPart)
                If Not iFoundRng Is Nothing Then
                    FoundAny = True
                    firstAddress = iFoundRng.Address
                    Do
                        With iFoundSht
                            iLastRow = .Cells(.Rows.Count, 1).End(xlUp).Row
                            If iLastRow = 1 Then iLastRow = 2
                            If iShtName <> iSheet.Name Then
                    With .Cells(iLastRow + 2, 1)
                    .Value = "Файл: " & iTempWB.Name & ", Лист: " & iSheet.Name
                    .Font.Bold = True
                    End With
                            End If
                            iFoundRng.EntireRow.Copy Destination:=.Cells(.Cells(.Rows.Count, 1).End(xlUp).Row + 1, 1)
                            iShtName = iSheet.Name
                        End With
                        Set iFoundRng = iSheet.Cells.FindNext(iFoundRng)
                    Loop While iFoundRng.Address <> firstAddress
                Else
                End If
            Next
            iTempWB.Close SaveChanges:=False
            iFileName = Dir
        Loop
        .StatusBar = False
        .ShowWindowsInTaskbar = True
        .EnableEvents = True
        .Calculation = xlCalculationAutomatic
        .ScreenUpdating = True
    End With
    If FoundAny = False Then
        MsgBox "Текст '" & TextToFind & "' ни в одном из файлов в папке:" & Chr(10) & iPath & Chr(10) & " не был найден!", 48, "Отчёт"
        iFoundSht.Parent.Close SaveChanges:=False
        Exit Sub
    End If
    MsgBox "Поиск " & TextToFind & " завершён!", 64, "Поиск"
'Range("A:T" & Range("A" & Rows.Count).End(xlUp).Row).FormulaR1C1 = "=SUM(R[-14]C:R[-1]C)"
'Selection.AutoFill Destination:=("A" & Rows.Count), Type:=xlFillDefault
's = Range("A:T" & Rows.Count).End(xlUp).Row
'Cells(s + 1, 1) = "=SUM(R[-14]C:R[-1]C)"
End Sub
[/vba]
Данный код не работает, если искомое слово находится в строке с незаполненной первой ячейкой (она же "A"). Т.е. во вложенном примере - слово "щеб" не найдётся из-за пустой ячейки "A482")
И отвечают за эту беду эти строки:
[vba]
Код
iFoundSht.Cells(1, 1) = "Ищем: " & TextToFind
iFoundSht.Cells(1, 1).Font.Bold = True
[/vba]
Пытался через Range, но вдруг не всё заполнено и понапрасну пускать поиск в пустые ячейки. А вот бы по поиску последней заполненной ячейке... Ммммм

(Мне как раз надо найти последнюю заполненную строку и чуть ниже просуммировать всё то, что лежит выше по соответствующему столбцу. Т.е. на примере: "A140:S140"
A140=СУММ(A1:A139) , B140=СУММ(B1:B139) и т.д. до последнего заполненного столбца (здесь "S").)
К сообщению приложен файл: 5454.xlsx (87.5 Kb)


Сообщение отредактировал Yar4i - Четверг, 23.03.2017, 16:34
 
Ответить
СообщениеДобрый вечер дамы и господа :D
Наткнулся на макрос поиска по группе Excel файлов по заданному слову/цифре:
[vba]
Код
Option Explicit
Sub Поиск()
Dim iShtName$, iPath$, iFileName$, firstAddress$
Dim iSheet As Worksheet, iFoundSht As Worksheet
Dim iTempWB As Workbook, iBazaWB As Workbook
Dim TextToFind As Variant, iFoundRng As Range
Dim FD As FileDialog, iLastRow&
Dim FoundAny As Boolean
    TextToFind = Application.InputBox("Введите текст для поиска:", "Поиск")
    If TextToFind = "" Or TextToFind = False Then Exit Sub
    TextToFind = Trim(TextToFind)
    Set FD = Application.FileDialog(msoFileDialogFilePicker)
    With FD
        .AllowMultiSelect = False
        .Title = "Укажите любой файл в папке"
        .ButtonName = "Выбрать папку"
        If .Show = False Then Exit Sub Else iPath = Mid(.SelectedItems(1), 1, InStrRev(.SelectedItems(1), "\"))
    End With
    Set FD = Nothing
    Workbooks.Add
    Sheets.Add.Name = "Поиск"
    Set iFoundSht = ActiveSheet
    iFoundSht.Cells(1, 1) = "Ищем: " & TextToFind
    iFoundSht.Cells(1, 1).Font.Bold = True
    With Application
        .ScreenUpdating = False
        .Calculation = xlManual
        .StatusBar = "Идёт поиск..."
        .ShowWindowsInTaskbar = False
        iFileName = Dir(iPath & "*.xls*")
        Do While iFileName$ <> ""
            Set iTempWB = Workbooks.Open(Filename:=iPath & iFileName, UpdateLinks:=False, ReadOnly:=True)
            For Each iSheet In iTempWB.Sheets
                If iSheet.FilterMode = True Then iSheet.ShowAllData
                Set iFoundRng = iSheet.Cells.Find(What:=TextToFind, LookIn:=xlFormulas, LookAt:=xlPart)
                If Not iFoundRng Is Nothing Then
                    FoundAny = True
                    firstAddress = iFoundRng.Address
                    Do
                        With iFoundSht
                            iLastRow = .Cells(.Rows.Count, 1).End(xlUp).Row
                            If iLastRow = 1 Then iLastRow = 2
                            If iShtName <> iSheet.Name Then
                    With .Cells(iLastRow + 2, 1)
                    .Value = "Файл: " & iTempWB.Name & ", Лист: " & iSheet.Name
                    .Font.Bold = True
                    End With
                            End If
                            iFoundRng.EntireRow.Copy Destination:=.Cells(.Cells(.Rows.Count, 1).End(xlUp).Row + 1, 1)
                            iShtName = iSheet.Name
                        End With
                        Set iFoundRng = iSheet.Cells.FindNext(iFoundRng)
                    Loop While iFoundRng.Address <> firstAddress
                Else
                End If
            Next
            iTempWB.Close SaveChanges:=False
            iFileName = Dir
        Loop
        .StatusBar = False
        .ShowWindowsInTaskbar = True
        .EnableEvents = True
        .Calculation = xlCalculationAutomatic
        .ScreenUpdating = True
    End With
    If FoundAny = False Then
        MsgBox "Текст '" & TextToFind & "' ни в одном из файлов в папке:" & Chr(10) & iPath & Chr(10) & " не был найден!", 48, "Отчёт"
        iFoundSht.Parent.Close SaveChanges:=False
        Exit Sub
    End If
    MsgBox "Поиск " & TextToFind & " завершён!", 64, "Поиск"
'Range("A:T" & Range("A" & Rows.Count).End(xlUp).Row).FormulaR1C1 = "=SUM(R[-14]C:R[-1]C)"
'Selection.AutoFill Destination:=("A" & Rows.Count), Type:=xlFillDefault
's = Range("A:T" & Rows.Count).End(xlUp).Row
'Cells(s + 1, 1) = "=SUM(R[-14]C:R[-1]C)"
End Sub
[/vba]
Данный код не работает, если искомое слово находится в строке с незаполненной первой ячейкой (она же "A"). Т.е. во вложенном примере - слово "щеб" не найдётся из-за пустой ячейки "A482")
И отвечают за эту беду эти строки:
[vba]
Код
iFoundSht.Cells(1, 1) = "Ищем: " & TextToFind
iFoundSht.Cells(1, 1).Font.Bold = True
[/vba]
Пытался через Range, но вдруг не всё заполнено и понапрасну пускать поиск в пустые ячейки. А вот бы по поиску последней заполненной ячейке... Ммммм

(Мне как раз надо найти последнюю заполненную строку и чуть ниже просуммировать всё то, что лежит выше по соответствующему столбцу. Т.е. на примере: "A140:S140"
A140=СУММ(A1:A139) , B140=СУММ(B1:B139) и т.д. до последнего заполненного столбца (здесь "S").)

Автор - Yar4i
Дата добавления - 23.03.2017 в 16:32
K-SerJC Дата: Пятница, 24.03.2017, 08:54 | Сообщение № 2
Группа: Проверенные
Ранг: Обитатель
Сообщений: 487
Репутация: 86 ±
Замечаний: 0% ±

Excel 2013
есть предположение, что код последнюю ячейку при поиске определяет по 1 столбцу.
[vba]
Код
iLastRow = .Cells(.Rows.Count, 1).End(xlUp).Row
[/vba]
попробуйте заменить:
[vba]
Код
iLastRow = .Cells.SpecialCells(xlLastCell).Row
[/vba]


Благими намерениями выстелена дорога в АД.

Сообщение отредактировал K-SerJC - Пятница, 24.03.2017, 08:55
 
Ответить
Сообщениеесть предположение, что код последнюю ячейку при поиске определяет по 1 столбцу.
[vba]
Код
iLastRow = .Cells(.Rows.Count, 1).End(xlUp).Row
[/vba]
попробуйте заменить:
[vba]
Код
iLastRow = .Cells.SpecialCells(xlLastCell).Row
[/vba]

Автор - K-SerJC
Дата добавления - 24.03.2017 в 08:54
Wasilich Дата: Пятница, 24.03.2017, 10:15 | Сообщение № 3
Группа: Друзья
Ранг: Старожил
Сообщений: 1232
Репутация: 326 ±
Замечаний: 0% ±

2003
надо найти последнюю заполненную строку и чуть ниже просуммировать
Предполагаю, речь идет об этой строке кода[vba]
Код
Range("A:T" & Range("A" & Rows.Count).End(xlUp).Row).FormulaR1C1 = "=SUM(R[-14]C:R[-1]C)"
[/vba]Во первых, проверка идет по столбцу А - Range("A" & Rows.Count), аон почти весь пустой, во вторых в Range("A:T" & Range("A" & Rows.Count)... строка определяется только для столбца Т, а для А нет. В третьих, формуле R[-14] это на 14 строк выше, то есть суммироваться будут строки 139 и 139-14=125.
Попробуйте такую химию: :) [vba]
Код
rw = Range("D" & Rows.Count).End(xlUp).Row + 1
Range("A" & rw & ":T" & rw).FormulaR1C1 = "=SUM(R[" & -(rw - 1) & "]C:R[-1]C)"
[/vba]
 
Ответить
Сообщение
надо найти последнюю заполненную строку и чуть ниже просуммировать
Предполагаю, речь идет об этой строке кода[vba]
Код
Range("A:T" & Range("A" & Rows.Count).End(xlUp).Row).FormulaR1C1 = "=SUM(R[-14]C:R[-1]C)"
[/vba]Во первых, проверка идет по столбцу А - Range("A" & Rows.Count), аон почти весь пустой, во вторых в Range("A:T" & Range("A" & Rows.Count)... строка определяется только для столбца Т, а для А нет. В третьих, формуле R[-14] это на 14 строк выше, то есть суммироваться будут строки 139 и 139-14=125.
Попробуйте такую химию: :) [vba]
Код
rw = Range("D" & Rows.Count).End(xlUp).Row + 1
Range("A" & rw & ":T" & rw).FormulaR1C1 = "=SUM(R[" & -(rw - 1) & "]C:R[-1]C)"
[/vba]

Автор - Wasilich
Дата добавления - 24.03.2017 в 10:15
Yar4i Дата: Пятница, 24.03.2017, 10:18 | Сообщение № 4
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 137
Репутация: 1 ±
Замечаний: 0% ±

Excel 2010
Предполагаю

Спасибо. По первой ячейке ищет последнюю. И в случае пустой "A" ставит там формулу, не смотря на то что в "B:T" могут быть символы//цифры.
С рабочего кода перенёс это, но вижу только Debug [vba]
Код
Range("A1:T" & Range("A" & Rows.Count).End(xlUp).Row) + 1
[/vba], ой для "T" только , понял.

[vba]
Код
rw = Range("D" & Rows.Count).End(xlUp).Row + 1
Range("A" & rw & ":T" & rw).FormulaR1C1 = "=SUM(R[" & -(rw - 1) & "]C:R[-1]C)"
[/vba] здесь он ищет последнюю пустую по "D" и заполняет формулой строку от "A" до "T". Но как заставить искать по массиву "A:D" ?

Все коды просмотрел - поиск по массиву не нашел рабочий.
А если сначала найти самый нижний заполненный столбец NS, а потом этот столбец использовать в [vba]
Код
Range("NS" & Range("A" & Rows.Count).End(xlUp).Row+1)
[/vba]


Сообщение отредактировал Yar4i - Пятница, 24.03.2017, 11:31
 
Ответить
Сообщение
Предполагаю

Спасибо. По первой ячейке ищет последнюю. И в случае пустой "A" ставит там формулу, не смотря на то что в "B:T" могут быть символы//цифры.
С рабочего кода перенёс это, но вижу только Debug [vba]
Код
Range("A1:T" & Range("A" & Rows.Count).End(xlUp).Row) + 1
[/vba], ой для "T" только , понял.

[vba]
Код
rw = Range("D" & Rows.Count).End(xlUp).Row + 1
Range("A" & rw & ":T" & rw).FormulaR1C1 = "=SUM(R[" & -(rw - 1) & "]C:R[-1]C)"
[/vba] здесь он ищет последнюю пустую по "D" и заполняет формулой строку от "A" до "T". Но как заставить искать по массиву "A:D" ?

Все коды просмотрел - поиск по массиву не нашел рабочий.
А если сначала найти самый нижний заполненный столбец NS, а потом этот столбец использовать в [vba]
Код
Range("NS" & Range("A" & Rows.Count).End(xlUp).Row+1)
[/vba]

Автор - Yar4i
Дата добавления - 24.03.2017 в 10:18
K-SerJC Дата: Пятница, 24.03.2017, 12:39 | Сообщение № 5
Группа: Проверенные
Ранг: Обитатель
Сообщений: 487
Репутация: 86 ±
Замечаний: 0% ±

Excel 2013
таки не понято что надо...
во всех файлах текст найти или суммы в последних ячейках проставить?


Благими намерениями выстелена дорога в АД.
 
Ответить
Сообщениетаки не понято что надо...
во всех файлах текст найти или суммы в последних ячейках проставить?

Автор - K-SerJC
Дата добавления - 24.03.2017 в 12:39
Yar4i Дата: Пятница, 24.03.2017, 13:58 | Сообщение № 6
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 137
Репутация: 1 ±
Замечаний: 0% ±

Excel 2010
таки не понято что надо

боялся этого вопроса, но надо найти текст во всех файлах, согласно темы. В скобках добавил схожую беду встречающуюся в приложенном коде. Не могу найти возможность поиска последней строки по целому массиву, а не по одному столбцу.
 
Ответить
Сообщение
таки не понято что надо

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

Автор - Yar4i
Дата добавления - 24.03.2017 в 13:58
Wasilich Дата: Пятница, 24.03.2017, 14:34 | Сообщение № 7
Группа: Друзья
Ранг: Старожил
Сообщений: 1232
Репутация: 326 ±
Замечаний: 0% ±

2003
возможность поиска последней строки по целому массиву
Второй вариант сообщ. №2.
Или так, строкИ и столбца.
[vba]
Код
iRow = Range("A1").SpecialCells(xlLastCell).Row
iClm = Range("A1").SpecialCells(xlLastCell).Column
[/vba]


Сообщение отредактировал Wasilich - Пятница, 24.03.2017, 14:38
 
Ответить
Сообщение
возможность поиска последней строки по целому массиву
Второй вариант сообщ. №2.
Или так, строкИ и столбца.
[vba]
Код
iRow = Range("A1").SpecialCells(xlLastCell).Row
iClm = Range("A1").SpecialCells(xlLastCell).Column
[/vba]

Автор - Wasilich
Дата добавления - 24.03.2017 в 14:34
Yar4i Дата: Пятница, 24.03.2017, 14:55 | Сообщение № 8
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 137
Репутация: 1 ±
Замечаний: 0% ±

Excel 2010
Второй вариант сообщ. №2

[vba]
Код
iLastRow = .Cells.SpecialCells(xlLastCell).Row
[/vba] заменял на это и всё равно упирается в первую пустую ячейку "A".
Вместо
[vba]
Код
iLastRow = .Cells(.Rows.Count, 1).End(xlUp).Row
iLastRow = .Cells.SpecialCells(xlLastCell).Row
[/vba] ставил:[vba]
Код
iRow = Range("A1").SpecialCells(xlLastCell).Row
iClm = Range("A1").SpecialCells(xlLastCell).Column
[/vba] ыделяет ошибкой iRow


Сообщение отредактировал Yar4i - Пятница, 24.03.2017, 15:29
 
Ответить
Сообщение
Второй вариант сообщ. №2

[vba]
Код
iLastRow = .Cells.SpecialCells(xlLastCell).Row
[/vba] заменял на это и всё равно упирается в первую пустую ячейку "A".
Вместо
[vba]
Код
iLastRow = .Cells(.Rows.Count, 1).End(xlUp).Row
iLastRow = .Cells.SpecialCells(xlLastCell).Row
[/vba] ставил:[vba]
Код
iRow = Range("A1").SpecialCells(xlLastCell).Row
iClm = Range("A1").SpecialCells(xlLastCell).Column
[/vba] ыделяет ошибкой iRow

Автор - Yar4i
Дата добавления - 24.03.2017 в 14:55
Wasilich Дата: Пятница, 24.03.2017, 15:46 | Сообщение № 9
Группа: Друзья
Ранг: Старожил
Сообщений: 1232
Репутация: 326 ±
Замечаний: 0% ±

2003
ыделяет ошибкой iRow
Ну не определена у вас переменная, Dim iRow. Замените на iLastRow. И вот еще код, определяет самую последнюю заполненную строку именно в диапазоне столбцов A:D
[vba]
Код
iLastRow = Columns("A:D").Find("*", [A1], SearchDirection:=xlPrevious).Row
[/vba]
 
Ответить
Сообщение
ыделяет ошибкой iRow
Ну не определена у вас переменная, Dim iRow. Замените на iLastRow. И вот еще код, определяет самую последнюю заполненную строку именно в диапазоне столбцов A:D
[vba]
Код
iLastRow = Columns("A:D").Find("*", [A1], SearchDirection:=xlPrevious).Row
[/vba]

Автор - Wasilich
Дата добавления - 24.03.2017 в 15:46
Yar4i Дата: Пятница, 24.03.2017, 16:54 | Сообщение № 10
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 137
Репутация: 1 ±
Замечаний: 0% ±

Excel 2010
Наверное не стыкуется поиск всех занятых ячеек с поисковым запросом, в данном случае "щебень".
В первом листе итог макроса. Наше всё и почему-то первая ячейка не пуста.
К сообщению приложен файл: 2578599.xlsm (87.2 Kb)
 
Ответить
СообщениеНаверное не стыкуется поиск всех занятых ячеек с поисковым запросом, в данном случае "щебень".
В первом листе итог макроса. Наше всё и почему-то первая ячейка не пуста.

Автор - Yar4i
Дата добавления - 24.03.2017 в 16:54
Wasilich Дата: Суббота, 25.03.2017, 00:45 | Сообщение № 11
Группа: Друзья
Ранг: Старожил
Сообщений: 1232
Репутация: 326 ±
Замечаний: 0% ±

2003
Наткнулся на макрос
и споткнулся! :D Не бывает готового макроса, что бы без вмешательства подошел к какой то задаче. В любом случае, конкретный макрос надо подгонять к конкретной таблице. Вот и у этого, малость другая задача. К вашей задаче его надо подгонять или переделывать.
 
Ответить
Сообщение
Наткнулся на макрос
и споткнулся! :D Не бывает готового макроса, что бы без вмешательства подошел к какой то задаче. В любом случае, конкретный макрос надо подгонять к конкретной таблице. Вот и у этого, малость другая задача. К вашей задаче его надо подгонять или переделывать.

Автор - Wasilich
Дата добавления - 25.03.2017 в 00:45
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Поиск слова в файле (ах) из папки (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

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