Ayuda con macro!

Hola, tengo un problema con una macro que estoy elaborando y me gustaría que me pudieran ayudar, la cual me busca un valor dentro de una matriz y me colorea la celda donde aparece.
El caso es que me necesito que en vez de cambiar el valor a buscar en el propio código VB (en el ejemplo sería el número 51 a buscar), me aparezca un cuadro de diálogo preguntándome qué valor deseo buscar o en su defecto que tome el valor puesto en otra celda con el número en cuestión para que empiece la búsqueda.
Además de esto, necesito saber cómo hacer esta misma macro, pero para buscar 3 valores a la vez en vez de uno y que me devuelva los números que son distintos a los buscados de la misma fila en otra columna aparte, por ejemplo, si tengo estos cuatro números en una fila
A B C D
1 2 3 51
Al poner a buscar los números 1,2 y 3 me los marcará en amarillo y me devolverá el 51 en otra columna aparte. El caso es que no siempre necesito el número de la columna DE, sino el número o números que no coincidan con los buscados.
Aquí dejo la macro conseguida hasta el momento:
Function ACNBuscaDato(RANGO As String, Dato As String)
'Inicializamos la variable donde devolveremos el resultado de la búsqueda...
Resultado = ""
'Depuramos el RANGO para eliminar los $...
RANGO = Replace(RANGO, "$", "")
'Obtenemos la celda inicial y final del rango...
CeldaInicial = Mid(RANGO, 1, InStr(1, RANGO, ":", 1) - 1)
CeldaFinal = Mid(RANGO, InStr(1, RANGO, ":", 1) + 1)
'Obtenemos de la celda inicial su columna y fila...
CeldaInicialColumna = Mid(CeldaInicial, 1, 1)
CeldaInicialFila = Val(Mid(CeldaInicial, 2))
'Obtenemos de la celda final su columna y fila...
CeldaFinalColumna = Mid(CeldaFinal, 1, 1)
CeldaFinalFila = Val(Mid(CeldaFinal, 2))
'Guardamos el nombre de la hoja actual...
HojaActual = ActiveSheet.Name
'Recorremos todas las celdas del rango de la hoja actual...
For Fila = CeldaInicialFila To CeldaFinalFila
    For Columna = Asc(CeldaInicialColumna) To Asc(CeldaFinalColumna)
        'Tomamos la referencia de la celda...
        Celda = Trim(Chr(Columna)) + Trim(Str(Fila))
        'Activamos la hoja actual...
        Sheets(HojaActual).Select
        'Tomamos el valor de la celda...
        Valor = Range(Celda).Value
        'Activamos la hoja secundaria...
        Sheets("Hoja1").Select
        'Seleccionamos la misma celda pero en la hoja secudaria...
        Range(Celda).Select
        'Si el valor que había en la celda coincide con el valor buscado...
        If Valor = Dato Then
            '... Añadimos la referencia al resultado de búsqueda...
            Resultado = Resultado + Celda + ", "
            '... Y ponemos fondo en amarillo...
            With Selection.Interior
                .ColorIndex = 6
                .Pattern = xlSolid
            End With
        '... Pero si el valor no coincide...
        Else
            '... Ponemos el fondo en blanco...
            'With Selection.Interior
                '.ColorIndex = 0
                '.Pattern = xlSolid
            'End With
        End If
    Next
Next
'Según si haya o no celdas encontradas se devolvemos un texto u otro...
If Resultado <> "" Then
    ACNBuscaDato = "Celdas que contienen el valor " + Dato + " = " + Mid(Resultado, 1, Len(Resultado) - 2)
Else
    ACNBuscaDato = "No hay celdas con el valor " + Dato
End If
End Function
Sub MacroBusca6x6()
    MsgBox (ACNBuscaDato("A1:D40", 51))
End Sub
Gracias y un saludo

1 respuesta

