我正在尝试创建一个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。
这里是使用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