Macro para ejecutar según contenido de celda lista despliegue

Tengo las siguientes rutinas que lo que buscan es ejecutar una macro dependiendo del valor de una celda:

Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Address <> "$M$7" Then Exit Sub

ActiveSheet.Unprotect Password:="XXXX"

Select Case Target.Value

Case 1

Call Risk_1

End Select

    ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True _

        , AllowFormattingColumns:=True, AllowFormattingRows:=True, AllowFiltering _

        :=True, Password:="XXXX"

End Sub

Sub Risk_1()

Application.ScreenUpdating = False

    Columns("O:R").Select

    Selection.EntireColumn.Hidden = True

    Columns("S:AH").Select

    Selection.EntireColumn.Hidden = False

    Columns("AI:OR").Select

    Selection.EntireColumn.Hidden = True

    Range("T19").Select

Application.ScreenUpdating = True

End Sub

Hasta acá funciona bien., pero…

El valor de esta celda M7 cambia dependiendo del valor de otra celda mediante una lista de despliegue en B7, al cambiar el valor de M7 no se ejecuta la macro. Debo entrar manual y darle intro dentro de la celda para que se ejecute.

¿Cómo puedo automatizar esto?

1 Respuesta

Respuesta
2

Efectivamente, el evento Change solo se ejecuta si el cambio es manual.

Lo que debieras controlar entonces en lugar de M7 es el cambio en B7 y cómo ese cambio modifica o no la celda M7.

Sdos

Elsa

Elsa gracias por la respuesta pero no funciona así solamente. El cambio en B7 es un texto muy largo, que puede variar por otras celda del libro. Por lo que la celda M7 es una formula condicional anidada que se cambia de acuerdo al contenido de B7. Esa la puedo dejar fija en el VBA pero la otra no.

Entonces, si tampoco puedes evaluar el 'cambio' en B7 o en otras celdas relacionadas, tendrás que ejecutarla a criterio, es decir con un atajo de teclado, botón, en algún otro proceso, etc.

Por lo que veo tu proceso solo ajusta anchos de col ... una acción que bien puedes ejecutar al entrar a la hoja o antes de salir o a criterio con un atajo de teclado, etc.

Ahora, también es posible controlar el cálculo de una hoja, pero imagina que si la misma presenta gran cantidad de fórmulas y encima tiene que evaluar en cada cálculo si M7 se modificó, puede no llegar a ser una buena solución. De todos modos te la presento.

Todo el código siguiente se coloca en la hoja donde se encuentre M7.

Declara la variable según el tipo de contenido que tendrá, por ahora la dejé como Integer.

Al entrar a la hoja se guarda el valor de la celda M7 (puede ser al abrir el libro o en cualquier otro evento anterior a cualquier cálculo en esta hoja). Luego al ejecutarse algún cálculo se evalúa si M7 se modificó, en caso afirmativo ejecuta la subrutina.

Dim val1 As Integer

Private Sub Worksheet_Activate()
val1 = Range("M7")
End Sub

Private Sub Worksheet_Calculate()
Dim val2 As Integer
val2 = Range("M7").Value
'si M7 cambió su contenido se ejecuta la macro
If val2 <> val1 Then
Call Risk_1
'se guarda el nuevo valor de M7
val1 = val2
End If
End Sub

Sdos!

Elsa buenas noches valoro mucho tu tiempo y agradecido por la ayuda... pero creo que hace falta algo.. y todo comienza porque son 23 llamadas a rutinas distintas que haría dependiendo del caso.. o sea hay Risk_1 ... Risk _23, aunque todas son similares (movimiento de columnas) en cada caso esconde o muestra distintas. por eso estaba trabajando con la sentencia Case... y en tu rutina siempre ejecutaría el Risk_1, esto se puede ajustar?.... o debemos buscar otra solución..?

El re-calcular de la hoja no causo traumatismo... podríamos solo hacer esto en la primera  rutina? donde se pondría?

Elsa otra forma manual con la que se ejecuta al hacer pruebas es con tabulador en la celda M7, existe alguna rutina que al haber cambio en B7, vaya a M7, abra el contenido, (este es muy largo, es un condicional anidado de las o menos 40 caracteres) y le de tabulador? para que según el resultado del SI se ejecute el Case?

A la macro del cálculo le debes agregar el Select Case como lo tenías.

Así quedaría la parte de la comparación, que debes completar con el resto de los Case. No olvides definir val1 y val2 con el tipo de datos que recibirán.

Private Sub Worksheet_Calculate()
Dim val2 As Integer
val2 = Range("M7").Value

'si M7 cambió su contenido se ejecuta la macro
If val2 <> val1 Then

Select Case val1

Case 1      'atención:  que estás evaluando???

Call Risk_1

'otros case

End Select

'se guarda el nuevo valor de M7
val1 = val2
End If

End Sub

Sdos!

Hola Elsa, no he logrado que el evento se dispare automáticamente. lo deje así siguiendo lo que me recomendaste... En M5 deje el valor 0, como val1, para que haga el comparativo con val2 y al ser siempre diferente realice la comparación.. pero nada..

Dim val1 As Integer
Private Sub Worksheet_Activate()
val1 = Range("M7")
End Sub
Private Sub Worksheet_Calculate()
Dim val2 As Integer
val2 = Range("M5").Value
'si M7 cambió su contenido se ejecuta la macro
If val2 <> val1 Then
Select Case val1
Case 1 'atención: que estás evaluando???
Call Risk_1
Case 2
Call Risk_2
Case 3
Call Risk_3
Case 4
Call Risk_4
Case 5
Call Risk_5
'otros case
End Select
'se guarda el nuevo valor de M7
val1 = val2
End If
End Sub

Te dejo el archivo en Dropbox para ver si es posible un detalle mejor me puedas ayudar.

https://www.dropbox.com/s/ax29ygtdhjfkgbs/Planes%20de%20Acci%C3%B3n%20-%205W1H%20V.%20para%20Elsa.xlsm?dl=0 

Tu libro no se puede abrir, revisalo y subilo nuevamente o envialo a mi correo.

Desde ya que tenes un error de interpretación con el tema de las variables: si M7 será un texto, tanto val1 como val2 deben ser declaradas como String

Yo utilicé Integer porque tu código original tiene estas instrucciones:

If Target.Address <> "$M$7" Then Exit Sub

Select Case Target.Value

Case 1

Call Risk_1

Además allí mencionabas M7 no se porqué ahora utilizas M5.

Por favor revisa bien lo que estás solicitando porque me parece que en el camino fuiste haciendo cambios y ahora nada parece funcionar. Luego enviame el libro para revisarlo.

Sdos!

Regalame por favor tu correo . Estoy muy confundido

Aparecen en la portada de mi sitio ;)

cibersoft_arg de yahoo.com.ar

Sdos!

Elsa ya te lo envié...

Te acabo de devolver el libro.

No necesitas la celda M5 para este proceso. Así te queda el encabezado de la macro:

Private Sub Worksheet_Calculate()
Dim val2 As Integer
val2 = Range("M7").Value
'si M7 cambió su contenido se ejecuta la macro
If val2 <> val1 Then
Select Case val2

'sigue

Sdos!

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas