这应该是可行的(我还没有测试过,目前在Linux上)。呼叫
getStrMatch
对于每个字符串。
Type StrMatch
Percent As Double
Word As String
End Type
Function getStrMatch(s As String, RefRange As Range) As StrMatch
Dim i As Long, ref_str As String
Dim BestMatch As StrMatch: BestMatch.Percent = -1
Dim match_pc As Double
With RefRange
For i = 1 to .Cells.Count
ref_str = .Cells(i).Value2
match_pc = getMatchPc(s, ref_str)
If match_pc > BestMatch.Percent Then
BestMatch.Percent = match_pc
BestMatch.Word = ref_str
End If
Next i
End With
getStrMatch = BestMatch
End Function
Function getMatchPc(s As String, ref_str As String) As Double
Dim s_len As Long: s_len = Len(s)
Dim ref_len As Long: ref_len = Len(ref_str)
Dim longer_len as Long
If s_len > ref_len Then longer_len = s_len Else longer_len = ref_len
Dim m As Long: m = 1
While m <= longer_len
If Mid(s, m, 1) <> Mid(ref_str, m, 1) Then Exit While
m = m + 1
Wend
getMatchPc = (m - 1.0) / longer_len
End Function
请注意,您必须将它放入模块中,否则将声明
Private Type
和
Private Function
.
另外,如果您匹配了很多字符串,那么您可能应该创建一个trie,因为这只是简单的字符串比较,并且每个getstrmatch的成本为o(mn),其中m是
RefRange
n是平均值
ref_str
长度。