Estructuras de control
Ningún programa es una secuencia lineal de instrucciones. En todo lenguaje de programación existen estructuras que nos permiten variar el orden de ejecución dependiendo de ciertas condiciones. Estas estructuras se pueden clasificar en dos grandes grupos: bifurcaciones condicionales y bucles.
Bifurcaciones condicionales
Una bifurcación condicional en una estructura que realiza una tarea u otra dependiendo del resultado de evaluar una condición. En VBScript la sentencia de bifurcación básica es la estructura If - Then - Else. Como es la que utilizan todos los lenguajes imperativos del universo terrenal (o casi) vamos a verla con un ejemplo:
If dinero = 0 Then
MsgBox "Estás en la más absoluta de las miserias"
ElseIf dinero >= 100000000 Then
MsgBox "Estas forrado, oye"
Else
Msgbox "Tampoco me iba a casar contigo por dinero, la verdad"
End If
Como os podéis imaginar, este código comprueba primero si la variable dinero es igual a cero. En caso afirmativo muestra en pantalla el primer mensaje. En otro caso comprueba si tenemos... bueno, si tenemos mucho dinero para sacar el segundo mensaje. Finalmente si no es ninguno de los dos casos enseña el tercer mensaje. Hay que indicar que End If sólo es necesario ponerlo cuando nuestra estructura If - Then - Else ocupa más de una línea.
Existe un caso bastante común de bifurcación en el que se miran todos los posibles valores de una variable, ejecutándo una tarea u otra dependiendo de ello. En VBScript esto se hace por medio de la sentencia Select Case:
Select Case Pelo
Case "Rubio"
MsgBox "Los caballeros las prefieren rubias"
Case "Moreno"
MsgBox "Pero se casan con las morenas"
Case Else
MsgBox "Ya no me sé más refranes estúpidos, lo siento"
End Select
Es menos flexible que la anterior sentencia estudiada, pero más cómoda y legible si nuestro caso se adapta a ella.
Bucles
Un bucle es una estructura que permite repetir una tarea un número de veces, determinado por una condición. De nuevo comenzaremos viendo por el más flexible, el bucle Do...Loop. Este bucle itera indefinidamente las sentencias contenidas en su interior hasta que se cumple (o deja de cumplir) una condición. Esta condición se puede poner al principio (junto al do) o al final (junto al loop), variando de ese modo el momento en que se comprueba, y precedida de la palabra while (si queremos que se itere mientras se cumpla) o la palabra until (si lo que deseamos es que itere mientras no se cumpla). Para mostrar estas diferencias, en el siguiente ejemplo:
i = 0
Do Until i = 10
i=i+1
Loop
i sería 10, mientras que aquí:
i = 0
Do
i=i+1
Loop While i = 10
i tendría el valor 1. Por último, hay que decir que la ejecución de la sentencia Exit Do en cualquier punto del interior del bucle provoca la salida inmediata del mismo. Es conveniente, sin embargo, evitar su uso porque puede convertir el código en algo parecido a un jeroglífico egipcio antes de encontrar la piedra Rossetta.
Un bucle muy común es el numérico. El siguiente ejemplo calcula el factorial de un número usando un bucle For..Next:
Numero = 4
For x = Numero - 1 To 1 Step -1
Numero = Numero * x
Next
En la primera iteración x es igual a Numero - 1 (es, decir, 3). Se ejecuta lo de dentro, con lo que número será igual a 4*3=12. Cuando llegamos al Next sumamos a x el valor contenido que viene después del Step (si no ponemos esta palabra reservada se asume que este valor es 1), por lo que x será ahora 3 y comprobamos que no ha llegado todavía al valor 1. Cuando lo haga, después de dos iteraciones, hay que precisar que realizará una iteración más con x=1, y después de esta la ejecución se saldrá del bucle.
Este bucle también tiene su puerta de atrás, llamada Exit For. Las mismas consideraciones que con el anterior caso.
Por último, una variación de este bucle es For Each...Next, que nos permitirá recorrer vectores. El siguiente ejemplo inicializaría un vector:
Dim vector(8)
For Each indice in vector
vector(indice) = "No tengo nada"
Next
El bucle recorrería los 9 elementos del vector, siendo indice el número del elemento que está recorriendo en ese preciso momento.