Respuesta
1
En la primera parte de la función debes borrar el String, por lo que quedaría así:
Function ACNBuscaDato(RANGO As String, Dato)
Luego la macro "MacroBusca6x6()" la debes cambiar por la siguiente
Sub MacroBusca6x6()
a = InputBox("Ingrese el Número de valores que desea buscar", "Número de Busquedas")
For i = 1 To a
b = InputBox("Ingrese el valor que desea que sea buscado", "Valor Buscado")
MsgBox (ACNBuscaDato("A1:D40", b))
Next
End Sub
Espero te ayude con todo lo que necesitas, No olvides finalizar la pregunta.
Hola de nuevo,
He hecho las modificaciones que me indicaste, pero ahora no me marca en amarillo las celdas y no me reconoce el valor buscado, siempre me sale el cuadro de diálogo "no hay celdas con el valor POR (siendo POR el número que ingresé para buscar)", ¿dónde puede estar el fallo?
Gracias y un saludo
Yo probé la macro y si funciona, prueba si el error radica en el reconocimiento de mayúsculas y minúsculas.
Hola de nuevo y gracias por la rapidez de tus comentarios. Opto por anotarte el código de nuevo porque no consigo hacerle funcionar, hace todo perfecto, pero no me marca en amarillo las celdas con el valor buscado:
Function ACNBuscaDato(RANGO As String, Dato)
'Inicializamos la variable donde devolveremos el resultado de la búsqueda...
Resultado = ""
'Depuramos el RANGO para eliminar los $...
RANGO = Replace(RANGO, "$", "")
'Obtenemos la celda inicial y final del rango...
CeldaInicial = Mid(RANGO, 1, InStr(1, RANGO, ":", 1) - 1)
CeldaFinal = Mid(RANGO, InStr(1, RANGO, ":", 1) + 1)
'Obtenemos de la celda inicial su columna y fila...
CeldaInicialColumna = Mid(CeldaInicial, 1, 1)
CeldaInicialFila = Val(Mid(CeldaInicial, 2))
'Obtenemos de la celda final su columna y fila...
CeldaFinalColumna = Mid(CeldaFinal, 1, 1)
CeldaFinalFila = Val(Mid(CeldaFinal, 2))
'Guardamos el nombre de la hoja actual...
HojaActual = ActiveSheet.Name
'Recorremos todas las celdas del rango de la hoja actual...
For Fila = CeldaInicialFila To CeldaFinalFila
    For Columna = Asc(CeldaInicialColumna) To Asc(CeldaFinalColumna)
        'Tomamos la referencia de la celda...
        Celda = Trim(Chr(Columna)) + Trim(Str(Fila))
        'Activamos la hoja actual...
        Sheets(HojaActual).Select
        'Tomamos el valor de la celda...
        Valor = Range(Celda).Value
        'Activamos la hoja secundaria...
        Sheets("hoja1").Select
        'Seleccionamos la misma celda pero en la hoja secudaria...
        Range(Celda).Select
        'Si el valor que había en la celda coincide con el valor buscado...
        If Valor = Dato Then
            '... añadimos la referencia al resultado de búsqueda...
            Resultado = Resultado + Celda + ", "
            '... y ponemos fondo en amarillo...
            With Selection.Interior
                .ColorIndex = 6
                .Pattern = xlSolid
            End With
        '... pero si el valor no coincide...
        Else
            '... ponemos el fondo en blanco...
            'With Selection.Interior
                '.ColorIndex = 0
                '.Pattern = xlSolid
            'End With
        End If
    Next
Next
'Según si haya o no celdas encontradas se devolvemos un texto u otro...
If Resultado <> "" Then
    ACNBuscaDato = "Celdas que contienen el valor " + Dato + " = " + Mid(Resultado, 1, Len(Resultado) - 2)
Else
    ACNBuscaDato = "No hay celdas con el valor " + Dato
