Introducción
Microsoft Access incluye una serie de características que permiten a los desarrolladores de bases de datos crear formularios de ingreso de datos, informes y consultas que pueden guiar a los usuarios en la consulta de datos existentes en la base de datos y el ingreso de nuevos datos. Varias herramientas de creación de consultas y asistentes facilitan este proceso de desarrollo. Sin embargo, incluso con estas herramientas, puede haber situaciones en las que el desarrollador desee agregar aún más funciones que las herramientas de desarrollo de MS Access aún no proporcionan. Por ejemplo, el desarrollador puede desear corregir automáticamente los datos incorrectos antes de que se guarden en la base de datos, mostrar una alerta si se viola una regla comercial, ayudar al usuario a navegar de un formulario de ingreso de datos a otro o lanzar un informe con algunos filtros personalizados. La forma de lograr dicha personalización es agregando código usando el lenguaje de programación Visual Basic for Applications.
Visual Basic para aplicaciones (VBA) es el lenguaje de programación utilizado en la familia de productos de software de Microsoft Office, como Excel y Access. El lenguaje VBA se deriva del lenguaje "básico" inventado en 1964 que se hizo popular en las computadoras personales en la década de 1970. Microsoft agregó la parte "Visual" del nombre para reflejar el uso del lenguaje de programación básico en Microsoft Windows.
Hay muchos tutoriales que introducen la programación básica. Este tutorial se centrará en un pequeño subconjunto de características del lenguaje VBA como se usa en MS Access.
Contenido
- Eventos en Microsoft Access
- Ejemplo de código VBA:garantizar que los nombres estén en mayúsculas y minúsculas
- El lenguaje VBA:declaración y asignación de variables, declaraciones condicionales y comentarios
- El lenguaje VBA:funciones, métodos y ejemplos
- El lenguaje VBA:propiedades
- Ejercicios de codificación VBA
- Manejo de errores en VBA
- Ejecución de consultas SQL personalizadas en VBA
La siguiente página presenta Eventos en Microsoft Access.
Eventos en Microsoft Access
En Access, el código de programación de VBA se adjunta a formularios e informes y se puede configurar para que se ejecute en un momento específico o como reacción a un evento específico. Este estilo de programación a veces se denomina programación "basada en eventos", lo que significa que el código que escribe el desarrollador se ejecutará en respuesta a algún evento. .
Cuando se muestra un formulario en Vista de formulario, generalmente consultará los datos existentes de las tablas subyacentes y luego simplemente se quedará inactivo hasta que el usuario haga algo. Por ejemplo, el usuario puede hacer clic en uno de los botones de navegación para pasar al siguiente registro, puede hacer clic en un cuadro de texto y comenzar a escribir algunos datos nuevos o puede hacer clic en el botón Cerrar para cerrar el formulario. Cada una de estas acciones da como resultado un Evento sucediendo en la forma. Cada clic del mouse o golpe de teclado se maneja como un evento.
En su mayor parte, los eventos tienen un comportamiento predeterminado. Al hacer clic en el botón de navegación "siguiente registro", el formulario se desplaza al siguiente registro de datos. Escribir la letra "C" cuando el cursor está en un cuadro de texto hace que aparezca la letra "C" en el cuadro de texto. Al presionar la tecla TAB, el cursor salta al siguiente cuadro de texto (o control) en el formulario y así sucesivamente. Un programador puede anular o mejorar este comportamiento predeterminado e insertar su propio código para que se ejecute en respuesta al evento.
La programación de VBA en formularios e informes de acceso se centra principalmente en escribir código para responder a diferentes eventos.
Antes de profundizar en los detalles de los eventos, puede ser instructivo implementar un ejemplo simple. Para ver algo de código en acción, la siguiente sección de este tutorial proporciona un recorrido para agregar código VBA a un formulario de entrada de datos.
Ejemplo de código VBA:garantizar que los nombres estén en mayúsculas y minúsculas
Lo que sigue es un ejemplo relativamente breve y simple de agregar código VBA a un formulario de entrada de datos en MS Access. Se omitirán varios detalles por motivos de brevedad. Después de este ejemplo, el resto de este tutorial completará esos detalles.
Este ejemplo usa el Cliente formulario de entrada de datos que se personalizó en el tutorial de formularios avanzados de MS Access. Es posible que desee completar ese tutorial (o al menos las partes relacionadas con el formulario de ingreso de datos del Cliente) antes de continuar.
Al ingresar información de nuevos clientes, nos gustaría asegurarnos de que los nombres de los Clientes se ingresen en "caso correcto". Es decir, la primera letra del nombre debe ser mayúscula y el resto del nombre debe estar en minúsculas. Si el usuario ingresa:"joe", nos gustaría que el formulario lo corrija automáticamente al caso correcto:"Joe".
En cuanto a los eventos, agregaremos un código que está conectado al evento Después de la actualización para el campo Nombre en el formulario del cliente. Esto significa que después algo ha sido cambiado (actualizado ) en el campo Nombre, se activará el evento Después de la actualización y luego el código que escribiremos entrará en acción para asegurarnos de que cualquier nombre que se haya escrito se convierta en mayúsculas y minúsculas.
Los siguientes pasos colocan este código en su lugar.
- Abra la entrada de datos del cliente en modo de diseño.
- Haga clic derecho en el Nombre cuadro de texto y seleccione Propiedades en el menú emergente.
- Cuando la Hoja de propiedades se muestra, haga clic en la pestaña Evento. Esto se muestra en la siguiente figura:
Tenga en cuenta la lista de eventos que se muestran. Cada uno se puede programar para responder al evento específico que le sucede al FirstName cuadro de texto.
- Cree un nuevo controlador de eventos haciendo clic en los tres puntos a la derecha del evento Después de la actualización.
- El Choose Builder aparecerá la ventana. Seleccione Generador de código y luego haga clic en Aceptar botón.
- Aparecerá la ventana de edición del código VBA. Tenga en cuenta que Access ya ha creado el stub de la subrutina que comienza con las palabras Private Sub y termina con las palabras End Sub.
El nombre de la subrutina se crea utilizando el nombre del control de formularios (FirstName) y el nombre del Evento al que responderá esta subrutina (AfterUpdate).La línea End Sub es donde terminará esta subrutina en particular.
- Agregue el siguiente código en la línea vacía entre Private Sub y End Sub.:
FirstName = StrConv(FirstName, vbProperCase)
Una vez completado, el código aparecerá de la siguiente manera:
Esta nueva línea de código hace lo siguiente:
StrConv es una función que toma el contenido del cuadro de texto FirstName y lo convierte de acuerdo con el segundo parámetro proporcionado, que es vbProperCase en este ejemplo. Una vez realizada esta conversión, el resultado se volverá a asignar (usando el signo igual) al cuadro de texto FirstName. Esto sobrescribirá todo lo que esté actualmente en el cuadro de texto FirstName. Por ejemplo, esta función tomará "sally", lo convertirá en "Sally" y luego colocará "Sally" en el cuadro de texto FirstName.
- Guarde este nuevo código bajando el Archivo menú y seleccionando Guardar .
- Pruebe el nuevo código. Vuelva a la pantalla del modo de diseño de Microsoft Access. Cambie la vista a Vista de formulario.
- Navegar a un registro vacío. Haga clic en el campo FirstName y escriba un nombre en minúsculas:
- Presiona el tabulador para pasar al siguiente cuadro de texto. El nombre de Joe debe cambiarse a "Joe" como se muestra a continuación:
- Si recibe un error, vuelva al editor de código VBA y asegúrese de haber escrito correctamente todas las partes del código. Es posible que deba desplegar el botón Ejecutar menú y seleccione Restablecer para detener la ejecución del código VBA.
El ejemplo anterior proporcionó una mirada rápida a cómo se puede personalizar el comportamiento de un formulario para ayudar al usuario a ingresar datos bien formateados en la base de datos. Se omitieron varios detalles durante este ejemplo y esos detalles se discutirán en el resto de este tutorial.
El lenguaje VBA
Esta sección presenta brevemente las partes principales del lenguaje VBA tal como se usa en MS Access. Una descripción general completa de VBA está más allá del alcance de este tutorial. Al final de este tutorial se proporcionan referencias a libros y materiales más completos.
Declaración de variables
Una variable es un nombre dado a un marcador de posición donde el programador puede almacenar algunos datos. Por ejemplo, una variable podría usarse para almacenar un número mientras realizamos algunas operaciones matemáticas con él o comparamos su valor con otras variables. Las variables se pueden declarar para contener valores de un tipo de datos específico como números enteros, cadenas o fechas. Para declarar una nueva variable, utilice la instrucción Dim. Por ejemplo, para declarar una nueva variable llamada MiNombre y configúrelo para contener una cadena (caracteres), haga lo siguiente:
Dim strMyName como cadena
Para declarar una nueva variable llamada "SaldoCuenta" y configurarla para almacenar un número con un decimal, use lo siguiente:
Dim dblAccountBalance como doble
Asignación de valores
Se puede asignar un valor a una variable o a un control en el formulario usando el signo igual. Por ejemplo, para almacenar el nombre “Alex” en la variable MiNombre use lo siguiente:
strMiNombre =“Alex”
Para copiar el contenido del cuadro de texto FirstName en la variable MyName, use:
strMiNombre =[Nombre]
Los valores también se pueden calcular antes de ser asignados. Por ejemplo, la siguiente expresión toma el saldo de la cuenta del cliente actual del cuadro de texto [Saldo], agrega un 1 % de interés (al multiplicar el saldo por 1,01) y luego reduce el resultado en $10. Finalmente, el resultado se asigna a la variable SaldoCuenta.
dblAccountBalance =( [Saldo] * 1.01 ) – 10.00
Declaraciones condicionales
Una declaración condicional utiliza una prueba lógica para determinar qué líneas de código ejecutar a continuación. La declaración condicional If … Then se usa con bastante frecuencia. Por ejemplo:
If AccountBalance < 1000 Then MonthlyFee = 10 Else MonthlyFee = 0 End If
Se evalúa la expresión lógica AccountBalance <1000. Si esta expresión es verdadera (por ejemplo, si AccountBalance es $400), entonces se ejecuta la siguiente línea después de Then. En este ejemplo, Tarifa mensual =10.
Si esta expresión es falsa, entonces se ejecuta la línea después de Else.
La expresión lógica puede incluir varias partes que están conectadas por los operadores booleanos OR, AND y NOT. Puede encontrar una discusión más detallada de las expresiones booleanas en este tutorial de programación. Por ejemplo, supongamos que renunciamos a la tarifa mensual si la cuenta tiene menos de un año. Supongamos que tenemos AccountAge como la edad de la cuenta en meses. Entonces el código sería:
If AccountBalance < 1000 AND AccountAge > 12 Then MonthlyFee = 10 Else MonthlyFee = 0 End If
Se puede ejecutar más de una línea de código en la declaración If... Then y las declaraciones If... Then se pueden anidar una dentro de otra.
Comentarios
Al programar en cualquier lenguaje de programación, es una buena práctica incluir comentarios que describan el código. En VBA, se puede incluir un comentario comenzando con una comilla simple. Tomando lo anterior como ejemplo, podríamos agregar los siguientes comentarios:
Más partes del lenguaje VBA se analizan en la página siguiente.
Lenguaje VBA – Continuación
Funciones
El lenguaje VBA tiene una gran cantidad de funciones y métodos incorporados que se pueden usar para realizar diversas tareas, como funciones matemáticas (sin, cos, tan), funciones de cadena y muchas otras. Las funciones suelen tener uno o más parámetros de entrada que utiliza la función. Por ejemplo, en la función Cos(45) el “45” es el ángulo de entrada sobre el que operará la función coseno. La función StrConv requiere dos parámetros de entrada:la cadena a convertir y el estilo de conversión:
StrConv(Nombre, vbProperCase)
Algunas funciones útiles incluyen:
MsgBox(mensaje, botones, título) | Mostrar un cuadro de mensaje emergente con el texto del mensaje, los botones y el título |
StrConv( expresión, estilo ) | Convierta la expresión de cadena a mayúsculas, minúsculas o mayúsculas y minúsculas |
Izquierda( expresión, caracteres ) | Tome los caracteres más a la izquierda de la expresión de cadena |
Mid(expresión, inicio, caracteres) | Tome el conjunto medio de caracteres de la expresión de cadena que comienza en inicio |
EsNulo( expresión ) | Pruebe si la expresión de cadena (o el cuadro de texto) no tiene contenido (es nulo) |
Nz( expresión, valor_si_null ) | Si la expresión es nula, complete un valor predeterminado |
Ahora() | Devuelve la fecha y hora actuales |
Redondo(expresión, decimales) | Redondea la expresión numérica a algún número de lugares decimales |
RGB (rojo, verde, azul) | Devuelve el número entero de color basado en una combinación de rojo, verde y azul |
Métodos
Los métodos en VBA son como funciones pero están conectados con un control u otro objeto en un formulario o informe.
Algunos métodos útiles incluyen:
DoCmd.CancelEvent | Cancela el evento actual que se está manejando |
DoCmd.Cerrar | Cerrar el formulario actual (o base de datos) |
DoCmd.OpenForm | Abre un nuevo formulario |
DoCmd.Abrir informe | Ejecute un comando de MS Access, como guardar datos nuevos o actualizados, deshacer un cambio o salir de un formulario |
.Establecer enfoque | Establecer el foco en el control del formulario |
.Deshacer | Deshacer el cambio o comando más reciente |
.Actualizar | Actualiza todos los datos subyacentes de un formulario |
.Solicitud de consulta | Reconsulta los datos suministrados a un formulario |
.Repintar | Vuelve a pintar todos los controles de un formulario |
En este sitio de Microsoft se enumeran muchas más funciones y métodos.
El siguiente conjunto de ejemplos hace uso de varias funciones y métodos en diferentes combinaciones.
Ejemplos
Muestra al usuario una advertencia si el saldo de la cuenta es inferior a 1000 $
If AccountBalance < 1000 Then MsgBox("Warning: The Account Balance is now less than $1,000.") End If
Si el cuadro de texto FirstName en el formulario tiene algo, entonces conviértalo a mayúsculas y minúsculas
If Not IsNull( [FirstName] ) Then FirstName = StrConv( [FirstName], vbProperCase ) End If
la página siguiente presenta las Propiedades de diferentes objetos.
Propiedades
Cada elemento de un formulario de entrada de datos o informe tiene un conjunto de propiedades asociado a ello. Las propiedades controlan la ubicación, el color, la fuente, el fondo y otros atributos de apariencia y formato de cada control. Por ejemplo, algunas de las muchas propiedades de un TextBox incluyen:
Visible | Determina si el cuadro de texto está visible en el formulario |
Bloqueado | Determina si se pueden cambiar los datos en el cuadro de texto |
Índice de pestañas | El orden de cada control a medida que el usuario navega por el formulario presionando Tabulador |
Etiqueta | Identifica el nombre de la etiqueta asociada con el cuadro de texto |
Ancho, Alto, Posición superior e inferior | Indica la posición relativa y el tamaño del cuadro de texto |
Estilo y color de fondo | Establece el estilo de fondo y el color del cuadro de texto |
Estilo y color del borde | Establece el estilo y el color del borde alrededor del cuadro de texto |
Tamaño de fuente, grosor, subrayado, cursiva, color y alineación | Establece la fuente y el estilo |
Márgenes y espaciado de relleno:establece los márgenes y el relleno alrededor del interior del cuadro de texto |
Las propiedades se pueden configurar mediante la Vista de diseño y se pueden guardar con el formulario o informe. Las propiedades también se pueden cambiar usando el código VBA mientras se ejecuta el formulario. Para acceder a una propiedad en VBA, use el nombre del control, luego un punto y luego el nombre de la propiedad. Por ejemplo, el siguiente código cambia el color de fuente del cuadro de texto CustomerID a rojo:
IDCliente.ForeColor =vbRed
Las secciones que siguen proporcionan algunos ejercicios que combinan diferentes partes del lenguaje de programación VBA para personalizar el comportamiento de varios formularios de ingreso de datos.
Ejercicios de código VBA
Pruebe los siguientes ejercicios que personalizan formularios. Vuelva a consultar las secciones anteriores para ver ejemplos de código que se pueden adaptar al ejercicio actual.
Ejercicio 1
Modifique el formulario CustomerDataEntry para agregar dos controladores de eventos AfterUpdate que convertirán el nombre y el apellido en mayúsculas y minúsculas (cree un controlador AfterUpdate independiente para cada cuadro de texto). Escriba código para comprobar primero que el cuadro de texto no sea nulo antes de intentar convertir el texto.
Ejercicio 2
Modifique el formulario AccountsDataEntry para agregar un controlador de eventos AfterUpdate que mostrará un cuadro de mensaje de advertencia si el saldo de la cuenta es inferior a $5000. También cambie el color de fuente del cuadro de texto Saldo a rojo.
Ejercicio 3
Modificar el formulario de Entrada de Datos del Cliente. Cree una subrutina On Lost Focus que cambie la etiqueta del cuadro de texto FirstName a rojo (vbRed) si el usuario deja el cuadro de texto FirstName sin escribir nada. Establezca la etiqueta en azul (vbBlue) si hay algo en el cuadro de texto. En el siguiente ejemplo, no se escribió nada en el cuadro de texto FirstName y luego el usuario pasó al siguiente cuadro de texto, lo que provocó que la etiqueta FirstName se pusiera roja.
La siguiente página de este tutorial explica cómo manejar los errores en el código VBA.
Manejo de errores en VBA
Ocasionalmente, el código VBA se ejecutará en un error. Por ejemplo, si un cuadro de texto está vacío e intentamos convertir el contenido del cuadro de texto a mayúsculas y minúsculas, la función StrCnv fallará. Otro ejemplo es cuando ocurre la división por cero. Sin el manejo de errores, estos problemas pueden hacer que el programa VBA se bloquee. Cuando ocurre un error, un código especial puede entrar en acción para manejar el error y continuar procesando el código VBA.
Las dos características principales de manejo de errores de VBA son la instrucción On Error Goto y la instrucción Resume Next. Estas dos declaraciones de código de VBA funcionan juntas para evitar que VBA bloquee la aplicación.
La declaración On Error Goto informa a VBA sobre qué hacer cuando ocurre un error en una subrutina. La parte Goto de la declaración hace referencia a una etiqueta en otra parte del código donde el VBA seguirá funcionando. Una vez que el programa VBA llegue a la etiqueta, cualquier error aparecerá en un objeto llamado Err. La propiedad Err.Description contendrá una descripción de texto del último error encontrado. La instrucción Resume Next hará que el programa VBA continúe ejecutándose desde el punto en que ocurrió el error.
El siguiente ejemplo amplía la rutina FirstName_AfterUpdate presentada al comienzo de este tutorial. Ahora el programa VBA puede manejar cualquier error que pueda ocurrir en el programa.
Private Sub FirstName_AfterUpdate ' Subroutine to convert the FirstName of the customer to Proper Case On Error Goto FirstName_AfterUpdate_Error_Handler FirstName = StrConv(FirstName, vbProperCase) ' If the conversion was successful, exit this subroutine Exit Sub FirstName_AfterUpdate_Error_Handler: ' If there is an error show the description of the error MsgBox Err.Description ' Resume with the next statement In the subroutine Resume Next End Sub
la siguiente sección de este tutorial analiza cómo incluir código SQL dentro de VBA.
Ejecución de consultas SQL personalizadas en VBA
El lenguaje de consulta estructurado (SQL) es el lenguaje de programación utilizado en bases de datos relacionales como MS Access, SQL Server, Oracle y muchas otras. Las sentencias SQL se pueden usar para insertar, actualizar, eliminar y recuperar (seleccionar) registros de datos de las tablas (entre muchas otras capacidades). Un ejemplo simple de una sentencia SQL sería:
SELECT customerid, firstname, lastname FROM customer
El código SQL puede escribirse dentro de VBA y ejecutarse en el momento adecuado. Por ejemplo, se podría escribir una subrutina de VBA para consultar la tabla Customer para encontrar el CustomerID más alto. Luego, podríamos agregar 1 a este número para lograr un nuevo ID de cliente sin usar para un nuevo registro.
Los pasos generales para realizar este tipo de tareas son:
Crear una sentencia SQL
Ejecute la instrucción SQL utilizando la conexión de base de datos abierta (llamada CurrentDb en VBA)
Recuperar los registros resultantes y utilizar los datos recuperados
Para crear esta subrutina de VBA, abra el formulario CustomerDataEntry y obtenga las propiedades del campo CustomerID. En la pestaña de eventos, haga clic en los tres puntos a la derecha del evento On Dbl Click. Elija Code builder y el stub se creará de la siguiente manera:
Private Sub CustomerID_DblClick(Cancel As Integer) End Sub
Agrega el siguiente código:
Private Sub CustomerID_DblClick(Cancel As Integer) ' Create a new CustomerID when user double-clicks in the CustomerID field On Error GoTo ErrorHandler Dim rstResults As Recordset ' This will hold the set of result records Dim strSQL As String ' This variable will hold the text of the SQL Statement ' If there is nothing in the CustomerID text box If IsNull(CustomerID) Then ' Make the SQL statement strSQL = "SELECT MAX(customerid) + 1 AS NewID FROM customer" ' Run the SQL query against the current database Set rstResults = CurrentDb.OpenRecordset(strSQL) ' If at least 1 record is returned If rstResults.EOF = False Then ' Assign the NewID to the CustomerID field CustomerID = rstResults!NewID End If rstResults.Close ' Close up the result set Set rstResults = Nothing ' Empty out the result set End If Exit Sub ErrorHandler: Set rstResults = Nothing End Sub
El código se verá como el siguiente una vez que esté todo en su lugar:
Guarde el archivo y luego vea el formulario CustomerDataEntry. Navegue a un nuevo registro y luego haga doble clic en el campo CustomerID. Se debe crear automáticamente un nuevo CustomerID.