Al ser un lenguaje de script, tienen muchas cosas en común con JS. Se puede encontrar documentación en la Web de VBScript de Microsoft, y también se puede obtener el SDK de Micrososft ActiveX.
La tabla siguiente muestra un resumen de la sintaxis de VBScript:
| Categoría | Sintaxis |
|---|---|
| Arrays | Declaration (Dim, Static, etc.), LBound, UBound, ReDim, Erase |
| Assignment | =, Let, Set |
| Comments | REM and ' |
| Control flow | Do...Loop, For...Next, For Each...Next, While...Wend, If...Then...Else |
| Error trapping | On Error Resume Next, Err object |
| Literals | Empty, Nothing, Null, True, False User-defined literals: 123.456, "Foo", etc. |
| Miscellaneous | Line continuation character (_), Line separation character (:) |
| Nonconforming identifiers | o.[My long method name] |
| Operators | Arithmetic: +, -, *, /, \, ^, Mod, Negation (-), String concatenation (&) Comparison: =, <>, <, >, <=, >=, Is Logical: Not, And, Or, Xor, Eqv, Imp |
| Options | Option Explicit |
| Procedures | Declaring procedures: Function, Sub Calling procedures: Call Exiting procedures: Exit Function, Exit Sub Parameters for procedures: ByVal, ByRef |
| Variables | Procedure-level: Dim, Static Module-level: Private, Dim |
Los scripts se incluyen de forma análoga a JS, pero indicando VBS o VBScript como lenguaje. Ej.:
<SCRIPT LANGUAGE="VBS"><!--
Function CanDeliver(Dt)
CanDeliver=(CDate(Dt) - Now()) > 2
End Function
--></SCRIPT>
El siguiente ejemplo muestra un mensaje al hacer clic en un botón de formulario:
<SCRIPT LANGUAGE="VBS"><!--
Sub Button1_OnClick 'Evento Click del botón Button1
MsgBox "Hello There!"
End Sub
--></SCRIPT>
...
<FORM>
<INPUT NAME="Button1" TYPE="BUTTON" VALUE="Click Here">
</FORM>
Con VBS también es posible añadir un nuevo atributo al tag SCRIPT para responder a un evento. Ej.:
<SCRIPT LANGUAGE="VBS" EVENT="OnClick" FOR="Button1"><!--
MsgBox "HELLO THERE!"
--></SCRIPT>
De todas formas es más claro el método tradicional de indicar el atributo onClick en el propio elemento.
VBS sólo tiene un tipo de dato: el tipo variant. Cada valor de una variable se trata como número o como cadena en función de cómo se utilice. También es posible utilizar subtipos o tipos de datos implícitos, que permiten determinar cómo se interpretará el tipo variant. La tabla siguiente lista los subtipos existentes:
| Subtipo | Descripción |
|---|---|
| Empty | Variant is not initialized. Value is either zero for numeric variables or a zero-length string ("") for string variables. |
| Null | Variant intentionally contains no valid data. |
| Boolean | Contains either True or False. |
| Byte | Contains integer in the range zero to 255. |
| Integer | Contains integer in the range -32,768 to 32,767. |
| Long | Contains integer in the range -2,147,483,648 to 2,147,483,647. |
| Single | Contains a single-precision, floating-point number in the range -3.402823E38 to -1.401298E-45 for negative values; 1.401298E-45 to 3.402823E38 for positive values. |
| Double | Contains a double-precision, floating-point number in the range -1.79769313486232E308 to -4.94065645841247E-324 for negative values; 4.94065645841247E-324 to 1.79769313486232E308 for positive values. |
| Date (Time) | Contains a number that represents a date between January 1, 100 to December 31, 9999. |
| String | Contains a variable-length string that can be up to about 2 billion characters in length. |
| Object | Contains an OLE Automation object. |
| Error | Contains an error number. |
Entero sin signo de 8 bits (1 byte).
Entero con signo de 16 bits (2 bytes), desde –32.768 hasta 32.767.
Entero con signo de 32 bits (4 bytes), desde –2.147.483.648 hasta 2.147.483.647. Es el tipo recomendado para cualquier sistema operativo de 32 bits (Windows 95/98/NT/2000/XP).
Número real de precisión simple de 32 bits (4 bytes) en formato IEEE, desde -3,402823E38 hasta –1.401298E-45 y desde 3,402823E38 hasta 1,401298E-45. Es el tipo real recomendado para cualquier sistema operativo de 32 bits (Windows 95/98/NT/2000/XP).
Número real de doble precisión de 64 bits en formato IEEE, desde –1,79769313486232E308 hasta –4,94065645841247E-324 y desde 1,79769313486232E308 hasta 4,94065645841247E-324.
Entero con signo de 16 bits, que puede tomar los valores True y False. VBS los convierte internamente a -1 y 0 respectivamente (cualquier valor distinto de 0 es interpretado como true).
Nota: un mismo valor lógico se puede visualizar de forma diferente. Ej.:
MyBool = True
Alert MyByte 'Displays (-1)
MsgBox MyByte 'Displays 'True'
Hasta 2 mil millones de caracteres (!?). Cadenas de longitud variable (no existen cadenas de longitud fija como en Visual Basic). No se deben utilizar para manejar datos binarios, ya que se gestionan como Unicode (2 bytes por carácter).
Entre comillas (") o apóstrofos ('). Permite apótrofos dentro de comillas y viceversa. Cadena vacía "" o ''.
Secuencias de escape: \t (horiz tab, ASCII 9), \n (return), \r (line feed, ASCII 13), \f (form feed, ASCII 10), \b (backspace).
El carácter '\' también se utiliza para anular el significado que tienen determinados caracteres: \' (carácter apóstrofo), \" (carácter comillas). El carácter '\' al final de una línea anula el significado del carácter de salto de línea, lo que sirve por ejemplo para continuar una cadena en la línea siguiente.
Número real de 64 bits que representa valores monetarios con hasta 15 dígitos enteros, y siempre 4 decimales (desde –922.337.203.685.477,5808 hasta 922.337.203.685.477,5807).
Número real de 64 bits que representa fechas, desde el 1/1/1900 (los números negativos cuentan hacia atrás) hasta el 12/31/9999, donde la parte entera representa la fecha (días desde el 1/1/1900) y la parte decimal la hora (0,0 para las 00:00, 0,5 para las 12:00, etc.). VBS reconoce las fechas como números o como cadenas. Ej.:
Myname = 12345.123
Myname = cdate(myname)
alert myname 'Displays "10/18/33 2:57:07 AM"
alert cdbl(myname) 'Displays 12345.123
Myname = cdate("10-10-10")
alert cdbl(myname) 'Displays '3936'
alert cdate(myname) 'Displays '10/10/10'
Myname = cdate("April 15, 1996")
Alert Myname 'Displays '4/15/96'
Alert cdbl(myname) 'Displays '35170'
Puntero de 32 bits con la dirección de una instancia de un objeto OLE (controles ActiveX y Java). Para fijar una referencia a un objeto se utiliza la siguiente sintaxis:
Set MyObject = New OleObject
Una expresión con una variable no inicializada da error, pero si la variable se inicializa a null, asume los valores 0, "" o false según se convierta a número, cadena o lógico.
En las conversiones implícitas, siempre intenta convertir de izquierda a derecha. Así, 5+"10"=15 (suma), "Hola"+10="Hola10" (concatenación), pero 5+"Hola" da error. Podemos observar que el operador "+" está sobrecargado (overloading), por lo que para evitar confusiones también se puede utilizar el operador & para concatenar cadenas.
Dintingue mayúsculas y minúsculas. Deben comenzar por letra, subrayado (_) o dólar ($), seguido de letras, números y subrayados (_). Máximo 255 caracteres. Como siempre, se recomienda seguir la Notación Húngara. Ej.: nSumaTotalBeneficios, sTituloVentana.
Las variables se crean implícitamente cuando se utilizan o se pueden declarar explícitamente, siendo esta última forma la recomendable. Es posible utilizar la sentencia "Option Explicit" para que se produzca un error si no se declara una variable. Ha de indicarse en la primera línea del script.
La sintaxis para declarar una variable es:
<SCRIPT LANGUAGE="VBScript"><!--
Dim Var1 [, ...]
...
--></SCRIPT>
Si no se inicializa una variable, tiene un valor especial: undefined. Por otra parte, al no existir tipos, es posible hacer x=10 y más tarde x="Hola", pero no es una buena práctica.
Los arrays se declaran con DIM al igual que las variables, pero indicando entre paréntesis el límite superior del array. Ej.:
Dim Foo(30) '¡31 elementos!, desde Foo(0) a Foo(30).
...
Foo(10)=100
Foo(11)="Hola"
Pueden ser de hasta 60 dimensiones. Ej.:
Dim theArray(99, 49, 9) '100, 50 y 10 elementos.
También es posible definir arrays dinámicos. Ej.:
Dim aDymArray() 'Dynamic Array.y el array se redimensiona las veces que sea necesario con ReDim(n).
La función VarType() devuelve un entero (asociado a una serie de constantes predefinidas) que representa el tipo de dato que almacena una variable variant.
| Constant | Value | Description |
| vbEmpty | 0 | Empty of any value and not initialized |
| vbNull | 1 | Contains a null value |
| vbInteger | 2 | Contains an integer value |
| vbLong | 3 | Contains a long integer |
| vbSingle | 4 | Contains a single precision floating point value |
| vbDouble | 5 | Contains a double precision floating point value |
| vbCurrency | 6 | Contains a currency type floating point value |
| vbDate | 7 | Contains a date type value |
| vbString | 8 | Contains a string type value |
| vbObject | 9 | Contains a reference to an OLE automation object |
| vbError | 10 | Contains an error |
| vbBoolean | 11 | Contains a boolean true or false value |
| vbVariant | 12 | Contains a variant |
| vbDataObject | 13 | Contains a non-OLE object |
| vbByte | 17 | Contains a byte value |
| vbArray | 8192 | Contains an array |
Ejemplo: función que recibe un conjunto de coordenadas y comprueba si están dentro de un rango de valores, devolviendo cierto o falso.
<Script ="VBS">
<!--
Sub Image1_MouseMove(a,b,x,y)
blnSuccess = IsMyArea(x, y)
If VarType(blnSuccess) = vbError Then
MsgBox "An unknown error has occured"
ElseIf blnSuccess = True then
Alert = "Click Here for More Information"
End If
End Sub
Function IsMyArea(x, y)
If x >0 and y> 0 then
If x >100 and x <201 then
IsMyArea = True
Else
IsMyArea = False
End
Else
IsMyArea = CVErr(5)
End If
End function
-->
</Script>
En el caso de una variable de tipo Array, el valor devuelto por la función VarType() es una combinación binaria de vbArray y el tipo de dato contenido en el array. Se debe utilizar el operador And por un lado para comprobar el tipo Array, y luego una sentencia Select restando el valor vbArray para comprobar el tipo de los datos. Ejemplo:
If VarType(MyValue) And vbArray then
Select Case VarType(MyValue) - vbArray
Case is vbEmpty
...
Case is vbNull
...
Case is vbByte
...
End Select
End If
La siguiente tabla muestra un conjunto de prefijos sugeridos en VBS para los nombres de variables en función del tipo de dato que van a contener:
| Prefix | Type | Example |
| bln | Boolean | blnDataValid = True |
| byt | Byte | bytStateFlags = bytStateFlags And &H10 |
| cur | Currency | curTotal = curSubTotal + curSalesTax |
| dte | Date | dteNextAppointment = NOW + 14 |
| dbl | Double | dblZPlot = 375.035 * 127.999 |
| int | Integer | For intCount = 1 to intMaximum |
| lng | Long | For lngCount = 1 to lngMaximum |
| obj | Object | Set objMyDoc = Document |
| sng | Single | sngXLocation = sngMyX * 2.5 |
| str | String | strUserName = strFstName & " " & strLstName |
En VBS las variables pueden tener 3 niveles de ámbito, alcance o visibilidad: nivel de página, nivel de script, y nivel de procedimiento.
Las variables con nivel de procedimiento se declaran dentro del propio procedimiento donde se utilizan. Las variables declaradas fuera de cualquier procedimiento pueden ser Private o Public: una varible Private es visible en todos los procedimientos del script en el que se declara; una variable Public es visible en todos los scripts del documento HTML.
| KeyWord | Placement | Description of scope |
| Dim | In Procedure | Limited to the procedure |
| Dim | Not in Procedure | Visible throughout script |
| Private | Not in Procedure | Visible throughout script |
| Public | Not in Procedure | Visible throughout all scripts |
Ejemplo:
<SCRIPT LANGUAGE=VBS>
<!--
Option Explicit
Dim MyName 'Script level variable
Sub Main (ButtonName) 'ButtonName is Procedure Level
Myname = ButtonName &"Ibrahim"
End Sub
Sub BtnHello_OnClick
Main "Hello"
Alert Myname
End Sub
Sub BtnGoodBye_OnClick
Dim MyButton 'Mybutton is procedure level
MyButton = BtnGoodBye.Value
Main MyButton
Alert Myname
End Sub
-->
</SCRIPT>
Recordemos que las variables pasadas a un procedimiento siempre se pasan por valor (VBS no admite el paso por referencia). Es decir, los parámetros de un procedimiento siempre se comportan como variables locales a dicho procedimiento.
En VBS existe (¿seguro?) el tipo static: visible sólo en la función o procedimiento donde se declara, pero tiempo de vida global (su valor permanece en sucesivas llamadas a la función o procedimiento).
VBS no admite constantes, por lo que habrá que simularlas mediante la utilización de variables. Ejemplo:
'pseudo constantes (ámbito de script).
Dim cstSunday
Dim cstMonday
Dim cstTuesday
...
cstSunday = 0
cstMonday = 1
cstTuesday = 2
...
Sub WhatDayIsIt
If DayOfWeek(cstSunday) then
Alert "Sorry We are closed today"
Else
...
End If
End Sub
Muchas funciones de VBS tienen constantes o pseudoconstantes internas, como por ejemplo Math(). Algunas constantes de uso general son:
| Constante | Descripción |
|---|---|
| vbCr | Carriage return character |
| vbLf | Line feed character |
| vbCrLf | Carriage return and line feed characters |
| vbFalse | Boolean value represented by 0 |
| vbTrue | Boolean value represented by -1 |
Tabla de operadores en orden de precedencia:
| Aritméticos | |
|---|---|
| ^ | Exponenciación |
| - | Negativo (unario) |
| * / \ Mod | Multiplicación, División, División entera, Módulo |
| + - | Suma, Resta |
| & | Concatenación |
| Comparación | |
| = <> < <= > >= | Igual, distinto, menor, etc. |
| Lógicos | |
| Not | Negación |
| And | Y |
| Or | O |
| XOr | O exclusivo |
| Eqv | Equivalencia lógica |
| Imp | Implicación lógica |
| Is | Equivalencia de objetos |
If cond Then
...
[Else
...]
End If
Do While cond
...
[... EXIT DO ...]
Loop
Do
...
[... EXIT DO ...]
Loop While|Until cond
For Each varobj In colección
... 'Acceso con varobj.propiedad
Next
Existen dos tipos de procedimientos: funciones (Function) y subrutinas (Sub). Sólo las funciones devuelven algún resultado. Ej.:
Sub ConvertTime()
time=InputBox("Please enter the time in seconds.", 1)
MsgBox "The number of hours is " & Horas(time)
End Sub
Function Horas(theTime)
Horas=theTime / 3600
End Function
| Funciones | ||
|---|---|---|
| Abs | Array | Asc |
| Atn | C | CBool |
| CByte | CDate | CDbl |
| Chr | CInt | CLng |
| Cos | CreateObject | CSng |
| CStr | CVErr | D |
| Date | DateSerial | DateValue |
| Day | E | Exp |
| H | Hex | Hour |
| I | InputBox | InStr |
| Int, Fix | IsArray | IsDate |
| IsEmpty | IsError | IsNull |
| IsNumeric | IsObject | |
| LBound | LCase | Left |
| Len | Log | LTrim, RTrim, and Trim |
| Mid | Minute | Month |
| MsgBox | Now | Oct |
| Right | Rnd | Second |
| Sgn | Sin | Sqr |
| Str | StrComp | String |
| Tan | Time | TimeSerial |
| TimeValue | UBound | UCase |
| Val | VarType | Weekday |
| Year | ||
| Métodos | |
|---|---|
| Raise | ClearTable |
| Sentencias | ||
|---|---|---|
| Call | Dim | Do...Loop |
| Erase | Exit | For...Next |
| For Each...Next | Function | If...Then...Else |
| Let | LSet | Mid |
| On Error | Private | Public |
| Randomize | ReDim | Rem |
| RSet | Select Case | Set |
| Static | Sub | While...Wend |
| Objetos y Propiedades |
|---|
| Err Description |
| HelpContext |
| HelpFile |
| Number |
| Source |
Se incluyen con OBJECT, y puede interaccionarse con ellos como con cualquier otro objeto del documento. Sus claves están en HKEY_CLASSES_ROOT\CLSID, y los archivos .ocx normalmente en el directorio SYSTEM (ej. objeto Label en IELABEL.ocx con identificador de clase 99B42120-6EC7-11CF-A6C7-00AA00A47DD2). Mirando el .ocx se descubre algo acerca de los parámetros, pero existe el Microsoft ActiveX Control Pad para editarlos cómodamente.
Ejemplo de un objeto ficticio:
<OBJECT CLASSID="clsid:{5t5636y3i-6e45w-23r37}" ID="theWorld"
width=300 height=200 align=top hspace=2 vspace=0>
<PARAM NAME="Name" VALUE="Earth">
<PARAM NAME="Size" VALUE="large">
<PARAM NAME="Color" VALUE="blue-green">
</OBJECT>
El siguiente formulario permitiría cambiar el color del objeto (cosa que no se podría hacer por ejemplo con un applet):
<FORM NAME="frmChangeColor">
<INPUT TYPE="TEXT" NAME="txtColor" SIZE=10>
<INPUT TYPE="BUTTON" NAME="btColor" VALUE="Change Color">
</FORM>
<SCRIPT LANGUAGE="VBS"><!--
Sub btColor_onClick
theWorld.Color=Document.frmChangeColor.txtColor.Value
End Sub
--></SCRIPT>
Es análogo a JS. Ejemplo:
<SCRIPT LANGUAGE="VBS"><!--
Sub Submit_OnClick
If IsNumeric(Document.myForm.Foo1.Value) Then
If Document.myForm.Foo1.Value < 100 Or
Document.myForm.Foo1.Value > 1000 Then
MsgBox "Please enter a number between 100 and 1000."
Else
MsgBox "Your Number Has Been Accepted"
End If
Else
MsgBox "Please enter a numeric value."
End If
End Sub
--></SCRIPT>
...
<FORM name="myForm">
Enter a value between 10 and 1000:
<INPUT NAME="Foo1" TYPE="TEXT" SIZE="2">
<INPUT NAME="Submit" TYPE="BUTTON" VALUE="Submit">
</FORM>
Nota: en este ejemplo no se envía la información en ningún caso. Para ello se podría utilizar Document.myForm.Submit.