Llamar macro en condición si.

Respuesta de
a
Usuario
Hola. Desearía saber como se puede llamar a una macro si se cumple una condición.
Con la fórmula SI, en el campo verdadero o falso no he sabido hacerlo... a lo mejor es que no se puede, si es el caso me podrías poner un ejemplo sencillo de la macro que lo realiza.
Gracias de antemano.
Avatar
Experto
Buenas...

Visual Basic permite que los macros se ejecuten a partir de "Eventos" (aparte de poder hacerlo manualmente)

Activando el editor de VBA (Alt + F11), en cada hoja o en "ThisWorkbook", encontrarás dos menúes descolgables en la parte superior derecha. Elige la segunda opción del primero y en el que está a la derecha te mostrará los eventos a los que puedes asociar una o varias macros.

Así, en la hoja donde tienes la fórmula condicional podrías elegir el evento "Change". Así cada vez que la hoja cambie, evaluará si tiene que disparar la macro.

Cuando eliges -del menú a la derecha- "Change", verás escrito automáticamente esto:

Private Sub Worksheet_Change(ByVal Target As Excel.Range)

End Sub

Entre ambas lineas coloca un condicional de forma tal que si el valor de la celda es verdadero esjecute la macro; si no, que no haga nada.

Supon que en la celda B8, colocaste una fórmula como esta:
=SI(A4>1042002,1,0)

Tu código sería, entonces, algo así como:

Private Sub Worksheet_Change(ByVal Target As Excel.Range)
ActiveSheet.Range("B8").Calculate
If B8 = 1 Then
'<pon aquí el nombre de la macro que quieres que se ejecute>
TUMACRO
End If

End Sub


Obviamente, puedes colocar el condicional directamente en la macro sin utilizar la fórmula en la hoja
Es decir, en lugar de:
If B8 = 1 Then
puedes colocar:
If A4>1042002 Then

Esto debería resolver tu pregunta. Si así fuera, te agradeceré un comentario y finalizarla.
Si no, pregúntame de nuevo.

Un abrazo!
Fernando
Usuario
Hola y gracias Fernando,
Primero no me hace falta que se recalcule la oja cada vez que ingreso un nuevo valor, (igualmente no conocía esa opción y seguro que me servirá más adelante), mi problema es mucho más sencillo, sólo quiero que se cumpla esto:

Sub pregunta()
'
' pregunta Macro
' Macro grabada el 12/04/2002 por Daniel Tortosa
'
Dim SEGURO
SEGURO = InputBox("PON !definitivo! SI ESTE DATO NO SERÁ MODIFICADO")
Range("C64").Value = SEGURO
ActiveSheet.Range("C64").Calculate

If C64 = DEFINITIVO Then
NENE
End If

'
End Sub

He hecho esto y siempre me ejecuta la macro, ¿dónde está el problema?
PD: espero que no duela mucho a la vista esa macro...
Un saludo
Usuario
Si en vez de poner que c64=definitivo pongo c64="valor numérico" hace lo contrario, nunca me ejecutala macro...
¿Por qué?
Pues nada más... Otro saludo.
Avatar
Experto

Buenas, Daniel!

OK, ahora entiendo, el llamado a una macro que solicitabas es *dentro* de otra macro. Como en tu primera pregunta no lo aclarabas y ademas hablabas de un *fórmula* SI, pensé que se trataba de manejarlo desde la misma hoja.

Respecto a cómo lo resolviste en tu código, habría un par de consideraciones que hacerle. Obviamente, asumo que existe un Sub NENE() en el mismo proyecto.

El problema está en
C64 = DEFINITIVO

C64 no es una variable, ni algo que se entienda como una referencia a una celda.
Adicionalmente, así como lo escribiste VBA intentará buscar una variable llamada DEFINITIVO, cuando -en realidad- debería buscar la palabra "DEFINITIVO". (Tomada del Input box, pasada a una variable y, de allí a la hoja) Faltan las comillas.

Personalmente, usaría lo siguiente:

Sub pregunta()
'
Dim SEGURO as String
SEGURO = InputBox("PON !definitivo! SI ESTE DATO NO SERÁ MODIFICADO")
If SEGURO <> ""
ActiveSheet.Range("C64").Value = Ucase(Trim(SEGURO))
End If
If ActiveSheet.Range("C64").Value = "DEFINITIVO" Then
NENE
End If

End Sub

Notarás que le agregué un par de controles. Para el caso de que no se ingrese nada en el input box y una corrección a la entradas de datos para que siempre la vuelque a la hoja en mayúsculas y sin espacios excedentes.

Efectivamente, al ser sólo un texto no es necesario un recalculo de la hoja-. Eliminé esa línea.

Pruébalo y comentame

Saludos, Daniel!

Fernando
Usuario
Después de If SEGURO <> "", no funcionaba si no ponía then (no es una crítica, ya va bien tener que investigar). En fin gracias y perfecto.