Cuando se introduce una respuesta a una pregunta, o cuando se obtiene un valor como resultado de una operación, o en otras muchas situaciones, es necesario que el código "decida" si va a hacer una cosa u otra (o ninguna) con lo que se ha obtenido. Por ejemplo. Si a la pregunta de si el usuario es español éste respondió afirmativamente, habrá que preguntarle cual es su numero del DNI. En caso contrario habrá que preguntarle por su número de pasaporte. Hay varias posibilidades de establecer condicionales durante la ejecución de un programa. Veámoslas:
La sentencia IF significa, en castellano si (condicional, no afirmativo) . La palabra THEN significa entonces o como consecuencia. La palabra ELSE se podría traducir por en caso contrario. Cuando queremos que el programa realice una o mas operaciones si se cumple una condición, podemos usar una estructura básica como la del siguiente ejemplo:
Condicionales
<HTML>
<HEAD>
<TITLE>Prueba básica de condicional</TITLE>
</HEAD>
<BODY>
<SCRIPT LANGUAGE = "VBScript">
edad = INPUTBOX ("¿Es usted mayor de edad?",,"Si")
IF (edad = "Si") THEN
MSGBOX ("Usted ya puede votar")
END IF
</SCRIPT>
</BODY>
</HTML>
Este código muestra la siguiente ventana en la pantalla:

Si el usuario responde Si (Aceptando la respuesta por defecto), el programa muestra el siguiente resultado:

Haz clic aquí para ver esta página:
ejemplo de condicionalEn caso de que el usuario responda otra cosa o pinche en cancelar el programa no muestra ningún resultado. Como hemos visto, la condición va entre paréntesis. Esto no es obligatorio en VBScript, pero facilita la legibilidad del código. Nosotros lo haremos siempre así, por sistema.
Vamos a sofisticar un poco mas nuestro programa:
Condicionales
<HTML>
<HEAD>
<TITLE>Prueba básica de condicional</TITLE>
</HEAD>
<BODY>
<SCRIPT LANGUAGE = "VBScript">
edad = INPUTBOX ("¿Es usted mayor de edad?",,"Si")
IF (edad = "Si") THEN
MSGBOX ("Usted ya puede votar")
ELSE
MSGBOX ("Usted aún no puede votar")
</BODY>
</HTML>
En caso de una respuesta diferente a Si por parte del usuario, ahora veremos en pantalla lo siguiente:

Como vemos, un condicional va encerrado entre las instrucciones IF y END IF. A continuación de la palabra clave IF, en la misma línea de código aparece la condición que determina la ejecución de unas instrucciones o de otras. Después de la palabra clave THEN aparecen las instrucciones que han de ejecutarse si se cumple la condición. A continuación de la palabra clave ELSE aparecen las instrucciones que han de ejecutarse si la condición no se cumple. Todo el bloque del condicional termina con las palabras clave END IF. Por lo tanto, la estructura general de este tipo de condicionales es la siguiente:
IF (condición) THEN
BLOQUE DE INSTRUCCIONES 1
ELSE
BLOQUE DE INSTRUCCIONES 2
END IF
El ejemplo anterior evalúa una condición. Si se cumple la condición hace una cosa y si no se cumple hace otra. Ahora supongamos la siguiente estructura:
IF (condición_1) THEN
BLOQUE DE INSTRUCCIONES 1
ELSE
IF (condición_2) THEN
BLOQUE DE INSTRUCCIONES 2
ELSE
BLOQUE DE INSTRUCCIONES 3
END IF
END IF
Esta estructura es un poco mas compleja. Si se cumple la condición_1 ejecutará el BLOQUE DE INSTRUCCIONES 1. Si no se cumple evalúa la condición_2. En caso de cumplirse ésta, ejecuta el BLOQUE DE INSTRUCCIONES 2. Solo en caso de que las dos condiciones sean falsas se ejecutará el BLOQUE DE INSTRUCCIONES 3. Veamos un ejemplo:
Condicionales anidados
<HTML>
<HEAD>
<TITLE>Prueba básica de condicional</TITLE>
</HEAD>
<BODY>
<SCRIPT LANGUAGE = "VBScript">
edad = INPUTBOX ("¿Cuál es su edad?",,"0")
IF (edad < 18) THEN
MSGBOX ("Eres un jovenzuelo")
ELSE
IF (edad > 65) THEN
MSGBOX
("Usted ya está jubilado")
ELSE
MSGBOX
("Usted es adulto")
END IF
END IF
</SCRIPT>
</BODY>
</HTML>
En primer lugar una observación. En el capítulo anterior decíamos que INPUTBOX () recibía un valor alfanumérico, aunque aquí recibe un valor numérico (la edad) y lo procesa sin problemas como un número. Esto es posible gracias a la propia estructura de datos del lenguaje (ver el capítulo 3: Datos y variables en VBScript).
Bien. Veamos lo que ocurre al ejecutar el código anterior. En primer lugar se le pide al usuario que introduzca su edad. La respuesta por defecto es 0. Una vez que la ha introducido y ha pulsado en Aceptar, se comprueba si la edad es menor que 18. Para ello se usa el operador < (mira el Apéndice C: Operadores en VBScript). En caso de que sea así, se muestra el siguiente mensaje:

