Я пытаюсь создать механизм поиска документов, который использует ключевые слова и имя документа при поиске файла ... в таблице Excel.
Работает путем разбиения поискового термина и имени файла через пробелы, а также ключевых слов через запятую.
Затем он соответствует каждому поисковому запросу для каждого ключевого слова и добавляет счетчик для каждого соответствия. Больше соответствий ключевых слов = более высокий счетчик, затем я сортирую таблицу по этому счетчику, чтобы получить наилучший результат в верхней части.
Функция поиска уже работает нормально, однако, когда дело доходит до терминов в единственном и множественном числе, она не находит его.
Допустим, ключевое слово для doc1 - Шаблоны . При поиске слова Шаблон в поле поиска оно не совпадает. Я использую оператор LIKE и пытался добавить подстановочный знак в начале и в конце, но он все равно не работает.
Как ни странно, работает наоборот. Если я ищу термин во множественном числе, а ключевое слово в единственном числе, оно соответствует. Я понятия не имею, почему, это просто работает, и это хорошо.
Sub Searchresult()
Dim x As Long, y As Long, count As Long
Dim search() As String, keyword() As String, names() As String
Dim result As String
Dim tbl As ListObject, sortcol As Range, lrow As Long
With Worksheets("Sheet3") 'Prep for placing results in table.
Set tbl = .ListObjects("tblSearch")
Set sortcol = .Range("tblSearch[sort]")
tbl.DataBodyRange.ClearContents
End With
With Worksheets("Sheet2")
search = Split(.Range("F1").Value, " ") 'split search terms via spaces
For x = 2 To 1000 Step 1
count = 0
lrow = Worksheets("Sheet3").Cells(Rows.count, 1).End(xlUp).Row + 1
keyword() = Split(.Range("d" & x), ",") ' split keywords via comma
names() = Split(Replace(Replace(Replace(Replace(.Range("c" & x), "-", ""), "(", ""), ")", ""), "'", ""), " ") 'splits names via spaces, deleting any unwanted characters
For i = LBound(keyword) To UBound(keyword)
For j = LBound(search) To UBound(search)
If "*" & UCase(search(j)) & "*" Like "*" & UCase(keyword(i)) & "*" Then 'compare search term and keyword
Worksheets("Sheet3").Range("A" & lrow, "B" & lrow).Value = .Range("A" & x, "B" & x).Value
count = count + 1
Worksheets("Sheet3").Range("C" & lrow).Value = count
End If
Next
Next
For k = LBound(names) To UBound(names)
For l = LBound(search) To UBound(search)
If "*" & UCase(search(l)) & "*" Like "*" & UCase(names(k)) & "*" And Len(names(k)) > 2 Then 'compare search term and document name
Worksheets("Sheet3").Range("A" & lrow, "B" & lrow).Value = .Range("A" & x, "B" & x).Value
count = count + 1
Worksheets("Sheet3").Range("C" & lrow).Value = count
End If
Next
Next
Next
End With
With tbl.Sort 'sort everything based on count to get best result
.SortFields.Clear
.SortFields.Add Key:=sortcol, SortOn:=xlSortOnValues, Order:=xlDescending
.Header = xlYes
.Apply
End With
End Sub
Как мне убедиться, что оператор LIKE может совпадать с единичным / множественным числом слова? Он не должен быть слишком сложным, чтобы он мог находить слова, которые меняются, когда он употребляется в единственном / множественном числе (например, «копировать / копировать»), однако, если бы он совпадал с тем, что просто добавляет «s», это может сделать.
РЕДАКТИРОВАТЬ: Благодаря объяснению Брайана, код исправляется добавлением оператора OR, который переворачивает оператор Like, чтобы он снова сравнивал термины. Теперь он может совпадать, даже если это единственное / множественное число.
If UCase(search(j)) Like "*" & UCase(keyword(i)) & "*" Or UCase(keyword(i)) Like UCase(search(j)) & "*" Then 'compare search term and keyword
If (UCase(search(l)) & "*" Like UCase(names(k)) & "*" Or UCase(names(k)) Like UCase(search(l)) & "*") And Len(names(k)) > 2 Then