2013-06-26 4 views
3

Я использую функцию соответствия в своей программе, ее основная цель - сравнить вход, введенный пользователем, а затем зациклиться на базе данных и сделать что-то каждый раз, когда есть совпадение.Excel VBA - повышение точности функции совпадения

В настоящее время я работаю с этим:

Function Match(searchStr As Variant, matchStr As Variant) As Boolean 
Match = False 
If (IsNull(searchStr) Or IsNull(matchStr)) Then Exit Function 
If (matchStr = "") Or (searchStr = "") Then Exit Function 

Dim f As Variant 
f = InStr(1, CStr(searchStr), CStr(matchStr), vbTextCompare) 
If IsNull(f) Then Exit Function 
Match = f > 0 

End Function 

А потом, когда он используется:

If Match(sCurrent.Range("A" & i).Value, cell.Value) Then 

Вот моя проблема:

Это слишком неточный. Если у меня в моей базе данных «Foxtrot Hotel», эта функция найдет соответствие всякий раз, когда пользователь набирает «F» «Fo» «Fox» «ox» «xtro» «t hot» и т. Д., Поэтому всякий раз, когда есть строка характера, включенного в полное предложение.

Я хочу, чтобы моя функция соответствия идентифицировала только полные слова. Поэтому в этом случае, чтобы показать матч только для трех конкретных случаев: «Фокстрот» «Отель» и «Фокстрот Отель».

Я прочитал об атрибуте под названием «lookat», который может делать подобные вещи с помощью функции «Найти» (lookat: = xlwhole), знаете ли вы, может ли что-то подобное быть вставлено в мою функцию Match?

Спасибо!

+1

Содержит ли 'Cell.value' вашу базу данных? И в какой форме - слова, разделенные запятой и т. Д.? – brettdj

+0

С одной стороны, у вас есть только одно слово (в диапазоне («A» и i)), с другой стороны, в Cell.Value у вас есть слова или последовательность слов, в основном разделенных пробелами (может быть «Foxtrot») , «Отель Фокстрот» или «Центр капитального строительства» и т. Д.). Я собираюсь попробовать то, что вы предложили в качестве ответа, спасибо @brettdj! – Phalanx

ответ

2

Вы можете использовать так. В этом случае выполняется нечувствительный к регистру совпадение только для целых слов (используя границы слов вокруг искомого слова).

  • Ложные (Ф.О. сопровождается письмом, а не границе слова)
  • Истинного
  • Правда
  • Ложные (ФОКСТРОТ ч не следует границе слова)

Find не будет работать с xlWhole для вас - это будет выглядеть в соответствии со всем содержимым ячейки, а не с одним d в содержимом.

Function WordMatch(searchStr As Variant, matchStr As Variant) As Boolean 
Dim objRegex As Object 
Set objRegex = CreateObject("vbscript.regexp") 
With objRegex 
.Pattern = "\b" & matchStr & "\b" 
.ignorecase = True 
WordMatch = .test(searchStr) 
End With 
Set objRegex = Nothing 
End Function 

Sub B() 
Debug.Print WordMatch("foxtrot hotel", "fo") 
Debug.Print WordMatch("foxtrot hotel", "hotel") 
Debug.Print WordMatch("foxtrot hotel", "FOXTROT") 
Debug.Print WordMatch("foxtrot hotel", "FOXTROT h") 
End Sub