¿Cómo ejecutar una macro solo en un rango específico?
Tengo una macro que llama a una función para buscar productos, ahora solo quiero que el usuario la pueda utilizar solo si está en un rango específico de la hoja, más precisamente entre "b10:b34".
1 Respuesta
Respuesta de edwinhenao
2
2
edwinhenao, Preguntas de Excel en general y macros VBA básicas
Lo puedes hacer preguntando antes por el rango que hay seleccionado sí es diferernte que saque un mensaje y salga de la macro, sí es igual al deseado que ejecute el código. Algo así: Sub Macro4() ElRango = "$B$10:$B$34" If Selection.Address <> ElRango Then MsgBox "Esta función solo sirve en el rango " & ElRango Exit Sub Else With Selection.Font .Color = -16776961 .TintAndShade = 0 End With End If End Sub
Estimado Experto: Gracias por tu pronta respuesta. He puesto en práctica tu código, pero me da que en NINGUNA, pero NINGUNA, de las celdas puedo ejecutar la MACRO que debe ejecutarse por el "ELSE", SIEMPRE, me da que está fuera del rango. Ya sea fuera de "$B$10:$B$34" o dentro del mismo.
Bueno el código funciona siempre y cuando esté el rango B10:B34 seleccionado, habría que ver como estas usando el rango... porqué si lo estas usando como argumento se debe preguntar de otra forma por él.
Estimado Experto: gracias nuevamente por la pronta respuesta. Le comento lo siguiente: La planilla en sí la confección de una factura de venta, donde hay un rango que es el que está en cuestión ($b$10:$b$34), que corresponde al dato código de producto (uno por cada fila), hice un formulario de búsqueda de productos por si el vendedor no recuerda el código que necesita, la misma es llamada por una macro, se selecciona el código y el mismo es relacionado con la celda desde donde se llamó la macro. La idea es que solamente en ese rango, se pueda utilizar la macro y no estando posicionado en cualquier lugar de la planilla. Hoy lo he logrado pero solo consultando si la ActiveCell.Address es solo UNA de las celdas del rango y así por cada una de las celdas que forman parte del rango, no me toma si coloco TODO el RANGO. En el caso de tu ejemplo: If Selection.Address <> ElRango Then ... no lo reconoce pero si: If Selection.Address <> "$C$10" Then ... y así. Lo que hice para no tener que escribir tantos IF ... es utilizar la función CASE. Gracias por la colaboración y bueno, estoy abierto a recibir sugerencias, pero ya solo para tener un código más reducido y no tan extenso, sino, damos por finalizada la consulta. Gracias de nuevo.
Hay que ver como trabaja la macro con el rango o si el trabajo es or celdas, en el ejemplo que te dí se condiciona la ejecución de la macro a que todo el rango este seleccinado. Si quieres asegurar que la macro solo escriba en determinadas celdas de una hoja sin importar desde donde se ejecute la macro, entonces, se debe escribir la ruta completa de la celda, por ejemplo, Sheets("Hoja1"). Range("C10"). Value = 1290 Así sin importar si la macro se ejecuta desde la Hoja10 los datos serán escritos en la celda C10 de la Hoja2. Ahora si lo que necesitas es comparar que la celda este dentro del rango, es mejor hacerlo dentro de un ciclo... algo así para comparar celdas del rango B10:B34: Sub macro1() For j = 10 To 34 If ActiveCell.Address = "$B$" & j Then 'Acá va el código que sirve. MsgBox "La celda B" & j & " esta bien" Exit Sub End If Next j MsgBox "No se autoriza la Macro en " & ActiveCell.Address End Sub Happy coding!
En primer lugar, disculpas por la tardanza en contestar, es que me tomé unos días de vacaciones y me "desenchufé" de todo. Voy a tener en cuenta la rutina que me pasaste de ultima para ver si funciona. Gracias por todo.
1 comentario
Excelente solución y muy sencilla, pero ¿si deseo que se ejecute en más columnas no seguidas por ejemplo columnas b d f h j? ¿Qué habría que añadir al código? - bfmd
Excelente solución y muy sencilla, pero ¿si deseo que se ejecute en más columnas no seguidas por ejemplo columnas b d f h j? ¿Qué habría que añadir al código? - bfmd