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
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 de Enrique Bernal
1