Aunque Excel no es una herramienta para hacer animaciones, se pueden obtener algunos efectos interesantes. Por ejemplo, consideremos la siguiente macro:

Sub orbita()
For i = 1 To 1000
x = Cos(i / 10) * 100 + 150
y = Sin(i / 10) * 50 + 150
ActiveSheet.Shapes(“Bola”).Top = y
ActiveSheet.Shapes(“Bola”).Left = x
Next End Sub

Esta macro trabaja sobre una hoja donde hay un objeto (un círculo) llamado Bola. A lo largo de 1000 pasos (controlados por un ciclo For… Next) la macro cambia la posición del objeto.

La coordenada vertical se modifica con la propiedad Top y, la horizontal, con la propiedad Left.

Los valores de estas coordenadas se calculan mediante las funciones Sin (seno) y Cos (coseno).

El resultado es (o debería ser) que el objeto dé vueltas sobre la hoja siguiendo una trayectoria elíptica.

Sin embargo, y como señala el lector, el movimiento del objeto es tan rápido que probablemente lo veamos saltar instantáneamente de su posición inicial a la final.

Esto se resuelve colocando en el código algún tipo de “espera” que detenga la ejecución durante una fracción de segundo.

La instrucción estándar para detener momentáneamente la ejecución de la macro es Wait. Por ejemplo: Application.Wait 1/100000.

El número que sigue a la instrucción es la cantidad de días (así se miden los tiempos en Excel) hasta que la macro reanude su marcha. En este caso, representa algo menos de un segundo (debido a que hay 86400 segundos en un día).

Sin embargo, hay una forma más tradicional de “retardar” una macro, usando un ciclo For… Next suficientemente largo y que “no haga nada”. Podemos hacerlo mediante esta instrucción:

For i = 1 To 200 Calculate Next

Este ciclo da mil vueltas recalculando la hoja en cada una. Esto no produce ningún efecto más que demorar un cierto tiempo. Podemos convertir esto en una instrucción definida por el usuario:

Sub demora(t) For i = 1 To t Calculate Next End Sub

La variable t, que controla la duración de la espera se indica como argumento al invocar la demora. En nuestro caso, en la macro original incluimos, luego de actualizar la posición del objeto, la instrucción de demora con un argumento adecuado:

Sub orbita()
For i = 1 To 1000
x = Cos(i / 10) * 100 + 150
y = Sin(i / 10) * 50 + 150
ActiveSheet.Shapes(“Bola”).Top = y
ActiveSheet.Shapes(“Bola”).Left = x
demora(200)
Next End Sub

Hay que probar con los valores del argumento hasta dar con la velocidad deseada.