# ejecución automática de macro



## Koopa_Troopa (Jan 24, 2008)

Hola. 

Esta es mi primera pregunta en el foro. El caso es que llevo varios días intentando ejecutar una macro de VB cada vez que se cumpla una condición en una celda de Excel. Me explico. Tengo una celda en la que recibo cotizaciones de activos (por ejemplo, Telefónica) y otra en la que compruebo si el valor de la acción supera un cierto valor. Solo quiero que se ejecute la macro la primera vez que se supere el valor, para lo que tengo otra celda que la macro pone a 1 una vez termina de ejecutarse, de modo que la condicion seria: =si(y(cotizacion > umbral;celda_primera_vez = 0);macro();0). Esto sería lo que me gustaría hacer. Como creo que no se pueden ejecutar macros así, sólo funciones, lo que hago es llamar a una función, pero entonces no puedo modificar el valor de la celda_primera_vez, no me deja. Así que lo que intenté hacer es devolver un 1 en la función e intentar que me salte el evento Worksheet_Change, pero no funciona para valores que cambian en fórmula, sólo si el usuario introduce un cambio y pulsa Intro. 

Me puede ayudar alguien, por favor????? 

Muchas gracias 

<!-- google_ad_section_end -->


----------



## Greg Truby (Jan 24, 2008)

¡Bienvenido a MrExcel!

Haga un prueba para ver si el evento _Calculate_ le serviría. Ponga una rutinita allí -- puede ser algo tan sencillo como: 
	
	
	
	
	
	



```
Private Sub Worksheet_Calculate()
    MsgBox "¡Ay, que guapo yo!", vbExclamation, "¡Hola!"
End Sub
```
y observe cuándo es que se activa. Si se activa en un momento apropiado, ya sabemos donde poner el código, solo falta escribir una rutina adecuada.


----------



## Koopa_Troopa (Jan 24, 2008)

Muchas gracias por su pronta respuesta!!

Ya he probado el evento Calculate, y es una solución, aunque no del todo buena. El caso es que Excel llama a ese método cada vez que se actualiza cualquier fórmula de la hoja y en mi hoja tengo muchas cotizaciones de activos puestas en filas y, por tanto, muchas fórmulas. Así que tengo que comprobar en cada llamada al evento si se cumplen las condiciones para lanzar la mi macro en cada activo. Al final la hoja funciona pero me satura Excel, pues está continuamente recibiendo cotizaciones en tiempo real y recalculando fórmulas.

Por otro lado, he estado probando la instrucción *ActiveWorkbook.SetLinkOnData*, para que me lance mi macro cada vez que se reciba una cotización desde una fuente externa (Bloomberg en mi caso). Pero tengo el mismo problema, yo quiero que la macro se ejecute cuando se cumpla una condición, no tener que comprobar si se cumple la condición cada vez que la cotización cambie. SetLinkOnData se puede activar y desactivar cuando queramos, y lo que he intentado es poner una celda en mi hoja con:

 =si(y(cotizacion > umbral;celda_primera_vez = 0);activar_conexion();apagar_conexion())

De este modo, la siguiente cotización que reciba ya me debería saltar la macro. El problema es que SetLinkOnData no se puede activar desde funciones, sólo desde macros manuales. En fin, que estoy un poco desesperado ya


----------

