Curso sobre Visual Basic
por Guillermo Llanderas

Primera Parte


Los temas incluidos:


Datos Básicos

 


Detalles

    Usar la letra ARIAL tipo 8 o MS Sans Serif de cuerpo 8 puntos

    Nombres de los botones estándar:
        OK
        Cancelar
        Cerrar
        Ayuda
        Salir
        Imprimir
        Crear
        Modificar
        Suprimir
        Reintentar

    La longitud máxima de una línea de código es de 1024 caracteres. Para
poder cortarse una instrucción en 2 líneas, se usa el subguión ( _ ) colocado
al final de la línea.

    Los comentarios se ponen con un apóstrofe ( ' ) delante.

    El operador '+' suma los operandos, mientras que '&' los une:

        X = "ABC" + "DE"  'X="ABCDE"
        X = "ABC" & "DE"  'X="ABCDE"
        X = 12 + 3        'X=15
        Y = 12 & 3        'X="123"


Tipos de Datos

Tipo dato     Sufijo     Tamaño     Rango de valores
                         (bytes)

Byte                        1       De 0 a 255
Boolean                     2       True o False
Integer         %           2       De -32,768 a 32767
Long            &           4       De -2,147,483,648 2,147,483,647
Single          !           4       De -3.402823E38 a -1.401298E-45 (negativos)
                                    de 1.401298E-45 a 3.402823E38   (positivos)
Double          #           8       De -1.79769313486232E308 a
                                    -4.94065645841247E-324     (para negativos)
                                    De 4.94065645841247E-324 a
                                    1.79769313486232E308       (para positivos)
Currency        @           8       De -922,337,203,685,477.5808 a
                                    922,337,203,685,477.5807
Date                        8       De 1 de Enero del 100 al 31 de Dic de 9999
Object                      4       Referencias a objetos
String          $          Var      Con tamaño variable 10 bytes + 1 byte/char
                                    Con tamaño fijo, 1 byte/char
                                    (hasta 65400 caracteres)
Variant                    Var      Con número, 16 bytes
                                    Con caracteres, 22 bytes + 1 byte/char
Type                       Var      El rango de cada tipo fundamental


Operadores

    >           Mayor que

    <           Menor que
    =           Igual a
    <=          Inferior o igual a

    >=          Superior o igual a

    <>          Distinto a
    Like        Como el modelo de cadena propuesto

Con Like se pueden usar los siguientes comodines:

    *               Para cero, uno o más caracteres cualesquiera
    ?               Para un carácter único cualquiera
    #               Para una cifra única cualquiera
    [ListaChars]    Para todo carácter único que se encuentre en la lista
    [!ListaChars]   Para todo carácter único que no se encuentre en la lista

Ejemplos:

        if CodigoProducto Like "S??4T#" Then
        If CodigoProducto Like "[!KR]*" Then   'El primer carácter no puede
                                                 ser ni una K ni una R
        If CodigoProducto Like "[!K-R]*" Then  'No está comprendido entre
                                                 la K y la R inclusive.


Trabajar con datos y variables

    &H  ->  hexadecimal     (&H3F)
    &O  ->  octal           (&O13)

    Dim Variable [As Tipo]
    Dim Variable As String * Longitud   (va desde 0 hasta Longitud)

Tipos definidos por el usuario:

    Type NombreTipo
        NombreElemento1 As TipoElemento1
        NombreElemento2 As TipoElemento2

        NombreElementoN As TipoElementoN
    End Type

    Dim Variable As NombreTipo

    Variable.NombreElemento1 = ...

Matrices:

    {Dim/Static/Private/Public} NombreMatriz ([Rango1[,Rango2[,...]]]) As Tipo

    El rango va desde 0 hasta el indicado. El rango máximo va desde -32.769
hasta 32.767  Para hacer que el rango no empieze en 0, sino en 1 se debe de
declarar en el módulo:  Option Base {0/1}
    El rango también puede indicarse usando desde una cota hasta otra.

    Dim Meses(11) As String     'Matriz de 12 elementos, del 0 al 11
    Dim Num(2 To 5) As Integer  'Matriz de 4 elementos, del 2 al 5

    Para poder usar matrices que cambian la dimensión en tiempo de ejecución,
se deben de declarar como las normales, pero sin indicar el rango dentro de los
paréntesis (pero sí que se deben de poner los paréntesis) y para cambiar la
dimensión hacer:

    ReDim [Preserve] NombreMatriz(Rango1[,Rango2[,...]]) As Tipo

    Funciones para obtener información de las matrices:

UBound(NombreMatriz[,Dimension]) : indica el límite superior
LBound(NombreMatriz[,Dimension]) : indica el límite inferior


Estructuras de Control

If Condicion Then                       If Condicion1 Then
    [Instrucciones]                         [Instrucciones1]
[Else                                   [Elseif Condicion2
    [Instrucciones]]                        [Instrucciones2]]
End If                                  [Elseif Condicion3
                                            [Instrucciones3]]
                                        ...
                                        [Else
                                            [InstruccionesN]]
IIf(Condicion,ExpVerdadera,ExpFalsa)    End If


Select Case Expresion                   Select Case WeekDay(Date)
    [Case ListaComprobacion1                Case 2,3
        [Instrucciones1]]                       Print "Es principio de semana"
    [Case ListaComprobacion2                Case 4
        [Instrucciones2]]                       Print "Hoy es Miércoles"
    [Case ListaComprobacion3                Case 5, 6
        [Instrucciones3]]                       Print "Terminando la semana"
    ...                                     Case Is < 2, Is > 6
    [Case Else                                  Print "Fin de semana"
        [InstruccionesN]]                   End Select
End Select


Choose(ExpIndice, Expresion1 [,Expresion2 [,... [,ExpresionN]]])
    'Se evalua ExpIndice y éste debe de variar entre 1 y N


Do [{While/Until} Condicion]            Num = 0
    [Instrucciones]                     Do While Num < 5
    [Exit Do]                               Num = Num + 1
    [Instrucciones]                     Loop
Loop                                    Print Num   'Resultado=5


Do                                      La diferencia entre poner las clausulas
    [Instrucciones]                     While/Until con el Do o con el Loop es
    [Exit Do]                           que en el primer caso puede que no se
    [Instrucciones]                     ejecuten nunca las instrucciones del
Loop [{While/Until} Condicion]          bucle y en el segundo caso se ejecutan
                                        al menos una vez.


While Condicion                         No permite el uso de Exit Do.
    [Instrucciones]                     Es similar a un Do While... Loop
Wend


For Variable = ExpInicio To ExpFinal [Step ExpIncremento]
    [Instrucciones]
    [Exit For]
    [Instrucciones]
Next [Variable]


Ambito y Visibilidad

Ambito de las variables:

    De Procedimiento: Si han sido declaradas dentro de los procedimientos. Son
        creadas automáticamente al comenzar el procedimiento y su destrucción
        se realiza también automáticamente cuanto éste finaliza.

    De Módulo: Si han sido declaradas en la sección de declaraciones de un
        módulo. Se crean de forma automática cuando comienza la ejecución de
        la aplicación y se destruyen al finalizar la misma.

Visibilidad de las variables:

    Private : Sólo es posible acceder a estas variables desde el procedimiento
              o módulo en que han sido declaradas.

    Public  : Se puede acceder desde cualquier parte de la aplicación.

Variables estáticas: Se usa con variables de procedimiento para que no se
    destruyan al terminar la ejecución del procedimiento en cuestión.


    Dim     Variable [As Tipo]  - definición de una variable privada
    Private Variable [As Tipo]  - definición de una variable privada
    Public  Variable [As Tipo]  - definición de una variable pública
    Static  Variable [As Tipo]  - definición de una variable estática


Para romper la ocultación de variables, se usa una admiración (!)

    Form!Label1     accedería a Label1 de Form y no al Label1
                    del procedimiento donde se ejecute.

Constantes:

    [Public/Private] Const Constante [As Tipo] = Expresión


Procedimientos

    Un procedimiento de tipo Private sólo podrá ser invocado desde el módulo
donde ha sido declarado. Si es de tipo Public podrá ser invocado desde
cualquier módulo de la aplicación. Por defecto son públicos.

    Si un procedimiento se declara como Static, todas sus variables serán de
tipo estático.


Procedimientos Sub (subrutinas): No devuelven un valor directamente.

    [Private/Public] [Static] Sub NombreSubrutina[(ListaParametros)]
        [Instrucciones]
        [Exit Sub]
        [Instrucciones]
    End Sub

    Call NombreSubrutina(Parametro1, Parametro2, ...)
    NombreSubrutina Parametro1, Parametro2, ...

Procedimientos Function (funciones): Devuelven un valor.

    [Private/Public] [Static] Function NombreFuncion[(ListaParam)] [As Tipo]
        [Instrucciones]
        [NombreFuncion = Valor]
        [Exit Function]
        [Instrucciones]
    End Function

    Valor = NombreFuncion(Parametro1, Parametro2, ...)
    Call NombreFuncion Parametro1, Parametro2, ... 'Se pierde el resultado

Procedimientos Property: Permiten crear y manipular propiedades. Mediante su
    uso, es posible hacer que se ejecute un cierto código cada vez que se
    establece u obtiene el valor de la propiedad a la que representa.

    [Public/Private] [Static] Property {Get/Let/Set} NomPropiedad
            ([LisParametros]) [As Tipo]
        [Instrucciones]
    End Property

    -Let: Establece el valor de la propiedad
        [Objeto.]NombrePropiedad[(ListaArgumentos)]=Expresion
    -Get: Devuelve el valor de la propiedad
        Variable=[Objeto.]NombrePropiedad[(ListaArgumentos)]
    -Set: Establece la propiedad mediante una referencia a un objeto
        Set [Objeto.]NombrePropiedad[(ListaArgumentos)]=Objeto

    En los procedimientos tipo Get y Set se deben especificar un parámetro más
    que en el caso del Let. En este parámetro, que es el último, se pasa el
    valor de la propiedad.


Pase de parámetros:

    [Optional] [ByRef/ByVal] [ParamArray] NombreParametro[()] [As Tipo]

    en caso de que haya más parámtros, irán separados por comas.

    Se puede declarar cualquier de los tipos de datos de Visual Basic, con la
excepción de las cadenas de tamaño fijo. También es posible pasar matrices
(en la llamada y en la declaración se deben poner los paréntesis vacíos).

    Optional: indica que el argumento es opcional. Si se especifica, todos los
argumentos que estén a la derecha también deben ser de tipo Optional. Para
saber si nos han pasado o no un parámetro, se puede usar IsMissing(NombreParam)
que devuelve true si no ha sido especificado.

    ByRef/ByVal: especifican si el argumento correspondiente será pasado por
referencia o por valor. Por defecto, lo parámetros se pasan por referencia.

    ParamArray: Indica que el parámetro es una matriz opcional de elementos
Variant. Debe ser la última declaración de parámetro y no puede usarse con
Optional, ByRef ni ByVal. Se usa para poder pasar un número variable de
parámetros al procedimiento. Estos parámetros quedarán situados por orden en
los distintos elementos de la matriz.


Funciones de conversión y comprobación de tipos de datos

Función     Descripción

CBool       Convierte una expresión al tipo Boolean
CByte       Convierte una expresión al tipo Bute
CCur        Convierte una expresión al tipo Currency
CDate       Convierte una expresión al tipo Date
CDbl        Convierte una expresión al tipo Double
CInt        Convierte una expresión al tipo Integer
CLng        Convierte una expresión al tipo Long
CSng        Convierte una expresión al tipo Single
CStr        Convierte una expresión al tipo String
CVar        Convierte una expresión al tipo Variant

IsArray     Devuelve TRUE si el parámetro pasado es un nombre de matriz
IsDatey     Devuelve TRUE si el parámetro es el nombre de un dato tipo Date
IsEmpty     Devuelve TRUE si el pará. es el nombre de una var. no inicializada
IsNull      Devuelve TRUE si el pará. es el nombre de una var. que contiene
Null
IsNumeric   Devuelve TRUE si el parámetro es el nombre de dato de tipo numérico

Str         Devuelve la representación de un número en forma de cadena
TypeName    Devuelve en forma de nombre el tipo de variable del parámetro
pasado
Val         Devuelve el número representado por una cadena de caracteres
ValType     Devuelve en forma de número el tipo de variable del parámetro
pasado



Funciones de tratamiento de datos numéricos

Función     Descripción

Abs         Devuelve el valor absoluto de un número
Atn         Devuelve el arcotangente de un número
Cos         Devuelve el coseno de un número
Exp         Devuelve el exponencial de un número en base e
Fix         Devuelve la parte entera de un número, redondeando los valores al
            Siguiente valor superior
Hex         Devuelve una cadena que representa el valor hexadecimal de un
número
Int         Devuelve la parte entera de un número
Log         Devuelve el logaritmo natural de un número (en base e)
Oct         Devuelve una cadena de caracteres que representa el valor octal
Rnd         Devuelve un número aleatorio menor que 1 y mayor o igual que 0
Sgn         Devuelve el signo de un número (-1 si es negativo, 0 si es nulo y
            1 si es positivo)
Sin         Devuelve el seno de un número
Sqr         Devuelve la raíz cuadrada de un número
Tan         Devuelve la tangente de un número
Val         Devuelve el número representado por una cadena de caracteres


Funciones de tratamiento de cadenas de caracteres

Función     Descipción

Asc         Devuelve el código ASCII del primer carácter de una cadena
Chr         Devuelve el carácter asociado al código ASCII de un número
Format      Formatea una expresión según una formato pasado como parámetro
InStr       Devuelve la posición de la primera ocurrencia de una cadena
            dentro de otra
LCase       Devuelve una cadena con sus caracteres convertidos a minúsculas
Left        Devuelve un número especificado de caracteres desde la izquierda
            de una cadena
Len         Devuelve el número de caracteres de una cadena, o el espacio en
            bytes ocupado por una variable
LTrim       Devuelve una cadena, eliminando los espacios en blanco a la
            izquierda
Mid         Devuelve la subcadena de tamaño y posición especificada dentro de
            una cadena
Right       Devuelve un número especificado de caracteres desde la derecha de
            una cadena
RTrim       Devuelve una cadena, eliminando los espacios en blanco a la derecha
Space       Devuelve una cadena formada por un número especificado de espacios
            en blanco
Str         Devuelve la representación de un número en forma de cadena
StrComp     Devuelve un valor que indica el resultado de una comparación entre
            cadenas
StrConv     Devuelve una cadena con diversos tipos de conversiones realizadas
            sobre ella
String      Devuelve una cadena compuesta de un carácter repetido un
determinado
            número de veces
Trim        Devuelve una cadena, eliminando los espacios en blanco a izquierda
            y derecha
UCase       Devuelve una cadena con sus caracteres convertidos a mayúsculas


Funciones de tratamiento de fechas y horas

Función     Descripción

Date        Devuelve la fecha actual del sistema
DetaAdd     Devuelve una fecha añadiéndole un cierto intervalo de tiempo
            especificado
DeteDiff    Devuelve el número de intervalos de tiempo entre dos fechas
            especificadas
DatePart    Devuelve una parte de una fecha especificada (el año, el día,
            los minutos, etc)
Dateserial  Devuelve la fecha correspondiente a un determinado día, mes y año
DateValue   Convierte una expresión a una fecha válida
Day         Devuelve un número entre 1 y 31 representando el día del mes
Hour        Devuelve un número entre 0 y 23 representando la hora del día
Minute      Devuelve un número entre 0 y 59 representando los minutos de la
hora
Month       Devuelve un número entre 1 y 12 representando el mes del año
Now         Devuelve la fecha y hora actual del sistema
Second      Devuelve un número entre 0 y 59 representando los segundos de
minuto
Time        Devuelve la hora actual del sistema
Timer       Devuelve el número de segundos transcurridos desde la medianoche
TimeSerial  Devuelve la hora correspondiente a una determinada hora, minuto
            y segundo
TimeValue   Convierte una expresión a una hora válida
WeekDay     Devuelve un número que representa el día de la semana
Year        Devuelve un número entero representando el año


Funciones diversas

Command     Devuelve los parámetros pasados en la línea de comando en la
            llamada al programa Visual Basic
CurDir      Devuelve el path actual
DoEvents    Pasa el control a Windows para que pueda ejecutar las tareas
            eventualmente en espera
Environ     Devuelve el valor de la variable de entorno especificada
FileDateTime Devuelve un dato de tipo Date con la fecha y hora de la última
            modificación del fichero especificado como parámetro
FileLen     Devuelve la longitud en bytes del fichero especificado como parám.
GetAttr     Devuelve los atributos de un fichero
InputBox    Abre un cuadro de diálogo que permite la introducción de un dato.
            Devuelve el contenido del TextBox.
MsgBox      Abre un cuadro de diálogo visualizando un mensaje, espera a que el
            usuario valide el cuadro. Devuelve un valor indicando el botón.
Shell       Ejecuta el programa pasado como parámetro
Error       Devuelve el texto del mensaje de error relativo al número de error
            pasado como parámetro de la función.


Menus

Visualizar un menu pop-up:

    [object].PopupMenu menuname, [flags], [x], [y], [boldcommand]

    -object: En caso de no aparecer, se asume que el form que tiene el foco es
             el objeto a usar.
    -menuname: Nombre del pop-up menu.
    -flags: Especifica la localización y el comportamiento del menu. Los
valores
             que acepta son:
             vbPopupMenuLeftAlign    El lado izquiedo del menu se pone en x
             vbPopupMenuCenterAlign  El menú se centra en x
             vbPopupMenuRightAlign   El lado derecho del menu se pone en x
             vbPopupMenuLeftButton   Las entradas del menu resonden sólo si se
                                     pulsa al botón izquierdo del ratón
             vbPopupMenuRightButton  Las entradas del menu resonden cuando se
                                     pulsa al botón derecho o el izquierdo
    -x: Especifica la coordenada x donde se mostrará el menú. Si se omite se
             usa la coordenada x del ratón
    -y: Especifica la coordenada y donde se mostrará el menú. Si se omite se
             usa la coordenada y del ratón
    -boldcommand: Especifica el nombre de una opción del menú que se mostrará
             en negrita. Sólo funciona en W95 o WNT 4.0


Añadir una entrada al menú:

    Load [formulario.]MatrizDeMenu(indice)

Borrar una entrada de menú:

    Unload [formulario.]MatrizDeMenu(indice)


Trabajar con objetos

Variables objeto:

    Se declaran mediante la instrucción:

        { Dim | ReDim | Static | Private | Public } Variable As [New] Clase

        -New: La variable hace referencia a una nueva instancia de la clase.
La instancia no se creará hasta que se haga una referencia a la variable
        -Clase: Tipo de datos de la variable

    Una vez declaradas, la variable sólo podrá hacer referencia a instancias
de esa clase. Es posible declarar variables objeto que hagan referencia a un
formulario específico de la aplicación, pero no se pueden declarar para que
hagan referencia a un control específico. Ejemplo:

        Dim Tb As TextBox
        Dim frm1 As New Form1

    Existen cuatro tipos de objetos genéricos, que permiten declarar variables
para hacer referencia a distintos tipos de objetos:

    -Form: Puede hacer referencia a cualquier formulario de la aplicación,
incluido el formulario MDI
    -Control: Puede hacer referencia a cualquier control disponible en la
aplicación
    -MDIForm: Sólo puede hacer referencia al formulario MDI
    -Object: Puede hacer referencia a cualquier objeto de la aplicación, ya
sea un formulario o un control


Asignación de una variable objeto a un objeto determinado:

    Set Variable = { [New] Objeto | Nothing }

    -New: Permite crear nuevas instancias en tiempo de ejecución. La instancia
se crea automaticamente
    -Objeto: Nombre del objeto a asignar o nombre de otra variable objeto. Debe
de ser del mismo tipo de objeto con el que se declaro la variable
    -Nothing: Elimina la referencia de una variable objeto


Comparación de variables de referencia de objetos:

    Objeto1 Is Objeto2

    La expresión valdrá True cuando ambas hagan referencia al mismo objeto y
False en caso contrario.


Acceso al valor de una propiedad de un objeto:

    Objeto.Propiedad = Expresion
    Variable = Objeto.Propiedad

    Ejemplo: Print Obj1 Is Obj2 visualizaría True o False


Comprobación de tipo de objeto:

    TypeIf VarObjeto

    Ejemplo: If TypeOf Obj1 Is TextBox Then...


Llamada a un método de un objeto:

    Objeto.Metodo [ListaArgumentos]
    Variable = Objeto.Metodo ([ListaArgumentos)]


Colecciones de objetos:

    Agrupan varios objetos que pueden ser de diferentes tipos. A cada uno de
los objetos le corresponde un número de índice que indica su posición dentro de
la colección. Tiene una propiedad, Count, que indica el número de elementos de
la colección.

    Creación de una colección:
        Dim NombreColeccion As New Colletion

    Añadido de elementos a la colección:
        Objeto.Add(Miembro[, Identificador [, Antes[, Despues]]])
        -Miembro: nombre del elemento a añadir
        -Identificador: cadena de caracteres que identificará al elemento
cuando
se quiera acceder a él
        -Antes: el nuevo miembro se situará antes del especificado
        -Despues: el nuevo miembro se situará después del especificado
        Por defecto, los elementos se añaden al final de la colección. Los
parámetros Antes y Después son excluyentes.

    Acceso a un elemento de la colección:
        NombreColeccion(indice).{ Propiedad | Metodo }
        NombreColeccion(identificador).{ Propiedad | Metodo }
        NombreColeccion!identificador.{ Propiedad | Metodo }

    Eliminación de elementos de la colección:
        Objeto.Remove(indice)
        Objeto.Remove(identificador)

    Recorrerse todos los elementos de la colección:
        For Each Elemento In NombreColeccion
            Elemento.{ Propiedad | Metodo }
        Next

    Colecciones predefinidas:
        -Forms: contiene todos los formularios de la aplicación que se
encuentran cargados.
        -Controls: contiene todos los controles de un formulario
        -Printers: contiene todas las impresoras disponibles del sistema

    Acceso al contenedor de un control:
        Elemento.Container

ir al índice