Com base no comentário da Zoredache, aqui está meu exemplo de pasta de trabalho usando o VBA e a Distância Levenshtein para encontrar strings semelhantes dentro de uma lista grande. É baseado nas respostas @smirkingman e @ Apostolos55 em stackoverflow .
The Levenshtein distance between two words is the minimum number of single-character edits (insertion, deletion, substitution) required to change one word into the other
Eu implementei duas versões diferentes. Por favor, verifique qual função é mais rápida para o seu caso com 8000 valores. Se você estiver curioso, veja o código completo do VBA em Github . Aumente o limite na linha const treshold = 1
se você quiser resultados com mais de 1 edição necessária para obter uma correspondência em algum lugar.
- Sintaxedafórmula:
=LevenshteinCompare(<cell_to_check>,<range_to_search_in>)
Exemplo:=LevenshteinCompare(A2;A$2:A$12)
(observeointervalofixo) - Sintaxedesaída:
<number_of_required_edits>-[<match_address>]<match_value>
PrivateFunctionLevenshtein(S1AsString,S2AsString)DimiAsInteger,jAsIntegerDiml1AsInteger,l2AsIntegerDimd()AsIntegerDimmin1AsInteger,min2AsIntegerl1=Len(S1)l2=Len(S2)ReDimd(l1,l2)Fori=0Tol1d(i,0)=iNextForj=0Tol2d(0,j)=jNextFori=1Tol1Forj=1Tol2IfMid(S1,i,1)=Mid(S2,j,1)Thend(i,j)=d(i-1,j-1)Elsemin1=d(i-1,j)+1min2=d(i,j-1)+1Ifmin2<min1Thenmin1=min2EndIfmin2=d(i-1,j-1)+1Ifmin2<min1Thenmin1=min2EndIfd(i,j)=min1EndIfNextNextLevenshtein=d(l1,l2)EndFunctionPublicFunctionLevenshteinCompare(S1AsRange,wordrangeAsRange)Consttreshold=1ForEachS2InApplication.Intersect(wordrange,wordrange.Parent.UsedRange)oldRes=newResnewRes=Levenshtein(S1.Value,S2.Value)IfoldRes<newResAndoldRes<>"" Or S1.Address = S2.Address Then
newRes = oldRes
newS2row = oldS2row
Else
oldS2 = S2
oldS2row = S2.Address(0, 0)
End If
newS2 = oldS2
Next
If newRes <= treshold Then
LevenshteinCompare = newRes & " - [" & newS2row & "] " & newS2
Else
LevenshteinCompare = ""
End If
End Function
Isso foi divertido ☜ (゚ ヮ ゚ ☜)