Расширение стандартного поиска. Как искать списки слов в Excel? - VBA

Узнай цену своей работы

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

На входе задается список слов или фраз (например, через буфер обмена, или на отдельном листе). Макрос ищет вхождение любого слова на ВСЕХ листах открытой книги, и выводит итоговую таблицу (но новом листе или в диалоговом окне), где указаны имя листа, адрес ячейки, найденное значение. При клике переходим к ячейке, содержащей совпадение. Если какое-то слово нигде не найдено, то напротив него пишется "не найдено". Т.е. это тоже самое, что и стандартный поиск "CTRL+F", только задается не одно слово, а список слов (фраз). Я не смог изменить все найденные в инете решения под себя и реализовать такой скрипт, т.к. у меня очень небольшие знания VBA (знаю только простейшие операции копировать/вставить, условие, цикл). Итого. На входе: Список слов (фраз), каждая фраза с новой строки На выходе: 1. Таблица или диалоговое окно, которая содержит все исходные фразы и все найденные ядреса ячеек. Т.е. эквивалент стандартного окна CTRL+F; поиск по всей книге; кнопка "Найти все". 2. Эта таблица или диалоговое окно содержит ссылки на ячейки, где встретились совпадения (как и окно стандартного поиска, чтобы можно было перейти к конкретной ячейке на конкретном листе) 3. Для слов и фраз, для которых ничего не найдено, выводится "не найдено". Помогите мне, пожалуйста=)

Решение задачи: «Расширение стандартного поиска. Как искать списки слов в Excel?»

textual
Листинг программы
Option Explicit
Sub pr3()
    Dim sh As Worksheet, t$
    Dim lLastRow As Long, lLastCol As Long, LastRow As Long, r As Long, i As Long, j As Long
    Dim PathFileTxt As String
    Dim dic As Object
    Dim el As Variant
    Dim a
    
    Windows("искать тут.xlsm").Activate
      
    'альтернативный способ задать массив без открытия файла. не подходит для фраз, состоящих более чем из одного слова.
    'a = Split(CreateObject("Scripting.FileSystemObject").Getfile(ActiveWorkbook.Path & "\ИД.txt").OpenasTextStream(1).ReadAll, vbNewLine)
      
    'открываем файл с Исходными Данными
    PathFileTxt = ActiveWorkbook.Path & "\ИД.txt"
    Workbooks.OpenText Filename:=PathFileTxt, Origin:=1251
    Columns("A:A").Select
      
    'разбиваем по столбцам чтобы найти слова, а не фразы
    Selection.TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
        TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=False, _
        Semicolon:=False, Comma:=False, Space:=True, Other:=False, FieldInfo _
        :=Array(1, 1), TrailingMinusNumbers:=True
      
      
    'удаляем пустые строки
    LastRow = ActiveSheet.UsedRange.Row - 1 + ActiveSheet.UsedRange.Rows.Count    'определяем размеры таблицы
    Application.ScreenUpdating = False
    For r = LastRow To 1 Step -1           'проходим от последней строки до первой
        If Application.CountA(Rows(r)) = 0 Then Rows(r).Delete   'если в строке пусто - удаляем ее
    Next r
        
      
    'определяем последнюю ячейку с данными
    With ActiveSheet.UsedRange: End With
    lLastRow = ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count - 1
    lLastCol = ActiveSheet.UsedRange.Column + ActiveSheet.UsedRange.Columns.Count - 1
      
    'задаем массив исходных данных
    'a = [a1].CurrentRegion.Value       'ограничивает диапазон первой пустой строкой/столбцом, не подходит
    a = Range(Cells(1, 1), Cells(lLastRow, lLastCol)).Value
    ActiveWorkbook.Close False
      
    'создаем словарь с исходными данными для поиска
    Set dic = CreateObject("scripting.dictionary")
    dic.comparemode = 1
    With dic
        For Each el In a
            If el <> "" Then
             .Item(el) = ""
            End If
        Next
'        MsgBox "Список ключей для поиска:" & vbLf & vbLf & Join(.keys, vbLf)
    'ищем в словаре совпадения на наших листах
        For Each sh In Sheets
            'определяем последнюю ячейку с данными
            With sh.UsedRange: End With
            lLastRow = sh.UsedRange.Row + sh.UsedRange.Rows.Count - 1
            lLastCol = sh.UsedRange.Column + sh.UsedRange.Columns.Count - 1
            'задаем массив
            a = sh.Range(sh.Cells(1, 1), sh.Cells(lLastRow, lLastCol)).Value
            'a = [a1].CurrentRegion.Value       'ограничивает диапазон первой пустой строкой/столбцом
            'забиваем словарь адресами ячеек, в которых есть совпадения с ИД
            For i = 1 To UBound(a)
                For j = 1 To UBound(a, 2)
                    t = a(i, j)
'                    MsgBox "=ГИПЕРССЫЛКА(""[" & Application.ActiveWorkbook.FullName & "]" & sh.Name & "!""&АДРЕС(" & i & ";" & j & ");""" & sh.Name & "!""&АДРЕС(" & i & ";" & j & "))"
                    If .exists(t) Then .Item(t) = .Item(t) & IIf(.Item(t) = "", "", "|") & "=ГИПЕРССЫЛКА(""[" & Application.ActiveWorkbook.FullName & "]" & sh.Name & "!""&АДРЕС(" & i & ";" & j & ");""" & sh.Name & "!""&АДРЕС(" & i & ";" & j & ";4))"
                Next
            Next
              
        Next
          
'вытаскиваем из словаря ключи (keys) и их значения (items)
        Dim aK, aI, aSP, s As String, ss As String
        Dim lMaxC As Long, lc As Long
        aK = .keys
        aI = .items
        ReDim a(1 To .Count, 1 To 100)
        For i = 1 To .Count
            a(i, 1) = aK(i - 1)
            s = .Item((aK(i - 1)))
            If s <> "" Then
                aSP = Split(s, "|")
                lc = UBound(aSP) + 1
                If lMaxC < lc Then
                    lMaxC = lc
                End If
                For lc = LBound(aSP) To UBound(aSP)
                    ss = aSP(lc)
                    a(i, lc + 2) = ss
                Next
            End If
        Next
 
        'создаем новую книгу
        Workbooks.Add
 
        'вставляем данные на лист
        ActiveSheet.[a1].Resize(.Count, lMaxC + 1).FormulaLocal = a
         
        Columns("B:XFD").EntireColumn.AutoFit
        Range("A1").Activate
        Application.ScreenUpdating = True
'        MsgBox "Done!"
'        ActiveWorkbook.Close False
    End With
 End Sub

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 3.2 из 5
Похожие ответы