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

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

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

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

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

textual
Листинг программы
  1. Option Explicit
  2. Sub pr3()
  3.     Dim sh As Worksheet, t$
  4.     Dim lLastRow As Long, lLastCol As Long, LastRow As Long, r As Long, i As Long, j As Long
  5.     Dim PathFileTxt As String
  6.     Dim dic As Object
  7.     Dim el As Variant
  8.     Dim a
  9.    
  10.     Windows("искать тут.xlsm").Activate
  11.      
  12.     'альтернативный способ задать массив без открытия файла. не подходит для фраз, состоящих более чем из одного слова.
  13.    'a = Split(CreateObject("Scripting.FileSystemObject").Getfile(ActiveWorkbook.Path & "\ИД.txt").OpenasTextStream(1).ReadAll, vbNewLine)
  14.      
  15.     'открываем файл с Исходными Данными
  16.    PathFileTxt = ActiveWorkbook.Path & "\ИД.txt"
  17.     Workbooks.OpenText Filename:=PathFileTxt, Origin:=1251
  18.     Columns("A:A").Select
  19.      
  20.     'разбиваем по столбцам чтобы найти слова, а не фразы
  21.    Selection.TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
  22.         TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=False, _
  23.         Semicolon:=False, Comma:=False, Space:=True, Other:=False, FieldInfo _
  24.         :=Array(1, 1), TrailingMinusNumbers:=True
  25.      
  26.      
  27.     'удаляем пустые строки
  28.    LastRow = ActiveSheet.UsedRange.Row - 1 + ActiveSheet.UsedRange.Rows.Count    'определяем размеры таблицы
  29.    Application.ScreenUpdating = False
  30.     For r = LastRow To 1 Step -1           'проходим от последней строки до первой
  31.        If Application.CountA(Rows(r)) = 0 Then Rows(r).Delete   'если в строке пусто - удаляем ее
  32.    Next r
  33.        
  34.      
  35.     'определяем последнюю ячейку с данными
  36.    With ActiveSheet.UsedRange: End With
  37.     lLastRow = ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count - 1
  38.     lLastCol = ActiveSheet.UsedRange.Column + ActiveSheet.UsedRange.Columns.Count - 1
  39.      
  40.     'задаем массив исходных данных
  41.    'a = [a1].CurrentRegion.Value       'ограничивает диапазон первой пустой строкой/столбцом, не подходит
  42.    a = Range(Cells(1, 1), Cells(lLastRow, lLastCol)).Value
  43.     ActiveWorkbook.Close False
  44.      
  45.     'создаем словарь с исходными данными для поиска
  46.    Set dic = CreateObject("scripting.dictionary")
  47.     dic.comparemode = 1
  48.     With dic
  49.         For Each el In a
  50.             If el <> "" Then
  51.              .Item(el) = ""
  52.             End If
  53.         Next
  54. '        MsgBox "Список ключей для поиска:" & vbLf & vbLf & Join(.keys, vbLf)
  55.    'ищем в словаре совпадения на наших листах
  56.        For Each sh In Sheets
  57.             'определяем последнюю ячейку с данными
  58.            With sh.UsedRange: End With
  59.             lLastRow = sh.UsedRange.Row + sh.UsedRange.Rows.Count - 1
  60.             lLastCol = sh.UsedRange.Column + sh.UsedRange.Columns.Count - 1
  61.             'задаем массив
  62.            a = sh.Range(sh.Cells(1, 1), sh.Cells(lLastRow, lLastCol)).Value
  63.             'a = [a1].CurrentRegion.Value       'ограничивает диапазон первой пустой строкой/столбцом
  64.            'забиваем словарь адресами ячеек, в которых есть совпадения с ИД
  65.            For i = 1 To UBound(a)
  66.                 For j = 1 To UBound(a, 2)
  67.                     t = a(i, j)
  68. '                    MsgBox "=ГИПЕРССЫЛКА(""[" & Application.ActiveWorkbook.FullName & "]" & sh.Name & "!""&АДРЕС(" & i & ";" & j & ");""" & sh.Name & "!""&АДРЕС(" & i & ";" & j & "))"
  69.                    If .exists(t) Then .Item(t) = .Item(t) & IIf(.Item(t) = "", "", "|") & "=ГИПЕРССЫЛКА(""[" & Application.ActiveWorkbook.FullName & "]" & sh.Name & "!""&АДРЕС(" & i & ";" & j & ");""" & sh.Name & "!""&АДРЕС(" & i & ";" & j & ";4))"
  70.                 Next
  71.             Next
  72.              
  73.         Next
  74.          
  75. 'вытаскиваем из словаря ключи (keys) и их значения (items)
  76.        Dim aK, aI, aSP, s As String, ss As String
  77.         Dim lMaxC As Long, lc As Long
  78.         aK = .keys
  79.         aI = .items
  80.         ReDim a(1 To .Count, 1 To 100)
  81.         For i = 1 To .Count
  82.             a(i, 1) = aK(i - 1)
  83.             s = .Item((aK(i - 1)))
  84.             If s <> "" Then
  85.                 aSP = Split(s, "|")
  86.                 lc = UBound(aSP) + 1
  87.                 If lMaxC < lc Then
  88.                     lMaxC = lc
  89.                 End If
  90.                 For lc = LBound(aSP) To UBound(aSP)
  91.                     ss = aSP(lc)
  92.                     a(i, lc + 2) = ss
  93.                 Next
  94.             End If
  95.         Next
  96.  
  97.         'создаем новую книгу
  98.        Workbooks.Add
  99.  
  100.         'вставляем данные на лист
  101.        ActiveSheet.[a1].Resize(.Count, lMaxC + 1).FormulaLocal = a
  102.          
  103.         Columns("B:XFD").EntireColumn.AutoFit
  104.         Range("A1").Activate
  105.         Application.ScreenUpdating = True
  106. '        MsgBox "Done!"
  107. '        ActiveWorkbook.Close False
  108.    End With
  109.  End Sub

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


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

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

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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы