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