End If
End Function
Sub MacroBusca6x6()
a = InputBox("Ingrese el Número de valores que desea buscar", "Número de Busquedas")
For i = 1 To a
b = InputBox("Ingrese el valor que desea que sea buscado", "Valor Buscado")
MsgBox (ACNBuscaDato("A1:D40", b))
Next
End Sub
Acabo de probar esta macro y funciona. Me avisas.
Function ACNBuscaDato(RANGO As String, Dato)
'Inicializamos la variable donde devolveremos el resultado de la búsqueda...
Resultado = ""
'Depuramos el RANGO para eliminar los $...
RANGO = Replace(RANGO, "$", "")
'Obtenemos la celda inicial y final del rango...
CeldaInicial = Mid(RANGO, 1, InStr(1, RANGO, ":", 1) - 1)
CeldaFinal = Mid(RANGO, InStr(1, RANGO, ":", 1) + 1)
'Obtenemos de la celda inicial su columna y fila...
CeldaInicialColumna = Mid(CeldaInicial, 1, 1)
CeldaInicialFila = Val(Mid(CeldaInicial, 2))
'Obtenemos de la celda final su columna y fila...
CeldaFinalColumna = Mid(CeldaFinal, 1, 1)
CeldaFinalFila = Val(Mid(CeldaFinal, 2))
'Guardamos el nombre de la hoja actual...
HojaActual = ActiveSheet.Name
'Recorremos todas las celdas del rango de la hoja actual...
For Fila = CeldaInicialFila To CeldaFinalFila
    For Columna = Asc(CeldaInicialColumna) To Asc(CeldaFinalColumna)
        'Tomamos la referencia de la celda...
        Celda = Trim(Chr(Columna)) + Trim(Str(Fila))
        'Activamos la hoja actual...
        Sheets(HojaActual).Select
        'Tomamos el valor de la celda...
        Valor = Range(Celda).Value
        'Activamos la hoja secundaria...
        Sheets("Hoja1").Select
        'Seleccionamos la misma celda pero en la hoja secudaria...
        Range(Celda).Select
        'Si el valor que había en la celda coincide con el valor buscado...
        If Valor = Dato Then
            '... añadimos la referencia al resultado de búsqueda...
            Resultado = Resultado + Celda + ", "
            '... y ponemos fondo en amarillo...
            With Selection.Interior
                .ColorIndex = 6
                .Pattern = xlSolid
            End With
        '... pero si el valor no coincide...
        Else
            '... ponemos el fondo en blanco...
            'With Selection.Interior
                '.ColorIndex = 0
                '.Pattern = xlSolid
            'End With
        End If
    Next
Next
'Según si haya o no celdas encontradas se devolvemos un texto u otro...
If Resultado <> "" Then
    ACNBuscaDato = "Celdas que contienen el valor " + Dato + " = " + Mid(Resultado, 1, Len(Resultado) - 2)
Else
    ACNBuscaDato = "No hay celdas con el valor " + Dato
End If
End Function
Sub MacroBusca6x6()
a = InputBox("Ingrese el Número de valores que desea buscar", "Número de Busquedas")
For i = 1 To a
b = InputBox("Ingrese el valor que desea que sea buscado", "Valor Buscado")
MsgBox (ACNBuscaDato("A1:D40", b))
Next
End Sub
Hola de nuevo, cuando probaste ¿te marcaba en amarillo las celdas que contenían los valores buscados?, no sé, me estoy volviendo loco, antes si lo hacía y ahor sólo me rastrea todas las celdas, pero no me marca en amarillo y cuando termina siempre sale el cuadro de diálogo "No hay celdas con el valor XX". ¿Por qué?
Gracias y un saludo
Pues eso quiere decir que no te esta encontrando los datos a buscar. Lo raro es que ya la has utilizado antes y en teoría comprendes las limitaciones de la fórmula, como por ejemplo, formato, mayúsculas, espacios y cosas así. No te puedo decir más ya que yo pruebo la macro, y me busca los valores que le propongo y también me los pinta.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas