Excel VBA Like заявление с единственными / множественными словами - PullRequest
0 голосов
/ 13 ноября 2018

Я пытаюсь создать механизм поиска документов, который использует ключевые слова и имя документа при поиске файла ... в таблице 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  

1 Ответ

0 голосов
/ 13 ноября 2018

В вашем примере кода «ключевое слово» должно быть в единственном числе, и тогда оно будет соответствовать как единственному, так и множественному числу (как вы видели).Кроме того, вам не нужны символы подстановки в поисковом запросе.

"TEMPLATE" Like "*" & "TEMPLATE" & "*"   'returns True
"TEMPLATES" Like "*" & "TEMPLATE" & "*"  'returns True

Подумайте об этом так.В обоих вышеупомянутых случаях мы, по сути, говорим: «содержит ли первый член второй член?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...