Unidad didáctica 11 VBA

Anuncio
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
Descargar