Excel-MATCH函数-多个搜索结果

问题描述 投票:-1回答:1

我正在尝试创建一个excel工具,该工具将搜索位于单独工作表中的特定关键字并显示结果(包括这些关键字的完整句子/段落)。到目前为止,我只能设法仅显示第一个发现。我想做的是将所有发现都显示在彼此下方。

我正在使用的功能是:=IFERROR((INDEX(Tabulka!A:A;POZVYHLEDAT(CONCATENATE("*";FINDER!C4;"*";FINDER!C5;"*";FINDER!C6;"*";FINDER!C7;"*";FINDER!C8;"*");Tabulka!A:A;0)));"N/A")

其中Tabulka是一个包含句子/段落的表所在的表,而FINDER是我定义关键字和显示搜索结果的表。

在Tabulka表中可以有更多的句子,在FINDER表中包含相同的定义关键词。我希望该功能不仅像现在一样将所有内容都显示在彼此的下方。

是否可以在使用VBA和/或不使用VBA的情况下解决此问题?

谢谢

J。

excel function search match keyword
1个回答
0
投票

这里是使用Regular Expression的示例。搜索模式是根据C列中的单词构建的。结果显示在A列和B列中。A列具有单元格引用。

Sub SEARCH()

    Const COL_WORDS As String = "C"
    Const COL_RESULTS As String = "B"
    Const SHT_RESULTS As String = "FINDER"
    Const SHT_SEARCH As String = "Tabulka"

    Dim wb As Workbook, wsToSearch As Worksheet, wsResults As Worksheet
    Dim t0 As Single
    t0 = Timer

    Set wb = ThisWorkbook
    Set wsToSearch = wb.Sheets(SHT_SEARCH)
    Set wsResults = wb.Sheets(SHT_RESULTS)

    ' build array of key words without blanks
    Dim i As Integer, irow As Long, iLastRow As Long
    Dim words() As String, cell As Range

    ' last row of keywords
    iLastRow = wsResults.Range(COL_WORDS & Rows.count).End(xlUp).Row

    ReDim words(iLastRow)
    i = 0
    For Each cell In wsResults.Range(COL_WORDS & "1:" & COL_WORDS & iLastRow)
      If Len(cell) > 0 Then
        words(i) = cell.Value
        i = i + 1
      End If
    Next
    ReDim Preserve words(i - 1)

    ' build regex engine
    Dim regex As Object, sPattern As String
    sPattern = Join(words, "|")
    Debug.Print sPattern

    Set regex = CreateObject("vbscript.regexp")
    With regex
      .Global = True
      .MultiLine = True
      .Pattern = sPattern
      .IgnoreCase = True
    End With

    ' scan sheet and record results under keywords
    Dim count As Integer, matches As Integer
    count = 0: matches = 0
    irow = iLastRow + 2
    For Each cell In wsToSearch.UsedRange
       If Len(cell.Value) > 0 Then
         count = count + 1
         If regex.test(cell.Value) Then
           wsResults.Cells(irow, 1) = cell.Address
           cell.Copy wsResults.Range(COL_RESULTS & irow)
           irow = irow + 1
           matches = matches + 1
         End If
       End If
    Next

    ' format results sheet
    wsResults.Columns(COL_RESULTS).ColumnWidth = 100

     ' performance stats
    Dim sMsg As String
    sMsg = count & " cells scanned and " & matches & " matches found " _
    & " in " & Int(Timer - t0) & " seconds."
    MsgBox sMsg, vbInformation, "Result"

End Sub
© www.soinside.com 2019 - 2024. All rights reserved.