Impedir que se ejecuten macros fuera de Rango

En primer lugar muchas gracias por todo el interés que nos prestan a los principiantes. La consulta es sencilla.

El rango abarca

J10:J130;N10:130;R10:130;V10:130;Z10:130;AD10:130

Tengo varias macros que solo debería ejecutarse cada una con su botón, (no deben ejecutarse automáticamente, siempre lo hará el usuario) pero nunca fuera de Rango.

¿Cómo limito esas macros dentro este Rango tan particular?

2 respuestas

Respuesta
1

[Hola

Es complicado darte respuestas certeras sin ver lo que tienes, pero probablemente estás usando ActiveCell o Selection, quizás hasta Select, y lo ideal es no usarlos.

Comentas

Abraham Valencia

Gracias por responder tan rápido.

Con esta condición me hace lo que quiero pero solo una columna.

For i = 10 To 130

If Activecells.Adress = "$J$" & i Then

Macro 1

Else

MsgBox "seleccione una celda del Rango correcto"

End if

Exit for

Con esta solo me deja en la columna J las filas del for.

Había pensado poner otro for para las columnas.

Probé esto pero no va.

For j = 10 To 30 Step 5

For i = 10 To 130

If Activecells.Adress = j & i Then

Macro 1

Else

MsgBox "seleccione una celda del Rango correcto"

End if

Exit for

Exit for

End Sub

La idea sería extenderlo a las columnas que había mencionado en la pregunta.

Complicado terminar de entender sin saber qué es "macro1"

Abraham Valencia

Solo pregunto por como hacer la condición.

Las Macros que activarán esa condición no necesitan corrección.

Solo pregunto por como plantear

If Activecells.Adress = "$J$" & i Then (¿como puedo añadir más columnas?)

Humm, veamos, prueba así:

If Activecells.Adress = "$J$" & i Or  Activecells.Adress = "$K$" & i Or Activecells.Adress = "$L$" & i Then

Abraham Valencia

Muchísimas gracias por todos los aportes, creo que no lo he sabido plantear mil disculpas,  adjunto una imagen.

Como se ve en la imagen, dejé los rangos seleccionados, (columnas J, N, R, V, Z, AD, y las filas desde la 10 hasta 130).

Los botones ejecutan diferentes macros, (ponen el color al que corresponde cada recuadro, 1 amarillo, 2 naranja....),

Ejemplo; Si quiero que en la columna R  a partir de la fila 30 poner "naranja", selecciono con el ratón celda R30, pulso botón 2 y me pone ese color desde R30 hasta final de rango.

Lo que quiero conseguir es que si por error tengo seleccionada otra celda fuera del rango que ya he mencionado (columnas J, N, R, V, Z, AD, y las filas desde la 10 hasta 130), que no se ejecute la macro.

Con esta condición me hace lo que quiero pero solo una columna.

For i = 10 To 130

If Activecells.Adress = "$J$" & i Then

Macro 1

Else

MsgBox "seleccione una celda del Rango correcto"

End if

Exit for

Con esta solo me deja en la columna J las filas del for.

Había pensado poner otro for para las columnas. Probé esto pero no va.

For j = 10 To 30 Step 5

For i = 10 To 130

If Activecells.Adress = j & i Then

Macro 1

Else

MsgBox "seleccione una celda del Rango correcto"

End if

Exit for

Exit for

End Sub

La idea sería extenderlo a las columnas que había mencionado en la pregunta.

Comencé diciéndote que el uso de Select o Selection no es ideal, muchas veces termina dificultando las cosas como en tu caso. Igual, mira lo que ocurre con esto, los resultados van a la Ventana Inmediato:

Sub Detectar()
Dim celda As Range, rngData As Range
Set rngData = Range("E5:E10", "F5:F10")
For Each celda In Selection.Cells
    If Union(celda, rngData).Address <> rngData.Address Then
        Debug.Print "Fuera del rango: " & celda.Address
    End If
Next celda
End Sub

Solo es cuestión de que lo adaptes.

Abraham Valencia

¡¡¡¡Muchísimas Gracias!!!!

¡¡¡¡Otra vez más Gracias por todo vuestro interés, tiempo y paciencia!!!!

¡¡¡¡Funciona muy bien y es una solución muy sencilla y elgante!!!!

He combinado y adaptado a mis necesidades las sugerencias de Gustavo Omar y Abraham Valencia, y ahora sí hace lo que necesitaba.

Para que hiciera su cometido La condición ha quedado así;

Sub emb_A()
'
ActiveSheet.Unprotect
Dim celda As Range, rngData As Range
Set rngData = Union(Range("J10:J130"), Range("N10:N130"), Range("R10:R130"), _
    Range("V10:V130"), Range("Z10:Z130"), Range("AD10:AD130"))
For Each celda In Selection.Cells
    If Union(celda, rngData).Address = rngData.Address Then
          MI_MACRO
    Else
        MsgBox "Seleccione una categoría"
          End If
 Next celda
End Sub
Respuesta
1

Creo que lo primero que debería hacer la macro que ejecutes es verificar si efectivamente está en el rango que debería. La instrucción "Selection" te dice cual es el rango seleccionado.

Salu2

Agradezco mucho las aportaciones, pero necesito más info, solo he logrado que lo haga con 1 columna y necesito esas 6 que no son consecutivas.

Entiendo que necesito poner una condición a la macro.  Y la tiene pero no se plantearla bien.

¿me pueden ayudar por favor?

Lo agradecería mucho

Creo que Abraham ya te dio la respuesta, si no es así, escribe como pusiste la condición, para que podamos decir como modificarla.

Muchísimas gracias por todos los aportes, creo que no lo he sabido plantear mil disculpas,  adjunto una imagen.

Como se ve en la imagen, dejé los rangos seleccionados, (columnas J, N, R, V, Z, AD, y las filas desde la 10 hasta 130).

Los botones ejecutan diferentes macros, (ponen el color al que corresponde cada recuadro, 1 amarillo, 2 naranja....),

Ejemplo; Si quiero que en la columna R  a partir de la fila 30 poner "naranja", selecciono con el ratón celda R30 y me pone ese color desde R30 hasta final de rango.

Lo que quiero conseguir es que si por error tengo seleccionada otra celda fuera del rango que ya he mencionado (columnas J, N, R, V, Z, AD, y las filas desde la 10 hasta 130), que no se ejecute la macro.

Con esta condición me hace lo que quiero pero solo una columna.

For i = 10 To 130

If Activecells.Adress = "$J$" & i Then

Macro 1

Else

MsgBox "seleccione una celda del Rango correcto"

End if

Exit for

Con esta solo me deja en la columna J las filas del for.

Había pensado poner otro for para las columnas. Probé esto pero no va.

For j = 10 To 30 Step 5

For i = 10 To 130

If Activecells.Adress = j & i Then

Macro 1

Else

MsgBox "seleccione una celda del Rango correcto"

End if

Exit for

Exit for

End Sub

La idea sería extenderlo a las columnas que había mencionado en la pregunta.

Ok, no aclaras si el rango seleccionado es una sola celda o pueden ser varias (voy a asumir que es una sola celda y sino detiene la macro)

Sub xx()
Dim rnValido As Range, rnCheck As Range
If Selection.Count > 1 Then
    MsgBox "Solo debe haber una celda seleccionada", vbInformation
    Exit Sub
End If
Set rnValido = Union(Range("J10:J130"), Range("N10:N130"), Range("R10:R130"), _
    Range("V10:V130"), Range("Z10:Z130"), Range("AD10:AD130"))
Set rnCheck = Intersect(rnValido, Selection)
If rnCheck Is Nothing Then
    MsgBox "La celda seleccionada no pertenece a los rangos válidos", vbInformation
    Exit Sub
End If
'Si llega acá es porque está todo bien
Macro1
End Sub

Salu

¡¡¡¡Muchísimas Gracias!!!!

¡¡¡¡Otra vez más Gracias por todo vuestro interés, tiempo y paciencia!!!!

¡¡¡¡Funciona muy bien y es una solución muy sencilla y elgante!!!!

He combinado y adaptado a mis necesidades las sugerencias de Gustavo Omar y Abraham Valencia, y ahora sí hace lo que necesitaba.

Para que hiciera su cometido La condición ha quedado así;

Sub emb_A()
'
ActiveSheet.Unprotect
Dim celda As Range, rngData As Range
Set rngData = Union(Range("J10:J130"), Range("N10:N130"), Range("R10:R130"), _
    Range("V10:V130"), Range("Z10:Z130"), Range("AD10:AD130"))
For Each celda In Selection.Cells
    If Union(celda, rngData).Address = rngData.Address Then
          MI_MACRO
    Else
        MsgBox "Seleccione una categoría"
          End If
 Next celda
End Sub

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas