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

Respuesta
1

.

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

.

¡Gracias! experto la macro funciona de maravilla formulare otra pregunta para que me ayudes 

Y en la macro donde puedo cambiar para que la coincidencia sea de 2 números en sus puestos

.

¿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

.

cual

.

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

.

muchas gracias experto eres un genio

.

Un placer ayudar!

Abrazo
Fer

La macro no da todas las coincidencias si mi rango de historial numérico es "TC1:TC7444" en que estará fallando

Perdón la ejecute mal tenia que ser "TC1" nada más

.

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

Como podríamos hacer que esta macro funcionara comparando celda por celda de una columna

.

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

.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas