Todos conocemos la conocida función VLOOKUP() que nos ayuda a combinar datos de diferentes tablas. Sin embargo, esta función tiene un inconveniente importante: no puede combinar valores similares, es decir, si hay un error en la palabra, no habrá coincidencia.
Para poder combinar valores aproximados, podemos crear nuestra propia función. Llamémoslo FuzzyLookup().
Imaginemos que tenemos dos listas. Ambos tienen aproximadamente los mismos elementos, pero pueden escribirse de forma ligeramente diferente. La tarea es encontrar para cada elemento de la primera lista el elemento más similar de la segunda lista, es decir implementar una búsqueda del texto máximamente similar más cercano.
La gran pregunta, en este caso, es qué considerar el criterio de “similitud”. ¿Solo el número de caracteres coincidentes? ¿Es el número de partidos consecutivos? ¿Deberían considerarse los caracteres en mayúsculas y minúsculas o los espacios? ¿Qué hacer con la diferente disposición de las palabras en una frase? Hay muchas opciones y no existe una solución única: para cada situación una u otra será mejor que otras.
En nuestro caso, implementamos la opción más simple: buscar por el número máximo de coincidencias de caracteres. No es perfecto, pero funciona bastante bien en la mayoría de situaciones.
para agregar función FuzzyLookup , abre el menú Tools - Macros - Edit Macros... , seleccionar Module1 y copie el siguiente texto en el módulo:
Function FuzzyLOOKUP(LookupValue As String, SrcTable As Variant, Optional SimThreshold As Single) As String
' moonexcel.com.ua
Dim Str As String
Dim CellArray As Variant
Dim StrArray As Variant
If IsMissing(SimThreshold) Then SimThreshold = 0
Str = LCase(LookupValue)
StrArray = Split(Str)
StrExt = UBound(StrArray)
For Each Cell In SrcTable
CellArray = Split(LCase(Cell))
CellExt = UBound(CellArray)
CellRate = 0
' Comprobamos cada palabra en la frase de búsqueda.
For x = 0 To StrExt
StrWord = StrArray(x)
If Len(StrWord) = 0 Then GoTo continue_x
MaxStrWordRate = 0
' Verificamos cada palabra en la siguiente celda de la tabla de valores original.
For i = 0 To CellExt
CellWord = CellArray(i)
If Len(CellWord) = 0 Then GoTo continue_i
FindCharNum = OccurrenceNum(StrWord, CellWord)
StrWordRate = FindCharNum / Max(Len(StrWord),Len(CellWord))
If StrWordRate > MaxStrWordRate Then MaxStrWordRate = StrWordRate
continue_i:
Next i
CellRate = CellRate + MaxStrWordRate
continue_x:
Next x
' Mantenemos el mejor partido.
If CellRate > MaxCellRate Then
MaxCellRate = CellRate
BestCell = Cell
FindCharNum = OccurrenceNum(Str, Cell)
SimRate = FindCharNum / Max(Len(Str),Len(Cell))
End If
Next Cell
IF SimRate >= SimThreshold Then
IF SimThreshold = -1 Then
ReturnValue = BestCell + " (" + Format(SimRate, "0.00") + ")"
ElseIf SimThreshold = -2 Then
ReturnValue = Format(SimRate, "0.00")
Else
ReturnValue = BestCell
End If
Else
ReturnValue = ""
End If
FuzzyLOOKUP = ReturnValue
End Function
Function OccurrenceNum(ByVal SourceString As String, ByVal TargetString As String)
For i = 1 To Len(SourceString)
' Buscamos la aparición de cada símbolo.
Position = InStr(1, TargetString, Mid(SourceString, i, 1), 1)
' Aumentamos el contador de coincidencias.
If Position > 0 Then
Count = Count + 1
' Eliminar el símbolo encontrado
TargetString = Left(TargetString, Position - 1) + Right(TargetString, Len(TargetString) - Position)
End If
Next i
OccurrenceNum = Count
End Function
Function Max(ByVal value1 As Variant, ByVal value2 As Variant)
If value1 > value2 Then
Result = value1
Else
Result = value2
End If
Max = Result
End Function
A continuación, cerrar Macro Editor y regresar a la hoja de trabajo LibreOffice Calc - ahora puedes usar nuestra nueva función FuzzyLookup() .
También puedes utilizar la función FUZZYLOOKUP() instalando la extensión gratuita YouLibreCalc.oxt o su versión con todas las funciones YLC_Utilities.oxt .
Después de eso, esta función estará disponible en todos los archivos que se abrirán en LibreOffice Calc.