Introducción

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íaSintaxis
ArraysDeclaration (Dim, Static, etc.), LBound, UBound, ReDim, Erase
Assignment=, Let, Set
CommentsREM and '
Control flowDo...Loop, For...Next, For Each...Next, While...Wend, If...Then...Else
Error trappingOn Error Resume Next, Err object
LiteralsEmpty, Nothing, Null, True, False
User-defined literals: 123.456, "Foo", etc.
MiscellaneousLine continuation character (_), Line separation character (:)
Nonconforming identifierso.[My long method name]
OperatorsArithmetic: +, -, *, /, \, ^, Mod, Negation (-), String concatenation (&)
Comparison: =, <>, <, >, <=, >=, Is
Logical: Not, And, Or, Xor, Eqv, Imp
OptionsOption Explicit
ProceduresDeclaring procedures: Function, Sub
Calling procedures: Call
Exiting procedures: Exit Function, Exit Sub
Parameters for procedures: ByVal, ByRef
VariablesProcedure-level: Dim, Static
Module-level: Private, Dim


VBScript y HTML

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.


Tipos de Datos

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:

SubtipoDescripción
EmptyVariant is not initialized. Value is either zero for numeric variables or a zero-length string ("") for string variables.
NullVariant intentionally contains no valid data.
BooleanContains either True or False.
ByteContains integer in the range zero to 255.
IntegerContains integer in the range -32,768 to 32,767.
LongContains integer in the range -2,147,483,648 to 2,147,483,647.
SingleContains 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.
DoubleContains 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.
StringContains a variable-length string that can be up to about 2 billion characters in length.
ObjectContains an OLE Automation object.
ErrorContains an error number.

Tipo Byte

Entero sin signo de 8 bits (1 byte).

Tipo Integer

Entero con signo de 16 bits (2 bytes), desde –32.768 hasta 32.767.

Tipo Long

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).

Tipo Single

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).

Tipo Double

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.

Tipo Boolean

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'

Tipo String

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).

Literales

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.

Tipo Currency

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).

Tipo Date

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'

Tipo Object

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

El valor null

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.

Conversión de Tipos

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.


Variables

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.

Arrays

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).

Determinar el Tipo de una Variable

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

Convenios de Nombres de Variables

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

Ámbito de las Variables

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).

Constantes

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:

ConstanteDescripción
vbCrCarriage return character
vbLfLine feed character
vbCrLfCarriage return and line feed characters
vbFalseBoolean value represented by 0
vbTrueBoolean value represented by -1


Operadores

Tabla de operadores en orden de precedencia:

Aritméticos
^Exponenciación
-Negativo (unario)
* / \ ModMultiplicación, División, División entera, Módulo
+ -Suma, Resta
&Concatenación
Comparación
= <> < <= > >=Igual, distinto, menor, etc.
Lógicos
NotNegación
AndY
OrO
XOrO exclusivo
EqvEquivalencia lógica
ImpImplicación lógica
IsEquivalencia de objetos


Estructuras de Control

    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

Procedimientos

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

Resumen de funciones y Palabras Reservadas

Funciones
AbsArrayAsc
AtnCCBool
CByteCDateCDbl
ChrCIntCLng
CosCreateObjectCSng
CStrCVErrD
DateDateSerialDateValue
DayEExp
HHexHour
IInputBoxInStr
Int, FixIsArrayIsDate
IsEmptyIsErrorIsNull
IsNumericIsObject
LBoundLCaseLeft
LenLogLTrim, RTrim, and Trim
MidMinuteMonth
MsgBoxNowOct
RightRndSecond
SgnSinSqr
StrStrCompString
TanTimeTimeSerial
TimeValueUBoundUCase
ValVarTypeWeekday
Year

Métodos
RaiseClearTable

Sentencias
CallDimDo...Loop
EraseExitFor...Next
For Each...NextFunctionIf...Then...Else
LetLSetMid
On ErrorPrivatePublic
RandomizeReDimRem
RSetSelect CaseSet
StaticSubWhile...Wend

Objetos y Propiedades
Err Description
HelpContext
HelpFile
Number
Source


Objetos ActiveX

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>

Validación de Formularios

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.