3. Fundamentos de la programación VBSCRIPT
Después de describir los posibles contextos de ejecución de un script VBScript, ahora abordamos el lenguaje en sí. En lo que sigue, nos situamos en las siguientes condiciones:
- el contenedor del script es WSH
- el script se encuentra en un archivo con la extensión .vbs
Para presentar un concepto, por lo general procedemos de la siguiente manera:
- introducimos el concepto si es necesario
- presentamos un programa de ejemplo con sus resultados
- comentamos los resultados y el programa si es necesario
Los contenedores de VBScript no distinguen entre mayúsculas y minúsculas en el texto del script. Por lo tanto, se puede escribir indistintamente wscript.echo «hola» o WSCRIPT.ECHO «hola».
Los programas que se presentan a continuación realizan muchas operaciones de escritura en pantalla, por lo que volveremos a explicar los métodos de escritura del objeto wscript.
3.1. Mostrar información
Ya hemos utilizado el método echo del objeto wscript, pero este último cuenta con otros métodos que permiten escribir en pantalla, como lo muestra el siguiente script:
Programa | Resultados |
![]() |
Cabe destacar los siguientes puntos:
- Cualquier texto que se coloque después de un apóstrofo se considera un comentario del script y no es interpretado por WSH (línea 1).
- El método echo escribe sus argumentos y pasa a la siguiente línea, al igual que el método writeLine (líneas 2 y 6).
- El método write escribe sus argumentos y no pasa a la siguiente línea (línea 3).
- Un marcador de fin de línea se representa mediante la secuencia de dos caracteres de código ASCII: 13 y 10. Así, la línea 4 se representa mediante la expresión chr(13) & chr(10), donde chr(i) es el carácter de código ASCII i y & es el operador de concatenación de cadenas. De este modo, «chat» & «eau» forma la cadena «chateau».
- El marcador de fin de línea se puede representar más fácilmente mediante la constante vbCRLF (línea 5)
3.2. E a escritura de instrucciones en un script de VBScript
Por defecto, se escribe una instrucción por línea. Sin embargo, se pueden escribir varias instrucciones por línea separándolas con el carácter :, como en inst1:inst2:inst3. Si una línea es demasiado larga, se puede dividir en partes. En ese caso, las diferentes partes de la instrucción deben terminar con los dos caracteres (espacio)_. Retomamos el ejemplo anterior reescribiendo las instrucciones de otra manera:
Programa | Resultados |
![]() |
3.3. Escribir con la función msgBox
Aunque en este documento utilizamos casi exclusivamente el objeto wscript para escribir en la pantalla, existe una función más sofisticada para mostrar información en una ventana. Se trata de la función msgbox, que por lo general se utiliza con tres parámetros:
msgbox mensaje, íconos+botones, título
- mensaje es el texto del mensaje que se mostrará
- iconos+botones (opcional) es, en realidad, un número que indica el tipo de icono y los botones que se colocarán en la ventana del mensaje. Este número suele ser la suma de dos números: el primero determina el icono, el segundo los botones
- título es el texto que se colocará en la barra de título de la ventana del mensaje
Los valores que se deben utilizar para especificar el ícono y los botones de la ventana de visualización son los siguientes:
Constante | Valor | Descripción |
vbOKOnly | 0 | Solo muestra el botón OK. |
vbOKCancel | 1 | Muestra los botones OK y Cancelar. |
vbAbortRetryIgnore | 2 | Muestra los botones «Cancelar», «Reintentar» e «Ignorar». |
vbYesNoCancel | 3 | Muestra los botones «Sí», «No» y «Cancelar». |
vbYesNo | 4 | Muestra los botones «Sí» y «No». |
vbRetryCancel | 5 | Muestra los botones «Intentar de nuevo» y «Cancelar». |
vbCritical | 16 | Muestra el ícono de «Mensaje crítico». |
vbQuestion | 32 | Muestra el ícono «Solicitud de advertencia». |
vbExclamation | 48 | Muestra el ícono de «Mensaje de advertencia». |
vbInformation | 64 | Muestra el ícono de mensaje informativo. |
vbDefaultButton1 | 0 | El primer botón es el botón predeterminado. |
vbDefaultButton2 | 256 | El segundo botón es el botón predeterminado. |
vbDefaultButton3 | 512 | El tercer botón es el botón predeterminado. |
vbDefaultButton4 | 768 | El cuarto botón es el botón predeterminado. |
vbApplicationModal | 0 | Aplicación modal; el usuario debe responder al mensaje antes de continuar trabajando en la aplicación actual. |
vbSystemModal | 4096 | Sistema modal; todas las aplicaciones se suspenden hasta que el usuario responda al mensaje. |
Estos son algunos ejemplos:
Programa | ||||||||||||||||||
![]() | ||||||||||||||||||
Resultados | ||||||||||||||||||
| ||||||||||||||||||
En algunos casos, se muestra una ventana de información que también sirve como ventana de entrada. Si se plantea una pregunta, se quiere saber, por ejemplo, si el usuario hizo clic en el botón oui o en el botón non. La función msgBox devuelve un resultado que no hemos utilizado en el programa anterior. Este resultado es un número entero que representa el botón que utilizó el usuario para cerrar la ventana de visualización:
Constante | Valor | Botón seleccionado |
vbOK | 1 | OK |
vbCancel | 2 | Cancelar |
vbAbort | 3 | Abandono |
vbRetry | 4 | Intentarlo de nuevo |
vbIgnore | 5 | Ignorar |
vbYes | 6 | Sí |
vbNo | 7 | No |
El siguiente programa muestra cómo se utiliza el resultado de la función msgBox. Se muestra cuatro veces una ventana con los botones «Sí», «No» y «Cancelar». Se responde de la siguiente manera:
- se hace clic en «Sí»
- se hace clic en «No»
- se hace clic en «Cancelar»
- se cierra la ventana sin usar ningún botón. El programa muestra que esto equivale a usar el botón «Cancelar».
Programa | ||||
![]() | ||||
Resultados | ||||
|
3.4. El s datos utilizables en VBScript
VBscript solo reconoce un tipo de datos: el variante. El valor de un «variant» puede ser un número (4, 10.2), una cadena de caracteres («hola»), un valor booleano (verdadero/falso), una fecha (#01/01/2002#), la dirección de un objeto o un conjunto de todos estos datos organizados en una estructura llamada matriz.
Analicemos el siguiente programa y sus resultados:
Programa | Resultados |
![]() |
Comentarios:
- Varios lenguajes de programación (C, C++, Pascal, Java, C#, etc.) exigen la declaración previa de una variable antes de usarla. Esta declaración consiste en indicar el nombre de la variable y el tipo de datos que puede contener (entero, real, cadena, fecha, booleano, etc.). La declaración de variables permite varias cosas:
- saber el espacio de memoria necesario para la variable, ya que los distintos tipos de datos requieren diferentes cantidades de memoria
- verificar la coherencia del programa. Así, si i es un entero y c es una cadena de caracteres, multiplicar i por c no tiene sentido. Si el programador ha declarado el tipo de las variables i y c, el programa encargado de analizar el código antes de su ejecución puede señalar dicha inconsistencia.
Al igual que la mayoría de los lenguajes de script con un solo tipo de datos (Perl, Python, JavaScript, etc.), VBScript permite no declarar las variables. Eso es lo que se hizo en el ejemplo anterior.
- Observemos la sintaxis de diferentes datos
- 10,2 en la línea 10 (punto decimal en lugar de coma). Cabe señalar que en la pantalla se muestra 10,2.
- 1.4e-2 en la línea 13 (notación científica). En la pantalla, se muestra el número 0,014
- [#01/10/2002#] (línea 26) para representar la fecha del 10 de enero de 2002. Por lo tanto, VBScript utiliza el formato #mm/dd/aaaa# para representar la fecha jj del mes mm del año aaaa
- los valores booleanos true y false (verdadero/falso) en las líneas 31 y 34. Estos dos valores se representan, respectivamente, con los números enteros -1 y 0, como se muestra en las líneas 32 y 35. Cuando un valor booleano se concatena con una cadena de caracteres, estos valores se convierten, respectivamente, en las cadenas «Veri» y «Falso», como se muestra en las líneas 33 y 36. Cabe señalar, de paso, que el operador de concatenación & puede utilizarse para concatenar otros elementos además de cadenas.
- Dado que una variable v no tiene un tipo asignado, puede albergar sucesivamente valores de diferentes tipos.
3.5. L os subtipos del tipo variant
Esto es lo que dice la documentación oficial sobre los diferentes tipos de datos que puede contener un variant:
Más allá de la simple distinción entre número y cadena, un Variant puede distinguir diferentes tipos de información numérica. Por ejemplo, cierta información numérica representa una fecha o una hora. Cuando esta información se utiliza junto con otros datos de fecha u hora, el resultado siempre se expresa en forma de fecha u hora. También hay otros tipos de información numérica, desde valores booleanos hasta números grandes en coma flotante. Estas diferentes categorías de información que pueden contenerse en un Variant son subtipos. En la mayoría de los casos, simplemente colocas tus datos en un Variant y este se comporta de la manera más adecuada según dichos datos.
La siguiente tabla presenta los diferentes subtipos que puede contener un Variant.
Subtipo | Descripción |
Empty | El Variant no está inicializado. Su valor es igual a cero para las variables numéricas y a una cadena de longitud nula ("") para las variables de cadena. |
Null | El Variant contiene datos incorrectos de manera intencional. |
Boolean | |
Byte | Contiene un número entero de 0 a 255. |
Integer | Contiene un entero de -32 768 a 32 767. |
Moneda | De -922 337 203 685 477,5808 a 922 337 203 685 477,5807. |
Long | Contiene un número entero de -2 147 483 648 a 2 147 483 647. |
Single | Contiene un número de coma flotante de precisión simple de -3,402823E38 a -1,401298E-45 para los valores negativos; de 1,401298E-45 a 3,402823E38 para los valores positivos. |
Doble | Contiene un número de coma flotante de precisión doble de -1,79769313486232E308 a -4,94065645841247E-324 para los valores negativos; de 4,94065645841247E-324 a 1,79769313486232E308 para los valores positivos. |
Fecha (Hora) | Contiene un número que representa una fecha entre el 1 de enero de 100 y el 31 de diciembre de 9999. |
Cadena | Contiene una cadena de longitud variable limitada a aproximadamente 2 mil millones de caracteres. |
Objeto | Contiene un objeto. |
Error | Contiene un número de error. |
3.6. C onocer el tipo exacto de los datos contenidos en un variante
Una variable de tipo «variant» puede contener datos de diversos tipos. A veces necesitamos conocer la naturaleza exacta de esos datos. Si en un programa escribimos produit=nombre1*nombre2, suponemos que nombre1 y nombre2 son dos datos numéricos. A veces no estamos seguros de ello, ya que estos valores pueden provenir de una entrada por teclado, de un archivo o de cualquier fuente externa. Por lo tanto, debemos verificar la naturaleza de los datos almacenados en nombre1 y nombre2. La función typename(var) nos permite conocer el tipo de datos que contiene la variable var. A continuación, algunos ejemplos:
Programa | Resultados |
![]() |
Otra función posible es vartype(var), que devuelve un número que representa el tipo de los datos contenidos en la variable var:
Constante | Valor | Descripción |
vbEmpty | 0 | Vacío (no inicializado) |
vbNull | 1 | Nulo (sin datos válidos) |
vbInteger | 2 | Entero |
vbLong | 3 | Entero largo |
vbSingle | 4 | Número de coma flotante de precisión simple |
vbDouble | 5 | Número de coma flotante de doble precisión |
vbCurrency | 6 | Monetario |
vbDate | 7 | Fecha |
vbString | 8 | Cadena |
vbObject | 9 | Objeto de automatización |
vbError | 10 | Error |
vbBoolean | 11 | Booleano |
vbVariant | 12 | Variante (solo se usa con tablas de variantes) |
vbDataObject | 13 | Objeto no de automatización |
vbByte | 17 | Byte |
vbArray | 8192 | Tabla |
Nota: Estas constantes son especificadas por VBScript. Por lo tanto, los nombres se pueden utilizar en cualquier parte de su código en lugar de los valores reales.
La información anterior proviene de la documentación de VBscript. En ocasiones, esta información es incorrecta, probablemente debido a que se copió y pegó de la documentación de VB. La función vartype de VBScript solo realiza una parte de lo que se describe anteriormente.
El programa anterior, reescrito para vartype, arroja los siguientes resultados:
Programa | Resultados |
![]() |
3.7. D clare las variables utilizadas por el script
Ya hemos señalado que no es obligatorio declarar las variables que utiliza el script. En este caso, si escribimos:
1) somme=4
...
2) somme=smme+10
Si hay un error de escritura, como smme en lugar de «sume» en la instrucción 2, VBScript no reportará ningún error. Supondrá que smme es una nueva variable. La creará y, en el contexto de la instrucción 2, la utilizará inicializándola a 0.
Este tipo de errores puede ser muy difícil de detectar. Por eso, se recomienda forzar la declaración de las variables con la directiva «option explicit» al inicio del script. A continuación, toda variable debe declararse con una instrucción «dim» antes de su primer uso:
option explicit
...
dim somme
1) somme=4
...
2) somme=smme+10
En este ejemplo, VBScript indicará que hay una variable no declarada, tal como se muestra en el punto 2), como lo ilustra el siguiente ejemplo:
Programa | Resultados |
![]() |
Aunque en los breves ejemplos de este documento las variables no suelen declararse, nos aseguraremos de declararlas tan pronto como escribamos los primeros scripts importantes. En ese momento, se utilizará sistemáticamente la directiva Option explicit.
3.8. : sus funciones de conversión
VBScript transforma los datos de los variantes en cadenas, números, valores booleanos, etc., según el contexto. La mayoría de las veces esto funciona bien, pero a veces da algunas sorpresas, como veremos más adelante. Por eso, es posible que queramos “forzar” el tipo de datos de la variante. VBscript cuenta con funciones de conversión que transforman una expresión en diversos tipos de datos. Estas son algunas de ellas:
Cint (expresión) | convierte la expresión en un entero corto (integer) |
Clng (expresión) | convierte la expresión en un entero largo (long) |
Cdbl (expresión) | convierte la expresión en un número real de doble precisión (double) |
Csng (expresión) | convierte la expresión en un número real simple (single) |
Ccur (expresión) | convierte la expresión en un valor monetario (currency) |
A continuación se muestran algunos ejemplos:
3.9. eer datos ingresados por teclado
El objeto wscript permite que un script recupere datos ingresados mediante el teclado. El método wscript.stdin.readLine permite leer una línea de texto ingresada mediante el teclado y validada con la tecla «Enter». Esta línea leída se puede asignar a una variable.
Programa | Resultados |
![]() | |
Comentarios:
- En la columna de resultados y en la fila [Tapez votre nom : st], st es la fila ingresada por el usuario.
Aunque el texto escrito con el teclado sea un número, se considera ante todo como una cadena de caracteres, tal como se muestra en el siguiente ejemplo:
Programa | Resultados |
![]() |
Si este número interviene en una operación aritmética, VBscript convertirá automáticamente la cadena en un número, pero no siempre. Veamos el siguiente ejemplo:
Programa | Resultados |
![]() |
En los resultados, vemos que la línea 8 del script no se ejecutó como se esperaba, ya que (lamentablemente) en VBScript el operador + tiene dos significados: la suma de dos números o la concatenación de dos cadenas (las dos cadenas se unen una a la otra). Anteriormente vimos que los números ingresados desde el teclado se leían como cadenas de caracteres y que VBScript las convertía en números según fuera necesario. Lo hizo correctamente para las operaciones -, *, /, que solo pueden involucrar números, pero no para el operador +, que también puede involucrar cadenas. En este caso, supuso que se quería realizar una concatenación de cadenas.
Una solución sencilla a este problema es convertir las cadenas en números tan pronto como se leen, tal como lo muestra la siguiente mejora del programa anterior:
Programa | Resultados |
![]() |
3.10. S introducir datos con la función inputbox
Es posible que se desee ingresar datos en una interfaz gráfica en lugar de hacerlo con el teclado. Para ello, se utiliza la función inputBox. Esta función admite numerosos parámetros, de los cuales solo los dos primeros se utilizan con frecuencia:
respuesta = inputBox(mensaje, título)
- mensaje: la pregunta que le haces al usuario
- título (opcional): el título que le das a la ventana de entrada
- respuesta: el texto que escribe el usuario. Si el usuario cerró la ventana sin responder, respuesta es la cadena vacía.
A continuación, un ejemplo en el que se solicita el nombre y la edad de una persona. Para el nombre, ingresamos un dato y presionamos OK. Para la edad, también ingresamos un dato, pero presionamos Cancelar.
Programa | ||||
![]() | ||||
Resultados | ||||
|
3.11. U tilizar objetos estructurados
Con VBScript es posible crear objetos que tengan métodos y propiedades. Para no complicar las cosas, aquí presentaremos un objeto con propiedades, pero sin métodos. Pensemos en una persona. Tiene muchas propiedades que la caracterizan: estatura, peso, color de piel, de ojos, de cabello... Nos quedaremos solo con dos: su nombre y su edad. Antes de poder utilizar objetos, hay que crear el molde que permitirá fabricarlos. En VBScript, esto se hace mediante una clase. La clase personne podría definirse de la siguiente manera:
class personne
Dim nom,age
End class
Es la instrucción [Dim nom,age] la que define las dos propiedades de la clase personne. Para crear ejemplares (a los que se les llama instancias) de la clase personne, se escribe:
¿Por qué no escribir
Porque una variante no puede contener un objeto. Solo puede contener su dirección. Al escribir set persona1=new persona, ocurre la siguiente secuencia de eventos:
- se crea un objeto personne. Esto significa que se le asigna memoria.
- La dirección de este objeto personne se asigna a la variable personne1
Entonces tenemos el siguiente esquema de memoria para las variables personne1 y personne2:
![]() |
En sentido figurado, podríamos decir que personne1 es un objeto personne. Se puede aceptar esta forma de hablar si recordamos que personne1 es, de hecho, la dirección de un objeto personne y no el objeto personne en sí mismo.
Hemos dicho que un objeto personne tiene dos propiedades: nom y age. ¿Cómo se pueden utilizar estas propiedades? Mediante la notación objet.propriété, tal como se explicó un poco más arriba. Así,
personne1.nom representa el nombre de la persona 1 y personne1.age su edad. A continuación, un breve programa ilustrativo:
Programa | Resultados |
![]() |
El programa anterior podría modificarse de la siguiente manera:
Programa | Resultados |
![]() |
Aquí hemos utilizado la estructura with ... end with, que permite «factorizar» nombres de objetos en expresiones. La estructura with p1 ... end with de las líneas 9a la 12 y de la 15 a la 18 permite utilizar posteriormente la sintaxis .nom en lugar de p1.nom y .age en lugar de p1.age. Esto permite simplificar la escritura de las instrucciones en las que se utiliza repetidamente el mismo nombre de objeto.
3.12. Asignar un valor a una variable
Existen dos instrucciones para asignar un valor a una variable:
- variable=expresión
- asignar variable=expresión
La forma 2 está reservada para expresiones cuyo resultado es una referencia a un objeto. Para todos los demás tipos de expresiones, se utiliza la forma 1. La diferencia entre ambas formas es la siguiente:
- en la instrucción variable=expression, la variable recibe un valor. Si v1 y v2 son dos variables, escribir v1=v2 asigna el valor de v1 a v2. Por lo tanto, se duplica un valor en dos lugares distintos. Si posteriormente se modifica el valor de v2, el de v1 no se ve afectado en absoluto.
![]() |
- En la instrucción set variable=expresión, la variable recibe como valor la dirección de un objeto. Si v1 y v2 son dos variables y v2 es la dirección de un objeto obj2, al escribir set v1=v2 se asigna el valor de v1 a v2, es decir, la dirección del objeto obj2. Cuando el script manipula posteriormente v1 y v2, no son los «valores» de v1 y v2 los que se manipulan, sino los objetos a los que «apuntan» v1 y v2, es decir, el mismo objeto en este caso. Se dice que v1 y v2 son dos referencias al mismo objeto y que manipularlo a través de v1 o v2 no supone ninguna diferencia. Dicho de otra manera, modificar el objeto al que apunta v2 modifica el que apunta v1.
![]() |
He aquí un ejemplo:
Programa | Resultados |
![]() |
3.13. E valuar expresiones
Los principales operadores que permiten evaluar expresiones son los siguientes:
Tipo de operadores | Operadores | Ejemplo |
Aritméticos | +,-,*,/ | |
mod | ||
\ | ||
^ | ||
Comparación | <, <= >, >= =,<> | a<>b es verdadero si a es diferente de b a=b es verdadero si a es igual a b Tanto a como b pueden ser números o cadenas de caracteres. En este último caso, cadena1<cadena2 si, en orden alfabético, cadena1 precede a cadena2. En la comparación de cadenas, las mayúsculas preceden a las minúsculas en el orden alfabético. |
is | ||
Lógica | and, or, not, xor | Aquí todos los operandos son booleanos. bool1 or bool2 es verdadero si bool1 o bool2 es verdadero bool1 and bool2 es verdadero si tanto bool1 como bool2 son verdaderos not bool1 es verdadero si bool1 es falso y viceversa bool1 xor bool2 es verdadero si solo uno de los booleanos bool1 o bool2 es verdadero |
Concatena | &, + | No se recomienda usar el operador + para concatenar dos cadenas debido a la posible confusión con la suma de dos números. Por lo tanto, se utilizará exclusivamente el operador &. |
3.14. C ontrolar la ejecución del programa
3.14.1. E ejecutar acciones de manera condicional
La instrucción de VBScript que permite realizar acciones según el valor verdadero o falso de una condición es la siguiente:
| Primero se evalúa la expresión expression. Esta expresión debe tener un valor booleano. Si su valor es verdadero, se ejecutan las acciones de then; de lo contrario, se ejecutan las de else, si está presente. |
A continuación se presenta un programa con diferentes variantes de la estructura if-then-else:
Programa | Resultados |
![]() |
Comentarios:
- En VBScript, se puede escribir instrucción1:instrucción2:... : instrucciónn en lugar de escribir una instrucción por línea. Esta posibilidad se ha aprovechado, por ejemplo, en la línea 10.
3.14.2. E xecutar acciones de manera repetida
Bucle con número conocido de iteraciones |
Se puede salir de un bucle «for» en cualquier momento con la instrucción «exit for». |
Bucle con número desconocido de iteraciones |
Se puede salir de un bucle «do while» en cualquier momento con la instrucción «exit do». |
El siguiente programa ilustra estos puntos:
Programa |
![]() |
Resultados |
Nota: Durante la fase de desarrollo de un programa, no es raro que un programa entre en un «bucle», c.a.d, y nunca se detenga. Por lo general, el programa ejecuta un bucle cuya condición de salida no se puede verificar, como, por ejemplo, en el siguiente ejemplo:
' bucle infinito
i=0
Do While 1=1
i=i+1
wscript.echo i
Loop
' otra del mismo tipo
i=0
Do While true
i=i+1
wscript.echo i
Loop
Si se ejecuta el programa anterior, el primer bucle nunca se detendrá por sí solo. Se puede forzar su detención escribiendo CTRL-C en el teclado (manteniendo presionadas simultáneamente las teclas CTRL y C).
3.14.3. Finalizar la ejecución del programa
La instrucción wscript.quit n termina la ejecución del programa devolviendo un código de error igual a n. En DOS, este código de error se puede comprobar con la instrucción if ERRORLEVEL n, que es verdadera si el código de error devuelto por el último programa ejecutado es >=n. Consideremos el siguiente programa y sus resultados:
![]() |
Inmediatamente después de ejecutar el programa, se emiten los siguientes tres comandos DOS:
El comando DOS 1 verifica si el código de error devuelto por el programa es >=5. Si es así, muestra (echo) 5; de lo contrario, no muestra nada.
El comando DOS 3 comprueba si el código de error devuelto por el programa es >=4. Si es así, muestra 4; de lo contrario, no muestra nada.
El comando DOS 5 comprueba si el código de error devuelto por el programa es >=3. Si es así, muestra 3; de lo contrario, no muestra nada.
A partir de los resultados mostrados, se puede deducir que el código de error devuelto por el programa fue 4.
3.15. L ar tablas de datos en una variante
Un variante T puede contener una lista de valores. En ese caso, se dice que es una matriz. Una matriz T tiene diversas propiedades:
- Se accede al elemento i de la matriz T mediante la sintaxis T(i), donde i es un número entero llamado índice, comprendido entre 0 y n-1 si T tiene n elementos.
- Se puede conocer el índice del último elemento del array T con la expresión ubound(T). El número de elementos del array T es, entonces, ubound(T)+1. A este número se le suele llamar el tamaño del array.
- Una variable T puede inicializarse con un array vacío mediante la sintaxis T=array() o con una secuencia de elementos mediante la sintaxis T=array(elemento0, elemento1, ...., elementoN)
- Se pueden agregar elementos a un array T ya creado. Para ello, se utiliza la instrucción redim preserve T(N), donde N es el nuevo índice del último elemento del array T. La operación se denomina redimensionamiento (redim). La palabra clave preserve indica que, durante este redimensionamiento, se debe conservar el contenido actual del array. Si no se incluye esta palabra clave, T se redimensiona y se vacía de sus elementos.
- Un elemento T(i) del array T es de tipo variant y, por lo tanto, puede contener cualquier valor y, en particular, un array. En este caso, la notación T(i)(j) designa al elemento j del array T(i).
Estas diversas propiedades de las matrices se ilustran en el siguiente programa:
Programa | Resultados |
![]() |
Comentarios
- Aquí se utilizó una función llamada «join», que se explica con más detalle más adelante.
3.16. as variables de matriz
En VBScript existe otra forma de utilizar un array: mediante una variable de tipo array. A diferencia de las variables escalares, este tipo de variable debe declararse obligatoriamente mediante la instrucción dim. Existen varias formas de declararla:
- dim array(n) declara un array estático de n+1 elementos numerados del 0 al n. Este tipo de array no se puede redimensionar
- dim matriz() declara una matriz dinámica vacía. Para poder usarla, deberá redimensionarse mediante la instrucción redim, de la misma manera que para un variant que contenga una matriz
- dim matriz(n,m) declara una matriz bidimensional de (n+1)*(m+1) elementos. El elemento (i,j) de la matriz se denota como tableau(i,j). Cabe señalar la diferencia con un variant, donde el mismo elemento se habría denotado como tableau(i)(j).
¿Por qué existen dos tipos de matrices que, en definitiva, son muy similares? La documentación de VBScript no lo menciona y tampoco indica si una es más eficiente que la otra. De aquí en adelante, utilizaremos casi exclusivamente la matriz dentro de una variante en nuestros ejemplos. Sin embargo, recordemos que VBscript proviene del lenguaje Visual Basic, que a su vez contiene datos tipados (integer, double, boolean, etc.). En este caso, si necesitamos usar una matriz de números reales, por ejemplo, la variable matriz será más eficiente que la variable variante. Entonces declararemos algo como dim array(1000) as double para declarar un array de números reales o simplemente dim array() as double si el array es dinámico.
A continuación se muestra un ejemplo que ilustra el uso de variables de tipo matriz:
Programa | Resultados |
![]() |
3.17. as funciones split y join
Las funciones split y join permiten pasar de una cadena de caracteres a una matriz y viceversa:
- Si T es un array y car es una cadena de caracteres, join(T,car) es una cadena de caracteres formada al unir todos los elementos del array T, cada uno separado del siguiente por la cadena car. Así, join(array(1,2,3),"abcd") dará como resultado la cadena "1abcd2abcd3"
- Si C es una cadena de caracteres formada por una secuencia de campos separados por la cadena car, la función split(C,car) devuelve un array cuyos elementos son los distintos campos de la cadena C. Así, split("1abcd2abcd3", "abcd") dará como resultado el array (1,2,3)
A continuación, un ejemplo:
Programa | Resultados |
|
3.18. Los diccionarios
Se puede acceder a un elemento de una matriz T cuando se conoce su número i. En ese caso, se puede acceder a él mediante la notación T(i). Existen matrices a cuyos elementos se accede, no mediante un número, sino mediante una cadena de caracteres. El ejemplo típico de este tipo de matriz es el diccionario. Cuando buscamos el significado de una palabra en el «Larousse» o en «Le petit Robert», accedemos a él mediante la palabra. Podríamos representar este diccionario mediante una matriz de 2 columnas:
palabra1 | descripción1 |
palabra2 | descripción2 |
palabra3 | descripción3 |
.... |
Entonces podríamos escribir cosas como:
diccionario("palabra1") = "descripción1"
diccionario("palabra2") = "descripción2"
...
Esto se asemeja al funcionamiento de un array, salvo que los índices del array no son números enteros, sino cadenas de caracteres. A este tipo de array se le llama diccionario (o array asociativo, tabla hash) y a los índices, que son cadenas de caracteres, se les llama claves del diccionario (keys). El uso de diccionarios es extremadamente frecuente en el mundo de la informática. Todos tenemos una tarjeta del seguro social con un número. Este número nos identifica de manera única y nos da acceso a la información que nos concierne. En el modelo diccionario("clave")="información", "clave" sería aquí el número del seguro social e "información" toda la información almacenada sobre nosotros en las computadoras del seguro social.
En Windows, existe un objeto ActiveX llamado «Scripting.Dictionary» que permite crear y administrar diccionarios. Un objeto ActiveX es un componente de software que expone una interfaz que pueden utilizar programas escritos en diferentes lenguajes, siempre y cuando respeten el estándar de uso de los objetos ActiveX. Por lo tanto, el objeto Scripting.dictionary puede utilizarse con los lenguajes de programación de Windows: JavaScript, Perl, Python, C, C++, VB, VBA... y no solo con VBScript.
1 | Un objeto Scripting.Dictionary se crea mediante una instrucción set dico=wscript.CreateObject("Scripting.Dictionary") o simplemente set diccionario = CreateObject("Scripting.Dictionary") CreateObject es un método del objeto WScript que permite crear instancias de objetos ActiveX. La versión 2 muestra que wscript puede ser un objeto implícito. Cuando un método no puede «asignarse» a un objeto, el contenedor WSH intentará asignarlo al objeto wscript. |
2 | Una vez creado el diccionario, podremos agregarle elementos con el método add: dico.add «clave»,valor creará una nueva entrada en el diccionario asociada a la clave «clave». El valor asociado es un variant que contiene cualquier dato. |
3 | Para recuperar el valor asociado a una clave determinada, se utiliza el método item del diccionario: var = dic.item("clave") o set var=dico.item("clave") si el valor asociado a la clave es un objeto. |
4 | El conjunto de claves del diccionario se puede recuperar en un array variable mediante el método `keys`: claves = diccionario.keys claves es un array cuyos elementos se pueden recorrer. |
5 | El conjunto de valores del diccionario se puede recuperar en un array variable mediante el método items: valores = dic.items items es un array cuyos elementos se pueden recorrer. |
6 | Se puede comprobar si existe una clave con el método exists: dico.exists("clave") es verdadero si la clave "clave" existe en el diccionario |
7 | Se puede eliminar una entrada del diccionario (clave+valor) con el método remove: dico.remove("clave") elimina la entrada del diccionario asociada a la clave "clave". dico.removeall elimina todas las claves; c.a.d vacía el diccionario. |
El siguiente programa utiliza estas diversas posibilidades:
Programa |
|
Resultados |
|
3.19. Ordenar un array o un diccionario
Es común querer ordenar una matriz o un diccionario en orden creciente o decreciente según sus valores o, en el caso de un diccionario, según sus claves. Si bien en la mayoría de los lenguajes existen funciones de ordenación, parece que en VBScript no las hay. Esto es una carencia.
3.20. Los argumentos de un programa
Es posible llamar a un programa de VBScript pasándole parámetros, como en:
Esto le permite al usuario pasar información al programa. ¿Cómo hace este para recuperarla? Veamos el siguiente programa:
Programa | Resultados |
![]() |
Comentarios
- WScript.Arguments es la colección de argumentos pasados al script
- una colección C es un objeto que tiene
- una propiedad count que representa el número de elementos en la colección
- un método C(i) que devuelve el elemento i de la colección
3.21. Una primera aplicación: IMPOTS
Nos proponemos escribir un programa que permita calcular el impuesto de un contribuyente. Consideremos el caso simplificado de un contribuyente que solo tiene que declarar su salario:
- se calcula el número de cuotas del empleado nbParts = nbEnfants/2 + 1 si no está casado, nbEnfants/2+2 si está casado, donde nbEnfants es su número de hijos.
- se calcula su ingreso imponible R = 0,72 * S, donde S es su salario anual
- se calcula su coeficiente familiar Q = R/N
se calcula su impuesto I según los siguientes datos
12620.0 | 0 | 0 |
13 190 | 0,05 | 631 |
15640 | 0,1 | 1290,5 |
24 740 | 0,15 | 2072,5 |
31 810 | 0,2 | 3309,5 |
39 970 | 0,25 | 4900 |
48 360 | 0,3 | 6898,5 |
55 790 | 0,35 | 9316,5 |
92 970 | 0,4 | 12106 |
127 860 | 0,45 | 16 754,5 |
151 250 | 0,50 | 23 147,5 |
172 040 | 0,55 | 30 710 |
195 000 | 0,60 | 39312 |
0 | 0,65 | 49 062 |
Cada línea tiene 3 campos. Para calcular el impuesto I, se busca la primera línea en la que QF sea menor o igual que el campo 1. Por ejemplo, si QF = 30000, se encontrará la línea
El impuesto I es entonces igual a 0,15*R - 2072,5*nbParts. Si QF es tal que la relación QF<=campo1 nunca se cumple, entonces se utilizan los coeficientes de la última línea. En este caso:
lo que da como resultado el impuesto I = 0,65 * R - 49062 * nbParts.
El programa es el siguiente:
Programa | ||
| ||
Resultados | ||
|
Comentarios:
- el programa utiliza lo que se ha explicado anteriormente (declaración de variables, argumentos, cambios de tipo, comprobaciones, bucles, matriz en un variante)
- No verifica la validez de los datos, lo cual sería inusual en un programa real
- Solo el bucle while presenta una dificultad. Su objetivo es determinar el índice i de la matriz «limites» para el cual se cumple que «limites(i)>qf», y esto para i<ubound(limites) (c.a.d. Aquí, i<13), ya que el último elemento de la matriz «limites» no es relevante. Se agregó únicamente para que la prueba [Do While i<ubound(limites) And qf>limites(i)] pudiera realizarse para i=13. La prueba es entonces 13<13 y qf>limites(13), por lo que es necesario (en VBScript) que limites(13) exista. Al salir del bucle while, el último valor calculado de i permite calcular el impuesto: [impot=int(revenu*coeffr(i)-nbParts*coeffn(i))].









































