Unidad didáctica 11 VBA VBA (Visual Basic para Aplicaciones) es un lenguaje de programación creado por Microsoft para Office que incluye su propio entorno de desarrollo. Esto no es un curso de Visual Basic. Se trata de comprender la utilización de este lenguaje para generar diferentes procedimientos que asignaremos a eventos de objetos de nuestra base de datos. Al finalizar el estudio de estas lecciones serás capaz de: Conocer el entorno de desarrollo de Visual Basic. Definir variables, expresiones y objetos. Establecer propiedades a distintos objetos de Access. VBA 1 Lección 1 Entorno de desarrollo Es el lugar en el que generamos los diferentes procedimientos y funciones que afectarán a los diferentes objetos de nuestra base de datos. Podemos acceder a él seleccionando la ficha Herramientas de bases de datos, grupo Macro, opción Visual Basic. VBA 2 La ventana de código En ella podemos escribir y editar el código de Visual Basic. Selector de “Objetos” Muestra el nombre del objeto seleccionado. Si hacemos clic en el “desplegable” se mostrarán todos los controles situados en el formulario. Selector de “Procedimientos” Muestra todos los eventos relacionados con el control seleccionado. Los botones que se muestran en la esquina inferior derecha de la ventana permitirán mostrar todos los procedimientos del módulo o únicamente el procedimiento seleccionado. Ver procedimiento / Ver módulo completo Explorador del proyecto Muestra una lista de todos los proyectos y de los elementos de cada uno de ellos. VBA 3 Ver código Muestra la ventana de código asociada al elemento seleccionado. Ver objeto Muestra la ventana del objeto correspondiente al elemento seleccionado. Alternar carpetas Permite ocultar y mostrar las carpetas y los elementos que contienen éstas. Propiedades Muestra los valores de las propiedades del elemento seleccionado. Cuadro de objetos Es el desplegable que se encuentra en la parte superior y, en él, aparecen todos los objetos del elemento seleccionado en el explorador de proyectos. Lista alfabética Muestra las propiedades del objeto ordenadas en orden alfabético. Lista por categorías Muestra las propiedades del objeto seleccionado agrupadas por categorías. VBA 4 Ventana "inmediato" Puedes mostrarla desde la opción “Ver/Ventana inmediato” y permite probar la ejecución de instrucciones escribiendo la línea de código y pulsando la tecla “Enter”. Barra de herramientas estándar Esta barra incluye los típicos botones de cortar, copiar, pegar y buscar. La posibilidad de deshacer y rehacer. Desde ella podemos mostrar u ocultar diferentes paneles como el explorador de proyectos, propiedades y examinador de objetos. Podemos crear nuevos procedimientos y guardarlos. También permite ejecutar el procedimiento, interrumpir su ejecución y restablecerla. VBA 5 Lección 2 Procedimientos y funciones Son sucesiones de instrucciones que realizan diferentes tareas o calculan valores. Podemos clasificar los procedimientos en dos tipos… Procedimientos Sub() Realizan una serie de procesos pero no devuelven un valor. Las instrucciones van comprendidas entre las expresiones Sub() y End Sub. Tenemos un formulario con un botón de comando al que le hemos asignado la ejecución del siguiente procedimiento al hacer clic en él. Proced01 Private Sub Comando0_Click() MsgBox "Bienvenido" End Sub Fíjate que la ejecución del procedimiento se ha asignado automáticamente al evento “Al hacer clic” del botón. Resultado Proced02 VBA 6 Si quieres realizar el ejemplo… Crea un formulario en vista “Diseño”. Inserta un control del tipo “Botón de comando” (si quieres desactiva el “Asistente para controles” puesto que la acción se la asignaremos de forma manual). Pulsa el botón derecho del ratón sobre el “Botón de comando” insertado y selecciona la opción “Generar evento”. En la ventana que aparece, elige “Generador de código” y pulsa el botón “Aceptar”. Entrarás en el “Entorno de desarrollo” en el que ya aparece el procedimiento asignado al evento “Al hacer clic” del botón. En la posición en la que queda situado el cursor escribe la instrucción del ejemplo: MsgBox "Bienvenido" Cierra la ventana del “Entorno de desarrollo” y prueba. El manejo del “Entorno de desarrollo” y sus diferentes paneles y componentes será comentado en posteriores lecciones. Procedimientos Function() Este tipo de procedimientos se denominan genéricamente funciones y, devuelven el valor resultante de una serie de cálculos o procesos. Las instrucciones estarán comprendidas entre las expresiones Function y End Function. Tenemos un formulario con tres cuadros de texto (Precio, Cantidad e Importe) y un botón de comando al que le asignaremos la ejecución de una función que calcule el importe. Funcion01 VBA 7 La función sería: Function CalculaImporte() Importe.Value = Cantidad.Value * Precio.Value End Function Así como los procedimientos van directamente asignados a eventos, las funciones serán creadas y, después asignadas al evento en el que queramos que se ejecuten. Observa que, a la función le damos un nombre para poder hacer referencia a ella en el momento que decidamos ejecutarla. Dicho nombre no podrá contener espacios en blanco ni caracteres extraños. A continuación del nombre abriremos y cerraremos paréntesis (en algunos casos escribiremos una serie de argumentos entre ellos). Si quieres realizar el ejemplo… Crea un formulario en vista “Diseño”. Inserta tres controles del tipo “Cuadro de texto” y un botón de comando (a los cuadros de texto les he puesto como nombre: Precio, Cantidad e Importe). Accede al “Entorno de desarrollo” pulsando las teclas “Alt+F11” y escribe lo siguiente: Function CalculaImporte() Importe.Value = Cantidad.Value * Precio.Value End Function De momento no te preocupes por el contenido de la expresión (aunque, en este caso es muy sencillo de entender). Ya comentaremos los conceptos de objeto, propiedad y método en próximas lecciones. Una vez creada la función, cierra la ventana del “Entorno de desarrollo” y, vamos a decidir el momento en el que se ejecutará. Pulsa el botón derecho del ratón sobre el “Botón de comando” insertado en el formulario y selecciona la opción “Propiedades”. Sitúate en el apartado “Eventos” y, en el evento “Al hacer clic”, escribe el nombre de la función precedido del signo “=”. =CalculaImporte() ¡No te preocupes por las mayúsculas y minúsculas, a Access le da igual! Ahora prueba a introducir el precio y la cantidad y pulsa el botón “Calcular” para comprobar que está todo correcto. VBA 8 Lección 3 Variables Podemos definir una variable como un contenedor en el que almacenamos cierta información para utilizarla posteriormente. Tenemos un formulario con un “Botón de comando” al que le hemos asignado la ejecución del siguiente procedimiento… Proced01 Private Sub Comando0_Click() dato = "Carlos" MsgBox "Hola " + dato + ", Bienvenido" End Sub Hemos creado una variable a la que le hemos puesto como nombre “dato” y le hemos asignado el valor “Carlos”. A continuación mostramos un cuadro de mensaje en el que unimos texto y el contenido de la variable dato mediante el signo “+”. Resultado Variables01 VBA 9 Nombre de variable El nombre de la variable tiene que cumplir las siguientes condiciones… No se pueden usar caracteres especiales de Access, como el punto, los paréntesis, la barra vertical o caracteres utilizados como operadores (+, -, /, *, <, >). Debe empezar por una letra o por el carácter de subrayado “_”. No puede contener espacios en blanco. No se pueden utilizar palabras reservadas de VBA (for, if, integer…) Puede tener hasta 255 caracteres. No puede haber dos variables con el mismo nombre dentro del mismo procedimiento. Para definir las variables que utilizaremos en el procedimiento utilizaremos la instrucción Dim, seguida del nombre de la variable y de su tipo de datos. Tipos de datos Al igual que en los campos, el tipo de datos permite establecer la clase de información que se almacenará en la variable. Numéricos Existen dos grupos Números enteros. Permite almacenar valores enteros. Sus tipos son: Tipo Byte Tamaño Valor inferior Valor superior 1 byte 0 255 Integer 2 bytes -32.768 32.767 Long 4 bytes -2.147.483.648 2.147.483.647 VBA 10 Números de coma flotante. Permiten almacenar valores enteros y no enteros. Sus tipos son: Tipo Tamaño Negativos De -3,402823E38 a -1,401298E-45 Single 4 byte Double 8 bytes De -1.79769313486231E308 a -4,94065645841247E-324 Currency 8 bytes De -922.337.203.685.477,5808 a0 Decimal Positivos De 1,401298E-45 a 3,402823E38 De 4,94065645841247E-324 a 1,79769313486232E308 De 0 a 922.337.203.685.477,5807 12 bytes El tipo decimal es un poco raro, permite almacenar hasta 29 dígitos enteros con hasta 28 posiciones decimales. +/-79.228.162.514.264.337.593.543.950.335 sin punto decimal; +/-7,9228162514264337593543950335 con 28 posiciones a la derecha del signo decimal; el número más pequeño distinto de cero es +/-0,0000000000000000000000000001 Ejemplo Dim dato1 As integer Date Permite almacenar datos de tipo Fecha/Hora con formato Mes/Día/Año. Ejemplo Dim dato1 As date Boolean Permite almacenar datos de tipo Sí/No o True/False. Ejemplo Dim dato1 As boolean VBA 11 String Almacena datos de cadena de texto. Existen dos tipos… Longitud variable. El número máximo de caracteres que se pueden almacenar es de 2^31. Ejemplo Dim dato1 As string Longitud fija. Limitamos el número de caracteres al definir la variable, hasta un máximo de 65.536. Esto lo hacemos utilizando el carácter “*” seguido del número de caracteres máximo. Ejemplo Dim dato1 As string * 25 Variant Permite almacenar cualquier tipo de datos. Ejemplo Dim dato1 As string * 25 Podemos definir más de una variable en la misma línea. Por ejemplo… Dim dato1, dato2, dato3 As string Ámbito Hasta ahora, en los ejemplos, el ámbito de una variable lo hemos definido con la instrucción Dim, pero existen otras instrucciones que permiten especificar el alcance de dicha variable. Dim La variable sólo será visible por los procedimientos incluidos en un módulo (si se define en la cabecera del mismo) y sólo será visible en el interior de un procedimiento si se define en él. VBA 12 Private Se suele utilizar para que una variable o un procedimiento sólo sean visibles dentro del modulo en el que se crean. Public Se utiliza para que una variable o un procedimiento sean visibles desde cualquier parte de la aplicación. Global Su ámbito es el mismo que el de la instrucción Public. VBA 13 Lección 4 Expresiones Los datos que manipulamos en los diferentes procedimientos, generalmente los utilizamos para realizar operaciones. Estas operaciones son denominadas genéricamente expresiones. Los operadores que podemos utilizar en las expresiones son los siguientes. Operadores aritméticos Operador Operación + Suma o unión (en cadenas de texto) - Resta * Multiplicación / División \ División entera Mod ^ Resto de una división Potencia Operadores de comparación Operador VBA Comparación = Igual a… > Mayor que… < Menor que… >= Mayor o igual que… <= Menor o igual que… <> Distinto de… 14 Operadores de concatenación Operador Función + Suma dos números o une dos cadenas de texto & Une dos cadenas de texto (recomendado) Operadores lógicos Operador VBA Función And Conjunción lógica Or Disyunción lógica Not Negación lógica 15 Lección 5 Objetos, propiedades y métodos Los objetos representan elementos de una aplicación. En el caso de Access: un formulario, un informe, un control, un campo… A los objetos se les pueden asignar propiedades y métodos. Propiedades Son características que poseen los objetos (posición, color, dimensiones, valor…) Son acciones que afectan a un objeto. Para asignar un método a un objeto, utilizamos la siguiente sintaxis… Objeto.Propiedad Métodos Son acciones que afectan a un objeto. Para asignar un método a un objeto, utilizamos la siguiente sintaxis… Objeto.Método() VBA 16 Lección 6 Estructuras condicionales Permiten ejecutar una serie de instrucciones dependiendo de una serie de condiciones. Podemos utilizar diferentes estructuras condicionales. If…Then La sintaxis básica es… If condición then Instrucciones que se ejecutarán si se cumple la condición Else Instrucciones que se ejecutarán si no se cumple la condición End if La instrucción Else es opcional. He creado un formulario en columnas basado en la tabla “Pueblos”. En él he insertado un cuadro de texto al que le he puesto como nombre “Tamaño”. Después, en el evento del formulario “Al activar registro” he generado el siguiente procedimiento: Private Sub Form_Current() If HABITANTES > 5000 Then Tamaño = "Grande" Else Tamaño = "Pequeño" End If End Sub De esta manera, si la localidad tiene más de 5000 habitantes, en el cuadro de texto se mostrará el rótulo “Grande” y, si no tiene más de 5000 habitantes, se mostrará el rótulo “Pequeño”. VBA 17 Condicional01 Select Case Permite establecer una serie de resultados para diferentes posibilidades. Su sintaxis es… Select Case campo Case valor1 Instrucciones Case valor2 Instrucciones … Case Else Instrucciones End Select VBA 18 He creado un formulario en columnas basado en la tabla “Pueblos”. En él he insertado un cuadro de texto al que le he puesto como nombre “DeDonde”. Después, en el evento del formulario “Al activar registro” he generado el siguiente procedimiento: Private Sub Form_Current() Select Case PROVINCIA Case "Zaragoza" DeDonde = "Hola zaragozano" Case "Huesca" DeDonde = "Hola oscense" Case "Teruel" DeDonde = "Hola Turolense" End Select End Sub Condicional02 VBA 19 Lección 7 Propiedades de formulario Te muestro una serie de propiedades de formulario (objeto Form) modificadas mediante la asignación de una serie de procedimientos. Crea un formulario en vista Diseño e inserta en él una serie de etiquetas o de botones de comando (como prefieras). Yo he insertado etiquetas… Propiedades01 Cambiar título del formulario: Para ello utilizamos la propiedad “Caption”. Genera un procedimiento asignado al evento “Al hacer clic” de la etiqueta con la siguiente instrucción… Private Sub Etiqueta3_Click() Form.Caption = "He cambiado el título" End Sub Quitar botones de desplazamiento: De esto se encarga la propiedad NavigationButtons la cual tiene dos valores “True” (visibles) y “False” (ocultos). Genera un procedimiento asignado al evento “Al hacer clic” de la etiqueta con la siguiente instrucción… Private Sub Etiqueta8_Click() Form.NavigationButtons = False End Sub VBA 20 Quitar selector de registro: Mediante la propiedad RecordSelectors podemos hacer que se muestre o no. Genera un procedimiento asignado al evento “Al hacer clic” de la etiqueta con la siguiente instrucción… Private Sub Etiqueta9_Click() Form.RecordSelectors = False End Sub Quitar separador de registros: La propiedad DividingLines hacer que se muestre o no la línea de separación entre registros. Genera un procedimiento asignado al evento “Al hacer clic” de la etiqueta con la siguiente instrucción… Private Sub Etiqueta10_Click() Form.DividingLines = False End Sub Existen otras muchas propiedades de formulario que podemos modificar (Mostrar u ocultar los botones de maximizar, minimizar y cerrar, modificar el estilo de los bordes, quitar o poner el botón de cerrar, modificar su tamaño…) Si quieres probar, ya habrás observado que, al escribir en el procedimiento la palabra Form y un punto, se muestra la lista de propiedades que afectan al objeto. No cuesta nada probar el efecto que causan en el formulario. VBA 21 Lección 8 Propiedades de etiquetas A continuación probaremos como afectan a las etiquetas de un formulario la modificación de los valores de algunas de sus propiedades. Estas propiedades son extensivas a los cuadros de texto. He creado un formulario en vista Diseño en el que he insertado una serie de etiquetas para probar. Propiedades 02 Cambiar el color del texto de la etiqueta: Propiedad ForeColor. Valor, código de color RGB (si quieres conocer el código que corresponde a un determinado color, muestra las propiedades de la etiqueta y, en la propiedad “Color del texto” pulsa el botón de los tres puntos, selecciona un color y se mostrará el código que le corresponde. Asigna el siguiente procedimiento al evento “Al hacer clic” de la etiqueta. Private Sub Etiqueta4_Click() Etiqueta4.ForeColor = 4966415 End Sub O también: Private Sub Etiqueta4_Click() Etiqueta4.ForeColor = RGB(255, 0, 0) End Sub De esta manera indicamos la cantidad de rojo, verde y azul (de 0 a 255) que utilizamos para dar color al texto. VBA 22 Cambiar el color de fondo de la etiqueta: Asigna previamente a la etiqueta un color de fondo y, después genera un procedimiento asignado al evento “Al hacer clic” de la misma. Mediante la propiedad BackColor podemos variar el color de su fondo. Los valores serán los mismos que para modificar el color del texto. Private Sub Etiqueta5_Click() Etiqueta5.BackColor = 4966415 End Sub Cambiar la posición de la etiqueta: De esto se encarga la propiedad Move con sus argumentos Left (posición desde el borde izquierdo de la ventana) y Top (posición desde el borde superior de la ventana). También podemos establecer su tamaño con los argumentos Width (ancho) y Height (alto). La unidad de medida que utilizamos para los diferentes valores es el twip (TWentIeth of a Point) Vigésima parte de un punto. Equivale a 1/1440 de una pulgada. Una unidad independiente de la pantalla utilizada para asegurar que la colocación y la proporción de los elementos de la pantalla de la aplicación son los mismos en todos los sistemas de pantallas. Un twip es una unidad de medida de la pantalla igual a 1/20 de un punto de impresora. Existen aproximadamente 1440 twips en una pulgada lógica o 567 twips en un centímetro lógico (la longitud de un elemento de pantalla que mide una pulgada o un centímetro al imprimirse. Asigna el siguiente procedimiento al evento “Al hacer clic” de la etiqueta. Private Sub Etiqueta6_Click() Etiqueta6.Move Left:=0, Top:=0 End Sub De esta manera se situará en la esquina superior izquierda de la ventana. Ocultar la etiqueta: De esto se encarga la propiedad Visible con los valores “True” (visible) y “False” (oculto). Asigna el siguiente procedimiento al evento “Al hacer clic” de la etiqueta. Private Sub Etiqueta7_Click() Etiqueta7.Visible = False End Sub Por supuesto que existen muchas otras propiedades. Crea tus propias etiquetas y prueba con diferentes propiedades para comprobar su funcionamiento. VBA 23 Lección 9 InputBox Muestra una ventana con un mensaje y un cuadro de texto en el que el usuario deberá introducir información que será procesada posteriormente. Su sintaxis básica es: Variable o campo = InputBox(Mensaje,Título de la ventana,Valor predeterminado) He creado una tabla y un formulario en columnas basado en ella, con los siguientes campos: Inputbox01 En el evento “Al cargar” del formulario he generado el siguiente procedimiento: Private Sub Form_Load() Apellidos = InputBox("Introduce tus apellidos", "Entrada de datos", "Escribe aquí") Nombre = InputBox("Introduce tu nombre", "Entrada de datos", "Escribe aquí") Telefono = InputBox("Introduce tu teléfono", "Entrada de datos", "Escribe aquí") End Sub Al cargarse el formulario se mostrarán (una detrás de otra) tres cuadros de diálogo en los que se me pedirá que introduzca la información solicitada. Esta información irá a parar a los diferentes campos del formulario. Inputbox02 VBA 24 Lección 10 MsgBox Muestra una ventana con un mensaje y una serie de botones que podemos controlar. Su sintaxis es… MsgBox “Mensaje” De esta forma, simplemente se muestra un cuadro de mensaje con un botón de “Aceptar”. He creado otro formulario basado en la tabla anterior y, en el evento “Al cargar” he generado el siguiente procedimiento de evento… Private Sub Form_Load() MsgBox "Bienvenido" End Sub El resultado es… Msgbox01 La sintaxis, algo más completa, es… Variable = MsgBox(Mensaje,botones,título de la ventana) He modificado el código asignado al evento “Al cargar” del formulario anterior por este… Private Sub Form_Load() Dim respuesta respuesta = MsgBox("¿Quieres introducir datos", vbYesNo, "Entrada de datos") If respuesta = vbNo Then DoCmd.Close End If End Sub VBA 25 En el código he definido una variable que he llamado respuesta. A continuación, muestro un cuadro de mensaje con dos botones “Sí” y “No”, y controlo el botón pulsado almacenando su valor en la variable. Pregunto por el contenido de la variable, si ha pulsado el botón “No”, cierro el formulario. En caso contrario se abriría el formulario. El resultado de la función MsgBox, sería… Msgbox02 VBA 26