3. Fundamentos de la programación VBSCRIPT
Tras haber descrito los posibles contextos de ejecución de un script VBScript, abordamos ahora 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, solemos proceder 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 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 presentar 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 dispone de otros métodos que permiten escribir en pantalla, como muestra el siguiente script:
Programa | Resultados |
![]() |
Cabe destacar los siguientes puntos:
- Cualquier texto situado 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 línea siguiente, al igual que el método writeLine (líneas 2 y 6).
- El método write escribe sus argumentos y no pasa a la línea siguiente (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 & el operador de concatenación de cadenas. De este modo, «chat» & «eau» es 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 VBScript
Por defecto, se escribe una instrucción por línea. No obstante, se pueden escribir varias instrucciones en una misma 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 pantalla, existe una función más sofisticada para mostrar información en una ventana. Se trata de la función msgbox, que se suele utilizar con tres parámetros:
msgbox mensaje, iconos+botones, título
- mensaje es el texto del mensaje que se va a 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 icono y los botones de la ventana de visualización son los siguientes:
Constante | Valor | Descripción |
vbOKOnly | 0 | Muestra únicamente el botón OK. |
vbOKCancel | 1 | Muestra los botones OK y Cancelar. |
vbAbortRetryIgnore | 2 | Muestra los botones Abandonar, 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 «Reintentar» y «Cancelar». |
vbCritical | 16 | Muestra el icono de mensaje crítico. |
vbQuestion | 32 | Muestra el icono «Solicitud de aviso». |
vbExclamation | 48 | Muestra el icono de mensaje de advertencia. |
vbInformation | 64 | Muestra el icono 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 es una ventana de entrada. Si se plantea una pregunta, se quiere saber, por ejemplo, si el usuario ha hecho clic en el botón oui o en el botón non. La función msgBox devuelve un resultado que en el programa anterior no hemos utilizado. Este resultado es un número entero que representa el botón utilizado por 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 el uso del 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 utilizar ningún botón. El programa muestra que esto equivale a utilizar el botón Cancelar.
Programa | ||||
![]() | ||||
Resultados | ||||
|
3.4. El e e datos utilizables en VBScript
VBscript solo conoce un tipo de datos: el variant. El valor de un variant puede ser un número (4, 10,2), una cadena de caracteres («hola»), un valor booleano (true/false), una fecha (#01/01/2002#), la dirección de un objeto o un conjunto de todos estos datos colocados en una estructura llamada matriz.
Veamos el siguiente programa y sus resultados:
Programa | Resultados |
![]() |
Comentarios:
- Algunos lenguajes de programación (C, C++, Pascal, Java, C#, etc.) exigen la declaración previa de una variable antes de su uso. 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:
- conocer el espacio de memoria necesario para la variable, ya que los diferentes tipos de datos requieren diferentes espacios de memoria
- verificar la coherencia del programa. Así, si i es un entero y c una cadena de caracteres, multiplicar i por c no tiene ningún 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 incoherencia.
Al igual que la mayoría de los lenguajes de script de tipo de datos único (Perl, Python, Javascript, etc.), VBScript permite no declarar las variables. Esto es lo que se ha hecho en el ejemplo anterior.
- Observemos la sintaxis de los diferentes datos
- 10,2 en la línea 10 (punto decimal, no 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 booleanos true y false (verdadero/falso) en las líneas 31 y 34. Estos dos valores se representan respectivamente por los enteros -1 y 0, como se muestra en las líneas 32 y 35. Cuando se concatena un valor booleano con una cadena de caracteres, estos valores se convierten, respectivamente, en las cadenas «Vrai» y «Faux», tal y como muestran 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 en el tiempo 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 con otros datos de fecha u hora, el resultado siempre se expresa en forma de fecha u hora. También dispone de otros tipos de información numérica, desde valores booleanos hasta grandes números de coma flotante. Estas diferentes categorías de información que pueden contenerse en un Variant son subtipos. En la mayoría de los casos, basta con colocar los datos en un Variant y este se comportará de la forma más adecuada en función de 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 forma intencionada. |
Boolean | |
Byte | Contiene un entero de 0 a 255. |
Integer | Contiene un entero de -32 768 a 32 767. |
Moneda | -922 337 203 685 477,5808 a 922 337 203 685 477,5807. |
Long | Contiene un 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 comprendida entre el 1 de enero de 100 y el 31 de diciembre de 9999. |
Cadena | Contiene una cadena de longitud variable limitada a unos 2000 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 variant
Una variable de tipo variante puede contener datos de diversos tipos. A veces necesitamos conocer la naturaleza exacta de estos datos. Si en un programa escribimos produit=nombre1*nombre2, suponemos que nombre1 y nombre2 son dos datos numéricos. A veces no estamos seguros, 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 contenidos en la variable var. A continuación se muestran 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 (sin inicializar) |
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 utiliza con matrices de variantes) |
vbDataObject | 13 | Objeto no Automation |
vbByte | 17 | Byte |
vbArray | 8192 | Tabla |
Nota: Estas constantes están especificadas por VBScript. Por lo tanto, los nombres se pueden utilizar en cualquier parte del código en lugar de los valores reales.
La información anterior procede de la documentación de VBscript. En ocasiones es incorrecta, probablemente debido a copias y pegados realizados a partir de la documentación de VB. La función vartype de VBScript solo realiza una parte de lo que se indica anteriormente.
El programa anterior, reescrito para vartype, ofrece los siguientes resultados:
Programa | Resultados |
![]() |
3.7. D eclarar las variables utilizadas por el script
Hemos indicado que no es obligatorio declarar las variables utilizadas por el script. En este caso, si escribimos:
1) somme=4
...
2) somme=smme+10
con un error tipográfico smme en lugar de suma en la instrucción 2, VBScript no señalará 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 lo tanto, se recomienda forzar la declaración de las variables con la directiva «option explicit» colocada al principio 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 y como se muestra en el siguiente ejemplo:
Programa | Resultados |
![]() |
Aunque en los breves ejemplos del documento las variables no suelen declararse, nos veremos obligados a declararlas en cuanto empecemos a escribir los primeros scripts importantes. En ese momento, se utilizará sistemáticamente la directiva Option explicit.
3.8. : funciones de conversión
VBScript transforma los datos de las variantes en cadenas, números, 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 lo tanto, puede 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 dato monetario (currency) |
He aquí algunos ejemplos:
Programa |
![]() |
Resultados |
|
3.9. L eer datos introducidos mediante el teclado
El objeto wscript permite a un script recuperar datos introducidos mediante el teclado. El método wscript.stdin.readLine permite leer una línea de texto introducida mediante el teclado y validada con la tecla «Intro». Esta línea leída se puede asignar a una variable.
Programa | Resultados |
![]() | |
Comentarios:
- En la columna de resultados y en la línea [Tapez votre nom : st], st es la línea introducida por el usuario.
Si el texto introducido con el teclado representa un número, se considera ante todo como una cadena de caracteres, tal y como muestra el ejemplo siguiente:
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 ha ejecutado como se esperaba, ya que (por desgracia) en VBScript el operador + tiene dos significados: suma de dos números o concatenación de dos cadenas (las dos cadenas se unen entre sí). Anteriormente vimos que los números introducidos con el teclado se leían como cadenas de caracteres y que VBScript las transformaba 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, ha supuesto que se quería realizar una concatenación de cadenas.
Una solución sencilla a este problema es convertir las cadenas en números en el momento de su lectura, tal y como muestra la siguiente mejora del programa anterior:
Programa | Resultados |
![]() |
3.10. S Introducir datos con la función inputbox
Es posible que se desee introducir datos en una interfaz gráfica en lugar de hacerlo mediante el teclado. En ese caso, se utiliza la función inputBox. Esta admite numerosos parámetros, de los cuales solo los dos primeros se utilizan con frecuencia:
respuesta=inputBox(mensaje,título)
- mensaje: la pregunta que se le plantea al usuario
- título (opcional): el título que le da a la ventana de entrada
- respuesta: el texto introducido por el usuario. Si este ha cerrado la ventana sin responder, respuesta es la cadena vacía.
A continuación se muestra un ejemplo en el que se solicita el nombre y la edad de una persona. Para el nombre, se proporciona una información y se ejecuta OK. Para la edad, también se proporciona una información, pero se ejecuta 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í vamos a presentar un objeto con propiedades, pero sin métodos. Pensemos en una persona. Tiene muchas propiedades que la caracterizan: altura, peso, color de piel, de ojos, de pelo... 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 (lo que se conoce como 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, tiene lugar 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
Tenemos entonces el siguiente esquema de memoria para las variables personne1 y personne2:
![]() |
Por licencia poética, podríamos decir que personne1 es un objeto personne. Podemos aceptar este uso coloquial si recordamos que personne1 es, de hecho, la dirección de un objeto personne y no el propio objeto personne.
Hemos dicho que un objeto personne tenía dos propiedades: nom y age. ¿Cómo se pueden utilizar estas propiedades? Mediante la notación objet.propriété, tal y como se ha explicado anteriormente. Así,
personne1.nom designa el nombre de la persona 1 y personne1.age su edad. He aquí 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 9-12 y 15-18 permite utilizar a continuación 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
Hay dos instrucciones para asignar un valor a una variable:
- variable=expresión
- set variable=expresión
La forma 2 está reservada para expresiones cuyo resultado es una referencia de 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, 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 produce la duplicación de un valor en dos lugares diferentes. 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, escribir set v1=v2 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 manipular este último a través de v1 o v2 no supone ninguna diferencia. Dicho de otro modo, modificar el objeto al que hace referencia v2 modifica el que hace referencia 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 | +,-,*,/ | |
Comparación | <, <= >, >= =,<> | a<>b es verdadero si a es diferente de b a=b es verdadero si a es igual a b a y b pueden ser ambos números o ambas 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. |
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 bool1 y 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 utilizar 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 forma condicional
La instrucción de VBScript que permite realizar acciones en función del valor verdadero/falso de una condición es la siguiente:
En primer lugar, 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 muestra un programa con diferentes variantes del 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 ejecutar acciones de forma repetida
Bucle con número de iteraciones conocido |
Se puede salir de un bucle «for» en cualquier momento con la instrucción «exit for». |
Bucle con número de iteraciones desconocido |
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: En la fase de desarrollo de un programa, no es raro que un programa «entre en bucle», c.a.d, y no se detenga nunca. 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 (teclas CTRL y C pulsadas al mismo tiempo).
3.14.3. Finalizar la ejecución del programa
La instrucción wscript.quit n finaliza 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:
![]() |
Justo después de la ejecución del programa, se emiten los tres comandos DOS siguientes:
El comando DOS 1 comprueba si el código de error devuelto por el programa es >=5. Si es así, muestra (echo) 5; de lo contrario, 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.
De los resultados mostrados, se deduce que el código de error devuelto por el programa era 4.
3.15. L a tablas de datos en una variante
Una variante T puede contener una lista de valores. En ese caso, se dice que es una matriz. Una matriz T tiene varias propiedades:
- se accede al elemento i de la matriz T mediante la sintaxis T(i), donde i es un entero llamado índice comprendido entre 0 y n-1 si T tiene n elementos.
- Se puede conocer el índice del último elemento de la matriz T con la expresión ubound(T). El número de elementos de la matriz T es entonces ubound(T)+1. A este número se le suele llamar el tamaño de la matriz.
- Una variante T se puede inicializar con una matriz vacía mediante la sintaxis T=array() o con una secuencia de elementos mediante la sintaxis T=array(elemento0, elemento1, ...., elementoN)
- Se pueden añadir elementos a una matriz T ya creada. Para ello, se utiliza la instrucción redim preserve T(N), donde N es el nuevo índice del último elemento de la matriz T. La operación se denomina redimensionamiento (redim). La palabra clave preserve indica que, durante este redimensionamiento, se debe conservar el contenido actual de la matriz. En ausencia de esta palabra clave, T se redimensiona y se vacía de sus elementos.
- Un elemento T(i) de la matriz T es de tipo variant y, por lo tanto, puede contener cualquier valor y, en particular, una matriz. En este caso, la notación T(i)(j) designa el elemento j de la matriz T(i).
Estas diversas propiedades de las matrices se ilustran en el siguiente programa:
Programa | Resultados |
![]() |
Comentarios
- Aquí se ha utilizado una función llamada «join», que se explica con más detalle más adelante.
3.16. L as variables de matriz
En VBScript existe otra forma de utilizar una matriz: mediante una variable de matriz. A diferencia de las variables escalares, este tipo de variable debe declararse obligatoriamente mediante una instrucción dim. Existen varias formas de declaración:
- dim matriz(n) declara una matriz estática de n+1 elementos numerados del 0 al n. Este tipo de matriz no se puede redimensionar
- dim matriz() declara una matriz dinámica vacía. Deberá redimensionarse para poder utilizarse mediante la instrucción redim, del mismo modo que para un variante 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 destacar 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. A partir de ahora, utilizaremos casi exclusivamente la matriz dentro de una variante en nuestros ejemplos. Sin embargo, recordaremos que VBscript deriva del lenguaje Visual Basic, que contiene datos tipados (integer, double, boolean, ...). En este caso, si debemos utilizar una matriz de números reales, por ejemplo, la variable matriz será más eficiente que la variable variante. Entonces declararemos algo como dim tabla(1000) as double para declarar una matriz de números reales o simplemente dim tabla() as double si la matriz es dinámica.
A continuación se muestra un ejemplo que ilustra el uso de variables de matriz:
Programa | Resultados |
![]() |
3.17. L 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 una matriz y car una cadena de caracteres, join(T,car) es una cadena de caracteres formada por la unión de todos los elementos de la matriz T, cada uno de ellos 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) es una matriz cuyos elementos son los distintos campos de la cadena C. Así, split("1abcd2abcd3","abcd") dará como resultado la matriz (1,2,3)
He aquí un ejemplo:
Programa | Resultados |
|
3.18. Los diccionarios
Se accede 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 no se accede mediante un número, sino mediante una cadena de caracteres. El ejemplo típico de este tipo de matriz es el diccionario. Cuando se busca el significado de una palabra en el «Larousse» o en «Le petit Robert», se accede a él mediante la palabra. Se podría 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 parece mucho al funcionamiento de una matriz, salvo que los índices de la matriz no son números enteros, sino cadenas de caracteres. A este tipo de matriz se le llama diccionario (o matriz asociativa, 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 de la Seguridad Social con un número. Este número nos identifica de forma única y da acceso a la información que nos concierne. En el modelo diccionario("clave")="información", «clave» sería aquí el número de la Seguridad Social e «información» toda la información almacenada sobre nosotros en los ordenadores de la Seguridad Social.
En Windows, se dispone de un objeto ActiveX llamado «Scripting.Dictionary» que permite crear y gestionar diccionarios. Un objeto ActiveX es un componente de software que expone una interfaz utilizable por programas que pueden estar escritos en diferentes lenguajes, siempre que 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 dico=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 «asociarse» a un objeto, el contenedor WSH intentará asociarlo al objeto wscript. |
2 | Una vez creado el diccionario, podremos añadirle 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 variante que contiene cualquier dato. |
3 | Para recuperar el valor asociado a una clave determinada, se utiliza el método item del diccionario: var=dico.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 una matriz variable gracias al método keys: claves=diccionario.keys claves es una matriz cuyos elementos se pueden recorrer. |
5 | El conjunto de valores del diccionario se puede recuperar en una matriz variable mediante el método items: valores = dic.items items es una matriz cuyos elementos se pueden recorrer. |
6 | Se puede comprobar la existencia de 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
' creación y uso de un diccionario
Set dico=CreateObject("Scripting.Dictionary")
' rellenar diccionario
dico.add "clé1","valeur1"
dico.add "clé2","valeur2"
dico.add "clé3","valeur3"
' número de elementos
wscript.echo "Le dictionnaire a " & dico.count & " éléments"
' lista de claves
wscript.echo "liste des clés"
cles=dico.keys
For i=0 To ubound(cles)
wscript.echo cles(i)
Next
' lista de valores
wscript.echo "liste des valeurs"
valeurs=dico.items
For i=0 To ubound(valeurs)
wscript.echo valeurs(i)
Next
' lista de claves y valores
wscript.echo "liste des clés et valeurs"
cles=dico.keys
For i=0 To ubound(cles)
wscript.echo "dico(" & cles(i) & ")=" & dico.item(cles(i))
Next
' búsqueda de elementos
' clave1
If dico.exists("clé1") Then
wscript.echo "La clé clé1 existe dans le dictionnaire et la valeur associée est " & dico.item("clé1")
Else
wscript.echo "La clé clé1 n'existe pas dans le dictionnaire"
End If
' clave4
If dico.exists("clé4") Then
wscript.echo "La clé clé4 existe dans le dictionnaire et la valeur associée est " & dico.item("clé4")
Else
wscript.echo "La clé clé4 n'existe pas dans le dictionnaire"
End If
' se elimina la clave 1
dico.remove("clé1")
' lista de claves y valores
wscript.echo "liste des clés et valeurs après suppression de clé1"
cles=dico.keys
For i=0 To ubound(cles)
wscript.echo "dico(" & cles(i) & ")=" & dico.item(cles(i))
Next
' se elimina todo
dico.removeall
' lista de claves y valores
wscript.echo "liste des clés et valeurs après suppression de tous les éléments"
cles=dico.keys
For i=0 To ubound(cles)
wscript.echo "dico(" & cles(i) & ")=" & dico.item(cles(i))
Next
' fin
wscript.quit 0
Resultados
Le dictionnaire a 3 éléments
liste des clés
clé1
clé2
clé3
liste des valeurs
valeur1
valeur2
valeur3
liste des clés et valeurs
dico(clé1)=valeur1
dico(clé2)=valeur2
dico(clé3)=valeur3
La clé clé1 existe dans le dictionnaire et la valeur associée est valeur1
La clé clé4 n'existe pas dans le dictionnaire
liste des clés et valeurs après suppression de clé1
dico(clé2)=valeur2
dico(clé3)=valeur3
liste des clés et valeurs après suppression de tous les éléments
3.19. Ordenar una matriz o un diccionario
Es habitual querer ordenar una matriz o un diccionario en orden ascendente o descendente según sus valores o, en el caso de un diccionario, según sus claves. Aunque en la mayoría de los lenguajes existen funciones de ordenación, no parece haberlas en VBScript. 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 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 es el número de elementos de 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. Consideramos el caso simplificado de un contribuyente que solo tiene que declarar su salario:
- se calcula el número de partes del asalariado nbParts=nbEnfants/2 +1 si no está casado, nbEnfants/2+2 si está casado, donde nbEnfants es el número de hijos que tiene.
- se calcula su renta imponible R = 0,72 * S, donde S es su salario anual
- se calcula su coeficiente familiar Q = R/N
se calcula su impuesto I a partir de 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 |
127860 | 0,45 | 16754,5 |
151 250 | 0,50 | 231 47,5 |
172 040 | 0,55 | 30710 |
195 000 | 0,60 | 39312 |
0 | 0,65 | 49062 |
Cada línea tiene 3 campos. Para calcular el impuesto I, se busca la primera línea donde QF<=campo1. 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 el impuesto I = 0,65 * R - 49062 * nbParts.
El programa es el siguiente:
Programa
' cálculo del impuesto de un contribuyente
' el programa debe ejecutarse con tres parámetros: casado, hijos, salario
' casado: carácter O si está casado, N si no lo está
' hijos: número de hijos
' salario: salario anual sin céntimos
' no se comprueba la validez de los datos, pero
' se comprueba que haya tres
' declaración obligatoria de las variables
Option Explicit
' se comprueba que haya 3 argumentos
Dim nbArguments
nbArguments=wscript.arguments.count
If nbArguments<>3 Then
wscript.echo "Syntaxe : pg marié enfants salaire"
wscript.echo "marié : caractère O si marié, N si non marié"
wscript.echo "enfants : nombre d'enfants"
wscript.echo "salaire : salaire annuel sans les centimes"
' parada con código de error 1
wscript.quit 1
End If
' se recuperan los argumentos sin comprobar su validez
Dim marie, enfants, salaire
If wscript.arguments(0) = "O" Or wscript.arguments(0)="o" Then
marie=true
Else
marie=false
End If
' «hijos» es un número entero
enfants=cint(wscript.arguments(1))
' salario es un entero largo
salaire=clng(wscript.arguments(2))
' se definen los datos necesarios para el cálculo del impuesto en 3 tablas
Dim limites, coeffn, coeffr
limites=array(12620,13190,15640,24740,31810,39970,48360, _
55790,92970,127860,151250,172040,195000,0)
coeffr=array(0,0.05,0.1,0.15,0.2,0.25,0.3,0.35,0.4,0.45, _
0.5,0.55,0.6,0.65)
coeffn=array(0,631,1290.5,2072.5,3309.5,4900,6898.5,9316.5, _
12106,16754.5,23147.5,30710,39312,49062)
' se calcula el número de participaciones
Dim nbParts
If marie=true Then
nbParts=(enfants/2)+2
Else
nbParts=(enfants/2)+1
End If
If enfants>=3 Then nbParts=nbParts+0.5
' se calcula el coeficiente familiar y la base imponible
Dim revenu, qf
revenu=0.72*salaire
qf=revenu/nbParts
' se calcula el impuesto
Dim i, impot
i=0
Do While i<ubound(limites) And qf>limites(i)
i=i+1
Loop
impot=int(revenu*coeffr(i)-nbParts*coeffn(i))
' se muestra el resultado
wscript.echo "impôt=" & impot
' salimos sin errores
wscript.quit 0
Resultados
Comentarios:
- el programa utiliza lo que se ha expuesto anteriormente (declaración de variables, argumentos, cambios de tipo, comprobaciones, bucles, matriz en un variante)
- No comprueba la validez de los datos, lo que sería inusual en un programa real
- solo el bucle while presenta una dificultad. Busca determinar el índice i de la matriz límites para el que se cumple límites(i)>qf y esto para i<ubound(límites) (c.a.d. aquí i<13) ya que el último elemento de la matriz límites no es significativo. Se ha añadido únicamente para que la prueba [Do While i<ubound(limites) And qf>limites(i)] pueda realizarse para i=13. La prueba es entonces 13<13 y qf>limites(13) y, por lo tanto, es necesario (en VBScript) que limites(13) exista. Al salir del bucle while, el último valor de i calculado permite calcular el impuesto: [impot=int(revenu*coeffr(i)-nbParts*coeffn(i))].









































