Function soundex(s As String, Optional digits As Integer = 4, _
Optional show_raw As Boolean = False) As String
Dim m As String, i As Integer, t As String, raw As String, char As String
'se la lunghezza di caratteri da restituire è un numero fuori limite
'(negativo oppure > 100 restituisce il valore di errore "#VALORE!")
If digits < 0 Or digits > 100 Then
soundex = "#VALORE!"
Exit Function
End If
'trasforma la stringa in tutto maiuscolo
s = UCase(s)
'elimina i caratteri non ASCII (accentate e simboli)
For i = 1 To Len(s)
If (Mid(s, i, 1) Like "[!A-Z]") Then
s = Replace(s, Mid(s, i, 1), "")
i = i - 1
End If
Next
'conserva il primo carattere della stringa che ne rappresenta una specie
'di impronta digitale
soundex = Left(s, 1)
'scorre l'intero contenuto della stringa dal secondo carattere in poi
For i = 2 To Len(s)
'considera carattere per carattere
char = Mid(s, i, 1)
'non tiene conto delle lettere doppie, che vengono ignorate
If char <> Mid(s, i - 1, 1) Then
'assegna il codice numerico ad ogni lettera in base allo schema
'standard che segue
Select Case char
Case "B", "F", "P", "V"
m = m & "1"
Case "C", "G", "J", "K", "Q", "S", "X", "Z"
m = m & "2"
Case "D", "T"
m = m & "3"
Case "L"
m = m & "4"
Case "M", "N"
m = m & "5"
Case "R"
m = m & "6"
End Select
'rappresentazione grezza pre-codifica: conserva il carattere
'se è tra quelli ammissibili (ignora vocali e straniere)
If char Like "[!AEIOUYWH]" Then raw = raw & char
End If
Next
'si prepara a ricevere la stringa codificata (riserva uno spazio grande)
m = m & String(100, "0")
'compone la stringa codificata considerando solo il numero di caratteri
'passato in argomento quando la funzione è stata chiamata
soundex = Left(soundex & m, digits)
'se è stata chiesta anche la rappresentazione grezza pre_codifica,
'restituisce una coppia di valori separati da virgola
If show_raw Then soundex = _
Left(Left(s, 1) & raw & String(100, "0"), digits) & "," & soundex
End Function |