En caso de no cumplirse la condición, se comprueba si la edad es mayor que 65. Si se cumple esta condición se muestra el siguiente mensaje:

Solo en caso de no cumplirse ninguna de las dos condiciones anteriores se muestra el último mensaje:

Haz clic aquí para ver esta página:
ejemplo de condicional anidadaHay que resaltar que las condiciones son excluyentes entre sí. Es decir. En el momento que alguna de ellas resulte ser cierta, se ejecuta el bloque de instrucciones correspondiente y se abandona el condicional. Por ejemplo. Si la primera condición es cierta, ya no se evaluará la segunda, como es lógico.
Supongamos que sólo queremos evaluar si la edad del usuario está entre 18 y 65 años. Solo nos interesa saber si está o no en ese rango de edad. Veamos un ejemplo:
Condiciones compuestas
<HTML>
<HEAD>
<TITLE>Prueba básica de condicional</TITLE>
</HEAD>
<BODY>
<SCRIPT LANGUAGE = "VBScript">
edad = INPUTBOX ("¿Cuál es su edad?",,"0")
IF (edad > 18 AND edad < 65) THEN
MSGBOX ("Usted es un adulto en edad
laboral")
ELSE
MSGBOX ("Usted no está en edad
laboral")
END IF
</SCRIPT>
</BODY>
</HTML>
Aquí vemos que la condición son, en realidad dos condiciones unidas por el operador lógico AND (Mira el Apéndice C). Esta línea se podría leer como "Si la edad es menor que 18 y la edad es menor que 65 entonces...". De esta forma se evalúan condiciones múltiples.
Cuando hay que evaluar muchas condiciones no se deben utilizar condicionales anidados: resulta muy laborioso y engorroso de depurar. Para ello se utilizan las sentencias SELECT CASE y END SELECT. Veamos un ejemplo:
Condiciones múltiples
<HTML>
<HEAD>
<TITLE>Prueba de Select</TITLE>
</HEAD>
<BODY>
<SCRIPT LANGUAGE = "VBScript">
OPTION EXPLICIT
DIM cantidad
cantidad = 3
SELECT CASE cantidad
CASE 1:
MSGBOX ("La cantidad vale 1")
CASE 2:
MSGBOX ("La cantidad vale 2")
CASE 3:
MSGBOX ("La cantidad vale 3")
CASE 4:
MSGBOX ("La cantidad vale 4")
CASE 5:
MSGBOX ("La cantidad vale 5")
CASE 6:
MSGBOX ("La cantidad vale 6")
CASE ELSE:
MSGBOX ("La cantidad no está entre 1
y 6")
END SELECT
</SCRIPT>
</BODY>
</HTML>
El resultado será el siguiente:

Supongamos que la línea cantidad = 3 la sustituimos por cantidad = 7. El resultado sería el siguiente.

Haz clic aquí para ver esta página:
ejemplo de condicional múltipleEn cualquier lenguaje de programación se nos plantea, en muchas ocasiones, la necesidad de realizar una operación mas de una vez, en un proceso reiterativo. Esa operación puede realizarse un número determinado o indeterminado de veces. En VBScript tenemos varias estructuras que nos lo permiten. Vamos a conocerlas todas y así sabremos como elegir una u otra según las circunstancias.
Esta estructura se emplea cuando es necesario repetir un bloque de operaciones un número determinado de veces. Un bucle FOR ... Next emplea para ello un variable de control que actúa como contador de las veces que se ha procesado el bucle. La variable que actúa como contador parte de un valor_inicial. Cada vez que se ejecuta el BLOQUE DE SENTENCIAS incluido en el bucle la variable de contador se incrementa en una unidad. Opcionalmente el incremento puede ser diferente de la unidad, incluyendo el parámetro STEP seguido del índice de incremento que deseemos. Cuando el contador alcanza el valor_final se deja de ejecutar el bucle y se sigue ejecutando el programa a partir de la instrucción que va detrás de NEXT. La estructura general es la siguiente:
FOR contador = valor_inicial TO valor_final STEP incremento
BLOQUE DE SENTENCIAS
NEXT
Veamos unos ejemplos de uso.
Bucle For...Next
<HTML>
<HEAD>
<TITLE>Prueba de bucle FOR...NEXT</TITLE>
</HEAD>
<BODY>
<SCRIPT LANGUAGE = "VBScript">
OPTION EXPLICIT
DIM contador
FOR contador = 0 TO 5
DOCUMENT.WRITE (contador & "<BR>")
NEXT
DOCUMENT.WRITE ("Se acabó la cuenta")
</SCRIPT>
</BODY>
</HTML>
El resultado de la ejecución de éste código será el siguiente:
0
1
2
3
4
5
Se acabó la cuenta
Haz clic aquí para ver esta página:
ejemplo de bucle FORBien. Ahora supongamos el siguiente ejemplo de código:
Bucle For...Next
<HTML>
<HEAD>
<TITLE>Prueba de bucle FOR...NEXT</TITLE>
</HEAD>
<BODY>
<SCRIPT LANGUAGE = "VBScript">
OPTION EXPLICIT
DIM contador
FOR contador = 0 TO 10 STEP 2
DOCUMENT.WRITE (contador & "<BR>")
NEXT
DOCUMENT.WRITE ("Se acabó la cuenta")
</SCRIPT>
</BODY>
</HTML>
El resultado será:
0
2
4
6
810
Se acabó la cuenta
Como vemos en el último ejemplo, la cuenta se ha realizado de dos en dos por la palabra clave STEP 2 que hemos añadido a la instrucción FOR.
Este tipo de bucles se emplean para efectuar (DO) una operación un número indeterminado de veces mientras (WHILE) se cumpla una condición. Su estructura general es la siguiente:
DO WHILE (condición)
BLOQUE DE INSTRUCCIONES
LOOP
El BLOQUE DE INSTRUCCIONES, contenido entre las líneas DO y LOOP se ejecutará mientras se cumpla la condición. Supongamos que ha llegado la hora de pedirle al usuario una palabra clave para continuar ejecutando un programa. Esta palabra será, por ejemplo, AUTORIZADO. Veamos como lo haríamos:
Bucle Do...While
<HTML>
<HEAD>
<TITLE>Prueba de DO WHILE ... LOOP</TITLE>
</HEAD>
<BODY>
<SCRIPT LANGUAGE = "VBScript">
OPTION EXPLICIT
DIM clave
clave = ""
DO WHILE (clave <> "AUTORIZADO")
' Ejecuta mientras la clave no es
igual a <> AUTORIZADO
clave = INPUTBOX ("Teclea la clave:")
LOOP
MSGBOX ("La clave ya es correcta")
</SCRIPT>
</BODY>
</HTML>
Este ejemplo mostrará el siguiente cuadro de diálogo y no seguirá adelante hasta que se introduzca la palabra AUTORIZADO. Si se introduce mal la clave, seguirá mostrando la pregunta indefinidamente.

Una vez introducida la clave correctamente el programa continuará su ejecución mostrando lo siguiente:

Haz clic aquí para ver esta página:
ejemplo de bucle DO WHILEBien. Veamos más posibilidades.
Este bucle funciona de manera muy similar al anterior, con la salvedad de que el BLOQUE DE INSTRUCCIONES se ejecuta hasta que (UNTIL) se cumple la condición. Cuando se cumple la condición deja de ejecutarse el bucle. La estructura general es la siguiente:
DO UNTIL (condición)
BLOQUE DE INSTRUCCIONES
LOOP
Como siempre, la mejor manera de entender el funcionamiento es con un ejemplo. Supongamos el mismo caso de antes. Se tiene que pedir la clave mientras no se introduzca correctamente. Veamos como hacerlo.
Bucle Do...Until
<HTML>
<HEAD>
<TITLE>Prueba de DO WHILE ... LOOP</TITLE>
</HEAD>
<BODY>
<SCRIPT LANGUAGE = "VBScript">
OPTION EXPLICIT
DIM clave
clave = ""
DO UNTIL (clave = "AUTORIZADO")
' Ejecuta hasta que la clave es igual
a AUTORIZADO
clave = INPUTBOX ("Teclea la clave:")
LOOP
MSGBOX ("La clave ya es correcta")
</SCRIPT>
</BODY>
</HTML>
El resultado es idéntico al del ejemplo anterior.
Estos bucles son un vestigio de los primeros tiempos de BASIC. Hoy día han sido sustituidos por los bucles DO WHILE ... LOOP, cuyo funcionamiento es idéntico. Sin embargo, los intérpretes actuales todavía los soportan como complemento, por aquellos programadores acostumbrados al modelo antiguo. Su estructura general es la siguiente:
WHILE (condición)
BLOQUE DE SENTENCIAS
WEND
De todas formas, se aconseja no utilizar este formato de bucle, ya que es posible que futuras versiones del intérprete dejen de contemplarlo.
En ocasiones es necesario interrumpir de manera forzada la ejecución de un bucle, por ejemplo si se produce una situación que aconseje la continuación del programa ignorando el resto del proceso del bucle. Para ello se emplea la instrucción EXIT. Esta instrucción presenta tres formatos distintos, según el tipo de bucle en que se implemente. Si queremos causar la ruptura de un bucle FOR... NEXT, utilizaremos EXIT FOR. Para romper un bucle DO WHILE ... LOOP o un bucle DO UNTIL ... LOOP utilizaremos la instrucción EXIT DO. Si lo que queremos es romper un bucle WHILE ... WEND usaremos EXIT WHILE. Veamos un ejemplo práctico. Vamos a suponer que estamos contando números y queremos que la cuenta se interrumpa cuando el cuadrado del número por el que vamos sea mayor que 99. Veamos el siguiente código:
Salir de un bucle
<HTML>
<HEAD>
<TITLE>Prueba de EXIT</TITLE>
</HEAD>
<BODY>
<SCRIPT LANGUAGE = "VBScript">
OPTION EXPLICIT
DIM num
DIM cuad
num = 0
cuad = 0
DO WHILE (num < 1000)
num = num + 1
cuad = num * num
IF (cuad > 99) THEN
EXIT DO
END IF
DOCUMENT.WRITE("El cuadrado de " &
num & " es " & cuad & "<BR>")
LOOP
DOCUMENT.WRITE ("Se acabó el bucle.")
</SCRIPT>
</BODY>
</HTML>
El resultado del código anterior es el siguiente:
El cuadrado de 1 es 1
El cuadrado de 2 es 4
El cuadrado de 3 es 9
El cuadrado de 4 es 16
El cuadrado de 5 es 25
El cuadrado de 6 es 36
El cuadrado de 7 es 49
El cuadrado de 8 es 64
El cuadrado de 9 es 81
Se acabó el bucle.
Haz clic aquí para ver esta página:
ejemplo de bucle EXIT DOEste ejemplo ilustra el funcionamiento de la instrucción EXIT DO. Los otros dos formatos actúan de manera similar. La instrucción EXIT no es de uso muy frecuente, ya que casi siempre se pueden encontrar soluciones mas elegantes, pero conviene conocerla.
Vamos a ver algunos ejemplos.
Uso de la función CBOOL
<HTML>
<HEAD>
<TITLE>
Prueba de funciones de conversión.
</TITLE>
</HEAD>
<BODY>
<SCRIPT LANGUAGE = "VBScript">
OPTION EXPLICIT
DIM variable
variable = 1
MSGBOX (CBOOL (variable))
</SCRIPT>
</BODY>
</HTML>
El resultado de este código será el siguiente:

La función CBOOL en particular devuelve un valor falso si el argumento es 0 y un valor verdadero si el argumento es cualquier otro número.
Una observación acerca de las conversiones entre subtipos numéricos. Si un número que convertimos, p.e., a Byte es muy grande para caber en este subtipo, se truncará. Supongamos la siguiente sentencia: numero = CBYTE (567.384.896.456,29) . Esto es claramente una irregularidad, ya que el número es demasiado grande para ser di subtipo Byte.
Veamos mas ejemplos:
Uso de Funciones de cadena: Instr y Mid
<HTML>
<HEAD>
<TITLE>Prueba de funciones de cadena.</TITLE>
</HEAD>
<BODY>
<SCRIPT LANGUAGE = "VBScript">
OPTION EXPLICIT
DIM variable
DIM parte_central
variable = CHR (65)
DOCUMENT.WRITE ("Valor de CHR (65): " & variable & "<BR>")
variable = "Alfa"
parte_central = INSTR (variable,"l")
DOCUMENT.WRITE (parte_central & "<BR>")
Variable = "Manzana"
Parte_central = MID (variable, 3, 2)
DOCUMENT.WRITE (parte_central)
</SCRIPT>
</BODY>
</HTML>
Haz clic aquí para ver esta página:
ejemplo de funciones de cadena. Como resultado nos aparece en pantalla lo siguiente:Valor de CHR (65): A
2
nz
Fíjate en la segunda línea. Es el resultado de la función INSTR. Si analizamos la correspondiente línea de código veremos que esta función recibe dos argumentos. El primero es la cadena (o variable que la contiene) donde hay que buscar algo. El segundo es la cadena (o variable que la contiene) que hay que buscar dentro. El número que devuelve como resultado (en este caso el 2) es la posición que ocupa la segunda cadena dentro de la primera.
Ahora observa la última línea, con el texto nz. Es el resultado de aplicar la función MID. Observa la correspondiente línea de código. Ves que esta función recibe tres argumentos. El primero es una cadena (o la variable que la contiene) de la que se extraerá una sub-cadena. El segundo es un número (o una variable que contiene un número), que indica que lugar de la cadena iniciará la sub-cadena. El tercero es un número (o una variable que contiene un número) que indica cuantos caracteres se cogerán para la sub-cadena. Hay que puntualizar que la cadena original no sufre amputación ni transformación de ningún tipo.
Otro ejemplo:
Funciones matemáticas
<HTML>
<HEAD>
<TITLE>Prueba de funciones matemáticas.</TITLE>
</HEAD>
<BODY>
<SCRIPT LANGUAGE = "VBScript">
OPTION EXPLICIT
RANDOMIZE
DIM numero
numero = 0
DO UNTIL numero > 0
numero = INPUTBOX ("Introduzca un
número")
IF (NOT ISNUMERIC (numero)) THEN
numero = 0
END IF
LOOP
DOCUMENT.WRITE ("El número es: " & numero & "<BR>")
numero = INT (numero)
DOCUMENT.WRITE ("La parte entera es: " & numero & "<BR>")
DOCUMENT.WRITE ("El valor hexa es: " & HEX (numero) & "<BR>")
DOCUMENT.WRITE ("Un número aleatorio es: " & RND() & "<BR>")
</SCRIPT>
</BODY>
</HTML>
Haz clic aquí para ver esta página:
ejemplo de funciones matemáticas Este programa nos pide un número por teclado como ya conocemos. Supongamos que introducimos 45,7. Los resultados serán los siguientes:El número es: 45,7
La parte entera es: 45
El valor hexa es: 2D
Un número aleatorio es: 0,1896936
La primera línea nos muestra el número que hemos introducido. La segunda nos muestra el resultado de obtener la parte entera con la función INT, la tercera línea nos muestra el valor hexa de 45. Finalmente la cuarta línea es un número aleatorio generado con
RND(). Esta función siempre genera un número aleatorio que está entre 0 y 1. Observa que el código incluye la instrucción RANDOMIZE.Observa también que se ha usado la función ISNUMERIC para anular la entrada por teclado si lo que se introdujo no es un número. En este caso se ha precedido la función del operador lógico
NOT. Consulta el Apéndice C para obtener mas información respecto a los operadores.Otro ejemplo mas:
Funciones de fecha
<HTML>
<HEAD>
<TITLE>Prueba de una función de fecha</TITLE>
</HEAD>
<BODY>
<SCRIPT LANGUAGE = "VBScript">
OPTION EXPLICIT
DIM fecha
fecha = DATE ()
IF (WEEKDAY (fecha, VBMONDAY) = 7) THEN
DOCUMENT.WRITE ("Hoy es domingo.")
ELSE
DOCUMENT.WRITE ("Hoy se trabaja.")
END IF
</SCRIPT>
</BODY>
</HTML>
Este código recoge, en primer lugar, la fecha del sistema. Si la fecha corresponde a un domingo, muestra:
Hoy es domingo.
En caso contrario, muestra:
Hoy se trabaja.
Para hacer esto, utiliza la función WEEKDAY, indicando, como primer día de la semana, el Lunes.
GENERALIDADES FINALES
Recuerda, las tres diferencias básicas entre funciones de usuario y procedimientos son:
1. La función de usuario se define entre las instrucciones FUNCTION y END FUNCTION. El procedimiento se define entre SUB y END SUB.
2. Las funciones (de usuario y del lenguaje) devuelven un resultado. Los procedimientos, no.
3. La forma de invocar una función es con su nombre seguido de paréntesis. Si la función recibe argumentos, éstos van entre los paréntesis. Para invocar un procedimiento hay dos formas. La primera es el nombre del procedimiento seguido de los argumentos, si los hay, separados por comas. La segunda es la palabra clave CALL, seguida del nombre del procedimiento, seguido éste, a su vez de paréntesis. Si hay argumentos, éstos van entre los paréntesis, seguidos por comas.