¿Está mi número en esta lista?
Planteamiento del problema
El problema que pretendemos solucionar con Excel es el siguiente: dada una lista de números de longitud indeterminada contenida en una única celda y teniendo en cuenta que los números van separados por comas, queremos saber si un cierto número está en la lista. Por ejemplo, tenemos esta lista de números:
2,23,6,8,14,57,9,12,6,3,47
Y queremos saber si el número 5 está comprendido en ella.
Soluciones con fórmulas clásicas
Primera solución
La primera función de la biblioteca de Excel que viene a la cabeza es =ENCONTRAR, que nos devuelve la posición del caracter o grupo de caracteres buscados. Pero esta función nos dará problemas en un caso como el expuesto. Observemos que si esa lista de números está en la celda A1 y escribimos en celda A2 la función:
=ENCONTRAR(“5”;A1)
Nos devuelve el valor 11, es decir, está actuando como si encontrara el número 5, ya que nos está devolviendo el 5 del número 57, y eso es un FALSO POSITIVO que no nos interesa. Luego esta primera solución puede dar FALSOS POSITIVOS.
Segunda solución
La segunda solución puede consistir en encontrar primero las posiciones de todas las comas del string, a base de usar consecutivamente la función ENCONTRAR de la forma:
=ENCONTRAR(“,”;$A$13;B14+1)
Suponiendo que el texto original está en A13 y la posición de la coma anterior en B14.
Después podríamos usar =EXTRAER entre cada dos posiciones de comas, luego transformar los strings (todas estas funciones aceptan y devuelven caracteres) a números sin más que sumarles 0, y finalmente usar =CONTAR.SI, que solo nos devolverá 0 si no encuentra el número. Así evitamos los falsos positivos.
Tercera solución
Otra solución que no comento en el video puede empezar por la utilidad TEXTO A COLUMNAS, con la coma como separador, lo que nos cribaría los números y nos permitiría otra vez usar =CONTAR.SI.
Solución con Función Definida por el Usuario
Function COMPROBARNUMERO(queNumero As Long, queString As String) As Boolean
‘Cribado de la cadena de entrada
COMPROBARNUMERO = False
Dim qChars As Long, qComas As Long, i As Long, j As Long
Dim qNums() As String
qChars = Len(queString)
‘Contamos el número de comas
For i = 1 To qChars
If Mid(queString, i, 1) = “,” Then qComas = qComas + 1
Next i
‘El número de números será el de comas más uno
ReDim qNums(1 To qComas + 1)
‘Cribemos los números entre las comas
j = 1
For i = 1 To qChars
If Mid(queString, i, 1) = “,” Then
j = j + 1
Else
qNums(j) = qNums(j) & Mid(queString, i, 1)
End If
Next i
‘Tengo el vector qNums() con mis números cribados
‘Si encuentro coincidencia, entonces mi número está en la cadena
For i = 1 To UBound(qNums)
If CStr(queNumero) = qNums(i) Then COMPROBARNUMERO = True
Next i
End Function
Os propongo como tarea hacer los cambios pertinentes en esta función para que en lugar de comprobar si está o no un número, compruebe si está o no una palabra en cierta lista de palabras separadas por comas.
Como puedo descargar el archivo
El archivo no lo he puesto para descarga. Lo importante es la función, cuyo código VBA puedes copiar de esta misma página.