Comparar un numero de una celda en excel
Como puedo comparar un numero cualquiera de cuatro cifras de una celda con un historial numérico pero de esta forma:
Ejemplo si colocamos el numero 1809 en un cuadro de búsqueda y el resultado seria así .
1849
8309
4959
1477
1802
1876
O sea que compararía todo el historial y como se pueden dar cuenta cualquier de los numero anteriores tiene un dígito o varios del 1809
1 respuesta
.
Buenas, Jhon
Aquí te paso la rutina que hace lo que solicitaste.
Similar a otra respuesta que te dí, nota que hay un par de variables dentro del código para que le indiques dónde buscar el listado de históricos y donde colocar los resultados coincidentes.
Si esas no fueran las direcciones que están ahora ahí, reemplázalas por las tuyas:
Sub ListaNum() 'JHON, indica aquí las celdas de referencia para la rutina RangoNum = "A2" 'celda inicial donde está el Historial Numérico CeldaDest = "C1" 'celda a partir de la cual listar los valores coincidentes ElColor = 44 'color a dar a las celdas con coincidencias. Cero para que quede en blanco Numero = InputBox("ingrese NUMERO de referencia" & Chr(10) & "(vacio para salir sin hacer nada)", "BUSQUEDA DE COINCIDENCIAS") If Len(Numero) Then With Range(CeldaDest).Offset(0, 1) .Value = Numero .Font.Bold = True .HorizontalAlignment = xlLeft .Interior.ColorIndex = ElColor End With Range(Range(CeldaDest). Offset(1), Range(CeldaDest). Offset(Range(CeldaDest). CurrentRegion. Rows. Count)). Clear Set RangoNum = Range(RangoNum, Range(RangoNum).Offset(Range(RangoNum).CurrentRegion.Rows.Count)) For Each valor In RangoNum valor.Interior.ColorIndex = 0 If valor > 0 Then For pos = 1 To Len(valor) cifra = Mid(valor, pos, 1) If InStr(1, Numero, cifra) <> 0 Then Range(CeldaDest).Offset(Range(CeldaDest).CurrentRegion.Rows.Count).Value = valor valor.Interior.ColorIndex = ElColor Cont = Cont + 1 Exit For End If Next End If Next ElMensaje = IIf(Cont = 0, "NO SE ENCONTRÓ NUMERO PARA AGREGAR", "Cantidad de números agregados " & Cont & " número" & IIf(Cont > 1, "s", "")) ElTitulo = "TERMINADO!" MsgBox ElMensaje, vbInformation, ElTitulo Set RangoNum = Nothing End If End Sub
Al inicio de la rutina, una ventana te solicitará que ingreses el número a considerar.
Luego obtendrás algo como esto:
Espero que esta solución sí te satisfaga completamente.
Saludos
Fernando
.
La respuesta que tu das del resultado de la macro es lo que quiero pero la macro se ejecuta y da números que no coinciden con el numero que pide
Además el 2715 en que coinciden con el 1809 me gustaría que las coincidencias co cambiara el orden de los números
.
Buenos días, Jhon
Entre que no lo había interpretado anteriormente, y tampoco lo habías mencionado en tu consulta, pensé que bastaba conque cualquiera de los números del historial tuviera un dígito o varios del numero consultado, sin importar su posición relativa.
Afortunadamente, una modificación menor sobre la misma rutina evaluará cifra por cifra en las comparaciones y sólo listará aquellos que tengan al menos una coincidencia:
Sub ListaNum() '--- area de variables: 'JHON, indica aquí las celdas de referencia para la rutina RangoNum = "A2" 'celda inicial donde está el Historial Numérico CeldaDest = "C1" 'celda a partir de la cual listar los valores coincidentes ElColor = 44 'color a dar a las celdas con coincidencias. Cero para que quede en blanco '--- fin variables Numero = InputBox("ingrese NUMERO de referencia" & Chr(10) & "(vacio para salir sin hacer nada)", "BUSQUEDA DE COINCIDENCIAS") If Len(Numero) Then With Range(CeldaDest).Offset(0, 1) .Value = Numero .Font.Bold = True .HorizontalAlignment = xlLeft .Interior.ColorIndex = ElColor End With Range(Range(CeldaDest). Offset(1), Range(CeldaDest). Offset(Range(CeldaDest). CurrentRegion. Rows. Count)). Clear Set RangoNum = Range(RangoNum, Range(RangoNum).Offset(Range(RangoNum).CurrentRegion.Rows.Count)) For Each valor In RangoNum valor.Interior.ColorIndex = 0 If valor > 0 Then For pos = 1 To Len(valor) CifraV = Mid(valor, pos, 1) CifraN = Mid(Numero, pos, 1) 'If InStr(1, Numero, cifra) <> 0 Then If CifraV = CifraN Then Range(CeldaDest).Offset(Range(CeldaDest).CurrentRegion.Rows.Count).Value = valor valor.Interior.ColorIndex = ElColor Cont = Cont + 1 Exit For End If Next End If Next ElMensaje = IIf(Cont = 0, "NO SE ENCONTRÓ NUMERO PARA AGREGAR", "Cantidad de números agregados " & Cont & " número" & IIf(Cont > 1, "s", "")) ElTitulo = "TERMINADO!" MsgBox ElMensaje, vbInformation, ElTitulo Set RangoNum = Nothing End If End Sub
Así el listado anterior se quedaría como esto:
Espero que ahora sí esté como lo necesitabas.
Abrazo
Fernando
.
.
¿Debería tomarlo de dos en dos?
1 y 2,
2 y 3,
3 y 4
¿Con sus respectivos del numero a evaluar?
Si así fuera, mañana intentaré una solución.
No me comentaste si pudiste bajar el otro archivo de ejemplo.
Saludos
Fernando
.
.
Solo llego la palabra: cual
No sé si preguntas cual archivo de ejemplo (el del conteo de repeticiones de cada numero) o si tiene que ver con tu consulta de las dos cifras.
Favor aclarar.
Saludos
Fernando
.
.
Buenas, Jhon
Lo prometido es deuda.
Así que antes de ir a dormir, te envío esta nueva versión que permite modificarle la cantidad de dígitos a considerar. Verás una nueva variable -Cifras- que cambiando su contenido puedes tomar los valores de a 1, 2, 3, 4, etc...
Reemplaza la anterior por esta.
Sub ListaNum() '---- Variables modificables: '=== JHON, modifica estos datos de acuerdo a tu planilla: RangoNum = "A2" 'celda inicial donde está el Historial Numérico CeldaDest = "C1" 'celda a partir de la cual listar los valores coincidentes ElColor = 44 'color a dar a las celdas con coincidencias. Cero para que quede en blanco Cifras = 2 ' cantidad cifras considerar para comparar <<<<< '---- fin Variables ' '---- inicio de rutina: ' Numero = InputBox("ingrese NUMERO de referencia" & Chr(10) & "(vacio para salir sin hacer nada)", "BUSQUEDA DE COINCIDENCIAS") If Len(Numero) Then With Range(CeldaDest).Offset(0, 1) .Value = Numero .Font.Bold = True .HorizontalAlignment = xlLeft .Interior.ColorIndex = ElColor End With Range(Range(CeldaDest). Offset(1), Range(CeldaDest). Offset(Range(CeldaDest). CurrentRegion. Rows. Count)). Clear Set RangoNum = Range(RangoNum, Range(RangoNum).Offset(Range(RangoNum).CurrentRegion.Rows.Count)) For Each valor In RangoNum valor.Interior.ColorIndex = 0 If valor > 0 Then For pos = 1 To Len(valor) CifraV = Mid(valor, pos, Cifras) CifraN = Mid(Numero, pos, Cifras) If Len(CifraV) = Cifras Then If CifraV = CifraN Then Range(CeldaDest).Offset(Range(CeldaDest).CurrentRegion.Rows.Count).Value = valor valor.Interior.ColorIndex = ElColor Cont = Cont + 1 Exit For End If Else Exit For End If Next End If Next ElMensaje = IIf(Cont = 0, "NO SE ENCONTRÓ NUMERO PARA AGREGAR", "Cantidad de números agregados " & Cont & " número" & IIf(Cont > 1, "s", "")) ElTitulo = "TERMINADO!" MsgBox ElMensaje, vbInformation, ElTitulo Set RangoNum = Nothing End If End Sub
Es decir que sobre la misma rutina anterior hice una adaptación para cuaquier caso que necesites evaluar.
He aquí un ejemplo tomando de a 2 cifras por vez:
Espero que sea lo que me habías preguntado.
Saludos
Fernando
.
La macro no da todas las coincidencias si mi rango de historial numérico es "TC1:TC7444" en que estará fallando
.
Efectivamente, la rutina solo necesita saber donde inicia el rango. Luego evalúa cada número hasta que encuentra una celda vacía donde se detiene.
Abrazo
Fernando
.
Y si esta macro se reinvirtiera o sea en vez de yo anotar el numero en el cuadro esta macro buscara similitudes del historial y en una celda colocaría el numero como una secuencia de patrones lo harías
.
Jhon,
Lo que estás intentando pedir es que cada número de la lista tenga al lado, por ejemplo, qué otros numeros comparte X (¿cuántas?) ¿Posiciones con ese?
No está muy claro tu planteo.
.
lo que quiero es que haga lo mismo la macro y que no cambie para nada la forma de buscar las coincidencias pero que tome como base los numeros de una columna y les busque las coincidencias con el rango de "F1;U40" y los resultados los coloque en AB1 en adelante como si fuera en C1 como dije anteriormente celda por celda de la columna y las respuestas de las coincidencias columna por columna o sea en AB1 AD1 AE1 como lo venia haciendo la macro anterior de antemano muchas gracias
.
Buenas, Jhon
Con esos nuevos parámetros modifiqué la rutina anterior para que coloque debajo de cada número de tu lista las coincidencias que haya encontrado en F1:U40
Sé que mencionaste que los números a buscar están en una columna, pero es más práctico que los tengas en filas desde AB1 así te muestra abajo de cada uno de ellos la coincidencia.
De tu parte sólo tienes que usar la operación copiar-pegado Especial: Trasponer en AB1 para que quede así.
Como siempre, hay variables dentro de la rutina que puedes modificar por si los rangos fuesen otros o si quisieras que la evaluación se haga por más de una cifra.
Este es el nuevo código:
Sub ListaNums() '---- Variables modificables: '=== JHON, modifica estos datos de acuerdo a tu planilla: RangoNum = "AB1" 'celda inicial donde están los números a analizar RangoBusq = "F1:U40" 'CeldaDest = "C1" 'celda a partir de la cual listar los valores coincidentes ElColor = 20 'color a dar a las celdas con coincidencias. Cero para que quede en blanco Cifras = 1 ' cantidad cifras considerar para comparar <<<<< '---- fin Variables ' '---- inicio de rutina: ' 'limpia datos bajo las columnas Range(Range(RangoNum).Offset(1, 0), Range(RangoNum).Offset(60000, 150)).ClearContents 'coloca mensaje de cantidad de cifras usadas: Range(RangoNum).Offset(1, -1).Value = "Coincidencias tomadas de a " & Cifras & "cifra" & IIf(Cifras > 1, "s", "") Range(RangoNum).Offset(1, -1).HorizontalAlignment = xlRight Set RangoNums = Range(RangoNum, Range(RangoNum).Offset(, Range(RangoNum).CurrentRegion.Columns.Count - 1)) RangoNums.Interior.ColorIndex = 0 col = 0 For Each Numero In RangoNums Numero.Interior.ColorIndex = ElColor Application.ScreenUpdating = False fila = 1 If Len(Numero) Then For Each valor In Range(RangoBusq) If valor > 0 Then For pos = 1 To Len(valor) CifraV = Mid(valor, pos, Cifras) CifraN = Mid(Numero, pos, Cifras) If Len(CifraV) = Cifras Then If CifraV = CifraN Then Range(RangoNum).Offset(fila, col).Value = valor valor.Interior.ColorIndex = ElColor fila = fila + 1 Cont = Cont + 1 Exit For End If Else Exit For End If Next End If Next End If col = col + 1 Application.ScreenUpdating = True Next ElMensaje = IIf(Cont = 0, "NO SE ENCONTRÓ NUMERO PARA AGREGAR", "Cantidad Total de números agregados " _ & Cont & " número" & IIf(Cont > 1, "s", "") & Chr(10) & "a una lista de " & linea & " números") ElTitulo = "TERMINADO!" MsgBox ElMensaje, vbInformation, ElTitulo Set RangoNum = Nothing End Sub
De todos modos, puedes bajarte el archivo de muestra que dejé en el mismo lugar que el anterior que buscaba un número por cifras.
Para bajarte este archivo que tiene un nuevo módulo insertado en él con esta rutina solo tienes que hacer un click en este texto.
Bien, Jhon, ya contesté todas tus preguntas. Falta que las pruebes y veas si funcionan como esperas.
Recuerda que tienes algunas sin valorar.
Me tomaré una semana de vacaciones y, durante ella, no podré contestar aquí.
Muy buen fin de semana
Fernando
.
- Compartir respuesta