This document was uploaded by user and they confirmed that they have the permission to share
it. If you are author or own the copyright of this book, please report to us by using this DMCA
report form. Report DMCA
Overview
Download & View Vba Excel 2013.pdf as PDF for free.
VBA Excel 2013 Programación en Excel: Macros y Lenguaje VBA
Colección Recursos Informáticos
Extracto del Libro
283
Capítulo 8
Administración de eventos 1. Presentación
Administración de eventos
Un evento es una acción del usuario o del sistema reconocido por un objeto de Microsoft Excel. El evento desencadena un procedimiento, asociado al evento del objeto activo. Estos procedimientos le permiten asociar un código personalizado en respuesta a un evento que se produce en un objeto Excel (libro, hoja, formulario, gráfico, etc.).
VBA Excel 2013
284
Programación en Excel: macros y lenguaje VBA
2. Escritura de eventos 2.1 Eventos de libro, de hoja o de formulario Usted puede acceder a los procedimientos de eventos asociados a un objeto de la siguiente manera: dEn la ventana Explorador de proyectos, haga doble clic en el objeto deseado (libro, hoja o formulario) para hacer aparecer la ventana de código correspondiente. dAbra la lista desplegable a la izquierda de la ventana de código y seleccione Workbook, Worksheet o UserForm, según el objeto seleccionado. dTambién puede seleccionar un evento vinculado al objeto seleccionado en la lista desplegable de la derecha, para asociarle un código personalizado. Observación
La ejecución de los procedimientos de eventos, se puede desactivar en cualquier momento asignando el valor False a la propiedad EnableEvents del objeto Application.
Administración de eventos Capítulo 8 Ejemplo Este ejemplo muestra cómo obtener un listado histórico de todos los hipervínculos visitados en la hoja de cálculo activa.
Resultado en Excel:
285
VBA Excel 2013
286
Programación en Excel: macros y lenguaje VBA
2.2 Eventos del objeto Application Se necesitan tres etapas para la escritura y ejecución de los eventos del objeto Application. Etapa 1 dInserte un módulo de clase: Insertar - Módulo de clase o abra la lista
y haga clic en Módulo de clase.
dUna vez insertado el módulo, asígnele un nombre. Ejemplo Dele el nombre ObjApplication al módulo de clase.
Etapa 2 dEn el módulo de clase, cree un objeto Application con el siguiente código: Public WithEvents NomObjeto As Application
Ejemplo Creación del objeto MiAplicación como aplicación. Public WithEvents MiAplicacion As Application
dSeleccione el objeto creado en la lista de la izquierda del módulo y luego seleccione el evento esperado en la lista de la derecha. Escriba el código de los procedimientos que desea generar.
El objeto así creado queda disponible en la lista de la izquierda del módulo.
Administración de eventos Capítulo 8 Ejemplo Creación de dos procedimientos de eventos: el primero realiza la inserción de una nueva hoja; el segundo, la creación de un nuevo libro. Public WithEvents MiAplicacion As Excel.Application ______________________________________________________________________ Private Sub MiAplicacion_WorkbookNewSheet _ (ByVal Wb As Workbook, ByVal Sh As Object) Dim NomHoja As String ' Cada vez que se agrega una hoja se pide al usuario ' que introduzca un nombre que a continuación se destinará a la hoja ' insertada tras las hojas existentes NomHoja = InputBox("Introduzca el nombre de la hoja") ActiveSheet.Name = NomHoja ActiveSheet.Move After:=Sheets(Sheets.Count) End Sub ______________________________________________________________________ Private Sub MiAplicacion_NewWorkbook(ByVal Wb As Workbook) Dim NbHojas As Integer Dim NbActual As Integer Dim Diferencia As Integer ' Por cada nuevo libro, ' solicitamos al usuario la cantidad de hojas ' Según el caso, se agregan o eliminan las hojas necesarias Do NbHojas = Application.InputBox _ ("¿Cantidad de hojas?", Type:=1) Loop While NbHojas = False NbActual = Sheets.Count Diferencia = NbActual - NbHojas ' Eliminar las hojas de más ' Eliminar los mensajes de alerta con el fin ' de no obtener mensajes en la eliminación de hojas Do While Diferencia > 0 Application.DisplayAlerts = False Sheets.Item(Diferencia).Select ActiveWindow.SelectedSheets.Delete Diferencia = Diferencia - 1 Loop ' Agregar hojas necesarias ' Se desactivan los eventos para ' no indicar los nombres de las nuevas hojas Do While Diferencia < 0 Application.EnableEvents = False Sheets.Add
287
VBA Excel 2013
288
Programación en Excel: macros y lenguaje VBA Diferencia = Diferencia + 1 Loop ' Reactivar eventos y alertas Application.EnableEvents = True Application.DisplayAlerts = True End Sub
Etapa 3 dActive un módulo cualquiera y conecte el objeto declarado en el módulo de clase con el objeto Application para las siguientes instrucciones: Dim NomVariable As New NomModuloDeClase Sub NomProced () Set NomVariable.NomObjeto = Application End Sub
Ejemplo Agregue el siguiente código en el módulo Declaraciones. Option Explicit Dim app As New ObjApplication ________________________________________________________________ Sub InicializaMiAplicacion() Set app.MiAplicacion = Application End Sub
Finalmente, llame al procedimiento InicializaMiAplicacion al abrir el libro (módulo de clase ThisWorkbook).
Cuando se abra el libro, se ejecutarán automáticamente los procedimientos de eventos creados durante la etapa 2 y se agregarán los libros o las hojas. Estos procedimientos se desactivarán al cerrar el libro.
Private Sub Workbook_Open() InicializaMiAplicacion End Sub
Ediciones ENI
VBA Access 2013 Programar en Access
Colección Recursos Informáticos
Extracto del Libro
207
Capítulo 6
Gestión de los eventos 1. Presentación
Gestión de los eventos
1.1 Definición Un evento es el resultado de una acción del usuario o del sistema sobre un objeto. Desencadena la ejecución del código correspondiente al procedimiento de evento del objeto activado.
208
VBA Access 2013
Programar en Access
La utilización de un procedimiento de evento o de una macro permite asociar un tratamiento específico en respuesta a un evento que se produzca en un formulario, en un informe o en un control.
1.2 Asociación de código VBA a un evento Puede asignar código VBA al evento de un objeto de dos maneras: – a partir de la ficha Eventos de la ventana de propiedades del objeto en Access.
– a partir de las listas desplegables de objetos y de eventos en el editor Visual Basic.
209
Gestión de los eventos Capítulo 6
2. Categorías de eventos Las siguientes listas de eventos están clasificadas por tipo y contienen: – el nombre del evento, – el nombre de la propiedad correspondiente en la ventana de propiedades del objeto (entre paréntesis), – la descripción del evento, – la columna de la derecha (Cancelación) indica si el evento puede cancelarse. La cancelación de un evento se describe en el apartado Cancelación de un evento.
2.1 Eventos de tipo Ventana Cancelación Open
(AlAbrir) Sí Se produce al abrir un formulario pero antes de que se muestre el primer registro. Se produce al abrir un informe, pero antes de su impresión.
Load
(AlCargar) No Se produce al abrir un formulario cuando se muestra el primer registro.
Resize
(AlCambiarTamaño) No Se produce al mostrar por primera vez el formulario y al cambiar su tamaño.
UnLoad
(AlDescargar) Sí Se produce al cerrar y cuando se liberan los registros, pero antes de que el formulario desaparezca.
Close
(AlCerrar) No Se produce cuando el formulario o el informe desaparece al cerrarlo.
VBA Access 2013
210
Programar en Access
2.2 Eventos de tipo Enfoque Les eventos de tipo "enfoque" pueden aplicarse a los formularios (Activate, Deactivate, GotFocus, LostFocus) o a los controles (Enter, Exit, SetFocus, LostFocus). Decimos que un objeto tiene el enfoque (o foco) cuando puede recibir una entrada del usuario a través de acciones con el ratón o con el teclado. Los objetos que tienen el enfoque se llaman objetos activos (ActiveForm o ActiveControl). Observación El método SetFocus permite dar el foco a un control o a un formulario.
Cancelación Activate
No (AlActivar) Se produce cuando la ventana del formulario o del informe se convierte en activa.
Enter
(AlEntrar) No Se produce antes de que un control tome el foco a partir de un control o al abrir el formulario.
Exit
(AlSalir) Sí Se produce antes de que un control pierda el enfoque en provecho de otro control del formulario o de otro formulario.
GotFocus
(AlRecibirEnfoque) No Se produce cuando un control o un formulario sin control activo recibe el foco.
LostFocus
(AlPerderEnfoque) No Se produce cuando un control o un formulario pierde el enfoque.
Deactivate (AlDesactivar) No Se produce al activar otra ventana, pero antes de que esta última esté activada. Se produce también al cerrar la ventana.
211
Gestión de los eventos Capítulo 6
2.3 Eventos de tipo Datos Los eventos de tipo "datos" se aplican a los formularios asociados a un origen de datos (propiedad RecordSource rellenada a partir de un nombre de tabla o de una consulta) y a los controles asociados a un campo del origen de datos del formulario (propiedad ControlSource rellenada). Cancelación AfterInsert
(DespuésDeInsertar) No Se produce después de agregar un nuevo registro a la tabla.
AfterUpdate
(DespuésDeActualizar) No Se produce después de la actualización de un control o de un registro con datos modificados.
AfterDelConfirm
(DespuésDeConfirmarEliminación) No Se produce después de que el usuario haya respondido a la solicitud de eliminación de los registros.
BeforeInsert
(AntesDeInsertar) Sí Se produce al teclear el primer carácter de un nuevo registro, pero antes de agregar realmente el registro.
BeforeUpdate
(AntesDeActualizar) Sí Se produce antes de la actualización de un control o de un registro con datos modificados.
BeforeDel-Confirm
(AntesDeConfirmarEliminación) Sí Se produce después de que el usuario haya eliminado registros y antes que Access solicite confirmación.
VBA Access 2013
212
Programar en Access
NotInList
(AlNoEnLaLista) No Se produce al entrar un valor que no existe en una lista y cuando la propiedad LimitarALista es verdadera.
Current
(AlActivarRegistro) No Se produce cuando el foco pasa de un registro a otro. Se produce también al abrir, antes de que el primer registro se convierta en el actual.
Change
(AlCambiar) No Se produce al modificar el contenido de un cuadro de texto o un cuadro combinado (teclado o macro/Visual Basic).
Updated
(AlActualizar) No Se produce cuando los datos de un objeto OLE han sido modificados.
Delete
(AlEliminar) Sí Se produce antes de la eliminación efectiva. Al pulsar [Supr] por ejemplo.
Dirty
Sí (AlCambiar) Se produce cuando cambia el contenido de un formulario o la parte de texto de un cuadro combinado. Se produce también al pasar de una página a otra en un control Ficha.
Introducción Access 2013 dispone del lenguaje de programación Visual Basic para Aplicaciones (VBA) que permite extender su funcionalidad para ofrecerle mejor rendimiento. Es un lenguaje potente que no presenta ninguna dificultad para ser comprendido por los prin
Objetivos del libro Este libro se dirige a los desarrolladores y usuarios avezados que desean crear aplicaciones profesionales con Access. El objetivo de este libro consiste en presentar el abanico de posibilidades propuestas por la potencia del lenguaje VBA. Los diferentes ejemplos, disponibles para descargar en la página Información, le permitirán poner en práctica fácil y progresivamente los conocimientos adquiridos. El único requisito necesario para aprovechar el contenido de este libro es el de tener un buen conocimiento de la interfaz de Access. Poseer nociones de programación o conocer un lenguaje de programación le ayudará a dominar el lenguaje VBA. Sin embargo, no son indispensables para sacarle partido a este libro. En una primera fase, aprenderá a transformar macros a lenguaje VBA, a emplear el entorno de desarrollo de Access, a familiarizarse con las nociones básicas del lenguaje VBA y usarlas para manipular los objetos Access (tablas, formularios, informes...), modificar las opciones Access y automatizar algunos procesos. En una segunda fase, descubrirá gradualmente cómo crear aplicaciones profesionales con Access mediante los siguientes módulos: Manejo de datos contenidos en las diferentes tablas: búsqueda de registros según criterios específicos, actualización de registros, modificación de la estructura de una tabla, etc. El uso del lenguaje SQL para traducir cualquier tipo de petición al lenguaje VBA. La interceptación de eventos de un formulario o un informe con el fin de asociarle un tratamiento personalizado en lenguaje VBA (programación orientada a eventos). El uso de herramientas de depuración para identificar y corregir los diferentes tipos de errores. La optimización de la fiabilidad del código VBA gracias a la implementación de un gestor de errores. La personalización dinámica de la presentación de los formularios e informes. La mejora de la interfaz usuario Access. La creación de una cinta Microsoft Office específicamente para su aplicación. La manipulación de aplicaciones Microsoft Office 2010 Word, Excel y Outlook, en particular mediante los ejemplos siguientes: generación de correspondencia con Word, creación de un libro Excel, visualización de los contactos Outlook. El acceso a las funcionalidades relacionadas con Internet: importar y exportar ficheros XML, y generación de ficheros HTML. El control del sistema operativo a través de llamadas a las funciones API de Windows (Application Programming Interface). Para terminar, el último capítulo del libro le guía en la creación completa de una aplicación en Access. La aplicación propuesta permite gestionar los cursos seguidos por los empleados de una empresa mediante las funcionalidades siguientes: entrada de los cursos que integran cálculos automáticos, el registro de los cursos tras el control de la coherencia de los datos introducidos, la búsqueda de los cursos según diferentes criterios e impresión de la lista de los cursos que cumplen esos criterios. Al final de este libro, estará convencido de la necesidad de utilizar el lenguaje VBA para crear aplicaciones profesionales, eficaces y amenas con Access.
Revisión de conceptos Una base Access está constituida por un único archivo con la extensión .ACCDB que contiene los distintos objetos de la aplicación. Estos objetos son:
Las tablas Contienen los datos de la base y pueden estar relacionadas entre ellas.
Las consultas Permiten efectuar: selecciones y ordenaciones en las tablas, cálculos sencillos y referencias cruzadas, acciones (agregar, eliminar, actualizar registros, crear tablas), operaciones SQL.
Los formularios Se utilizan para consultar o actualizar los datos.
Los informes Se utilizan para imprimir listados desde la simple lista de una tabla hasta informes más complejos que contengan agrupamientos de registros y cálculos.
Las macros Permiten automatizar varias tareas mediante un lenguaje particular, sin alcanzar, sin embargo, la potencia de desarrollo de VBA.
Los módulos Contienen una parte del código VBA de la aplicación, es decir, declaraciones de funciones, procedimientos, etc.
Principios fundamentales de VBA VBA presenta un entorno de programación orientado a objetos. Un objeto es una entidad autónoma que posee características (propiedades: tamaño, color, valor...) y comportamientos (métodos) que le son propios. Ciertos objetos poseen una representación visual (Formularios, Informes...), mientras que otros sólo son accesibles mediante código VBA (DBEngine, Container...). La mayoría de objetos visuales tienen la posibilidad de responder a eventos (al abrir, después de actualizar...). Mediante el código, la programación en VBA permite inducir comportamientos particulares de los objetos en función de los eventos: métodos, procedimientos y funciones. Para este fin, la escritura del código se ve facilitada ya que se basa en una concepción modular. De este modo permite una gran flexibilidad de funcionamiento y un mantenimiento más sencillo.
Estructura de un objeto
Evento
Acción del usuario o del sistema que actúa sobre un objeto y desencadena el código correspondiente.
Método
Código predefinido referido a un tipo de objeto.
Procedimiento
Secuencia de instrucciones que no devuelve ningún valor.
Función
Secuencia de instrucciones que devuelve un valor.
Conversión de macros a VBA Las macros representan una manera fácil de gestionar el encadenamiento de acciones sencillas tales como abrir y cerrar formularios. Sin embargo, VBA presenta otras ventajas: facilita el mantenimiento de las bases de datos ya que los procedimientos de evento de Visual Basic están integrados en la definición del formulario o del informe, mejora y facilita la gestión de los errores, permite llevar a cabo acciones en el sistema, autoriza la manipulación de un solo registro a la vez, acepta el paso de argumentos al código en curso de ejecución. Cualquier macro puede convertirse automáticamente en código VBA.
1. Conversión de las macros en un formulario o en un informe En el panel de exploración, haga clic con el botón secundario del ratón en el formulario o el informe y a continuación haga clic en Diseño. Bajo la pestaña DISEÑO, haga clic en el icono Convertir macros del formulario a Visual Basic oConvertir macros del informe a Visual Basic situado en la parte inferior derecha del grupoHerramientas:
Aparece entonces el siguiente cuadro de diálogo:
Si lo desea desactive las opciones que aparecen por defecto. No obstante se recomienda conservar el control de errores para la fiabilidad de la aplicación y los comentarios para simplificar la lectura del código. Haga clic en Convertir para continuar.
2. Conversión de macros globales En el panel de navegación, use el botón secundario del ratón para hacer clic en la macro y, a continuación, en Modo Diseño. Bajo la pestaña DISEÑO, haga clic en el icono Convertir macros a Visual Basic situado en la parte
inferior derecha del grupo Herramientas.
En el cuadro de diálogo Convertir macros seleccione las opciones deseadas. Haga clic en Convertir para poder continuar: la macro habrá sido convertida a código VBA en un módulo denominado Macro convertida seguido del nombre de la macro.
Seguridad de la base de datos Los parámetros de seguridad de las macros permiten controlar lo que se produce cuando se abre una base de datos de Access que contiene una macro o código VBA.
1. Modificación de los parámetros de seguridad de una base de datos Access De manera predeterminada, cuando se instala Access, se abren las bases de datos en modoDeshabilitado. Esto significa que los siguientes componentes no pueden ser ejecutados: Código VBA. Acciones no securizadas en Macros: aquéllas que permitirían a un usuario modificar el contenido de la base de datos o acceder a recursos externos a ella. Consultas: todas aquellas que permitan insertar, modificar o suprimir datos de tablas. Controles ActiveX. Si abre una base de datos Access en modo deshabilitado, el sistema le presentará una advertencia en la barra de mensajes:
Para activar de forma permanente el contenido de una base de datos haga clic en Habilitar contenido. La base de datos se convierte así en un documento aceptado; la advertencia de seguridad no se volverá a mostrar en el momento de su apertura. La aceptación de la base de datos se restringe a una localización precisa; si la mueve de lugar se mostrará de nuevo la advertencia de seguridad en el momento de su apertura.
También puede habilitar el contenido sólo para una sesión (esto es, durante el tiempo que tenga la base de datos abierta) de la siguiente manera: Cuando el sistema le muestre la advertencia de seguridad, pulse en el enlace Haga clic para obtener más detalles de la barra de mensajes o pulse en la pestaña Archivo. En la zona Advertencia de seguridad abra la lista Habilitar contenido. Seleccione Opciones avanzadas. En el cuadro de diálogo Opciones de seguridad Microsoft Office, seleccione la opción Habilitar contenido para esta sesión. De esta manera Access ocultará la advertencia de seguridad: volverá a ser mostrada la próxima vez que abra el fichero.
2. Modificación de los parámetros de seguridad por defecto También puede modificar los parámetros de seguridad por defecto de todas las bases de datos Access de la siguiente manera: Seleccione el comando Opciones en la pestaña Archivo. Seleccione la categoría Centro de confianza en el menú de la izquierda. Haga clic en el botón Configuración del centro de confianza. Seleccione la categoría Configuración de macros en el menú de la izquierda para modificar la
configuración de las macros y del código VBA. En caso de modificación de la configuración de seguridad, la nueva opción seleccionada será aplicada al conjunto de todas las bases de datos Access con excepción de la base de datos activa actualmente. Para aplicar la nueva configuración a esta base de datos deberá cerrarla y volver a abrirla. Para modificar la configuración de seguridad de los controles ActiveX seleccione Configuración ActiveX en el menú de la izquierda de la ventana Centro de confianza.
3. Descripción de las diferentes opciones de seguridad El término "macros" engloba todos los comandos macro y el código VBA. Deshabilitar todas las macros sin notificación Se deshabilitan todas las macros y todas las alertas de seguridad.
Deshabilitar todas las macros con notificación Opción predeterminada. Se deshabilitan las macros, pero aparece la alerta de seguridad.
Deshabilitar todas las macros excepto las macros firmadas digitalmente Si las macros de un archivo están firmadas digitalmente por un editor de confianza, pueden ser ejecutadas. Si el editor no es de confianza, aparece una notificación y entonces se pueden habilitar las macros firmadas o confiar en el editor. Las macros no firmadas digitalmente no podrán ser habilitadas.
Habilitar todas las macros Si se selecciona esta opción, se habilitan todas las macros. No se recomienda utilizar esta configuración de manera permanente.
Sea cual sea la opción elegida, si se instala un software antivirus que funcione con Microsoft Office System 2013, los archivos que contienen macros son analizados antes de ser abiertos.
4. Documentos confiables El término ”documento confiable” es un término genérico común al conjunto de las aplicaciones Office 2013. Un documento confiable es un archivo Microsoft Office (Base de datos Access, Hoja de cálculo Excel, Documento Word...) en el que todos los componentes inseguros (código VBA, macros, componentes ActiveX...) se habilitan en cuanto se abre el archivo. Access puede dar por válida una base de datos de diferentes maneras: Habilitando el contenido inseguro de la base de datos después de una advertencia de seguridad. Añadiendo la ubicación de la base de datos a la lista de ubicaciones de confianza. Validando al editor de la base de datos. Es posible deshabilitar cualquier documento confiable por activación del contenido de la siguiente manera: Seleccione el comando Opciones de la pestaña Archivo.
Seleccione la categoría Centro de confianza en el menú de la izquierda. Haga clic en el botón de comando Configuración del Centro de confianza. Seleccione la categoría Documentos confiables en el menú izquierdo. Marque la casilla Deshabilitar los documentos confiables. En lo concerniente a los documentos validados por otros métodos, en todo momento se puede suprimir una ubicación de confianza o un editor de confianza.
5. Ubicaciones de confianza Si lo desea, puede definir de la siguiente manera una lista de ubicaciones para las cuales todas las bases de datos Access serán consideradas ”de confianza”: Seleccione el comando Opciones de la pestaña Archivo. Seleccione la categoría Centro de confianza en el menú izquierdo. Seleccione la categoría Ubicaciones de confianza en el menú izquierdo. Haga clic en el botón Agregar una ubicación. Seleccione la ubicación deseada mediante el botón Examinar... y complete los datos requeridos en el cuadro de diálogo Ubicación de confianza de Microsoft Office.
Haga clic en el botón Aceptar: la ruta escogida será añadida a la lista de ubicaciones de confianza.
6. Editores de confianza Las aplicaciones Access desarrolladas por editores de confianza se caracterizan por los siguientes criterios: El código está firmado por el programador mediante una firma digital; La firma digital es válida; La firma digital está actualizada (no ha caducado); El certificado asociado a la firma digital fue emitido por una entidad emisora de certificados acreditada.
Para agregar un editor a la lista de Editores de confianza: Abra una base de datos Access cuyo código ha sido firmado por un editor (paquete firmado con la extensión accdc). Seleccione la opción Confiar en todo contenido del editor en el cuadro de diálogo Aviso de seguridad de Microsoft Access.
Puede ver en cualquier momento la lista de editores de confianza de la siguiente manera: Seleccione el comando Opciones de la pestaña Archivo. Seleccione la categoría Centro de confianza en el menú de la izquierda. Seleccione la categoría Editores de confianza en el menú de la izquierda. También es posible desactivar un editor de confianza haciendo clic en el botón Quitar.
Publicar una base de datos Access mediante un paquete firmado Para publicar una aplicación Access, es necesario crear un paquete y firmarlo para implementar la seguridad. Cuando los usuarios reciban el paquete, la firma garantiza que la base de datos no ha sido modificada desde la creación del paquete. La firma permite, además, comprobar la procedencia de la aplicación y confiar en el editor. La firma se aplica a todos los objetos de la base de datos, y no solamente a las macros o códigos VBA. Además, se comprime el fichero de paquete para reducir los tiempos de descarga.
1. Obtener un certificado digital Para firmar de manera digital un paquete, es necesario obtener previamente un certificado digital de una autoridad de certificación comercial como Verisign (www.verisign.com) o Thawte (www.thawte.com). La herramienta Selfcert.exe (programa entregado con Microsoft Office 2013 y ubicado en la carpeta C:\Archivos de Programas\Microsoft Office\Office 15) le permite crear un certificado digital para efectuar pruebas de paquete (no se podrá desplegar el paquete en puestos de trabajo distíntos a aquél en que ha sido creado). Para crear un certificado digital con la herramienta Selfcert.exe: Lance el programa Selfcert.exe. Introduzca el nombre de su certificación (Ej.: ENI), luego haga clic en el botón de comando Aceptar.
Puede obtener la lista de las autoridades certificadoras pulsando el enlace Haga clic aquí para obtener una lista de entidades comerciales emisoras de certificados.
2. Crear y firmar un paquete
Es posible crear un paquete firmado de la siguiente manera: Abra la base de datos en Access. Seleccione el comando Guardar como en la pestaña Archivo. Haga doble clic en Empaquetar y firmar situado debajo de Avanzadas.
Seleccione un certificado digital y luego haga clic en el botón de comando Aceptar (el botón de comando Mostrar el certificado le permite modificar las propiedades de un certificado o deshabilitarlo). En el cuadro de diálogo Crear un paquete firmado Microsoft Access, seleccione la ubicación de su paquete en la lista Guardar como y haga clic en el botón de comando Crear. A continuación Access crea un paquete firmado con la extensión accdc en la ubicación que Usted escogió.
El entorno de desarrollo IDE 1. Presentación El IDE (Integrated Development Environment) es el entorno en el que puede introducir, modificar y probar su código VBA. Este entorno también se llama VBE (Visual Basic Editor). Desde Access, se puede acceder al entorno de desarrollo IDE: Mediante la combinación [Ctrl][F11].
Haciendo clic en el icono
debajo de la pestaña Herramientas de base de datos.
Seleccionando un procedimiento de evento desde una hoja de propiedades en un formulario o un informe. El IDE pone a su disposición una gran cantidad de herramientas que facilitan la programación y la puesta a punto de su código VBA: herramientas de depuración, lista de miembros automática, examinador de objetos...
2. Ventanas del entorno IDE
Se pueden mostrar todas las ventanas del entorno IDE a partir del menú Ver.
La barra de herramientas Estándar (1)
1 Ver Microsoft Access
11 Interrumpir
2 Agregar un módulo, un módulo de clase o un procedimiento (Función o Sub)
12 Restablecer
3 Guardar
13 Vista Diseño
4 Cortar
14 Explorador de proyectos
5 Copiar
15 Ventana de Propiedades
6 Pegar
16 Examinador de objetos
7 Buscar
17 Cuadro de herramientas
8 Deshacer
18 Ayuda de Microsoft Visual Basic
9 Rehacer
19 Posición en la ventana de Código
10 Ejecutar
El explorador de proyectos (2) Todos los módulos de la base de datos o del proyecto VBA aparecen en el explorador de proyectos mediante una estructura de árbol. Están agrupados en tres conjuntos: los módulos de formulario o de informe, los módulos estándar, los módulos de clase independientes.
La ventana Propiedades (3) Permite mostrar las propiedades de los distintos módulos. Para mostrar las propiedades de un formulario o de un informe, éste debe estar abierto en Access; si no fuese el caso, seleccione el formulario o el informe en el explorador de proyectos y escoja la opción Objeto del menú Ver.
La ventana Código (4) En esta ventana se encuentran dos cuadros de lista desplegable: el cuadro objeto (10) muestra la lista de objetos del módulo, el cuadro procedimiento (11) muestra los procedimientos o los eventos del objeto seleccionado en el cuadro objeto. Los eventos ya utilizados aparecen en negrita.
Lista de miembros automática (5) La lista de miembros automática (llamada también IntelliSense) muestra una lista que contiene información que completaría de forma lógica la instrucción en el punto actual de inserción. Por ejemplo, la lista desplegable de los métodos y las propiedades disponibles para un objeto se muestra automáticamente cuando se teclea el nombre de un objeto seguido de un punto. Si esta lista no está activada, seleccione Opciones en el menú Herramientas y active la casilla Lista de miembros automática de la ficha Editor.
La ventana Inmediato (6) Permite mostrar los valores de las variables, modificarlos y ejecutar instrucciones. Las ventanas Inmediato, Locales e Inspecciones se utilizan durante la depuración de la aplicación.
La ventana Locales (7) Contiene todos los valores de las variables del procedimiento actual.
La ventana Inspecciones (8) Muestra los valores de las variables que han sido definidas como variables de inspección.
El Examinador de objetos (9) Permite visualizar las propiedades, métodos y constantes de cada objeto.
Configuración del editor VBA 1. Configuración de los colores del editor Las palabras clave, las funciones y las instrucciones VBA aparecen en azul, los objetos, métodos y propiedades en negro y los comentarios en verde. Las instrucciones que contienen errores se resaltan enrojo. Puede cambiar el estilo (colores, fuente, tamaño) de las distintas partes del código. Para ello, seleccioneOpciones en el menú Herramientas y haga clic en la ficha Formato del editor.
2. Configuración de la presentación del código Distintas herramientas, como la comprobación de sintaxis automática, la declaración obligatoria de variables, la lista de miembros automática... facilitan la introducción y la puesta a punto del código VBA. Para activar dichas herramientas, seleccione Opciones en el menú Herramientas y haga clic en la fichaEditor.
Referencia a los objetos Para poder utilizar un objeto de acceso a datos, un objeto de automatización, o un control ActiveX específico, debe referenciar la biblioteca de objeto correspondiente. Una biblioteca de objetos es generalmente un archivo DLL u OCX que contiene el código del objeto. Para activar una referencia a una biblioteca, seleccione la opción Referencias en el menú Herramientas.
Puede buscar otras referencias haciendo clic en el botón Examinar.
Creación de un procedimiento en VBA Esta sección le guiará paso a paso en la creación de un primer procedimiento en VBA. Este procedimiento solicita al usuario la introducción de una fecha en formato corto (18/06/10), verifica la fecha y la presenta en formato largo (viernes 18 junio 2010).
Etapa 1: creación de un módulo nuevo Desde el entorno VBA: Seleccione la opción Módulo del menú Insertar o Desde la ventana Explorador de proyectos, haga clic con el botón secundario del ratón y seleccioneInsertar y luego Módulo desde el menú contextual. Desde Access: Active la pestaña CREAR de la cinta. Haga clic en el icono Módulo del grupo Macros y código.
Etapa 2: asignación de un nombre a un módulo De manera predeterminada, el módulo creado se llama Módulo1 (o Módulo seguido del primer número disponible si ya han sido creados otros módulos y no han sido renombrados). Para modificar el nombre del módulo: Seleccione el módulo en la ventana Explorador de proyectos. En la ventana Propiedades (haga clic en [F4] si no se ve la ventana Propiedades), modifique el valor de la propiedad (Name).
Etapa 3: creación de un procedimiento Haga doble clic en el módulo para ver la ventana de VBA asociada. Introduzca el código siguiente en la ventana VBA:
Haga clic en el icono
de la barra de herramientas Estándar para grabar el procedimiento.
Etapa 4: prueba del procedimiento Para ejecutar el código del procedimiento: Sitúe el cursor del ratón sobre el código del procedimiento introducido. Haga clic en el icono
de la barra de herramientas Estándar o utilice la tecla [F5].
Introduzca una fecha en el cuadro de diálogo mostrado y haga clic en el botón Aceptar:
Aparece entonces el siguiente mensaje:
Haga clic en el botón Aceptar. Como el día de la semana es lunes, aparece el siguiente mensaje:
Consejos Para optimizar el rendimiento de VBA, ciertas técnicas pueden contribuir a acelerar la velocidad de ejecución de su código. Las variables deben declararse siempre. El tipo de las variables debe ser lo más específico posible. Para referenciar las propiedades, controles y objetos de acceso a datos, se aconseja hacer uso de variables. La palabra reservada Me debe utilizarse para hacer referencia al formulario o al informe en el interior de un procedimiento de evento. La utilización de constantes está recomendada siempre que sea posible. Los módulos deben estar organizados para no sobrecargar la memoria. Un módulo se carga en memoria solamente si uno de sus procedimientos es invocado por otro código. El código debe compilarse regularmente.
Los módulos Distinguimos tres tipos de módulos: los módulos Microsoft Access Objetos de clase, los módulos estándar, los módulos de clase independientes. La lista de todos estos módulos aparece de manera jerárquica en el explorador de proyectos de la interfaz VBA.
Si el explorador de proyectos no aparece en pantalla, seleccione la opción Explorador de proyectosdel menú Ver o utilice el método abreviado [Ctrl] R.
Los módulos Microsoft Access Objetos de clase contienen los procedimientos de evento asociados a los formularios y a los informes. Los módulos estándar (o módulos) se componen de uno o varios procedimientos que pueden invocarse en distintas circunstancias desde los diferentes módulos. Sólo los módulos estándar aparecen en la lista de módulos del panel Examinador de objetos.
Se recomienda agrupar en uno o varios módulos los procedimientos de "utilidades" que pueden ser utilizados por distintas aplicaciones (ej: operaciones con fechas). Estos módulos podrán después exportarse a otras bases Access mediante la opción Exportar del menú Archivo.
Los módulos de clase independientes se utilizan durante la creación de clases de objetos. La programación mediante objetos se detallará en el capítulo Objetos y colecciones. Los elementos del lenguaje Visual Basic descritos en este capítulo pueden utilizarse en los distintos módulos.
Los procedimientos Los procedimientos son subprogramas que permiten descomponer una tarea de programación compleja en un conjunto de tareas más pequeñas y más simples. Permiten organizar el código en el interior de los módulos para obtener un código más fácil de mantener y fácilmente reutilizable. En VBA Access, existen tres tipos de procedimientos: los procedimientos Sub (de subrutina) llamados subprogramas, los procedimientos Function llamados funciones, los procedimientos Property llamados procedimientos de propiedad. En este capítulo utilizaremos solamente los procedimientos Sub y Function que son los más habituales (los procedimientos de propiedad se presentarán en el capítulo Objetos y colecciones). Existen puntos comunes entre estos dos procedimientos: contienen instrucciones y/o métodos VBA, aceptan argumentos, pueden llamarse desde otras funciones o procedimientos Sub. Ciertas características son específicas de las funciones: pueden devolver valores, pueden invocarse desde una macro.
1. Los procedimientos Sub Existen dos tipos de procedimientos Sub: los procedimientos Sub generales los procedimientos Sub de evento. Un procedimiento Sub general es un procedimiento declarado en un módulo estándar o, a nivel general, en un módulo de formulario o de informe. La llamada de un procedimiento de este tipo está definida explícitamente en el código del programa. Ejemplo Este procedimiento general solicita al usuario que confirme su deseo de abandonar la aplicación y abandona Access si el usuario responde Sí. Private Sub Salir_Apli() If Msgbox ("¿Desea abandonar la aplicación?", _ VbQuestion + VbYesNo) = vbYes Then Quit End If End Sub Este código puede llamarse desde cualquier botón de comando u opción de menú que permita abandonar la aplicación.
Un procedimiento Sub de evento es un procedimiento asociado a un evento de un objeto. De hecho, su nombre se compone del nombre del objeto activado seguido de un carácter de subrayado (_) y del nombre del evento. La llamada a un procedimiento de este tipo es implícita, es decir, el procedimiento sólo se
ejecuta cuando tiene lugar el evento al que está asociado. Ejemplo Este procedimiento de evento permite mostrar el formulario "Empleados" cuando el usuario hace clic sobre un botón de comando cmdEmpleados. Private Sub cmdEmpleados_Click() Docmd.OpenForm "Empleados" End Sub Ciertos procedimientos Sub de evento pueden generarse automáticamente mediante asistentes (ej: asistente para botones de comando).
2. Los procedimientos Function Los procedimientos Function, llamados habitualmente funciones, devuelven un valor, como por ejemplo el resultado de un cálculo. El valor devuelto debe llevar el nombre de la función. Son los únicos procedimientos que pueden llamarse desde una macro.
El lenguaje Visual Basic contiene numerosas funciones integradas, como las funciones de fecha (day, week, year, format...). Además de estas funciones integradas, usted puede crear sus propias funciones personalizadas. Ejemplo Esta función solicita al usuario que confirme su deseo de abandonar la aplicación y devuelve True si el usuario responde Sí y False en caso contrario. Function Salir_Apli() As Boolean If MsgBox("¿Desea abandonar la aplicación?", _ vbQuestion + vbYesNo) = vbYes Then Salir_Apli = True Else Salir_Apli = False End If End Function
3. Declaración de los procedimientos Sintaxis de un procedimiento Sub [Private | Public | Friend] [Static] Sub NomProc ([lista de argumentos])] <Secuencia de instrucciones> End Sub Sintaxis de un procedimiento Function [Private | Public | Friend] [Static] Function NomProc ([lista de argumentos]) [As Type]] <Secuencia de instrucciones> End Function Para crear un procedimiento Sub o Function debe respetar las etapas siguientes: especifique el alcance del procedimiento,
declare el procedimiento en función de su tipo con la palabra clave Sub o Function, seguida del nombre del procedimiento, defina los argumentos que desea pasar como parámetros al procedimiento, indicándolos entre paréntesis después del nombre del procedimiento, si se trata de una función, especifique eventualmente el tipo del valor devuelto después de la palabra clave As, escriba el código que permite efectuar la operación deseada. Utilice eventualmente Exit Sub o Exit Function para salir del procedimiento. Si se trata de una función, asigne el resultado al nombre de dicha función, termine el procedimiento mediante End Sub o End Function.
4. Alcance de los procedimientos El alcance de un procedimiento define su ámbito de utilización. Un procedimiento público (declarado mediante la palabra clave Public) puede ser llamado desde cualquier módulo, cualquier procedimiento de evento o desde cualquier macro de la base de datos. Un procedimiento privado (declarado mediante la palabra clave Private) sólo puede ser llamado desde un procedimiento del interior del mismo módulo. El procedimiento Friend se utiliza solamente en los módulos de clase. La palabra clave Static indica que las variables locales del procedimiento se preservan entre las llamadas. En ausencia de modificadores Public, Private o Friend, los procedimientos son públicos por defecto.
5. Argumentos de los procedimientos Los argumentos se utilizan para pasar parámetros a los procedimientos en forma de datos. El número de argumentos puede variar de 0 a varios. Para declarar un argumento, basta simplemente con especificar su nombre. Sin embargo, la sintaxis completa para declarar un argumento es la siguiente: [Optional] [ByVal | Byref] [ParamArray] [As type]
Optional: indica que el argumento es facultativo. Todos los argumentos facultativos deben estar situados al final de la lista de argumentos y ser de tipo variant.
Byval: indica que el argumento se pasa por valor. El procedimiento accede a una copia de la variable; el valor inicial de ésta no será modificado por el procedimiento.
Byref (opción predeterminada): indica que el argumento se pasa por referencia. El procedimiento puede así acceder a la variable propiamente dicha, por lo que el valor real de ésta podrá ser directamente modificado por el procedimiento.
ParamArray: utilizado solamente por el último argumento de la lista, indica que éste es una matriz opcional de elementos de tipo Variant. No puede utilizarse con las palabras clave ByVal, ByRef uOptional.
Variable: especifica el nombre del argumento. Para las variables de tipo matriz, no es necesario especificar las dimensiones.
Type: especifica el tipo de datos del argumento pasado al procedimiento (Byte, Boolean, Integer, Long...).
6. Los argumentos con nombre
El paso de argumentos a un procedimiento teniendo en cuenta su orden de aparición a menudo es difícil de llevar a la práctica, especialmente cuando algunos parámetros son opcionales. Además, la legibilidad de las llamadas a procedimientos que comportan varios parámetros no siempre es evidente. Los argumentos con nombre facilitan el paso de los argumentos y presentan las ventajas siguientes: el orden de los argumentos es irrelevante y se pueden omitir los argumentos opcionales.
La sintaxis de los argumentos con nombre es: NombreArgumento := Valor Ejemplo If MsgBox("¿Desea abandonar la aplicación?", _ vbYesNo + vbQuestion, "Gestión de las ventas") = vbYes Then Application.Quit End If puede transformarse en: If MsgBox(Prompt:="¿Desea abandonar la aplicación?", _ Buttons:=vbYesNo + vbQuestion, _ Title:="Gestión de las ventas") = vbYes Then Application.Quit End If También puede modificarse el orden de los parámetros: If MsgBox(Prompt:="¿Desea abandonar la aplicación?", _ Title:="Gestión de las ventas", _ Buttons:=vbYesNo +vbQuestion) = vbYes Then Application.Quit End If
7. Llamada a un procedimiento Sintaxis [Call] NomProc [lista de argumentos] Si se indica la palabra clave Call, debe situar la lista de argumentos entre paréntesis. Para almacenar el resultado de una función en una variable, utilice la sintaxis siguiente: = NomProc ( [lista de argumentos] )
8. Ejemplos de procedimientos Cuando el usuario hace clic en el botón de comando cmdCalculo del formulario de entrada de una factura, el importe del descuento debe calcularse del modo siguiente: 5% del importe de la factura si ésta es superior o igual a 100000, 2% del importe de la factura si ésta está comprendida entre 20000 y 100000, 0 si el importe de la factura es inferior a 20000.
Procedimiento de evento
Private Sub cmdCalculo_Click() tasImpDes = Descuento (tasImpFact) End Sub Se invoca la función Descuento, con el importe de la factura (contenido en el cuadro de texto tasImpFact del formulario) como argumento. El descuento calculado se mostrará en el cuadro de texto tasImpDes.
Función Function Descuento(curImporte as Currency) as Currency Const Tasa1 = 0.05 Const Tasa2 = 0.02 ’ Cálculo de un descuento If curImporte >= 100000 then Descuento = curImporte * Tasa1 Else If curImporte >= 20000 then Descuento = curImporte * Tasa2 End If End If End Function Si el importe de la factura es inferior a 20000, Descuento conserva su valor inicial, o sea cero.
9. La función MsgBox Esta función muestra un mensaje en un cuadro de diálogo, acompañado eventualmente por un icono y por uno a tres botones. Sintaxis de la instrucción Utilizada cuando sólo hay un botón. MsgBox <mensaje> [, [][, ]] Sintaxis de la función Utilizada cuando hay más de un botón. Permite saber qué botón ha sido activado gracias a su valor de retorno. MsgBox (<mensaje> , [][, ] [,helpfile, context])
mensaje: Texto del mensaje en el cuadro de diálogo. botones: expresión numérica que representa la suma de los valores que especifican los botones que deben
mostrarse, el estilo de icono que se va a utilizar, la identidad del botón predeterminado, así como la modalidad del cuadro de mensajes.
título: texto en la barra de título. helpfile: archivo de ayuda que debe emplearse. Context: tema de la ayuda correspondiente. Valores del argumento Botones Constante simbólica
Valor
Significado
Número y tipo de botones vbOKOnly
0
Muestra solamente el botón Aceptar.
vbOKCancel
1
Muestra los botones Aceptar y Cancelar.
vbAbortRetryIgnore
2
Muestra los botones Anular, Reintentar eIgnorar.
vbYesNoCancel
3
Muestra los botones Sí, No y Cancelar.
vbYesNo
4
Muestra los botones Sí y No.
vbRetryCancel
5
Muestra los botones Reintentar y Cancelar.
vbMsgBoxHelpButton
16384
Muestra un botón de ayuda.
Tipo de icono vbCritical
16
vbQuestion
32
vbExclamation
48
vbInformation
64
Muestra el icono
Muestra el icono
Muestra el icono
Muestra el icono
Botón predeterminado vbDefaultButton1
0
Primer botón.
vbDefaultButton2
256
Segundo botón.
vbDefaultButton3
512
Tercer botón.
vbDefaultButton4
768
Cuarto botón. Modalidad
vbApplicationModal
vbSystemModal
0
Aplicación modal. El usuario debe responder al mensaje mostrado en el cuadro de mensaje antes de poder continuar trabajando en la aplicación actual.
4 096
Sistema modal. Todas las aplicaciones se interrumpen hasta que el usuario responda al mensaje mostrado en el cuadro de mensaje.
Presentación vbMsgBoxHelpButton
16384
Agregar el botón "Ayuda" al cuadro de mensaje.
vbMsgBoxSetForeground
65536
Muestra la ventana de mensaje en primer plano.
vbMsgBoxRight vbMsgBoxRtlReading
524288 1048576
Alinea el texto a la derecha. Define un orden de lectura de derecha a izquierda para los sistemas hebreo y árabe.
Los valores de retorno están igualmente definidos por constantes:
Constante
Valor de retorno
Botón seleccionado
vbOK
1
Aceptar
vbCancel
2
Cancelar
vbAbort
3
Anular
vbRetry
4
Reintentar
vbIgnore
5
Ignorar
vbYes
6
Sí
vbNo
7
No
Ejemplos: utilización de la función MsgBox Dim lngRep As Long lngRep = MsgBox ("¿Desea confirmar?", 292, "Confirmación") El valor 292 corresponde a la suma de los valores de los constantes vbYesNo (4), vbQuestion (32) y vbDefaultButton2 (256). o Dim strRep As Long strRep = MsgBox ("¿Desea confirmar?", vbYesNo + vbQuestion_ + vbDefaultButton2, "Confirmación")
Utilización de la instrucción MsgBox MsgBox "Resultado falso",vbCritical,"Error"
1. Los tipos de variables Las variables permiten almacenar valores intermedios en cualquier momento de la ejecución del código VBA con el fin de utilizarlas posteriormente para realizar cálculos, comparaciones, pruebas... Las variables se identifican con un nombre que permite referenciar el valor que éstas contienen y un tipo que determina la naturaleza de los datos que pueden almacenar.
Numéricas Tipo
Rango
Tamaño en bytes
Byte
0 a 255
1
Integer (entero)
32 738 a 32 767
2
Long (entero largo)
2 147 483 648 a 2 147 483 647
4
Single (real simple con coma flotante)
3,402823E38 a 1,401298E45 (valores negativos) 1,401298E45 a 3,402823E38 (valores positivos)
4
Double (real doble con coma flotante)
1,79769313486231E308 a 4,94065645841247E 324 (valores negativos) 4,94065645841247E324 a 1,79769313486231E308 (valores positivos)
+/79 228 162 514 264 337 593 543950 335 sin separador decimal; +/7,9228162514264337593543950335 con 28 cifras a la derecha del separador decimal; el número más pequeño distinto de cero es +/ 0.0000000000000000000000000001
12
Cadenas de caracteres El tipo es String. Existen dos tipos de cadenas: las cadenas de longitud variable pueden contener aproximadamente dos mil millones (2 31) de caracteres. las cadenas de longitud fija pueden contener de 1 a aproximadamente 64000 (2 16) caracteres. Ejemplo ’Cadena de longitud variable Dim Dirección As String ’Cadena de longitud fija (20 caracteres) Dim Apellido As String * 20
Boleana El tipo es Boolean. La variable puede tomar el valor True (Verdadero) o False (Falso) que es el valor predeterminado. Ocupa dos bytes.
Fecha
El tipo es Date. La variable puede tomar los valores de fecha y de hora desde el 1 de enero de 100 al 31 de diciembre de 9999. Ocupa ocho bytes.
Variant El tipo es Variant. La variable permite almacenar valores de datos de todo tipo: fecha, números de coma flotante, cadenas de caracteres, referencias a objetos... Ocupa dieciséis bytes, más un byte por carácter si el valor es una cadena.
Objeto El tipo es Object. La variable permite almacenar la referencia a un objeto en forma de dirección de cuatro bytes. Es un tipo genérico, pero para obtener mayor rendimiento es aconsejable utilizar el nombre del objeto tal y como está definido en el cuadro Clases del examinador de objetos. Ejemplo Apertura de una base de datos Access utilizando el tipo genérico Object o a partir del objeto Database. Dim dbsEmp As Object Dim dbsArt As Database Set dbsEmp = OpenDatabase("C:\Aplicación\" _ & "Empleados.accdb") Set dbsArt = OpenDatabase("C:\Aplicación\" _ & "Artículos.accdb")
Definido por el usuario Este tipo se utiliza sobre todo para la declaración de variables que contienen varios tipos de información. La definición del tipo sólo puede realizarse en la sección de declaración de un módulo. Ejemplos Declaración de un nuevo tipo Empleados: Public Type Empleados strRegistro As String * 5 strNombre As String * 30 intEdad As Integer strServicio As String * 20 End Type Utilización del tipo Empleados: Dim NewEmpleado As Empleados NewEmpleado.strRegistro = "A1290" ...
2. Las declaraciones de variables Existen dos maneras de declarar variables: de forma implícita o explícita.
Declaración implícita Cuando VBA encuentra una variable que no forma parte de una declaración explícita, la declara de forma implícita otorgándole un tipo Variant. El tipo Variant permite almacenar sucesivamente en la misma variable valores de tipo distinto. El tipo de la variable evoluciona en función del valor que se le asigna.
Private Sub Asignación() Dim var As variant ’ El tipo de la variable se convierte en String var = "Buenos días" MsgBox var & " es de tipo : " & TypeName(var) ’ El tipo de la variable se convierte en Integer var = 12 MsgBox var & " es de tipo : " & TypeName(var) ’ El tipo de la variable se convierte en Double var = 6.55957 MsgBox var & " es de tipo : " & TypeName(var) ’ El tipo de la variable se convierte en Boolean var = True MsgBox var & " es de tipo : " & TypeName(var) End Sub
Declaración explícita La variable se declara antes de su utilización. Es posible imponer la declaración explícita utilizando la instrucción Option Explicit en la sección de declaración de cada módulo. Para que esta instrucción esté definida por defecto en VBA, active la opciónRequerir declaración de variables del menú Herramientas Opciones ficha Editor. Las declaraciones explícitas de variables pueden hacerse en la sección de declaraciones de los módulos o en el cuerpo de un procedimiento o de una función. La declaración se realiza mediante una de las cuatro instrucciones siguientes, utilizando la misma sintaxis: en un procedimiento, una función o un módulo: Dim [As Type] Static [As Type] en un módulo: Private [As Type] Public [As Type] Cada vez que se ejecuta la instrucción Dim, se reinicializa la variable (0 para numérica, vacía para String,Empty para Variant). Si es necesario conservar el valor anterior, se deberá utilizar Static en lugar deDim. Si no se especifica ningún tipo (ej: dim var), se asigna a la variable el tipo por defecto Variant.
3. El alcance de las variables Une variable es local para una función o un procedimiento, si se declara en el cuerpo de la función o del procedimiento con Dim o Static. Esta variable es desconocida (visible) fuera de la función o del procedimiento. Una variable puede ser visible para todos los procedimientos o funciones de un módulo (estándar, de clase, formulario o informe), si está declarada en la sección de declaración del módulo mediante Private (oDim). Una variable es pública para toda la aplicación (es decir visible desde cualquier punto de la aplicación), si está declarada en la sección de declaración de un módulo con la instrucción Public.
Para referenciar, a partir de un módulo, una variable pública que se encuentre en otro módulo de formulario o de informe, es conveniente utilizar la sintaxis siguiente:
Forms!. Reports!.
4. Las matrices Una matriz se declara del mismo instrucciones Dim, Static, Private oPublic.
modo
que
las
variables,
mediante
Una matriz es una variable que contiene diversos compartimentos que permiten almacenar el mismo número de valores. Contrariamente, una variable clásica designa un compartimento destinado a un solo valor. Se puede referenciar a la matriz de forma global o acceder individualmente a sus elementos mediante la utilización de índices. Cualquiera que sea el tipo de los elementos, una matriz requiere 20 bytes de memoria, a los que se añaden cuatro bytes para cada dimensión y el número de bytes ocupados por los datos. Si no se especifica el tipo de datos, los elementos de la matriz declarada toman el tipo Variant. A la primera posición de una matriz se le asigna el índice 0 por defecto. Sin embargo, es posible convertir este valor predeterminado a 1 utilizando, en la sección de declaración, la instrucción Option Base 1. La utilización de una cláusula To permite también definir explícitamente los índices de inicio y fin. Ejemplo Declaración de distintas matrices: ’ 12 elementos indexados de 0 a 11 Dim sngDescuento (11) As Single ’ 12 elementos indexados de 1 a 12 Dim sngGastos (1 To 12) As Single ’ 2 dimensiones: la primera indexada de 0 a 10 y ’ la segunda de 1 a 15 Dim strTren (10,1 To 15) As String
Option Base 1 ’ 12 elementos indexados de 1 a 12 Dim varGastos (12) Utilización de una matriz de dos dimensiones. El ejemplo siguiente permite crear una tabla de multiplicación: cada elemento de la matriz Multiplica es igual al resultado de la multiplicación de sus índices. Todas las líneas de la tabla se muestran en la ventanaInmediato (método Print del objeto Debug). Sub Ver_Tabla() Dim intMultiplica(1 To 10, 1 To 10) As Integer Dim i, j As Integer Dim strResult As String ’ 1ª línea de la tabla de multiplicar strResult = " " For i = 1 To 10 strResult = strResult & " " & Format(i, "00") & " " Next i
Debug.Print strResult ’ Inicia la matriz For i = 1 To 10 strResult = Format(i, "00") For j = 1 To 10 intMultiplica(i, j) = i * j strResult = strResult & " " & Format(intMultiplica(i, j), "000") Next j Debug.Print strResult Next i ’ Devuelve el resultado de 4 * 7 MsgBox "4 * 7 = " & intMultiplica(4, 7) ’ Devuelve el resultado de 8 * 6 MsgBox "8 * 6 = " & intMultiplica(8, 6) End Sub Resultado en la ventana Inmediato.
Las matrices dinámicas Se trata de matrices cuyas dimensiones se definen durante la ejecución. Permiten optimizar el espacio ocupado en memoria. Declaración: Dim varMatriz () Utilización: Antes de utilizarla, es necesario dimensionarla por medio de la instrucción Redim: ReDim varMatriz (15 To 50) Es posible utilizar la instrucción ReDim para modificar la matriz dinámica tantas veces como sea necesario. Por defecto, los valores presentados en la matriz se destruyen. La instrucción ReDim Preserve permite extender una matriz conservando los valores existentes. ReDim Preserve varMatriz (15 To 70)
5. Las constantes
Una constante representa un valor numérico o de tipo cadena de caracteres que no debe ser modificado. La instrucción Const permite declarar una constante y definir su valor como fijo. Una vez declarada, la constante no puede modificarse ni recibir un nuevo valor. La declaración de una constante se efectúa dentro de un procedimiento o en la sección de declaración de un módulo. Las constantes de nivel módulo son privadas por defecto. Para declarar una constante a nivel de módulo como pública, es necesario hacer preceder la instrucciónConst con la palabra clave Public. Ejemplo acForm vbCurrency
Las constantes intrínsecas Las constantes intrínsecas son constantes puestas a disposición por las propias aplicaciones. De este modo, Access posee sus propias constantes intrínsecas que son visibles desde el examinador de objetos. Una constante intrínseca puede ser utilizada en una macro o dentro del código Visual Basic. Las constantes intrínsecas se caracterizan por un prefijo de dos letras que identifica la biblioteca de objetos donde está definida la constante. Prefijo de las constantes Biblioteca
Prefijo
Ejemplos
Microsoft Access
ac
acForm, acNormal
Visual Basic
vb
vbCurrency, vbYellow
Microsoft Office
mso
msoSortByFileName
Las constantes de la biblioteca Visual Basic se describen en el anexo Constantes VBA del presente manual. Para utilizar las constantes de Microsoft Office 2013 deberá seleccionar la referencia "Microsoft Office 15.0 Object Library" (opción Referencias del menú Herramientas).
Existen varias categorías de constantes intrínsecas (constantes de acción, constantes de procedimientos de eventos, etc.).
Ejemplo El siguiente ejemplo muestra cómo visualizar y personalizar un formulario. El ejemplo utiliza las constantes strNomAppli y strNomSoc declaradas en el código y varias constantes intrínsecas.
Resultado en Access: visualización del formulario personalizado Empleado.
Las estructuras de decisión A menudo es necesario evaluar condiciones específicas antes de ejecutar instrucciones. Las estructuras de decisión, llamadas también alternativas o de bifurcación condicional, permiten, al finalizar una evaluación, optar por un bloque de código u otro. Distinguimos dos tipos de instrucciones de bifurcación condicional: If ... Then ... Else Select ... Case La función IIf también puede emplearse para definir un valor en función de una condición.
1. La instrucción IF If Permite ejecutar instrucciones en función del resultado de una condición. Las instrucciones If...Then...Else pueden anidarse en tantos niveles como sea necesario. La sintaxis de múltiples líneas, con una indentación apropiada, presenta la ventaja de una mayor legibilidad.
Sintaxis 1 (línea única) If Then [Else ]
puede estar compuesta de varias instrucciones separadas por el carácter (:). Sintaxis 2 (múltiples líneas) If Then <secuencia de instrucciones 1> [ElseIf Then <secuencia de instrucciones 2>] [Else <secuencia de instrucciones 3>] End If Otra posibilidad If Then <secuencia de instrucciones 1> [Else If Then <secuencia de instrucciones 2> [Else <secuencia de instrucciones 3>] End If] End If Ejemplo El siguiente código permite comparar el contenido de dos cajas de texto en un formulario. If txtImp1> txtImp2 Then MsgBox ”El mayor valor es: " & txtImp1
Else If txtImp1= txtImp2 Then MsgBox ”Los dos valores son iguales” Else MsgBox ”El mayor valor es: " & txtImp2 End if End If
2. La instrucción Select Case Select Case Ejecuta secuencias de instrucciones específicas en función del valor de una expresión. La instrucción Select Case permite reemplazar el ElseIf dentro de instrucciones If...Then...Else al realizar la comparación entre una misma expresión y varios valores. Sintaxis Select Case <expresión de evaluación> [Case <lista de expresiones 1> <secuencia de instrucciones 1>] [Case <lista de expresiones 2> <secuencia de instrucciones 2>] [Case Else <secuencia de instrucciones 3>] End Select
<lista de expresiones> puede tomar las formas siguientes: valor (ej: Case 10) lista de valores (ej: Case 1, 5, 10) rango de valores (ej: Case 1 To 5 ) expresión condicional (ej: Case Is>= 5) Ejemplo Muestra un comentario sobre la temperatura. Dim intTemperatura As Integer intTemperatura = InputBox ("Introducir una temperatura") Select Case intTemperatura Case 0 MsgBox "Hielo" Case 1 To 10 MsgBox "Frío" Case 11 To 16 MsgBox "Fresco" Case 17, 18, 19 MsgBox "Temperatura interior" _ & "de una casa en invierno" Case 20 To 25 MsgBox "Agradable" Case Is > 25 MsgBox "Caliente" Case Else MsgBox "Temperatura no referenciada" End Select
3. La función IIf IIf
Devuelve un valor en función de una condición. Sintaxis IIf (, , ) Ejemplo Dim bln As Boolean bln = IIf(A = B, True, False) Es posible anidar varias llamadas de función IIf. Ejemplo Dim IntI As Integer IntI = IIf(A = B, IIf(B = C, 1, 0), 0)
Las estructuras en bucle Las estructuras en bucle (o iterativas) permiten repetir la ejecución de un conjunto de instrucciones. Distinguimos varios tipos de estructuras en bucle: Do...Loop While...Wend For...Next For Each...Next Do...Loop y While...Wend repiten una operación hasta que se cumpla una cierta condición. For...Next efectúa determinada operación un número de veces especificado en función de un contador. For Each...Next permite recorrer los elementos de una colección.
1. La instrucción Do...Loop Do...Loop Ejecuta una secuencia de instrucciones mientras que (While) o hasta que (Until) la condición especificada se cumpla. Sintaxis 1 Secuencia de instrucciones eventualmente no ejecutada (condición evaluada antes de la secuencia). Do [{While | Until} ] <secuencia de instrucciones> [Exit Do] [<secuencia de instrucciones>] Loop Sintaxis 2 Secuencia de instrucciones ejecutada al menos una vez (condición evaluada después de la secuencia). Do <secuencia de instrucciones> [Exit Do] [<secuencia de instrucciones>] Loop [{While | Until} ] Exit Do se utiliza a menudo después de la evaluación de una condición interna del bucle y permite abandonar el bucle sin que la condición de control se verifique.
Ejemplo Calcula y muestra el importe anual de gastos en función de una matriz (GastosMensuales) de doce posiciones cargadas con anterioridad. Dim intCont As Integer Dim curGastosAnuales As Currency curGastosAnuales = 0
2. La instrucción While...Wend While...Wend Ejecuta una secuencia de instrucciones mientras la condición especificada se cumpla. Sintaxis While <secuencia de instrucciones> Wend Ejemplo Calcula y muestra el importe de gastos anuales en función de una matriz (GastosMensuales) de doce posiciones cargadas con anterioridad. Dim intCont As Integer Dim curGastosAnuales As Currency curGastosAnuales = 0 intCont = 1 While intCont <= 12 curGastosAnuales = curGastosAnuales + curGastosMensuales (intCont) intCont = intCont + 1 Wend MsgBox "Los Gastos Anuales son: " & curGastosAnuales
3. La instrucción For...Next For...Next Permite repetir la ejecución de una secuencia de instrucciones en función de un contador. Sintaxis For = To [Step ] <secuencia de instrucciones> [Exit For] <secuencia de instrucciones> Next [ [,] [, ...]] Exit For, situada a menudo después de la evaluación de una condición, permite salir del bucle antes de que el contador alcance su valor final.
Ejemplo Calcula y muestra el importe de los gastos anuales en función de una matriz (GastosMensuales) de doce posiciones cargadas anteriormente. Dim intCont As Integer Dim curGastosAnuales As Currency
curGastosAnuales = 0 For intCont = 1 To 12 curGastosAnuales = curGastosAnuales + curGastosMensuales (intCont) Next MsgBox "Los Gastos Anuales son: " & curGastosAnuales La palabra clave Step permite incrementar o disminuir la variable contador en el valor especificado. Ejemplo La variable contador j se incrementa en 5 a cada iteración. Al final del bucle el total corresponde a la suma de 5, 10, 15, y 20. Dim j As Integer Dim intTotal As Integer intTotal = 0 For j = 5 To 20 Step 5 intTotal = intTotal + j Next j MsgBox "El total es " & intTotal
4. La instrucción For Each...Next For Each ... Next Permite recorrer todos los elementos de una matriz o de una colección. Sintaxis For Each <elemento> In <matriz>/ <secuencia de instrucciones> [Exit For] <secuencia de instrucciones> Next [elemento] Ejemplo Muestra los gastos de cada mes (ver ejemplo For Next): Dim curGastos As Currency For Each curGastos In curGastosMensuales MsgBox curGastos Next
Los operadores Los operadores permiten efectuar operaciones aritméticas sobre variables y/o constantes, comparar variables entre sí, evaluar varias condiciones... Distinguimos varias categorías de operadores: los operadores aritméticos, los operadores de comparación, los operadores lógicos, el operador de concatenación. El operador de asignación es el signo de igualdad. El valor de la expresión situada a la derecha del signo igual es asignado a la variable situada a la izquierda de dicho signo (ejemplo: IntA = 12, 12 se asigna a la variable IntA, IntA = IntB*12, el valor de IntB multiplicado por 12 se asigna a IntA).
1. Los operadores aritméticos Permiten efectuar cálculos aritméticos a partir de variables y/o constantes numéricas. Operador
Cálculo realizado
+
Suma.
Resta.
/
División con resultado de un número con coma flotante.
Mod
Resto de la división de dos números.
\
División con resultado de un número entero.
*
Multiplicación.
ˆ
Elevación a la potencia.
2. Los operadores de comparación Permiten comparar dos valores numéricos o dos cadenas de caracteres. Operador
Cálculo realizado
<
Inferior a (menor que)
<=
Inferior o igual a (menor o igual que)
>
Superior a (mayor que)
>=
Superior o igual a (mayor o igual que)
=
Igual a
<>
Distinto de
La instrucción Option compare utilizada a nivel de módulo permite definir el método de comparación por defecto que conviene utilizar durante la comparación de cadenas de caracteres. Puede tomar tres valores: Compare Binary
(opción por defecto) proporciona comparaciones de cadenas basadas en un criterio de ordenación derivado de la representación binaria interna de los caracteres: A
Compare Text
proporciona comparaciones de cadenas basadas en un criterio de ordenación que no distingue entre mayúsculas y minúsculas: (A=a)< (À=à)<(B=b)<(E=e)<(Ê=ê)<(Z=z)<...
Compare Database
proporciona comparaciones de cadenas basadas en un criterio de ordenación determinado por el identificador local de la base de datos actual.
3. Los operadores lógicos Permiten evaluar simultáneamente dos (o varios) valores booleanos o expresiones que devuelvan este tipo de valor. Se utilizan generalmente con la instrucción If. Operador
Cálculo realizado
And
Si todas las expresiones tienen el valor True, el resultado es True. Si una de las expresiones tiene el valor False, el resultado es False.
Or
Si al menos una de las expresiones tiene el valor True, el resultado es True (O inclusivo).
Xor
Si una sola de las expresiones tiene por valor True, el resultado es True (O exclusivo).
Not
Devuelve el contrario de la expresión.
Eqv
Devuelve True si ambas expresiones son idénticas.
Ejemplo (A rel="nofollow">= 1) And (A<= 9) devuelve True si A está comprendido entre 1 y 9, Not (A >= 10) devuelve True si A es estrictamente inferior a 10, (A>0) Or (B>0) Or (C>0) devuelve True si al menos uno de los valores es positivo.
4. El operador de concatenación El operador de concatenación es el signo &. Permite juntar cadenas de caracteres, valores y expresiones. El resultado es una cadena de caracteres. Ejemplo Concatenación del apellido y del nombre separados por un espacio: StrApeNom = strApellido & " " & strNombre
5. Prioridad de los operadores Cuando una misma expresión contiene varios operadores, cada uno se evalúa siguiendo un orden predefinido, llamado prioridad de los operadores. Los operadores se evalúan en el orden siguiente: operadores aritméticos, operadores de comparación, operadores lógicos. Los operadores de comparación tienen la misma prioridad; es decir que se evalúan siguiendo su orden de aparición, de izquierda a derecha. Los operadores aritméticos y lógicos se evalúan en el orden de prioridad siguiente (prioridad decreciente de izquierda a derecha): Aritmético: ˆ, *, /, Mod, +, Lógico: Not, And, Or, Xor, Eqv Ejemplo
La expresión "3 + 4 * 5" da como resultado 23. La multiplicación (4 * 5) se lleva a cabo antes que la suma ( + 3): La utilización de paréntesis permite modificar el orden de prioridad para que un elemento de una expresión se evalúe antes que los demás. Las operaciones situadas en el interior de paréntesis se efectúan siempre antes que las demás. Ejemplo: la expresión "(3 + 4) * 5" devuelve 35. La suma se realiza antes. Se aconseja utilizar paréntesis para mejorar la legibilidad del código.
Las reglas de escritura del código 1. Los comentarios Los comentarios permiten documentar un programa para hacerlo más legible. Sintaxis Rem o ’ Ejemplo ’========================================================= Rem Procedimiento que permite comparar el contenido de dos Rem cuadros de texto ’========================================================= Private Sub cmdResultado_Click() ’ txtImp1 es superior txtImp2 If txtImp1> txtImp2 Then lblresultado.Caption = ”El mayor valor es: " & txtImp1 Else ’ txtImp1 es igual a txtImp2 If txtImp1= txtImp2 Then lblresultado.Caption = ”Los dos valores son iguales” Else ’ txtImp1 es inferior txtImp2 lblresultado.Caption = ”El mayor valor es: " & txtImp2 End if End If End Sub
2. El carácter de continuación Una instrucción VBA puede escribirse en varias líneas utilizando un carácter de continuación: el carácter de subrayado (_) precedido de un espacio. Ejemplo If txtImp1 _ > _ txtImp2 then _ Por supuesto, este ejemplo no es digno de una programación estructurada, pero refleja el hecho de que es posible fragmentar una línea de código en cualquier punto.
3. La indentación Es importante alinear sobre la misma tabulación las instrucciones de mismo nivel. El encabezado y el pie del procedimiento se alinean a la izquierda y el contenido debe desplazarse una tabulación a la derecha. Estas indentaciones hacen más legible la estructura del procedimiento.
4. Los nombres de procedimientos, variables y constantes Los nombres de los procedimientos, variables y constantes deben respetar las reglas siguientes: Deben empezar por una letra. No deben contener más de 255 caracteres. Pueden estar compuestas por letras, cifras y por el carácter "subrayado" (_). No pueden contener caracteres de puntuación ni espacios. No deben corresponder a palabras reservadas. Deben ser únicos en el interior de un mismo ámbito. Ejemplos Numcliente Num_cliente Numcliente1
Las convenciones de llamada Es recomendable utilizar convenciones de llamada para las variables, los controles y los objetos. Permiten estandarizar el código y, consiguientemente, hacerlo más legible y más fácil de mantener por parte de distintos desarrolladores.
1. Convención de llamada de las variables Es recomendable utilizar dos prefijos: el primero para especificar el alcance de la variable: g para global, m para módulo, ningún prefijo para local, el segundo para especificar su tipo. Ejemplo
gstrNombre
variable global de tipo String
intCantidad
variable local de tipo Integer
Tipo de variable
Prefijo
Boolean
bln
Byte
byt
Currency
cur
Fecha, hora
dtm
Double
dbl
Error
err
Integer
int
Long
lng
Object
obj
Single
sng
String
str
Definido por el usuario
udt
Variant
var
2. Convención de llamada de los controles Al igual que para las variables, los nombres de controles de los formularios y de los informes deben llevar un prefijo según su tipo. Control
Prefijo
Datos ADO
ado
Casilla de verificación
chk
Cuadro combinado (combo)
cbo
Botón de comando
cmd
Marco (frame)
fra
Grupo de opciones
grp
Imagen
img
Etiqueta
lbl
Botón de opción
opt
Cuadro de texto
txt
3. Convención de llamada de los objetos Los objetos Access o las variables objeto relacionadas con los objetos Access pueden ir también acompañados de prefijos. Control
Prefijo
Tabla
tbl
Consulta
qry
Formulario
frm
Informe
rpt
Macro
mac
Índice
idx
Campo
fld
Colección
col
Propiedad
pty
Páginas de acceso a datos
pag
Presentación VBA Access es un lenguaje de programación orientado a objetos, aunque no disponga de todas las funcionalidades de los lenguajes de este tipo. La mayoría de los elementos manejados en Access son objetos: las tablas, los campos, los registros, los formularios, etc. Los objetos están organizados según un modelo jerárquico: ciertos objetos contienen objetos que a su vez contienen otros... Por ejemplo, el objeto Application está compuesto por varios objetos Form(formularios de la aplicación), que a su vez están compuestos por varios objetos Control (controles de un formulario). Un conjunto de objetos de la misma naturaleza constituye una colección (colección Forms: conjunto de los formularios u objetos Form de la aplicación). Un objeto dispone de un conjunto de características llamadas propiedades (ej: tamaño, color de un control en un formulario...) y comportamientos o acciones llamadas métodos (ej: el método close del objeto Formulario permite cerrarlo. Responde a eventos provocados por el usuario (ej: clic en un botón de comando) o por el sistema. Las clases son plantillas que permiten crear objetos de la misma naturaleza. Los objetos resultantes de una misma clase heredan sistemáticamente todos los métodos, propiedades y eventos de su clase de origen. Es posible crear clases de objetos con VBA Access utilizando módulos de clase. Existen varios conjuntos de objetos en Access: los objetos generales de Access (formularios, informes...). los controles ActiveX. los objetos de acceso a datos (modelo DAO y ADO). Cada conjunto puede estar representado en forma de modelo jerárquico. Este capítulo describe particularmente los objetos generales de Access; los objetos de acceso a datos se abordarán en el capítulo siguiente.
El modelo de objetos de Access El diagrama siguiente permite distinguir los principales objetos globales de Access.
1. Principales colecciones CommandBars
Colección de objetos CommandBar que representan las barras de comandos de la aplicación actual.
COMAddIns
Colección de objetos COMAddIn que
proporcionaninformación sobre un complemento COM inscrito en el Registro de Windows. Forms
Colección que contiene todos los formularios (objetos Form) abiertos en la base de datos activa. Para listar todos los formularios de la base de datos, tanto abiertos como cerrados, utilice la colección AllForms del objeto CurrentProject.
Modules
Colección que contiene todos los módulos estándar y los módulos de clase abiertos en la base de datos activa.
References
Colección que contiene todas las referencias a bibliotecas de objetos que pertenecen a otras aplicaciones (archivos dll, controles ActiveX...) que estén seleccionadas (las referencias se seleccionan desde el cuadro de diálogo Referencias del menú Herramientas).
Reports
Colección que contiene todos los informes (objetos Report) abiertos en la base de datos activa. Para listar todos los informes de la base de datos, tanto abiertos como cerrados, utilice la colección AllReports del objeto CurrentProject.
Printers
Colección que contiene todos los objetos Printer que representan a todas las impresoras disponibles en el sistema.
TempVars
Colección de objetos TempVar que permiten intercambiar fácilmente datos entre procedimientos VBA y macros.
WebServices
Colección de objetos WebService que representa una conexión a un servicio Web.
2. Objetos del Modelo Application
Objeto que hace referencia a la aplicación Microsoft Access activa.
AutoCorrect
Objeto que representa las opciones de corrección automática de Access.
DBEngine
Objeto que representa el motor de la base de datos Microsoft Jet. Como objeto principal en el núcleo del sistema jerárquico, el objeto DBEngine contiene todos los demás objetos de acceso a los datos y los controla.
DoCmd
Objeto que permite convertir acciones Macro a Visual Basic. La mayoría de las acciones macro pueden traducirse a VBA.
FileDialog
Objeto que permite acceder a funcionalidades similares a las de los cuadros de diálogo estándar Abrir y Guardar.
LanguageSettings
Objeto que devuelve datos sobre la configuración lingüísticade la aplicación.
Screen
Objeto que permite acceder al formulario, al informe o al control activo en ese momento.
VBE
Objeto que representa el editor Microsoft Visual Basic Edition Applications.
CurrentProject (o CodeProject)
Objeto que agrupa varias colecciones de objetos Access específicos (AllForms: colección de todos los formularios de la base, etc.).
CurrentData (o CodeData)
Objeto que agrupa varias colecciones de objetos Access de acceso a datos (AllTables: colección de todas las tablas de la base, etc.).
Principios de utilización de los objetos y de las colecciones 1. Las propiedades Las propiedades sirven para describir un objeto. Ciertas propiedades existen solamente en modo sólo lectura y no pueden, por tanto, ser modificadas a través de código VBA. Sintaxis { | }.<propiedad> Ejemplo Dim strVersion As String ’ Recuperación de la propiedad versión ’ del objeto aplicación ’ Esta propiedad es de sólo lectura strVersion = Application.Version ’ Modificación del puntero del ratón ’ 0 : puntero predeterminado ‐ 11 : reloj de arena If Screen.MousePointer = 0 Then Screen.MousePointer = 11 Else Screen.MousePointer = 0 End If End Sub
2. Propiedades que representan objetos Los objetos globales y las instancias de objetos creadas en el código a partir de clases proporcionadas por VBA poseen propiedades cuyo valor se actualiza automáticamente por parte del sistema. Propiedad
Del objeto
Objeto retornado
ActiveControl
Screen
Objeto Control que representa el control activo.
ActiveDataAccessPage
Screen
Objeto DataAccessPage que representa la página de acceso a los datos activos.
ActiveForm
Screen
Objeto Form que representa el formulario activo.
ActiveReport
Screen
Objeto Report que representa el informe activo.
Application
Múltiples objetos
Objeto Application que representa la aplicación de Access.
Form
Control subformulario
Objeto Form asociado al control de subformulario.
Me
Form o Report
El objeto Form o Report cuyo código se está ejecutando.
Module
Form o Report
Objeto Módulo que contiene el código asociado al formulario o al informe.
Parent
Múltiples objetos
Objeto o colección que contiene el objeto.
PreviousControl
Screen
El objeto Control anteriormente activo.
RecordsetClone
Form
Un Recordset copia del conjunto de registros subyacente del formulario.
Report
Controlsubinforme
Objeto Report asociado al control de subinforme.
Section
Form, Report
Sección de un formulario o de un informe.
3. Los métodos Los métodos permiten efectuar acciones propias de los objetos. Se presentan como procedimientos: pueden utilizar o no argumentos, algunos métodos pueden devolver un valor del mismo modo que los procedimientos Function, otros no, al igual que los procedimientos Sub. Sintaxis de método que no devuelve valor { | }.<método> [] Ejemplo ’ Modificación de la opción "Compactar al cerrar" ’ Método SetOption que no devuelve ningún valor Application.SetOption "Auto Compact", True Los distintos argumentos del método deben estar separados por comas. Si un argumento opcional no está definido de forma explícita, el método utilizará un valor por defecto. Sintaxis de método que devuelve un valor = { | }.<método> ([]) Ejemplo Private Sub cmdMétodos_Clic() ’ Variable boleana Dim blnCompact As Boolean ’ Recuperación de la opción "Compactar al cerrar" ’ Método GetOption que devuelve un valor boleano blnCompact = Application.GetOption("Auto Compact") ’ Modificación de la opción ’ Método SetOption que no devuelve ningún valor If blnCompact Then Application.SetOption "Auto Compact", False MsgBox "La base no se compactará al cerrarla", _ vbExclamation Else Application.SetOption "Auto Compact", True MsgBox "La base se compactará al cerrarla", _ vbExclamation End If End Sub
4. Los eventos
Un evento es una acción específica que se produce sobre un objeto. Microsoft Access está capacitado para responder a varios tipos de eventos: abrir o cerrar formularios, clics de ratón, modificación de datos, etc. Generalmente, los eventos son el resultado de una acción del usuario. La utilización de un procedimiento de evento le permite asociar su propio código en respuesta a un evento que se produce en un formulario, un informe, un control, etc. Ejemplo Cuando el usuario hace clic sobre el botón de comando "Salir", se muestra un cuadro de diálogo solicitando confirmación. Private Sub CmdSalir_Click() ’ Solicita al usuario que confirme ’ que desea abandonar la aplicación If MsgBox("¿Desea salir de la aplicación?", _ vbQuestion + vbYesNo) = vbYes Then DoCmd.Quit End If End Sub La gestión de los eventos es uno de los aspectos más importantes en el desarrollo de una aplicación Access, por lo que el capítulo Gestión de los eventos, está consagrado enteramente a este tema.
5. Las colecciones Para hacer referencia a un objeto de una colección puede utilizar una de las sintaxis siguientes: NombreColección!NombreObjeto NombreColección![NombreObjeto] NombreColección("NombreObjeto") NombreColección(var) donde var representa una variable de tipo string que contiene el nombre del objeto. NombreColección(índice) donde índice representa el número de índice del objeto en la colección. Para asegurar una mejor legibilidad del código se aconseja utilizar siempre la misma sintaxis. Se recomiendan las sintaxis 3 y 5, ya que permiten activar el asistente del editor de código. Además, la sintaxis 5 es muy útil para recorrer los objetos de una colección.
Atención, el primer elemento de la mayoría de colecciones tiene como índice 0. No utilice los índices más que para recorrer una colección. Evite, por ejemplo, Me.controls(5) para hacer referencia a un control ya que el índice del control puede cambiar si se modifica el formulario.
Ejemplo Private Sub cmdColecciones_Click() Dim ctl As Control Dim intI As Integer ’ Abre el formulario "Empleados" ’ y lo oculta (propiedad Visible) DoCmd.OpenForm "Empleados" Forms("Empleados").Visible = False
’ Hace referencia al control Nombre ’ del Formulario "Empleados" ’ Colecciones Forms y Controls MsgBox Forms("Empleados").Controls("Nombre").Value MsgBox Forms!Empleados.Controls![Nombre].Value ’ Fecha de creación de una tabla de la base actual ’ Colecciones AllTables MsgBox CurrentData.AllTables![Empleados].DateCreated MsgBox CurrentData.AllTables("Empleados").DateCreated MsgBox CurrentData.AllTables(0).DateCreated ’ Modifica la fuente y el color de todos los controles ’ "cuadros de texto" del formulario For intI = 0 To Forms("Empleados").Controls.Count ‐ 1 Set ctl = Forms("Empleados").Controls(intI) If TypeOf ctl Is TextBox Then ctl.ForeColor = vbRed ctl.FontItalic = True ctl.FontBold = True End If Next intI ’ Muestra el formulario Forms("Empleados").Visible = True End Sub
Colecciones predeterminadas Definición Una colección predeterminada es una colección que contiene objetos a los que es posible hacer referencia a través del nombre del objeto contenedor de la colección, es decir sin hacer referencia a la colección misma.
Objetos que poseen una colección predeterminada Objeto
Colección predeterminada
Container
Documents
Database
TableDefs
DBEngine
Workspaces
Form
Controls
Group
Users
Index
Fields
QueryDef
Parameters
Recordset
Fields
Relation
Fields
Report
Controls
TableDef
Fields
User
Groups
Workspace
Databases
Ejemplo Referencia al control txtFechaIni del formulario Cursos (la colección Controls es la colección predeterminada de un formulario).
Forms![Cursos].Controls("txtFechaIni").Value O Forms![Cursos].[txtFechaIni].Value o Forms!Cursos.txtFechaIni.Value o Forms!Cursos!txtFechaIni.Value
6. Presentación automática de instrucciones El editor VBA dispone de una tecnología que permite asistirle durante la utilización de objetos. Al teclear un nombre de objeto reconocido por VBA seguido de un punto, se muestra la lista desplegable de los métodos y propiedades de dicho objeto. Si selecciona un método, el asistente también le ayuda a introducir los distintos argumentos que comporta. Ejemplo Teclee el nombre de objeto DoCmd seguido de un punto y aparece la lista desplegable siguiente.
El icono
representa los métodos, el icono
representa las propiedades.
Puede hacer pasar los elementos de la lista desplegable tecleando las primeras letras del método, propiedad o colección que está buscando o por medio de la barra de desplazamiento. Para seleccionar un elemento de la lista, haga un doble clic encima de él. Teclee un punto si acaba de seleccionar un objeto y si desea ver la lista de propiedades y métodos relacionados. Si ha seleccionado un método, teclee un espacio para introducir la lista de parámetros del método. Para proseguir el ejemplo: Seleccione el método OpenForm.
Y teclee un espacio:
Se muestra entonces la lista de argumentos del método y se adapta a medida que los introduce. Los argumentos opcionales están entre corchetes. El argumento actual aparece en negrita. Si para un argumento determinado existe una lista de valores predefinidos, aparece la lista desplegable de las correspondientes constantes. Introduzca el nombre del parámetro pasado a la función, es decir StrFormName, seguido de una coma, el argumento acNormal y tres comas (para los dos argumentos opcionales).
En el ejemplo aparece la lista de valores posibles del argumento DataMode. Para obtener la lista de propiedades y métodos de un objeto también es posible proceder de la siguiente manera: coloque el cursor tras el punto (situado después del nombre del objeto), haga clic en el botón secundario del ratón y seleccione la opción Lista de propiedades y métodos del menú contextual o utilice el método abreviado [Ctrl] J.
Asimismo, para obtener la lista de constantes disponibles como argumento de un método, se puede proceder como sigue: coloque el cursor donde está el argumento (después del método o después de la coma), haga clic en el botón secundario del ratón y seleccione la opción Lista de constantes del menú contextual.
Instrucciones utilizadas con los objetos 1. La instrucción With La instrucción With permite acceder varias veces al mismo objeto nombrándolo una sola vez. Ofrece varias ventajas: optimización del tiempo de ejecución del código, ahorro de tiempo en el trabajo de escritura, mejor legibilidad del código. Sintaxis With End With Ejemplo ’ Abre el formulario "Empleados" DoCmd.OpenForm "Empleados" ’ Modifica el título del formulario ’ Coloca el cursor sobre el nombre With Forms("Empleados") .Caption = "FICHA DEL EMPLEADO" & _ .Controls("Nombre").Value & " " & _ UCase(.Controls("Apellido").Value) .Controls("Apellido").SetFocus End With
2. La instrucción For each...Next La instrucción For Each...Next permite recorrer los objetos de una colección o los elementos de una matriz. Sintaxis For Each <elemento> In {<matriz>|} <secuencia de instrucciones> [Exit For] <secuencia de instrucciones> Next <elemento> Ejemplo El ejemplo siguiente permite asignar un color de fuente a cada control del formulario "empleado" en función de su tipo (propiedad ControlType). Utiliza la colección predeterminada del objeto Form (Screen.ActiveForm equivale a Screen.ActiveForm.Controls). Dim ctl As Control ’ Recorrido de los controles del formulario activo For Each ctl In Screen.ActiveForm With ctl Select Case.ControlType ’ Etiquetas Case acLabel .ForeColor = vbBlue ’ Cuadros de texto Case acTextBox
.ForeColor = vbGrayText ’ Listas desplegables Case acListBox, acComboBox .ForeColor = vbRed End Select End With Next ctl
3. La instrucción If TypeOf La instrucción If TypeOf permite evaluar el tipo de un objeto. Sintaxis If TypeOf Is <TipoObjeto> Then End If Ejemplo If TypeOf ctl Is acListBox Then ...
4. La instrucción Set La instrucción Set permite atribuir una referencia de objeto a una variable, llamada variable de objeto. Esta instrucción puede emplearse para crear una referencia hacia un nuevo objeto (utilizando eventualmente un método que permita crear el objeto) o para asignar una referencia a un objeto ya existente. Sintaxis Creación de una referencia hacia un nuevo objeto Set = New <expresión objeto> o Set = <método que permite crear el objeto>
nombre de la variable objeto.
<expresión objeto>
nombre de un objeto o de una variable objeto del mismo tipo.
La palabra clave New permite crear una nueva instancia de la clase. Si la variable objeto ya contiene una referencia, esta última se pierde.
Sólo puede utilizar la palabra clave New para referenciar un objeto si el componente ActiveX del objeto proporciona una biblioteca de tipos (ej: objetos ADO, objetos Excel, etc.).
Asignación de una referencia a un objeto existente Set = <expresión objeto>
nombre de la variable objeto.
<expresión objeto>
nombre de un objeto o de una variable objeto del mismo tipo.
Reinicialización de las variables objeto Set = Nothing
Nothing permite reinicializar la variable objeto y liberar el conjunto de recursos del sistema y memoria asociados a dicho objeto. Ejemplos: Creación de referencias hacia nuevos objetos. Los ejemplos 1 y 2 permiten crear una nueva tabla y añadirla a la base de datos actual. Para ejecutar estos ejemplos debe seleccionar la referencia Microsoft DAO 3.6 Object Library en el proyecto (Herramientas Referencias). Ejemplo 1: utilización de la palabra clave New Dim tbl As Object Dim tdfCliente As DAO.TableDef Dim fld As DAO.Field ’ Comprueba si la tabla ya existe ’ y propone eliminarla For Each tbl In CurrentData.AllTables If tbl.Name = "CLIENTES" Then If MsgBox("La tabla ya existe." & _ "¿Desea eliminarla?", _ vbYesNo + vbQuestion) = vbYes Then DoCmd.DeleteObject acTable, "CLIENTES" Else Exit Sub End If End If Next tbl ’ Crea la definición de tabla Set tdfCliente = New DAO.TableDef tdfCliente.Name = "CLIENTES" ’ Crea el primer campo Set fld = New DAO.Field With fld .Name = "Cli_Apellido" .Type = dbText .Size = 40 End With tdfCliente.Fields.Append fld ’ Crea el segundo campo Set fld = New DAO.Field With fld .Name = "Cli_Num" .Type = dbInteger End With tdfCliente.Fields.Append fld ’ Agrega la tabla a la base de datos actual Application.CurrentDb.TableDefs.Append tdfCliente ’ Reinicia las variables de objeto Set tdfCliente = Nothing Set fld = Nothing Ejemplo 2: misma operación utilizando métodos Dim tbl As Object Dim tdfCliente As DAO.TableDef Dim fld As DAO.Field ’ Comprueba si la tabla ya existe ’ y propone eliminarla
For Each tbl In CurrentData.AllTables If tbl.Name = "CLIENTES" Then If MsgBox("La tabla ya existe." & _ "¿Desea eliminarla?", _ vbYesNo + vbQuestion) = vbYes Then DoCmd.DeleteObject acTable, "CLIENTES" Else Exit Sub End If End If Next tbl ’ Crea la definición de tabla Set tdfCliente = CurrentDb.CreateTableDef("Clientes") With tdfCliente ’ Crea el primer campo Set fld = .CreateField("Cli_Apellido", dbText, 40) .Fields.Append fld ’ Crea el segundo campo .Fields.Append .CreateField("Cli_Num", dbInteger) End With ’ Agrega la tabla a la base de datos actual CurrentDb.TableDefs.Append tdfCliente ’ Reinicia las variables de objeto Set fld = Nothing Set tdfCliente = Nothing Ejemplo 3: Creación de un formulario con un cuadro de texto y una etiqueta. ’ Objeto Formulario Dim frmEmpleado As Form ’ Nombre del formulario Dim strName As String ’ Objeto control Dim ctl As Control ’ Creación de un nuevo formulario Set frmEmpleado = Application.CreateForm With frmEmpleado ’ Título del formulario .Caption = "Empleados" ’ Ancho y alto del formulario .Width = 5000 .Section(acDetail).Height = 2000 ’ Elimina los botones de desplazamiento .NavigationButtons = False ’ Elimina el selector de registro .RecordSelectors = False ’ Centra el formulario dentro de la aplicación .AutoCenter = True ’ Nombre del formulario strName = frmEmpleado.Name End With ’ Incorporación del cuadro de texto Nombre del empleado Set ctl = Application.CreateControl(strName, _ acTextBox, , "", "", 2000, 500, 2500, 300) ’ Formato del cuadro de texto With ctl ’ Nombre del cuadro de texto .name = "txtNombre" ’ Colores .BackColor = vbWhite .ForeColor = vbBlack .FontBold = True End With ’ Incorporación de la etiqueta Nombre del empleado
Set ctl = Application.CreateControl(strName, _ acLabel, , "", "", 500, 500, 1500, 300) ’ Formato de la etiqueta With ctl ’ Nombre de la etiqueta .Name = "lblNombre" ’ Título de la etiqueta .Caption = "Apellido del empleado:" ’ Colores .BackColor = vbWhite .ForeColor = vbBlue End With ’ Salvaguarda del formulario DoCmd.Save , "Ficha_Empleado" Docmd.Close Formulario creado con el código:
Las clases de objetos 1. Descripción Una clase es en cierto modo un molde de donde aparecen los objetos. Por ejemplo, es posible realizar figuritas de yeso con un molde adecuado. Se podría decir que todas las figuritas fabricadas son Objetos, cada una con colores y ornamentos distintos, y que los moldes son Clases. De este modo, los objetos originarios de una misma clase heredan sistemáticamente todos los métodos (código), las propiedades (datos) y los eventos de su clase de origen. Más adelante, se podrán adaptar las características y el comportamiento de cada uno de ellos en función de las necesidades de la aplicación. De hecho, todos los objetos de Access resultan de una clase.
2. Los módulos de clase Los módulos de clase le permiten crear y manipular sus propios tipos de objeto dentro de sus aplicaciones. Los módulos de clase presentan las características siguientes: llevan el nombre del objeto, contienen procedimientos públicos Sub y Function correspondientes a los métodos propios del objeto, contienen procedimientos Property Get que permiten leer los valores de propiedades del objeto y los procedimientos Property Set/Property Let que permiten establecer los valores de dichas propiedades. Una vez se hayan descrito el conjunto de estos procedimientos en el interior del módulo de clase, es posible crear un nuevo objeto del tipo definido. Para ello basta con crear una nueva instancia de la clase mediante el uso de una variable de objeto del tipo de la clase: Dim <nombre del objeto> As New <nombre de la clase> Los módulos de clase no son muy utilizados en programación VBA. Van destinados especialmente a los desarrolladores más expertos.
3. Ejemplo de módulos de clase Este ejemplo le guiará paso a paso en la creación y la utilización de un módulo de clase. El módulo creado permitirá mostrar los mensajes de usuario. Este módulo contiene los elementos siguientes: un método Confirmación que muestra un cuadro de diálogo invitando al usuario a responder "sí" o "no" a una pregunta, y recupera la respuesta del usuario, dos propiedades: la propiedad IsBeep indica si debe emitirse un beep antes de la aparición del mensaje, la propiedad Title contiene el título del cuadro de diálogo. Ejemplo Para crear un módulo de clase: Seleccione la opción Módulo de clase del menú contextual Insertar del explorador de proyecto. Seleccione la opción Módulo de clase del menú Insertar del entorno de desarrollo.
Defina el nombre de la clase en el campo Name.
Si la ventana Propiedades no aparece en pantalla, seleccione la opción Ventana propiedades del menú Ver o utilice la tecla [F4]. Defina las variables necesarias para la utilización de las propiedades en el módulo de clase Mensaje. La variable strTitle está asociada a la propiedad Title, la variable blnBeep a la propiedad IsBeep. Option Compare Database Option Explicit ’ Emisión de un beep Dim blnBeep As Boolean ’ Título de la ventana MsgBox Dim strTitle As String Cree las propiedades IsBeep y Title utilizando la opción Procedimiento del menú Insertar.
Los procedimientos Property Get y Property Set se crean para cada propiedad: Modifíquelos para obtener el siguiente código: Public Property Get IsBeep() As Boolean IsBeep = blnBeep End Property ________________________________________________________________ Public Property Let IsBeep(ByVal blnNewValue As Boolean) blnBeep = blnNewValue End Property ________________________________________________________________ Public Property Get Title() As String Title = strTitle End Property ________________________________________________________________ Public Property Let Title(ByVal strNewValue As String) strTitle = strNewValue End Property Cree ahora el método de confirmación mediante la opción Procedimiento del menú Insertar.
Modifique el procedimiento Confirmación para obtener el código siguiente. Public Function Confirmacion(strMsg) As Boolean If MsgBox(strMsg, vbYesNo, strTitle) = vbYes Then Confirmacion = True Else Confirmacion = False End If If blnBeep Then Beep End Function Podemos ver que este método utiliza las dos variables strTitle y blnBeep. El método ha sido creado como función ya que devuelve la respuesta del usuario como variable boleana. Ahora que está creada esta clase, vamos a utilizarla desde un formulario. Para ello, cree un formulario Empleados con dos botones de comando cmdCerrar y cmdSalir. Asigne el código siguiente a los eventos click. Private Sub CmdCerrar_Click() ’ Objeto mensaje Dim msg As New Message ’ Ninguna emisión de señal sonora msg.IsBeep = False ’ Título del cuadro de diálogo msg.Title = "Aplicación Gestión del personal" ’ Solicitud de confirmación If msg.Confirmación("¿Desea cerrar" _ & " el formulario" & Me.Caption & "?") Then DoCmd.Close End If End Sub _______________________________________________________________ Private Sub CmdSalir_Click() ’ Objeto mensaje Dim msg As New Message ’ Emisión de señal sonora msg.IsBeep = True ’ Título del cuadro de diálogo msg.Title = "Aplicación Gestión del personal" ’ Solicitud de confirmación If msg.Confirmación("¿Desea salir de" _ & "la aplicación?") Then DoCmd.Quit End If End Sub A continuación, pruebe el formulario. El cuadro de mensaje mostrado por el método Confirmacion utiliza las dos propiedades y devuelve la respuesta del usuario. Es posible enriquecer el módulo de clase Mensaje definiendo nuevas propiedades y nuevos métodos (ej: mensajes de error...).
El examinador de objetos 1. Presentación Teniendo en cuenta el importante número de objetos de Access y su diversidad, es útil poder buscar rápidamente la información relacionada con los objetos. El examinador de objetos permite mostrar información relativa a los objetos, métodos, propiedades, eventos y constantes. Puede mostrarlos de distintas maneras: seleccione la opción Examinador de objetos del menú Ver, utilice el método abreviado [F2], haga clic sobre el icono
.
1. Lista de las bibliotecas de objetos cargadas. 2. Elemento buscado: objeto, propiedad, colección, evento, método, etc. 3. Resultado de la búsqueda: lista de las clases de objetos (objetos y colecciones) y de los miembros que las componen (objeto, colección, propiedad, evento o método). La palabra buscada puede estar en la lista de clases o en la de miembros. 4. Objetos de la biblioteca: la clase de objeto seleccionada en la lista Resultados aparece enmarcada. 5. Métodos, propiedades, eventos y constantes relacionados con el objeto seleccionado en la lista de la
izquierda. El miembro seleccionado en la lista Resultados aparece enmarcado. 6. Detalle del elemento seleccionado.
2. Búsqueda en el examinador de objetos Para efectuar una búsqueda en el examinador de objetos, proceda del modo siguiente: Introduzca el término buscado en la segunda lista desplegable. Haga clic sobre el icono
.
Si la lista de Resultados muestra varias líneas, desplácese a la que le interesa (la parte inferior de la ventana se actualiza). Ejemplo Si busca la palabra "Message", el modulo de clase creado anteriormente aparece en la lista de las clases con los métodos y propiedades relacionados.
Propiedades y métodos de objetos de Access Esta parte describe las propiedades y los métodos de los objetos utilizados habitualmente en Access. Los objetos Form y Report se describirán en el capítulo Personalizar formularios e informes. Para obtener la lista exhaustiva de los objetos, las propiedades y los métodos, busque en la ayuda VBA Access o utilice el examinador de objetos.
1. El objeto Application El objeto Application hace referencia a la aplicación Microsoft Access activa.
Propiedades AutomationSecurity
Devuelve o define una constanteMsoAutomationSecurity que representa el modelo de seguridad utilizado por Microsoft Access cuando abre ficheros por programación.
BrokenReference
Devuelve un valor de tipo Boleano que indica si la base de datos activa posee referencias rotas hacia bases de datos o bibliotecas de tipos.
Build
Devuelve un valor de tipo Entero Largo que representa el número de la copia de Microsoft Office Access 2013 actualmente instalada.
CodeContextObject
Devuelve el objeto en el que se está ejecutando una macro o código Visual Basic.
CurrentObjectName
Devuelve el nombre del objeto activo (tabla, consulta, formulario, informe, macro, módulo).
CurrentObjectType
Devuelve el tipo del objeto activo.
Constante
Valor
Descripción
acTable
0
Tabla
acQuery
1
Consulta
acForm
2
Formulario
acReport
3
Informe
acMacro
4
Macro
acModule
5
Módulo
10
Función
acFunction FeatureInstall
Especifica o determina la manera cómo Microsoft Access gestiona las llamadas de métodos y de propiedades que requieren funcionalidades no instaladas.
IsCompiled
Devuelve un valor de tipo boolean que indica si el proyecto Visual Basic está compilado.
MenuBar
Determina la barra de menús que debe utilizarse para la base de datos.
Name
Identifica el nombre de la aplicación ("Microsoft Access").
Parent
Permite hacer referencia al objeto padre.
ProductCode
Determina el identificador global único (GUID) de Microsoft Access.
ShortcutMenuBar
Especifica el menú contextual que aparece cuando el usuario hace clic con el botón secundario del ratón.
UserControl
Permite determinar si la aplicación Microsoft Access actual ha sido iniciada por el usuario o por otra aplicación mediante automatización.
Version
Devuelve el número de la versión de Microsoft Access.
Visible
Permite ocultar la aplicación.
Métodos que actúan sobre la base de datos Access CloseCurrentDatabase
Cierra una base de datos Access a partir de otra aplicación que utilice la tecnología Automation (la aplicación Excel, por ejemplo). La base de datos debe haber sido abierta previamente por esa misma aplicación mediante el métodoOpenCurrentDatabase.
CompactRepair
Compacta y repara la base de datos (.mdb) o el proyecto Microsoft Access (.adp) especificados. Devuelve un Boleano que toma el valor True si la operación tiene éxito.
ConvertAccessProject
Convierte la versión del archivo Microsoft Access especificado en otra versión.
CreateNewWorkgroupFile
Crea un nuevo archivo de grupo de trabajo para que los usuarios puedan acceder de forma segura a una base de datos.
CurrentDb
Devuelve una variable objeto que hace referencia a la base de datos actualmente abierta en Microsoft.
InstantiateTemplate
Crea una nueva base de datos y le aplica el modelo especificado.
NewCurrentDatabase
Crea una nueva base de datos en la ventana Microsoft Access.
OpenCurrentDatabase
Abre una base de datos Access como base en curso a partir de otra aplicación que utilice la tecnología Automation (la aplicación Excel por ejemplo).
RefreshDatabaseWindow
Permite actualizar la ventana Base de datoscuando una tabla, una consulta, un formulario, un informe, una macro o un módulo han sido creados, eliminados o se les ha cambiado el nombre.
Métodos que afectan a los proyectos Access CreateAccessProject
Permite crear un nuevo proyecto Microsoft Access (.adp) en el disco.
NewAccessProject
Permite crear y abrir un nuevo proyecto Microsoft Access (.adp) como proyecto Access activo.
Métodos que afectan a los objetos Access (formularios, informes…) ColumnHistory
Proporciona el historial de los valores que han sido
almacenados en un campo Memo. CreateControl
Permite crear un control en un formulario abierto especificado.
CreateForm
Permite crear un formulario y devuelve un objeto de tipo Form.
CreateGroupLevel
Permite especificar un campo o una expresión a partir de los cuales se reagruparán o se seleccionarán los datos de un informe.
CreateReport
Permite crear un informe y devuelve un objeto de tipo informe.
CreateReportControl
Permite crear un control en un informe abierto.
DeleteControl
Permite eliminar un control determinado en un formulario.
DeleteReportControl
Permite eliminar un control determinado en un informe.
DirtyObject
Marca un formulario o un informe como si hubiera sido modificado.
LoadPicture
Carga una imagen en un control ActiveX.
SetHiddenAttribute
Habilita el atributo oculto de un objeto Access.
Métodos que afectan a la interfaz de Access AddToFavorites
Agrega el nombre de la base de datos actual a la carpeta Favoritos.
Echo
Especifica si Access debe refrescar los datos mostrados en la pantalla.
GetOption
Devuelve el valor actual de una opción del cuadro de diálogo Opciones.
ImportNavigationPane
Carga la configuración guardada del panel de navegación desde el disco.
Quit
Permite salir de Access.
RefreshTitleBar
Actualiza la barra de título de Microsoft Access.
SetOption
Define el valor actual de una opción en el cuadro de diálogo Opciones.
SysCmd
Permite mostrar una barra de progresión o un texto especificado opcional en la barra de estado, permite también devolver datos sobre Microsoft Access y los ficheros asociados, o el informe de un objeto de base de datos especificado (objeto abierto, nuevo o modificado pero no guardado).
Métodos que permiten ejecutar código Run
Permite ejecutar un procedimiento Function o Sub especificado por Microsoft Access o definido por el usuario.
RunCommand
Ejecuta un comando integrado de Access.
RunDataMacro
Ejecuta una macro de datos con nombre.
Métodos relacionados con los ficheros XML CreateAdditionalData
Permite crear un objeto AdditionalData que puede ser utilizado para agregar tablas y consultas complementarias en la tabla madre exportada con el método ExportXML.
ExportXML
Permite exportar datos XML, esquemas e informaciones de presentación a partir de Microsoft SQL Server 2000 Desktop Engine (MSDE 2000), Microsoft SQL Server versión 6.5 o posterior, o del motor de base de datos Microsoft Jet.
ImportXML
Permite importar datos XML y/o informaciones de presentación a Microsoft SQL Server 2000 Desktop Engine (MSDE 2000), Microsoft SQL Server versión 7.0 o posterior, o al motor de base de datos Microsoft Jet.
TransformXML
Aplica una hoja XSL (eXtensible Stylesheet Language) a un archivo de datos XML y escribe el lenguaje XML resultante en un archivo de datos XML.
Métodos relativos a los hipervínculos FollowHyperLink
Abre el documento o la página Web especificada por una dirección de hipervínculo.
HyperLinkPart
Devuelve la información relativa a los datos almacenados bajo la forma de un hipervínculo.
Métodos relativos a los usuarios CurrentUser
Permite devolver el nombre del usuario actual de la base de datos.
CurrentWebUser
Proporciona información sobre el usuario actual de una base de datos Web en Microsoft SharePoint Foundation 2013.
IsCurrentWebUserInGroup
Indica si el usuario actual de una base de datos Web es miembro del grupo Microsoft SharePoint Foundation 2013 especificado.
Métodos que afectan a los ficheros Aplicación XML LoadFromAxl
Importa el objeto definido a un fichero Aplicación XML (AXL) en la base de datos.
SaveAsAXL
Exporta el objeto definido hacia un fichero Aplicación XML (AXL).
Otros métodos AccessError
Devuelve la cadena descriptiva asociada a un error Microsoft Access o a un error DAO.
BuildCriteria
Permite construir fácilmente los criterios de un filtro.
DefaultWorkspaceClone
Crea un nuevo objeto Workspace sin obligar al
usuario a conectarse de nuevo. LoadCustomUI
Carga el código XML que representa una cinta personalizada.
Nz
Transforma un valor nulo en cero, cadena vacía u otro valor especificado.
SetDefaultWorkgroupFile
Define el fichero especificado como fichero de grupo de trabajo.
Ejemplo Botón de comando que permite salir de Access guardando todos los objetos. Sub cmdSalir_Click() Application.Quit acQuitSaveAll End Sub Ejemplo El código siguiente permite modificar los colores predeterminados de las hojas de datos (contenidos en la ficha Hoja de datos del cuadro de diálogo Opciones de Access). With Application ’ Fuente azul oscuro .SetOption "Default Font Color", 4 ’ Color de fondo: blanco .SetOption "Default Background Color", 15 ’ Color de la cuadrícula azul claro .SetOption "Default Gridlines Color", 12 End With
Funciones aplicables a un conjunto de registros Estas funciones se utilizan generalmente en los formularios y los informes: DAvg
Calcula la media de un conjunto de valores en un conjunto de registros.
DCount
Determina el número de registros en un conjunto de registros.
DFirst
Devuelve el primer registro de un conjunto de registros.
DLast
Devuelve el último registro de un conjunto de registros.
DLookUp
Busca el valor de un campo particular que forma parte de un conjunto de registros.
DMin
Determina el valor mínimo de un campo para un conjunto de registros.
DMax
Determina el valor máximo de un campo para un conjunto de registros.
DStDev
Evalúa la desviación típica para una muestra de población para un conjunto de registros.
DstDevP
Calcula la desviación típica de una población en un conjunto de registros.
DSum
Calcula la suma de un conjunto de valores en un conjunto de registros.
DVar
Evalúa la varianza para una muestra en un conjunto de registros.
DVarP
Evalúa la varianza de una población en un conjunto de registros.
Eval
Evalúa una expresión (combinación de operadores, de nombres de campo, de funciones, de literales y de constantes) y devuelve el resultado bajo la forma de una cadena de caracteres o un valor numérico.
2. El objeto DoCmd
El objeto DoCmd permite ejecutar desde Visual Basic la mayoría de las acciones ejecutables a través de las macros. A cada opción de macro le corresponde un método. Los argumentos de la acción se convierten en los argumentos del método. El objeto DoCmd no dispone de propiedades. Las acciones de macro correspondientes a los métodos se indican entre paréntesis.
Ejecución de acción CancelEvent
(CancelarEvento) Cancela un evento.
Quit
(Salir) Sale de Access.
RunCommand
(EjecutarComando) Ejecuta un comando de un menú o de una barra de herramientas.
RunMacro
(EjecutarMacro) Ejecuta una macro.
RunSql
(EjecutarSql) Ejecuta una orden SQL.
Acciones sobre los objetos de Access (formularios, informes...) ApplyFilter
(AplicarFiltro) Aplica un filtro a una tabla, un formulario o a un informe.
BrowseTo
(Examinar)Permite navegar entre los objetos de la base
de datos. También se puede cambiar el objeto fuente de un control de subformulario al especificar el argumentoPathToSubFormControl. Close
(Cerrar) Cierra un objeto (formulario, informe...).
CloseDatabase
(CerrarBaseDeDatos) Cierra la base de datos abierta en la interfaz Access. Si la base de datos contiene objetos que no hayan sido grabados cuando utiliza el métodoCloseDatabase, aparecen cuadros de diálogo idénticos a los que se muestran cuando hace clic en Cerrar base de datos.
CopyObject
(CopiarObjeto) Permite copiar un objeto Access en la misma base o en otra base.
DeleteObject
(EliminarObjeto) Elimina un objeto.
GotoControl
(IrAControl) Mueve el enfoque a un control.
GotoPage
(IrAPágina) Mueve el enfoque al primer control de la página indicada del formulario activo.
OpenDataAccessPage
(AbrirPáginaAccesoDatos) Abre una página de acceso a los datos.
OpenDiagram
(AbrirDiagrama) Abre un esquema de base de datos.
OpenForm
(AbrirFormulario) Abre un formulario.
OpenFunction
(AbrirFunción) Abre una función de usuario en una base de datos Microsoft SQL Server para mostrarla en Microsoft Access.
OpenModule
(AbrirMódulo) Abre un módulo VBA.
OpenQuery
(AbrirConsulta) Abre una consulta.
OpenReport
(AbrirInforme) Abre un informe.
OpenStoredProcedure
(AbrirProcedimientoAlmacenado) Abre un
procedimiento almacenado en la vista Hoja de datos, en vista Diseño o en vista Preliminar. OpenTable
(AbrirTabla) Abre una tabla.
OpenView
(AbrirPáginaAccesoADatos) Abre una página de acceso a datos.
PrintOut
(Imprimir) Imprime en papel.
Rename
(CambiarNombre) Cambiar el nombre a un objeto.
RepaintObject
(RepintarObjeto) Repintar un objeto (formulario...).
Save
(Guardar) Guarda el objeto especificado o el objeto activo.
SelectObject
(SeleccionarObjeto) Selecciona un objeto de base de datos.
SetHiddenAttribute
Permite modificar la visibilidad de un objeto Access.
SetParameter
(EstablecerParametro) Crea un parámetro que los
métodos BrowseTo, OpenForm, OpenQuery, OpenReport o RunDataMacro pueden utilizar.
Acciones sobre los registros FindNext
(EncontrarSiguiente) Continúa la búsqueda.
FindRecord
(EncontrarRegistro) Búsqueda de un registro.
GoToRecord
(AlcanzarRegistro) Alcanza un registro.
RefreshRecord
(RefrescarRegistro) Refresca los datos de los registros del objeto Access activo (formulario, informe...)
Requery
(Actualizar) Actualiza los datos de la pantalla (vuelve a lanzar la consulta fuente del objeto).
SearchForRecord
(BuscarRegistro) Permite buscar un registro específico en una tabla, una consulta, un formulario o un informe.
SetFilter
(EstablecerFiltro) Aplica un filtro a los registros del
objeto Access activo: hoja de datos, formulario, informe o tabla. SetOrderBy
(EstablecerOrdenPor) Ordena los registros del objeto Access activo: hoja de datos, formulario, informe o tabla.
ShowAllRecords
(MostrarTodosRegistros) Deshabilita un filtro y vuelve a mostrar todos los registros.
Importar/Exportar Datos CopyDatabaseFile
(CopiarArchivoDeBaseDeDatos) Copia la base de datos conectada al proyecto activo a un archivo de base de datos Microsoft SQL Server para exportarla.
OutPutTo
(SalidaHacia) Permite exportar un objeto Access (tabla,
formulario) a otra base Access o a otro tipo de fichero (Excel, XML...) RunSavedImportExport
(EjecutarImportaciónExportacionGuardada)Ejecuta una especificación de importación o exportación guardada, creada a partir del Ayudante para la Importación o del Ayudante para la Exportación.
SendObject
(EnviarObjeto) Envía un objeto hacia la mensajería.
TransferDatabase
(TransferirBase) Importa o exporta una base de datos.
TransferSpreadSheet
(TransferirHojaCalculo) Importa o exporta una hoja de cálculo.
TransferSharePointList
(TransferirListaSharePoint) Permite importar o relacionar datos a partir de un sitio Microsoft Windows SharePoint Services 3.0.
TransferSQLDatabase
(TransferirBaseDeDatosSQL) Transferir la integridad de la base de datos Microsoft SQL Server especificada hacia otra base de datos SQL Server.
TransferText
(TransferirTexto) Importa o exporta texto en formato ASCII.
Manipulaciones de la ventana activa Maximize
(Maximizar) Maximiza una ventana.
Minimize
(Minimizar) Reduce la ventana activa a un icono.
MoveSize
(DesplazarTamaño) Desplaza o cambia el tamaño de la ventana activa.
Restore
(Restaurar) Recupera el tamaño normal de la ventana activa.
Modificación de la interfaz Access AddMenu
(AgregarMenú) Permite crear una barra de menú o un menú contextual.
DoMenuItem
(MostrarBarraHerramientas) Muestra el
comando de menú apropiado para Microsoft Access. Hourglass
(RelojDeArena) Muestra el puntero del ratón en forma de reloj de arena o no.
LockNavigationPane
(BloquearPanelExploración) Permite impedir a los usuarios suprimir objetos de base de datos que se muestran en el panel de navegación.
SetDisplayedCategories
(DefinirCategoríasMostradas) Precisa las
categorías que se muestran en Desplazarse a la categoría en la barra de título del panel de navegación. SetMenuItem
(EstablecerElementoMenú) Permite establecer el estado (activo o inactivo, seleccionado o no seleccionado) de elementos de menú personalizado o global para la ventana activa.
SetWarnings
(EstablecerAdvertencias) Activa o desactiva la
visualización de los mensajes de advertencia estándar. ShowToolbar
(MostrarBarraDeHerramientas) Muestra u oculta una barra de herramientas.
Diversos Beep
(Bip) Emite un bip sonoro.
ClearMacroError
(BorrarErrorDeMacro) Suprime la información
relativa a un error guardada en un objetoErrorDeMacro. Echo
(Eco) Oculta o muestra los resultados de una macro durante su ejecución.
PlainText
Suprime el formato del texto enriquecido de una cadena y devuelve una cadena de texto plano.
SetDefaultWorkgroupFile
Define el archivo especificado como archivo de grupo de trabajo predeterminado.
SingleStep
(PasoaPaso) Suspende la ejecución de la macro activa y abre el cuadro de diálogo Paso a paso.
Acciones de macros no tomadas en cuenta por el objeto DoCmd El objeto DoCmd no toma en cuenta las siguientes macros pero éstas pueden ser sustituidas por una función o una instrucción VBA. CuadroMsj
Utilice la función o la instrucción MsgBox.
EjecutarAplicación
Utilice la función Shell.
EjecutarCódigo
Llame directamente a la función en Visual Basic.
EnviarTeclas
Utilice la instrucción SendKeys.
Las acciones DetenerTodasMacros y DetenerMacro no tienen equivalente en Visual Basic.
3. El objeto Screen El objeto Screen hace referencia al objeto activo ya se trate de un formulario, de una página de acceso a datos, de un informe o de un control. El objeto Screen se utiliza especialmente en los procedimientos de evento de esos distintos objetos (Control, Data Access Page, Form, Report). Este objeto sólo contiene propiedades.
Propiedades ActiveControl
Proporciona una referencia al control activo.
ActiveDataAccessPage
Proporciona una referencia a la página de acceso a datos activa.
ActiveDataSheet
Proporciona una referencia a la hoja de datos activa.
ActiveForm
Proporciona una referencia al formulario activo.
ActiveReport
Proporciona una referencia al informe activo.
Application
Permite acceder al objeto Application y a sus propiedades.
MousePointer
Permite especificar el tipo de puntero del ratón.
Parent
Proporciona una referencia al padre (objeto principal) de un control, de una sección, de un subformulario, etc.
PreviousControl
Proporciona una referencia al último control activo antes del control actual.
Ejemplo Sub CmdScreen_Click()
’ Muestra el nombre del control anterior Dim ctl As Control Set ctl = Screen.PreviousControl MsgBox ctl.Name ’ Transforma el puntero del ratón en un reloj de arena Screen.MousePointer = 11 ’ Recupera el puntero predeterminado Screen.MousePointer = 0 ’ Muestra el nombre del formulario activo Dim frm As Form Set frm = Screen.ActiveForm MsgBox frm.Name ’ Modifica el título del formulario frm.Caption = "Formulario de entrada de los empleados" End Sub
4. La colección References La colección References contiene los objetos Reference correspondientes a las bibliotecas de objetos que provienen de otras aplicaciones. Para agregar (o eliminar) una referencia a una biblioteca de objetos, seleccione la opción Referencias del menú Herramientas. La ventana siguiente le permite seleccionar las referencias deseadas:
Propiedades Count
Determina el número de objetos referencia.
Parent
No empleada.
Métodos AddFromFile
Crea una referencia a una biblioteca a partir de un nombre de archivo.
AddFromGuid
Crea una referencia a una biblioteca a partir de su GUID (identificador global único en el registro de Windows).
Item
Devuelve una referencia en función de su posición en la colecciónReferences.
Remove
Elimina un objeto referencia de la colección References.
Propiedades del objeto Reference BuiltIn
Indica si una referencia predeterminada es necesaria para que Access funcione correctamente.
FullPath
Devuelve la ruta de acceso y el nombre del archivo de la biblioteca referenciada.
Guid
Devuelve el GUID, identificador de la biblioteca en el Registro de Windows.
IsBroken
Indica si una referencia válida está asignada al objeto en el Registro de Windows.
Kind
Indica el tipo de referencia del objeto.
Major
Indica el número de versión principal de la aplicación a la que está asociada la referencia.
Minor
Indica el número de versión secundario de la aplicación.
Name
Indica el nombre de la referencia.
Ejemplo Private Sub cmdReferencias_Click() Dim ref As Reference Dim i As Integer ’ Muestra el número total de referencias MsgBox "El número total de referencias es: " & References.Count ’ Recorre las referencias y muestra su nombre y ruta de acceso i = 0 For Each ref In Application.References MsgBox " Nombre: " & ref.Name & " " & Chr(13) & Chr(13) _ & " Ruta: " & ref.FullPath Next ref ’ Agrega las bibliotecas de objeto Excel y Word ’ Error si la biblioteca ya ha sido referenciada On Error Resume Next Application.References.AddFromFile "Excel.exe" Application.References.AddFromFile "MsWord.olb" On Error GoTo 0 ’ Muestra el número total de referencias MsgBox "El número total de referencias es: " & References.Count End Sub
5. La colección Printers La colección Printers contiene objetos Printer que representan cada uno una impresora disponible en el sistema actual. El objeto Printer no existía en las versiones anteriores de Access.
Propiedades del objeto Printer
BottomMargin
En combinación con las propiedades TopMargin, RightMargin yLeftMargin, esta propiedad permite especificar los márgenes de una página.
ColorMode
Indica si la impresora debe imprimir en color (acPRCMColor) o no (acPRCMMonochrome).
ColumnSpacing
Indica el espaciado vertical de las secciones de Detalle de un formulario.
Copies
Indica el número de copias que deben imprimirse.
DataOnly
Permite imprimir solamente los datos de una tabla o de una consulta en la vista Hoja de datos.
DefaultSize
Devuelve el valor True si se emplea el tamaño de la sección de detalle en vista Diseño al imprimir un informe o un formulario.
DeviceName
Indica el nombre del dispositivo de impresión.
DriverName
Indica el nombre del controlador utilizado por la impresora.
Duplex
Indica cómo gestiona la impresora la impresión dúplex.
ItemLayout
Indica si la impresora traza las columnas en horizontal y luego en vertical o en vertical y luego en horizontal.
ItemsAcross
Devuelve o define un valor de tipo Entero Largo que indica el número de columnas que deben imprimirse en el caso de informes o de etiquetas en varias columnas.
ItemSizeHeight
Devuelve o define un valor de Entero Largo que indica la altura de la sección de detalle de un formulario o de un informe en twips.
ItemSizeWidth
Devuelve o define un valor de tipo Entero Largo que indica la anchura de la sección de detalle de un formulario o de un informe en twips.
LeftMargin
Margen izquierdo de una página impresa.
Orientation
Indica la orientación de la impresión (acPRORPortrait oacPRORLandscape).
PaperBin
Indica qué bandeja de papel debe utilizar la impresora.
PaperSize
Indica el tamaño de papel que debe utilizarse durante la impresión.
Port
Indica el puerto al que está conectada la impresora.
PrintQuality
Indica la resolución que debe utilizar la impresora para los trabajos de impresión.
RightMargin
Margen derecho de una página impresa.
RowSpacing
Devuelve o define un valor de tipo Entero Largo que representa el espaciado horizontal de las secciones de detalle en twips.
TopMargin
Margen superior de una página impresa.
Las demás propiedades (ColumnSpacing, RowSpacing, ItemSizeHeight...) permiten definir el formato de la sección Detalle de un formulario o de un informe.
Objetos de acceso a datos DAO y ADO Los objetos de acceso a datos son muy útiles: permiten, mediante VBA, manipular los datos (búsquedas, actualizaciones, agregar registros...) de bases de datos locales o remotas. En las versiones anteriores a Access 2000, el único modelo de acceso a datos era el modelo DAO: Data Access Objects. Con Access 2000 aparece el modelo ADO: ActiveX Data Objects. Microsoft recomienda utilizar el modelo ADO por los motivos siguientes: mejor implementación de SQL Server, mejor rendimiento en entornos cliente/servidor, código VBA más corto y más sencillo. Si desarrolla una nueva aplicación, puede utilizar el modelo ADO incluso si su aplicación accede a una base de datos local de tipo Access. Si desea más adelante migrar sus datos a MSDE (Microsoft Data Engine) o SQL Server, su código funcionará de manera óptima. Si hace evolucionar una aplicación existente utilizando el modelo DAO, es posible modificar su código para transformar los objetos DAO en objetos ADO.
El modelo de acceso a datos DAO 1. Presentación La biblioteca de objetos DAO (Data Access Objects) incorpora dos entornos de bases de datos distintos, llamados espacios de trabajo: los espacios de trabajo Microsoft Jet: permiten acceder a bases de datos de tipo Access, a servidores de bases de datos ODBC (Open Database Connectivity) y a bases de datos externas como dBASE, Microsoft Excel y Paradox accesibles mediante un controlador ISAM (Indexed Sequential Access Method). los espacios de trabajo ODBCDirect: permiten acceder a servidores de bases de datos ODBC de manera "directa", es decir sin cargar el motor de base de datos Microsoft Office 14. Por consiguiente, este espacio de trabajo está recomendado para ejecutar consultas, procedimientos almacenados o funciones específicas de ODBC en un servidor remoto de tipo SQL Server. Para poder utilizar la biblioteca de objetos DAO, es necesario seleccionar la referencia Microsoft DAO 3.6 Object Library en la lista de referencia de las bibliotecas de objetos (para mostrar esta lista, seleccione la opción Referencias del menú Herramientas). Si esta referencia no está disponible, debe seleccionar el archivo DAO360.dll mediante el botón de comando Examinar. Este archivo está generalmente situado en el directorio C:\Archivos de programa\Common Files\Microsoft Shared\DAO. El archivo de ayuda DAO360.chm, proporcionado con los ejemplos del libro, le permite obtener información detallada sobre la utilización del modelo de objetos DAO.
2. Jerarquía de los objetos DAO
3. Descripción de las colecciones Existe una colección para cada uno de los tipos de objeto DAO, con la excepción del objeto DBEngine. Todas las colecciones incluyen todos los objetos de un tipo determinado. Por ejemplo, la colecciónDataBases contiene todos los objetos DataBase abiertos. Todos los objetos DAO poseen una colección Properties, con la excepción de los objetos Error. La mayoría de los objetos DAO disponen de colecciones por defecto. Por ejemplo, la colección por defecto de un objeto Recordset es la colección Fields. De este modo puede simplificarse el código. Containers
Conjunto de los objetos Container de una base de datos.
Databases
Contiene todas las bases de datos (objetos DataBase) abiertas en un Workspace.
Documents
Conjunto de los objetos Document de un Container.
Errors
Conjunto de los errores (Error) del motor de acceso a datos (DBEngine).
Fields
Conjunto de los campos (Field) de una tabla (TableDef), de una consulta (QueryDef), de un índice (Index), de un conjunto de
registros (Recordset) o de una relación (Relation). Groups
Conjunto de los grupos de usuarios (Group) de un Workspace o conjunto de los grupos de usuarios (Group) a los que pertenece un usuario (User).
Indexes
Conjunto de los índices (Index) de una tabla (TableDef).
Parameters
Conjunto de los parámetros (Parameter) de una consulta (QueryDef).
Properties
Conjunto de las propiedades (Property) de un objeto.
QueryDefs
Contiene todas las definiciones de consulta (QueryDef) de una base de datos (Database).
Recordsets
Conjunto de los conjuntos de registros abiertos (Recordset) de una base de datos (Database).
Relations
Conjunto de las relaciones (Relation) de una base de datos (Database).
TableDefs
Contiene todas las definiciones de tabla (TableDef) de una base de datos (Database).
Users
Conjunto de los usuarios (User) de un Workspace o de un grupo de usuarios (Group).
Workspaces
Contiene todos los objetos Workspace activos.
Propiedades Count
Devuelve el número de elementos en la colección.
Item
Devuelve un miembro específico de una colección en función de su posición o de su clave.
Todas las colecciones pueden utilizar estas propiedades.
Ejemplo Lista de las tablas de la base de datos actual. Dim intI As Integer For intI = 0 To CurrentDb.TableDefs.Count ‐ 1 MsgBox CurrentDb.TableDefs.Item(intI).Name Next intI
Métodos Append
Agrega un elemento a la colección.
Delete
Elimina un elemento de la colección.
Refresh
Actualiza el contenido de la colección.
Las colecciones Errors, Databases, Containers, Documents, Parameters y Recordsets no pueden utilizar los métodos Append y Delete. Su contenido está gestionado directamente por el motor de la base de datos.
4. El objeto DBEngine Representa el motor de acceso a datos Microsoft Jet. Contiene y controla el conjunto de los objetos DAO.
Propiedades DefaultType
Define el tipo de espacio de trabajo, Microsoft Jet o ODBCDirect.
DefaultUser yDefaultPassword
Nombre de usuario y contraseña utilizados por el motor de base de datos Microsoft Jet cuando un objeto Workspace se crea sin nombre de usuario ni contraseña específica.
IniPath
Define o devuelve informaciones sobre la clave del Registro de Windows que contiene valores relativos al motor de base de datos Microsoft Jet.
SystemDB
Define o devuelve la ruta de acceso al archivo de informaciones sobre el grupo de trabajo actual (MDW).
Version
Valor que indica la versión de la base de datos o del motor de base de datos asociado al objeto.
Métodos CompactDatabase
Compacta una base de datos cerrada.
CreateWorkspace
Crea un nuevo objeto Workspace.
Idle
Interrumpe el tratamiento, permitiendo al motor de base de datos Microsoft Jet terminar las tareas en espera.
SetOption
Permite modificar temporalmente las opciones del motor de acceso a datos Microsoft Jet.
Colecciones Workspaces, Properties, Errors Ejemplo Compactar la base de datos Presupuesto en Presupuesto2. DBEngine.CompactDatabase "c:\Presupuesto\Presupuesto.accdb", _ "c:\Presupuesto\Presupuesto2.accdb" Mostrar la versión del motor Microsoft Jet. MsgBox DBEngine.Version, vbExclamation, "Número de versión" _ & "del motor Microsoft Jet"
5. Los objetos Workspace Un objeto Workspace (espacio de trabajo) permite definir una sesión de trabajo para un usuario.
Propiedades Name
Devuelve el nombre del objeto Workspace.
Type
Devuelve o define el tipo de conexión del objeto Workspace (constante dbUseJet si el objeto Workspace está conectado al motor de base de datos Microsoft Jet, constante dbUseODBC si el objeto Workspace está conectado a un origen de datos ODBC).
UserName
Devuelve el nombre del propietario del objeto Workspace.
Otras propiedades DefaultCursorDriver, IsolateODBCTrans, LoginTimeout
Métodos BeginTrans
Inicia una nueva transacción.
Close
Cierra el Workspace.
CommitTrans
Termina y valida la transacción actual.
CreateDatabase
Crea un nuevo objeto Database.
CreateGroup
Crea un nuevo grupo de usuarios.
CreateUser
Crea un nuevo usuario.
OpenDatabase
Abre una base de datos.
RollBack
Anula y termina una transacción en curso y restablece el estado anterior de la base de datos.
Colecciones Databases, Users, Groups, Properties Ejemplo Apertura de la base de datos Presupuesto en el espacio de trabajo activo. Dim wrk As Workspace Dim dbs As Database Set wrk = DBEngine.Workspaces(0) Set dbs = wrk.OpenDatabase("C:\Presupuesto\Presupuesto.accdb")
6. Les objetos Database Un objeto Database representa una base de datos abierta.
Propiedades CollatingOrder
Define el método de comparación de las cadenas de caracteres según el idioma.
Connect
Determina la información necesaria para abrir una base de datos externa o para adjuntar una tabla de una base externa.
DesignMasterID
Determina el GUID del diseño principal de un conjunto de réplicas.
Name
Devuelve el nombre de la base.
RecordsAffected
Indica el número de registros afectados por el último métodoExecute.
Replicable
Indica si la base de datos se puede replicar.
ReplicaID
Devuelve el identificador de una réplica.
Transactions
Indica si la base de datos de la conexión toma en cuenta las transacciones (ODBCDirect).
Updatable
Indica si las modificaciones del objeto Database están
autorizadas. Version
Identifica la versión del formato de la base de datos.
Métodos Close
Cierra el objeto Database.
CreateProperty
Crea un nuevo objeto Property.
CreateQueryDef
Crea un nuevo objeto QueryDef.
CreateRelation
Crea un nuevo objeto Relation.
CreateTableDef
Crea un nuevo objeto TableDef.
Execute
Ejecuta una consulta de acción o una instrucción SQL.
MakeReplica
Crea una réplica de la base de datos.
NewPassword
Define una nueva contraseña para una base de datos Microsoft Jet.
OpenRecordset
Crea un nuevo objeto Recordset.
PopulatePartial
Sincroniza los cambios aportados a una réplica parcial con la réplica completa.
Synchronize
Sincroniza dos réplicas.
Colecciones TableDefs, QueryDefs, Relations, Containers, Recordsets, Properties Ejemplo Inicialización de una referencia sobre la base de datos actual. Dim dbsPresupuesto As DAO.Database Set dbsPresupuesto = CurrentDb() Apertura de una base de datos externa. Dim dbsPresupuesto As DAO.Database Set dbsPresupuesto = DBEngine.OpenDatabase _ ("C:\Presupuesto\Presupuesto.accdb") Creación de un objeto RecordSet de tipo tabla en sólo lectura en la tabla Clientes de la base de datos actual. Dim dbsPresupuesto As Database Dim rstCli As DAO.Recordset Set dbsPresupuesto = DBEngine.OpenDatabase("C:\Presupuesto\ Presupuesto.accdb" Set rstCli = dbsPresupuesto.OpenRecordset("Clientes", dbOpenTable, _ dbReadOnly)
7. Los objetos Recordset Un objeto Recordset representa los registros de una tabla o los resultantes de una consulta. Existen cuatro tipos de objetos Recordset: Recordset
Definición
Interés
Constante de declaración
Table
Representa una tabla.
Permite utilizar los índices.
dbOpenTable
Dynaset (hoja de respuestas dinámica)
Representa el resultado de una consulta cuyos registros pueden actualizarse.
Permite trabajar sobre los datos originarios de varias tablas.
dbOpenDynaset
ForwardOnly(adelante solamente)
Idem Snapshot pero el desplazamiento de los registros solamente hacia delante.
Velocidad
dbOpenForwardOnly
Snapshot(instantánea)
Representa el resultado de una consulta en sólo lectura.
Velocidad en comparación con el Dynaset.
dbOpenSnapshot
Los tipos de objetos Recordset a los que concierne cada propiedad o método se representan medianteT (Table), D (Dynaset), S (Snapshot), F (ForwardOnly).
Propiedades AbsolutePosition
Recordset DS
Determina la posición relativa de un registro en un recordset. BOF
DSTF
Indica un posicionamiento al inicio del Recordset. Bookmark
DST
Devuelve o define un marcador que identifica de manera única un registro. Bookmarkable
DST
Indica si el Recordset admite marcadores. CacheStart
D
Define o devuelve el marcador del primer registro que debe situarse en memoria caché. DateCreated
T
Devuelve la fecha y la hora de creación de la tabla subyacente. EditMode
DT
Indica el estado de modificación del registro actual. EOF
DSTF
Indica un posicionamiento al final del Recordset. Filter
DSF
Permite definir el filtro que debe aplicarse. Index
T
Define el índice que debe emplearse. LockEdits
DTS
Define la condición de bloqueo. LastModified
DT
Devuelve un marcador que indica el último registro modificado. LastUpdated Devuelve la hora de la última modificación de la tabla de origen subyacente.
T
Name Devuelve el nombre del Recordset.
DSTF
NoMatch Indica si el registro buscado ha sido encontrado.
DST
PercentPosition Devuelve la posición actual de un registro en porcentaje del número total de registros.
DST
RecordCount
DSTF
Indica el número de registros solicitados. Restartable
DSFT
Indica si el Recordset admite el método Requery que ejecuta de nuevo la consulta subyacente. Sort
DS
Define el criterio de ordenación. Transactions
DTSF
Indica si el Recordset soporta las transacciones. Type
DSTF
Indica el tipo de Recordset. Updatable
DTSF
Indica las actualizaciones autorizadas. ValidationText
DSTF
Especifica el mensaje de error si la condición de validación es falsa. ValidationRule
DSTF
Especifica la condición de validación del Recordset. Métodos AddNew
Recordset DT
Crea un nuevo registro. CancelUpdate
DT
Cancela las actualizaciones pendientes. Clone
DST
Crea una copia del Recordset. Close
DSTF
Cierra el Recordset. CopyQueryDef
DSF
Crea una copia del objeto QueryDef asociado al Recordset. Delete
DT
Elimina el registro actual. Edit
DT
Pasa el registro actual al modo Edición. FindFirst
DS
Localiza el primer registro que responde al criterio y lo convierte en el registro actual. FindLast Localiza el último registro que responde al criterio y lo convierte en el registro actual.
DS
FindNext Localiza el registro siguiente que responde al criterio y lo convierte en el registro actual.
DS
FindPrevious
DS
Localiza el registro anterior que responde al criterio y lo convierte en el registro actual. GetRows
DSTF
Extrae varias filas de un Recordset y las copia en una matriz. MoveFirst
DST
Localiza el primer registro y lo convierte en el registro actual. MoveLast
DST
Localiza el último registro y lo convierte en el registro actual. MoveNext
DST
Localiza el siguiente registro y lo convierte en el registro actual. MovePrevious
DST
Localiza el registro anterior y lo convierte en el registro actual. Move
DST
Cambia la posición del registro actual. OpenRecordset
DST
Crea un nuevo Recordset. Requery
DSF
Actualiza los registros de un Recordset volviendo a ejecutar la consulta subyacente. Seek
T
Localiza en relación a un índice (Index) seleccionado, el primer registro que responda a los criterios especificados y lo convierte en el registro actual. Update Actualiza el registro.
DT
Ejemplo Transformación en mayúsculas de los caracteres del campo Cli_Empresa en la tabla Clientes. Dim dbs As Database Dim rstCli As DAO.Recordset ’ Creación del Recordset Set dbs = CurrentDb Set rstCli = dbs.OpenRecordset("Clientes", dbOpenTable) rstCli.MoveFirst ’ Recorre los registros With rstCli Do Until .EOF .Edit rstCli("Cli_Empresa") = UCase(rstCli("Cli_Empresa")) ’ Actualización .Update ’ Registro siguiente .MoveNext Loop End With rstCli.Close Utilización del método Seek: búsqueda de un cliente a partir de su código.
Dim dbs As Database Dim rstCli As DAO.Recordset Dim strCodigoCli As String ’ Creación del Recordset Set dbs = CurrentDb Set rstCli = dbs.OpenRecordset("Clientes", dbOpenTable) With rstCli ’ Entrada del código cliente strCodigoCli = InputBox("Introduzca el código cliente") ’ Índice actual: clave primaria .Index = "PrimaryKey" ’ Búsqueda .Seek "=", strcodigocli ’ Registro no encontrado If .NoMatch Then MsgBox "Cliente no encontrado" Else ’ Registro encontrado MsgBox "Empresa : " & rstCli("Cli_Empresa") End If End With rstCli.Close Utilización del método Find: búsqueda de los clientes cuyo nombre de Empresa empiece por un valor determinado. Dim dbs As DAO.Database Dim rstCli As DAO.Recordset Dim strEmp As String Dim strCrit As String ’ Creación del Recordset Set dbs = CurrentDb Set rstCli = dbs.OpenRecordset("Clientes", dbOpenSnapshot) With rstCli ’ Entrada del código cliente strEmp = InputBox("Introduzca las primeras letras de la Empresa") .MoveLast ’ Búsqueda strCrit = "Cli_Empresa Like ’" & strEmp & "*’" .FindFirst strCrit ’ Registro no encontrado If .NoMatch Then MsgBox "Cliente no encontrado" Else ’ Si encontrado: búsqueda de los siguientes Do While True MsgBox rstCli("Cli_Empresa") .FindNext strCrit If .NoMatch Then Exit Do Loop End If End With
8. Los objetos Tabledef Un objeto TableDef representa la definición guardada de una tabla o de una tabla adjunta creada en una base externa.
Propiedades Attributes
Determina las características de la tabla descrita por
elTableDef (exclusividad, tabla vinculada, tabla del sistema...). ConflictTable
Devuelve el nombre de la tabla de conflictos que contiene los registros que entraban en conflicto durante una operación de sincronización de réplicas.
Connect
Devuelve la información para el origen del objeto TableDef.
DateCreated
Indica la fecha y la hora de creación de la tabla subyacente.
KeepLocal
Determina si la tabla no debe formar parte de una operación de réplica.
LastUpdated
Indica la fecha y la hora de la última modificación de la tabla subyacente.
Name
Devuelve el nombre de la tabla.
RecordCount
Indica el número de registros de la tabla.
Replicable
Determina si la tabla debe formar parte de una operación de réplica.
ReplicaFilter
Define los registros de una tabla que deban formar parte de una operación de réplica.
SourceTableName
Especifica el nombre de la tabla vinculada.
Updatable
Indica si está autorizada la modificación de la estructura.
ValidationText
Especifica el mensaje de error si la condición de validación es falsa.
ValidationRule
Especifica la condición que debe respetarse para la validación del objeto.
Métodos CreateField
Crea un nuevo campo (Field).
CreateIndex
Crea un nuevo Index.
CreateProperty
Crea un nuevo objeto Property.
OpenRecordset
Crea un nuevo Recordset.
RefreshLink
Actualiza los datos a partir de una tabla vinculada.
Colecciones Fields, Indexes, Properties Ejemplo Agregar un campo de tipo Memo a la tabla Clientes. Dim dbs As DAO.Database Dim tdf As DAO.TableDef Dim fld As DAO.Field Set dbs = CurrentDb Set tdf = dbs.TableDefs("Clientes") Set fld = tdf.CreateField("Cli_Coment", dbMemo) tdf.Fields.Append fld
9. Los objetos Field e Index a. Field
Un objeto Field representa un campo de una tabla (TableDef), de una relación (Relation), de una consulta (QueryDef), de un conjunto de registros (Recordset) o de un índice (Index).
Propiedades AllowZeroLength
Define si autoriza a una cadena vacía como valor de campo.
Attributes
Indica ciertas características del campo.
CollatingOrder
Especifica las características de comparación de cadenas de caracteres y de la ordenación.
DataUpdatable
Indica si el campo puede actualizarse.
DefaultValue
Define el valor por defecto del campo.
FieldSize
Devuelve el tamaño de un campo Memo o Binario Largo (Objeto OLE).
ForeignName
Especifica, en una relación Relation, el nombre del campo de una tabla externa (tabla vinculada) que corresponde a un campo (clave primaria) de la tabla de origen (tabla de referencia).
Name
Devuelve el nombre del campo.
OrdinalPosition
Especifica el orden de presentación de los campos.
Required
Define si el campo debe contener obligatoriamente un valor.
Size
Define o devuelve el tamaño del campo.
SourceField
Indica el nombre del campo origen de los datos.
SourceTable
Indica el nombre de la tabla origen de los datos.
Type
Indica el tipo de datos del campo.
Value
Devuelve el valor del campo.
ValidationText
Especifica el mensaje de error devuelto si la condición de validación del campo es falsa.
ValidateOnSet
Especifica si la validación de valor del campo es inmediata después de su modificación.
ValidationRule
Especifica la condición de validación del campo.
Métodos AppendChunk
Agrega datos de una expresión de cadena a un campo de tipoMemo u Objeto OLE.
CreateProperty
Crea un nuevo objeto Property.
GetChunk
Lee la totalidad o parte de un campo Memo u Objeto OLE.
Colecciones Properties Ejemplo Muestra la lista de todos los campos (nombre y tipo) de la tabla Clientes, en la ventana Inmediato. Dim dbs As DAO.Database Dim tdf As DAO.TableDef Dim fld As DAO.Field
Set dbs = CurrentDb Set tdf = dbs.TableDefs("Clientes") For Each fld In tdf.Fields Debug.Print fld.Name & " " & fld.Type Next
b. Index Un objeto Index representa un índice asociado a un objeto TableDef o Recordset de tipo tabla.
Propiedades Clustered
Indica si el índice representa el índice por grupos en una tabla.
DistinctCount
Devuelve el número de valores únicos para este índice en la tabla asociada.
Foreign
Indica si el índice es una clave externa de la tabla.
IgnoreNulls
Indica si existe una entrada de índice para los registros cuyos campos indexados contienen el valor Null.
Name
Devuelve el nombre del índice.
Primary
Indica si el índice es la clave primaria.
Required
Define si todos los campos del índice deben contener obligatoriamente un valor.
Unique
Indica si los valores del índice son únicos (sin duplicados).
Métodos CreateField
Crea un nuevo campo para el índice.
CreateProperty
Crea una nueva propiedad.
Colecciones Fields, Properties Ejemplo Creación del índice Empresa en el campo Cli_Empresa de la tabla Clientes. Dim dbs As DAO.Database Dim tdf As DAO.TableDef Dim fld As DAO.Field Dim idx As DAO.Index Set dbs = CurrentDb Set tdf = dbs.TableDefs("Clientes") Set idx = tdf.CreateIndex("Empresa") Set fld = idx.CreateField("Cli_Empresa") idx.Unique = False idx.Fields.Append fld tdf.Indexes.Append idx
10. Los objetos QueryDef y Parameter a. QueryDef El objeto QueryDef representa la definición guardada de una consulta en una base de datos.
Propiedades Connect
Proporciona información sobre la base de datos utilizada en la consulta.
DateCreated
Indica la fecha y la hora de creación de la consulta.
KeepLocal
Determina si la consulta debe formar parte o no de una operación de replicación.
LastUpdated
Indica la fecha y la hora de última actualización de la consulta.
MaxRecords
Define el número máximo de registros que debe devolver la consulta.
Name
Devuelve el nombre de la consulta.
RecordsAffected
Indica el número de registros afectados por el último métodoExecute.
Replicable
Determina si la consulta debe formar parte de una operación de replicación.
ReturnsRecords
Indica si la consulta ha devuelto registros.
SQL
Define o devuelve la instrucción SQL asociada a la consulta.
Type
Define el tipo de la consulta (selección, agregar...).
Updatable
Indica si se autorizan las actualizaciones a través de la consulta.
Métodos Close
Cierra la consulta.
CreateProperty
Crea una nueva propiedad.
Execute
Inicia un consulta de acción o ejecuta una instrucción SQL.
OpenRecordset
Crea un nuevo Recordset.
Colecciones Fields, Parameters, Properties Ejemplo Creación de una nueva consulta basada en una instrucción SQL. Private Sub cmdSQL_Click() Dim dbs As Database Dim qdf As QueryDef On Error GoTo cmdSQL_Error Set dbs = CurrentDb Set qdf = dbs.CreateQueryDef("Lista de " _ & "empleados seleccionados por fecha de contratación") qdf.SQL = "Select * from Empleados " _ & "Order by [Fecha Contratación]" Exit Sub cmdSQL_Error: MsgBox "La consulta ya existe" End Sub
b. Parameter
Un objeto Parameter representa un parámetro de un objeto QueryDef con parámetros.
Propiedades Name
Define o devuelve el nombre del parámetro.
Type
Define o devuelve el tipo de datos del parámetro.
Value
Define o devuelve el valor del parámetro.
Colecciones Properties Ejemplo Creación de una consulta con parámetros y presentación del número de parámetros. Private Sub cmdSQL_Click() Dim dbs As Database Dim qdf As QueryDef Dim prm As Parameter On Error GoTo cmdSQL_Error Set dbs = CurrentDb Set qdf = dbs.CreateQueryDef("Lista de los empleados" _ & " contratados en un periodo determinado") qdf.SQL = "Select * from Empleados Where " _ & "[Fecha contratación] >= [Introduzca la fecha de inicio] " _ & " And [Fecha contratación] <= [Introduzca la fecha de fin] " MsgBox qdf.Parameters.Count Exit Sub cmdSQL_Error: MsgBox "La consulta ya existe" End Sub
11. Los objetos Relation Un objeto Relation representa una relación entre los campos de dos objetos TableDef.
Propiedades Attributes
Indica ciertas características de la relación (uno a varios, integridad...).
ForeignTable
Define o devuelve el nombre de la tabla externa.
Name
Define o devuelve el nombre de la relación.
PartialReplica
Define si la relación debe tenerse en cuenta cuando se rellena unaRéplica parcial a partir de una Réplica completa.
Table
Define o devuelve el nombre de la TableDef o del QueryDef de origen.
Métodos CreateField
Colecciones Fields, Properties Ejemplo
Crea un nuevo objeto Field.
Almacenamiento en una tabla de las distintas relaciones y sus propiedades. La tabla Relaciones contiene 3 campos de texto (Rel_Origen, Rel_ Externa, Rel_Tiporel y 3 campos boleanos (Rel_Integridad, Rel_Act_Cascada, Rel_Sup_Cascada). Dim dbs As DAO.Database Dim rst As DAO.Recordset Dim rel As DAO.Relation ’ Creación del Recordset ’ y eliminación de los registros existentes Set dbs = CurrentDb Set rst = dbs.OpenRecordset("Relaciones", dbOpenTable) Do While Not rst.EOF rst.Delete rst.MoveNext Loop ’ Almacenamiento de las distintas relaciones del modelo ’ relacional en la tabla Relaciones For Each rel In dbs.Relaciones rst.AddNew rst("REL_ORIGEN") = rel.Table rst("REL_EXTERNA") = rel.ForeignTable If rel.Attributes And dbRelationUnique Then rst("REL_TIPOREL") = "1 a 1" Else rst("REL_TIPOREL") = "1 a n" End If rst("REL_INTEGRIDAD") = IIf(rel.Attributes And _ dbRelationDontEnforce, False, True) rst("REL_ACT_CASCADA") = IIf(rel.Attributes And _ dbRelationUpdateCascade, True, False) rst("REL_SUP_CASCADA") = IIf(rel.Attributes And _ dbRelationDeleteCascade, True, False) rst.Update Next rst.Close Visualización en Access de la tabla RELACIONES actualizada:
12. Los objetos Container y Document a. Container Un objeto Container representa el conjunto de las informaciones sobre una base de datos y sobre cada tipo de objetos que ésta contiene.
Propiedades AllPermissions
Devuelve todos los permisos que se aplican a la
propiedadUserName del objeto Container actual. Inherit
Indica si los nuevos objetos Document heredarán o no, un valor para la propiedad Permissions.
Name
Indica el nombre del container.
Owner
Indica el propietario del container.
Permissions
Define los permisos de un usuario o de un grupo de usuarios identificados por la propiedad UserName del objeto Container.
UserName
Define el nombre del usuario.
Ejemplo Muestra la lista de los nombres de todos los objetos Container de la base en la ventana Inmediato. Dim dbs As DAO.Database Set dbs = CurrentDb Dim ctn As Container For Each ctn In dbs.Containers Debug.Print ctn.Name Next
b. Document Un objeto Document representa el conjunto de la información relacionada con un tipo de objeto (base de datos, tabla, consulta o relación guardadas). Cada objeto Container dispone de una colecciónDocuments que contiene objetos Document.
Propiedades AllPermissions
Devuelve todos los permisos que se aplican propiedadUserName actual del objeto Document.
a
la
Container
Devuelve el nombre del objeto Container al que pertenece elDocument.
DateCreated
Devuelve la fecha y la hora de creación de la tabla subyacente.
LastUpdated
Devuelve la fecha y la hora de la última modificación de la tabla subyacente.
Name
Devuelve el nombre del Document.
Owner
Devuelve el nombre del propietario del Document.
Permissions
Define los permisos del usuario o del grupo de usuarios identificados mediante la propiedad UserName del objetoDocument.
Properties
Lista de propiedades (fecha de creación, de la última actualización...) del objeto Document.
UserName
Define el nombre del usuario.
Colecciones Properties Ejemplo Muestra la lista de todos los formularios en la ventana Inmediato: Dim dbs As DAO.Database Dim ctn As Container Dim doc As Document Set dbs = CurrentDb For Each ctn In dbs.Containers If ctn.Name = "Forms" Then For Each doc In ctn.Documents Debug.Print doc.Name Next End If Next
13. Los objetos Group y User a. User Un objeto User representa una cuenta de usuario con sus permisos.
Propiedades Name
Define o devuelve el nombre de la cuenta de usuario.
PID
Devuelve el número de identificación personal de la cuenta de usuario.
PassWord
Devuelve la contraseña de la cuenta de usuario.
Métodos CreateGroup
Crea un nuevo objeto Group.
NewpassWord
Define una nueva contraseña para el usuario.
Colecciones Groups, Properties
b. Group Un objeto Group representa un grupo de usuarios que poseen los mismos permisos.
Propiedades
Name
Define o devuelve el nombre del grupo de usuarios.
PID
Define el número personal de la cuenta de grupo.
Métodos CreateUser
Crea un nuevo objeto User.
Colecciones Users, Properties Ejemplo Para cada grupo de trabajo, muestra en la ventana Inmediato el nombre del grupo y la lista de sus usuarios. Dim wrk As Workspace Dim usr As dao.User Dim grp As dao.Group Set wrk = DBEngine.Workspaces(0) For Each grp In wrk.Groups Debug.Print grp.Name With grp For Each usr In .Users Debug.Print usr.Name Next End With Next
14. El objeto Error Un objeto Error representa el detalle de un error de acceso a los datos.
Propiedades Description
Devuelve el texto del error.
HelpContext
Proporciona un identificador de contexto de ayuda en forma de variable de cadena, correspondiente a un tema de un archivo de ayuda Microsoft Windows.
HelpFile
Indica la ruta de acceso completa al archivo de ayuda correspondiente.
Number
Devuelve el número del error.
Source
Proporciona el nombre del objeto o de la aplicación que ha generado el error.
Ejemplo Desencadena intencionadamente un error y muestra todas las propiedades del objeto Error. Private Sub cmdError_Click() On Error GoTo Gest_Error ’ Desencadena intencionadamente un error ’ El fichero Presupuesto1.accdb no existe en el Archivo C:\Presupuesto DBEngine.Workspaces(0).OpenDatabase _ ("C:\Presupuesto\presupuesto1.accdb") Exit Sub
Gest_Error: Dim strError As String Dim errLoop As Variant ’ Recorre los elementos de la colección Errors ’ Muestra un mensaje con la descripción del error For Each errLoop In Errors With errLoop strError = _ "Error #" & .Number & vbCr strError = strError & _ " " & .Description & vbCr strError = strError & _ "(Origen: " & .Source & ")" & vbCr strError = strError & _ "Pulse F1 para ver " & _ "el tema " & .HelpContext & vbCr strError = strError & _ "en el archivo " & .HelpFile & "." End With MsgBox strError Next End Sub El mensaje que aparece es el siguiente:
15. Los objetos Property Un objeto Property representa una propiedad de un objeto.
Propiedades Inherited
Indica si la propiedad es heredada.
Name
Define el nombre de la propiedad.
Type
Define o devuelve el tipo de la propiedad.
Value
Define o devuelve el valor de la propiedad.
Ejemplo Presentación del nombre y del valor de cada propiedad de un objeto Recordset en la ventana Inmediato. Dim dbs As DAO.Database
Dim rst As DAO.Recordset Dim prp As DAO.Property Set dbs = CurrentDb Set rst = dbs.OpenRecordset("Clientes") ’ Recorre las propiedades For Each prp In rst.Properties On Error Resume Next Debug.Print prp.Name & " : " & prp.Value Next
El modelo de acceso a datos ADO 1. Presentación La biblioteca de objetos ADO (ActiveX Data Objects) le permite escribir una aplicación que accede a datos situados en un servidor de bases de datos y manejar éstas mediante un proveedor OLE DB. ADO tiene la ventaja de ser fácil de usar, con buen rendimiento y usando poca memoria y espacio de disco. ADO ofrece las funcionalidades básicas que permiten crear aplicaciones cliente/servidor y aplicaciones Web. Para poder utilizar la biblioteca de objetos ADO, es necesario seleccionar la referencia Microsoft ActiveX Data Objects 6.0 Library en la lista de referencias a las bibliotecas de objetos. Si esta referencia no está disponible, debe seleccionar el archivo MSADO15.dll mediante el botón de comando Examinar. Generalmente, este archivo está ubicado en el directorio C:\Archivos de programa\Common Files\System\ADO. Igualmente puede utilizar las extensiones ADO seleccionando la referencia Microsoft ADO Ext 6.0 for DLL and Security (archivo MSADOX.DLL). Estas extensiones le permiten acceder a objetos complementarios (catalgo, users, views…) del modelo ADO. El archivo de ayuda ADO210.chm ubicado en el directorio C:\Archivos de Programa\Common Files\MicrosoftShared\Office 15\1036, le permite obtener información detallada sobre la utilización de los modelos ADO.
2. ADO y OLE DB OLE DB es una tecnología que permite un acceso uniforme a los datos almacenados en diversas fuentes de información: bases de datos relacionales o no relacionales, correo, sistemas de archivos… Prácticamente todos los datos de la empresa son accesibles mediante OLE DB. ADO (ActiveX Data Objects) es la interfaz de programación utilizada para acceder a los datos de todos los proveedores de datos OLE DB. Arquitectura tecnológica
Los proveedores de datos o Providers son controladores que permiten comunicar con los orígenes de datos.
3. Jerarquía de los objetos ADO
4. Modelo de base de programación ADO ADO le permite ejecutar la siguiente secuencia de acciones: establecer una conexión a una base de datos OLE DB o ODBC por medio del objeto Connection, crear un comando que permita enviar una consulta SQL al servidor utilizando el objeto Command, ejecutar el comando. Si el comando devuelve filas, almacenarlas en un objeto Recordset, utilizar los datos del objeto Recordset: ordenar, filtrar, modificar, eliminar los registros, actualizar los datos: validar los eventuales cambios del objeto Recordset, incorporar las actualizaciones en una transacción, si se ha utilizado una transacción: aceptar o desechar las actualizaciones aportadas durante ésta. Ejemplo Dim cnn As New ADODB.Connection Dim cmd As New ADODB.Command Dim rs As New ADODB.Recordset ’ Etapa 1: establecer una conexión a un origen de datos ’ SQL Server mediante la tecnología OLEDB cnn.Open "Provider=SQLOLEDB.1;Data Source=SRV; _ & "Initial Catalog=Presupuesto;" _ & "Integrated Security=SSPI;Persist Security Info=False;" ’ Etapa 2: crear un comando Set cmd.ActiveConnection = cnn cmd.CommandText = "SELECT * FROM Clientes" ’ Etapa 3: ejecutar el comando rs.CursorLocation = adUseClient rs.Open cmd, , adOpenStatic, adLockBatchOptimistic ’ Etapa 4 : manipular los datos rs.Filter = "CLI_CIUDAD LIKE ’Barcelona’" Do While Not rs.EOF rs("CLI_PAÍS") = "E" rs.MoveNext Loop ’ Etapa 5: actualizar los datos modificados cnn.BeginTrans rs.UpdateBatch ’ Etapa 6: terminar la actualización de la base SQL If MsgBox("¿Desea confirmar las actualizaciones?", _ vbYesNo) = vbYes Then cnn.CommitTrans Else cnn.RollbackTrans End If
5. Descripción de los objetos ADO Connection
Representa una conexión con un origen de datos.
Command
Define un comando específico que debe ejecutarse sobre un origen de datos.
Recordset
Representa el conjunto de registros completo de una tabla de bases de datos o los resultados de un comando (ej: resultados de una consulta SQL).
Record
Funciona esencialmente como un objeto Recordset de una sola línea. El origen de los datos en un objeto Record puede ser un comando que devuelve una línea de datos a partir del servidor. La utilización de objetos Record en lugar de Recordset para recibir los resultados de una consulta que devuelve una sola línea de datos elimina el exceso de tratamiento vinculado a la instanciación del objeto Recordset, que es más complejo.
Stream
Proporciona el medio para leer, escribir y gestionar un flujo de bytes formado por texto o datos binarios.
6. Las colecciones ADO Parameters
Colección de todos los objetos Parameter de un objeto Command. El objeto Parameter representa un parámetro o argumento asociado a un objeto Command basado en una consulta con parámetros o un procedimiento almacenado con parámetros.
Properties
Colección de todos los objetos Property para un objeto determinado (Connection, Command, Recordset). El objeto Propertyrepresenta una característica dinámica de un objeto ADO definido por el usuario.
Errors
Colección de todos los objetos Error creados en respuesta a un error único vinculado al proveedor OLE DB. El objeto Error contiene informaciones relativas a un error de acceso a los datos.
Fields
Colección de todos los objetos Field correspondientes a una columna (o campo) de un objeto Recordset.
7. Los objetos Connection Métodos BeginTrans
Empieza una nueva transacción.
Cancel
Interrumpe y anula la ejecución de una consulta iniciada en modo asíncrono mediante los métodos Execute u Open.
Close
Cierra una conexión abierta, así como todos los objetos que dependen de ésta.
CommitTrans
Guarda los cambios efectuados a los datos y detiene la transacción en curso.
Execute
Ejecuta la consulta, la instrucción SQL, el procedimiento almacenado o el texto propio del proveedor OLE DB.
Open
Abre una conexión a un origen de datos para poder ejecutar comandos.
OpenSchema
Obtiene informaciones procedentes del proveedor OLE DB, relativas al esquema de la base de datos.
RollbackTrans
Anula los cambios realizados a los datos durante la transacción en curso y detiene esta última.
Propiedades Attributes
Define o devuelve una o varias características de un objetoConnection. El valor por defecto es cero.
CommandTimeout
Indica el intervalo de espera, en segundos, que debe respetarse al intentar la ejecución de un comando, antes de interrumpir el intento y generar un mensaje de error. El valor por defecto es 30.
ConnectionString
Define o devuelve la información utilizada para establecer una conexión con el origen de datos.
ConnectionTimeout
Indica el intervalo de tiempo, en segundos, que debe respetarse al intentar una conexión, antes de abortarla y generar un mensaje de error. El valor por defecto es 15.
CursorLocation
Define o devuelve el tipo de cursor que debe emplearse por defecto para esta conexión (cursor del lado cliente o cursor del lado servidor).
DefaultDatabase
Indica la base de datos por defecto de un objeto Connection.
IsolationLevel
Indica el nivel de aislamiento de un objeto Connection.
Mode
Indica los permisos de modificación de datos de un objetoConnection.
Provider
Indica el nombre del proveedor OLE DB del objetoConnection.
State
Indica si el objeto Connection está abierto o cerrado. Sólo lectura.
Version
Indica el número de versión ADO. Sólo lectura.
Ejemplo Creación de una referencia sobre la base de datos actual. Dim cncPresupuesto as ADODB.Connection Set cncPresupuesto = CurrentProject.Connection Apertura de una base de datos externa. Dim cncPresupuesto as ADODB.Connection cncPresupuesto.Open "Provider=Microsoft.ACE.OLEDB.15.0.;" _ & "Data Source = C:\Presupuesto\Presupuesto.accdb"; Utilización de los métodos CommitTrans y RollbackTrans para confirmar o anular la actualización de registros. Dim cnc As ADODB.Connection Dim strSQL As String Dim strMessage As String ’ Abre la conexión. Set cnc = CurrentProject.Connection ’ Inicio de la transacción cnc.BeginTrans ’ Consultas SQL de actualización strSQL = "UPDATE CLIENTES SET CLI_PAIS = ’España’" _ & "WHERE CLI_CIUDAD = ’Madrid’" cnc.Execute strSQL strSQL = "UPDATE CLIENTES SET CLI_PAIS = ’Francia’" _ & "WHERE CLI_CIUDAD = ’París’" cnc.Execute strSQL ’ Pregunta al usuario si desea validar las actualizaciones If MsgBox("¿Desea confirmar la actualización de los países?", vbYesNo) _
= vbYes Then ’ Guarda los cambios cnc.CommitTrans Else ’ Anula los cambios cnc.RollbackTrans End If
8. Los objetos Command Métodos Cancel
Interrumpe y cancela la ejecución de una consulta iniciada en modo asíncrono mediante el método Execute.
CreateParameter
Crea un nuevo objeto Parameter y especifica sus propiedades.
Execute
Ejecuta la consulta, la instrucción SQL o el procedimiento almacenado especificado mediante la propiedadCommandText.
Propiedades ActiveConnection
Indica el objeto Connection al que está asociado el comando.
CommandText
Contiene el texto del comando que debe enviarse al proveedor OLE DB.
CommandTimeout
Indica el intervalo de tiempo (en segundos) que debe respetarse al intentar la ejecución del comando, antes de interrumpir el intento y generar un mensaje de error. El valor por defecto es 30.
CommandType
Indica el tipo del objeto Command.
Name
Indica el nombre del objeto Command.
Prepared
Indica si es necesario guardar una versión compilada del comando en el servidor antes de la ejecución.
State
Indica si el objeto Command está abierto o cerrado. En sólo lectura.
Ejemplo Utilización del objeto Command para crear un conjunto de registros. Dim cnc As New ADODB.Connection Dim cmd As New ADODB.Command Dim rst As New ADODB.Recordset ’ Abre la conexión cnc.Open "Provider=Microsoft.ACE.OLEDB.15.0.;" _ & "Data Source = C:\Presupuesto\Presupuesto.accdb;PersistSecurity Info=False" ’ Ejecuta el comando Select Set cmd.ActiveConnection = cnc cmd.CommandType = adCmdText cmd.CommandText = "SELECT * FROM CLIENTES WHERE" _ & " CLI_CIUDAD = ’Madrid’" Set rst = cmd.Execute
’ Muestra el nombre de la empresa ’ en la ventana Inmediato Do While Not rst.EOF Debug.Print rst("CLI_EMPRESA") rst.MoveNext Loop rst.Close cnc.Close
9. Los objetos Recordset Métodos AddNew
Crea un nuevo registro para un objeto Recordset que pueda actualizarse.
Cancel
Cancela la ejecución de una operación Open asíncrona en espera.
CancelBatch
Cancela una actualización por lotes en espera.
CancelUpdate
Cancela todas las modificaciones aportadas al registro actual o a un nuevo registro antes de llamar al método Update.
Clone
Crea un objeto Recordset duplicado a partir de un objetoRecordset existente.
Close
Cierra el objeto Recordset abierto, así como todos los objetos que dependen de éste.
CompareBookmarks
Compara dos marcadores y devuelve un valor que indica sus posiciones relativas.
Delete
Elimina el registro actual o un grupo de registros.
Find
Busca en un objeto Recordset el registro correspondiente a criterios específicos.
GetRows
Extrae varios registros de un objeto Recordset y los coloca en una matriz.
GetString
Devuelve un objeto Recordset en forma de cadena.
Move
Desplaza la posición objetoRecordset.
MoveFirst
Desplaza la posición del registro actual hasta el primer registro del objeto Recordset.
MoveLast
Desplaza la posición del registro actual hasta el último registro del objeto Recordset.
MoveNext
Desplaza la posición del registro actual hasta el registro siguiente del objeto Recordset.
MovePrevious
Desplaza la posición del registro actual hasta el registro anterior del objeto Recordset.
NextRecordset
Devuelve el conjunto de registros siguiente en el caso de que un comando conlleve varias consultas de selección.
Open
Abre un cursor que representa los registros de una tabla o los resultados de una consulta.
Requery
Actualiza los datos de un objeto Recordset volviendo a ejecutar la consulta en la que se basa el objeto.
Resync
Actualiza los datos del objeto Recordset en curso a partir de la base de datos subyacente.
del
registro
actual
en
un
Save
Guarda el objeto Recordset en un archivo.
Seek
Busca en el índice de un objeto Recordset un registro correspondiente a un valor y reemplaza el registro actual por el registro encontrado.
Supports
Determina si un objeto Recordset soporta un tipo de funcionalidad particular.
Update
Guarda los cambios aportados al registro actual del objetoRecordset.
UpdateBatch
Guarda en el disco todas las actualizaciones por lotes en espera.
Propiedades AbsolutePage
Indica la página del registro actual.
AbsolutePosition
Indica la posición ordinal del registro actual dentro de un objeto Recordset.
ActiveCommand
Indica el objeto Command que ha objeto Recordsetcorrespondiente. Sólo lectura.
ActiveConnection
Indica a qué objetoRecordset.
BOF
Indica si el puntero de registro está posicionado antes del primer registro del objeto Recordset. Sólo lectura.
Bookmark
Devuelve un marcador que identifica de manera única el registro actual en el objeto Recordset o desplaza el registro actual a un registro identificado por un marcador válido.
CacheSize
Indica el número de registros objeto Recordsetalmacenado en memoria caché.
CursorLocation
Define o devuelve el tipo de cursor por defecto para esta conexión (cursor lado cliente o cursor lado servidor).
CursorType
Indica el tipo de cursor utilizado para este objeto Recordset.
DataMember
Indica el nombre del miembro de datos que debe extraerse del objeto definido por la propiedad DataSource. Sólo lectura.
DataSource
Indica que un objeto que contiene datos debe representarse como objeto Recordset. Sólo lectura.
EditMode
Indica el estado de modificación del registro actual. Sólo lectura.
EOF
Indica si el puntero de registro está posicionado después del último registro en el objeto Recordset. Sólo lectura.
Filter
Define un filtro de datos en el Recordset.
Index
Indica el nombre del índice actual para el Recordset.
LockType
Indica el tipo de bloqueo de los registros durante las modificaciones.
MarshalOptions
Indica qué registros se devuelven al servidor.
MaxRecords
Indica el número máximo de registros que se devuelven a un objeto Recordset desde una misma consulta. El valor por defecto es cero (no hay límite).
PageCount
Indica el número de páginas de datos contenidas en el
objeto
Connection
creado
el
pertenece
el
de
un
objetoRecordset. Sólo lectura. PageSize
Indica el número de registros contenidos en una página delRecordset.
Properties
Referencia a la Colección de los objetos Property del objetoRecordset actual.
RecordCount
Indica el número de registros en el objeto Recordset. Sólo lectura.
Sort
Especifica uno o varios nombres de campos según los cuales se ordena el objeto Recordset, y determina el criterio de ordenación de cada campo.
Source
Indica el origen de los datos de un objeto Recordset.
State
Indica el estado del Recordset: abierto, cerrado u operación asíncrona en curso. Sólo lectura.
Status
Indica el estado del registro actual correspondiente a las actualizaciones por lotes u otras operaciones globales. Sólo lectura.
StayInSync
Indica, en un objeto Recordset jerárquico, si la fila principal debe cambiar cuando cambia el conjunto de los registros secundarios subyacentes. Sólo lectura.
Ejemplo Transformación en mayúsculas de los caracteres del campo Cli_Empresa en la tabla Clientes. Dim cnc As New ADODB.Connection Dim rstCli As New ADODB.Recordset ’ Creación del Recordset Set cnc = CurrentProject.Connection rstCli.Open "Select from Clientes", cnc, _ adOpenKeyset, adLockOptimistic ’ Recorrido de los registros With rstCli Do Until .EOF rstCli("Cli_Empresa") = _ UCase(rstCli("Cli_Empresa")) ’ Actualización .Update ’ Registro siguiente .MoveNext Loop End With rstCli.Close cnc.Close Utilización del método Seek: búsqueda de un cliente a partir de su código. Dim cnc As New ADODB.Connection Dim rstCli As New ADODB.Recordset Dim strCodigoCli As String ’ Creación del Recordset Set cnc = CurrentProject.Connection rstCli.Open "Clientes", cnc, adOpenKeyset, _ adLockReadOnly, adCmdTableDirect With rstCli ’ Entrada del código cliente strCodigoCli = _ InputBox("Introduzca el código cliente")
’ Índice actual: clave primaria .Index = "PrimaryKey" ’ Búsqueda .Seek strCodigoCli, adSeekFirstEQ ’ Registro no encontrado If .EOF Then MsgBox "Cliente no encontrado" Else ’ Registro encontrado MsgBox "Empresa: " & rstCli("Cli_Empresa") End If End With rstCli.Close cnc.Close Utilización del método Find: búsqueda de los clientes cuyo nombre de Empresa empiece por un valor determinado. Dim cnc As New ADODB.Connection Dim rstCli As New ADODB.Recordset Dim strEmp As String Dim strCrit As String Dim bkm As Variant ’ Creación del Recordset Set cnc = CurrentProject.Connection rstCli.Open "Clientes", cnc, adOpenKeyset, _ adLockReadOnly, adCmdTableDirect With rstCli ’ Entrada del código cliente strEmp = InputBox("Introduzca las primeras "_ & "letras de la Empresa") ’ Búsqueda strCrit = "Cli_Empresa Like ’" & strEmp & "%’" .Find strCrit, , adSearchForward ’ Registro no encontrado If .EOF Then MsgBox "Cliente no encontrado" Else ’ Si encuentra: búsqueda de los siguientes Do While Not .EOF MsgBox rstCli("Cli_Empresa") ’ Posición actual bkm = .Bookmark .Find strCrit, 1, adSearchForward, bkm Loop End If End With rstCli.Close cnc.close
10. La colección Fields Métodos Append
Agrega un objeto Field a una colección Fields.
Delete
Elimina un objeto Field de la colección Fields.
Refresh
Actualiza los objetos Field en la colección Fields.
11. Los objetos Field Métodos AppendChunk
Agrega datos a un objeto Field de tipo binario o de gran
tamaño. GetChunk
Devuelve todo o parte del contenido de un objeto Field de tipo binario o de gran tamaño.
Propiedades ActualSize
Indica la longitud del valor de un campo. Sólo lectura.
Attributes
Indica una o varias características de un objeto Field.
DefinedSize
Indica el tamaño del objeto Field. Sólo lectura.
Name
Indica el nombre del objeto Field.
NumericScale
Indica la escala de los valores numéricos del objeto Field. Sólo lectura.
OriginalValue
Indica el valor del objeto Field antes de la modificación. Sólo lectura.
Precision
Indica el grado de precisión de los valores de tipo numérico en el objeto Field. Sólo lectura.
Properties
Contiene todos los objetos Property de un objeto Field.
Type
Indica el tipo de datos del objeto Field.
UnderlyingValue
Indica el valor actual del objeto Field en la base de datos. Sólo lectura.
Value
Indica el valor del objeto Field.
12. La colección Parameters Métodos Append
Agrega un objeto Parameter a la colección Parameters.
Delete
Elimina un objeto Parameter de la colección Parameters.
Refresh
Actualiza los objetos Parameter en la colección Parameters.
Ejemplo Muestra la lista de todos los campos (nombre y tipo) de la tabla Clientes en la ventana Inmediato. Dim cnc As New ADODB.Connection Dim rstCli As New ADODB.Recordset Dim fld As ADODB.Field ’ Creación del Recordset Set cnc = CurrentProject.Connection rstCli.Open "Empleados", cnc, adOpenKeyset, adLockReadOnly, _ adCmdTableDirect For Each fld In rstCli.Fields Debug.Print fld.Name & " " & fld.Type Next rstCli.close
13. Los objetos Parameter Métodos AppendChunk
Agrega datos a un objeto Parameter de tipo binario o texto de gran tamaño.
Propiedades Attributes
Indica una o varias características de un objeto Parameter.
Direction
Indica si el objeto Parameter corresponde a un parámetro de entrada, de salida, o ambos, o si el parámetro es el tipo de retorno de un procedimiento almacenado.
Name
Indica el nombre del objeto Parameter.
NumericScale
Indica la escala objetoParameter.
Precision
Indica el grado de precisión de los valores de tipo Numeric del objeto Parameter.
Properties
Contiene todos los objetos Property de un objeto Parameter.
Size
Indica el tamaño máximo, en bytes o en caracteres, de un objeto Parameter.
Type
Indica el tipo de datos del objeto Parameter.
Value
Indica el valor atribuido al objeto Parameter.
de
los
valores
numéricos
del
14. La colección Properties Métodos Refresh
Actualiza los objetos Property en la colección Properties a partir de las informaciones del proveedor.
15. Los objetos Property Propiedades Attributes
Indica una o varias características de un objeto Property.
Name
Indica el nombre del objeto Property. En sólo lectura.
Type
Indica el tipo de datos del objeto Property.
Value
Indica el valor del objeto Property.
16. La colección Errors Métodos Clear
Elimina el conjunto de los objetos Error de la colección Errors.
Refresh
Actualiza los objetos Error a partir de las informaciones del proveedor OLE DB.
Propiedades Count
Indica el número de objetos Error de la colección Errors. En sólo lectura.
Item
Permite la indexación de la colección Errors para referenciar a un objeto Error específico. Sólo lectura.
17. Los objetos Error
Propiedades Description
Devuelve la cadena descriptiva asociada al objeto Error. Sólo lectura.
HelpContext
Indica el ContextID del archivo de ayuda asociado al objetoError. Sólo lectura.
HelpFile
Indica el nombre del archivo de ayuda asociado al objetoError. Sólo lectura.
NativeError
Indica el código de error específico del proveedor asociado al objeto Error. Sólo lectura.
Number
Indica el número que identifica de manera única el error del objeto Error. Sólo lectura.
Source
Indica el nombre del objeto o de la aplicación que originó el error. Sólo lectura.
SQLState
Indica el valor devuelto por el proveedor OLE DB. Cadena de cinco caracteres conforme a la norma SQL ANSI. Sólo lectura.
Presentación El lenguaje SQL (Structured Query Langage o lenguaje de consulta estructurado) es un lenguaje de consulta y de gestión de bases de datos relacionales. Access 2013 utiliza SQL como lenguaje de consulta. Cuando se crea una consulta en la vista Diseño de consulta, Access construye, como tarea en segundo plano, las instrucciones equivalentes en SQL. De hecho, la mayoría de las propiedades de las consultas en la vista Diseño de consulta tienen cláusulas equivalentes y opciones accesibles en lenguaje SQL. Es posible mostrar o modificar la instrucción SQL correspondiente a una consulta pasando a la vista SQL. Ejemplo Abra una consulta existente en la vista Diseño.
A continuación, haga clic sobre la opción Vista SQL del icono Ver.
Obtendrá la instrucción SQL correspondiente a su consulta.
Esta operación es muy interesante, especialmente si no está habituado al lenguaje SQL: puede crear sus consultas en Access y recuperar la instrucción SQL generada para incluirla en su código VBA.
Ciertas consultas SQL, llamadas consultas específicas SQL, no pueden ser creadas en la cuadrícula de diseño de consultas, sino que deben ser entradas directamente en la vista SQL. Se trata: de las "consultas paso a través" que le permiten trabajar directamente con las tablas del servidor, las "consultas de definición de datos" que le permiten crear, eliminar o modificar la estructura de las tablas, las "consultas de combinación o de unión" que le permiten agrupar los campos de dos tablas (o más) en un mismo campo resultado de la consulta. Estas consultas son muy útiles para fusionar registros procedentes de tablas distintas.
Lenguaje SQL y VBA Las consultas SQL se integran perfectamente en VBA y pueden emplearse a partir de los métodos de distintos objetos: método OpenRecordset de los objetos DataBase y Connection, método CreateQueryDef de los objetos DataBase y Connection, método Execute de los objetos Command y Connection, etc. Las consultas SQL se utilizan frecuentemente también en los formularios: propiedad RecordSource de un formulario o de un informe, propiedad RowSource de una lista desplegable, etc. La mayoría de estas propiedades pueden modificarse utilizando código VBA. Las ventajas de la utilización de instrucciones SQL en VBA son las siguientes: Velocidad de ejecución: una instrucción Select es más rápida que el recorrido secuencial de una tabla. Mejor rendimiento: en modo cliente/servidor, las consultas son compiladas por el SGBD que optimiza su rendimiento. Mantenimiento simplificado: el código de las instrucciones SQL es más corto y por tanto más legible que el equivalente en VBA. Estandarización: el lenguaje SQL es el estándar de consulta de las bases de datos relacionales.
Descripción del lenguaje SQL 1. La instrucción SELECT SELECT es la instrucción SQL más empleada: corresponde a la consulta de selección en Access. Permite extraer campos de un conjunto de registros que responden a ciertos criterios. Sintaxis SELECT [ALL | DISTINCT] <lista de campos> FROM <lista de tablas> [WHERE... ] [GROUP BY...] [HAVING... ] [ORDER BY... ]
All (valor predeterminado)
Distinct
<lista de campos>
Se tienen en cuenta todos los registros que respondan a los criterios. Se omiten los registros cuyos campos seleccionados contienen datos duplicados. Lista de los campos seleccionados, separados por comas, respetando la sintaxis siguiente: * | tabla.* | [tabla.]campo1 [AS alias1] [, [tabla.]campo2 [AS alias2] [, ...]]
*
Indica que se seleccionan todos los campos de la(s) tabla(s) especificada(s).
alias1, alias2
Indican los nombres que deben utilizarse como encabezados de columna en lugar de los nombres de columna originales de la tabla.
<lista de tablas>
Nombre de la o de las tablas que contienen los datos que desea extraer. Si la consulta utiliza varias tablas, el modo de combinación también debe especificarse en la cláusula FROM.
Ejemplos ‐ SELECT * FROM Productos ‐ SELECT Productos.* FROM Productos ‐ SELECT Prod_ref, Prod_desc, Prod_precio, Prod_iva FROM Productos ‐ SELECT Prod_ref As Reference, Prod_desc As Descripción, Prod_Precio as Precio, Prod_iva as Iva From Productos
2. La cláusula FROM La cláusula FROM especifica las tablas o las consultas de donde se extraen los datos. Sintaxis FROM tabla1 [ LEFT | RIGHT | INNER ] JOIN tabla2 ON tabla1.campo1 tabla2.campo2
[ LEFT | RIGHT |INNER ]
Estos operadores permiten definir el tipo de combinación entre las tablas.
LEFT JOIN
Utilice una operación LEFT JOIN para crear una combinación
externa izquierda. El resultado de la combinación externa izquierda incluye todos los registros de la primera tabla (la de la izquierda: ) incluso para los que no existe un valor correspondiente en la segunda tabla (la de la derecha: ).
RIGHT JOIN
Utilice una operación RIGHT JOIN para crear una combinación externa derecha. El resultado incluye todos los registros de la segunda tabla (la de la derecha: ) incluso para los que no existe un valor correspondiente en la primera tabla (la de la izquierda: ).
INNER JOIN
Utilice INNER JOIN para crear una combinación que incluya solamente los registros cuyos datos de los campos vinculados son idénticos.
Utilice todos los operadores de comparación relacionales, como: =, <, >, <=, >=, <> (diferente de). El operador = es el más utilizado frecuentemente.
Ejemplo Lista de los pedidos con el nombre y el número de teléfono del mensajero. Primer ejemplo Sólo se seleccionan los pedidos a los que se les ha asignado un mensajero. SELECT Pedidos.Pdo_Numpdo, Pedidos.Pdo_FechaEnvío, Mensajeros.Mens_Nombre, Mensajeros.Mens_Teléfono FROM Pedidos INNER JOIN Mensajeros ON Pedidos.Pdo_NumMens = Mensajeros.Mens_NumMens Segundo ejemplo Se seleccionan todos los pedidos. SELECT Pedidos.Pdo_Numpdo, Pedidos.Pdo_FechaEnvío, Mensajeros.Mens_Nombre,Mensajeros.Mens_Teléfono FROM Pedidos LEFT JOIN Mensajeros ON Pedidos.Pdo_NumMens = Mensajeros.Mens_NumMens
3. La cláusula WHERE La cláusula WHERE permite filtrar los registros a partir de criterios. Las condiciones de la cláusula WHERE se expresan mediante los operadores siguientes: operadores de comparación: =, <, >, <=, >=, <> (diferente de) Is [Not] Null, [Not] In, Between. operadores lógicos: And, Or, Not. Ejemplos SELECT * FROM Productos WHERE [Prod_Precio] = 10000 SELECT * FROM Productos WHERE [Prod_Precio] BETWEEN 2000 AND 4000 SELECT * FROM Clientes WHERE [Cli_país] IN (’Francia’,’Italia’,’España’)
4. La cláusula GROUP BY La cláusula GROUP BY corresponde a los "Totales" de las consultas Access (llamados Agrupamientos en las versiones antiguas). Permite agrupar datos por uno o varios campos. Se utiliza principalmente para efectuar funciones de agregado SQL, como Sum (suma), Count (cuenta), Avg (promedio), etc.
Ejemplos Esta consulta devuelve el número de pedidos pasados por cliente. SELECT Clientes.Cli_Empresa, Count (Pedidos.Pdo_Numpdo) As nb_Pdos FROM Clientes INNER JOIN Pedidos ON Clientes.Cli_NumCli= Pedidos.Pdo_CodCli GROUP BY Clientes.Cli_Empresa Esta consulta devuelve el importe total de cada uno de los pedidos. SELECT Pedidos.Pdo_Numpdo, Pedidos.Pdo_FechaPdo, Sum ([Pdo_Precio]*[Pdo_Ctd]) As TotalPdo FROM Pedidos INNER JOIN [Detalle pedidos] ON Pedidos.Pdo_Numpdo = [Detalle pedidos].Pdo_Numpdo GROUP BY Pedidos.Pdo_Numpdo, Pedidos.Pdo_FechaPdo
5. La cláusula HAVING La cláusula HAVING especifica los registros agrupados que deben mostrarse en una instrucción SELECT dotada de una cláusula GROUP BY. Una vez se ha efectuado el agrupamiento siguiendo la lista de los campos del GROUP BY, se conservan solamente los registros que cumplen la condición especificada en la cláusula HAVING. Ejemplo Esta consulta extrae los pedidos cuyo importe total es superior a 10.000 €. SELECT Pedidos.Pdo_Numpdo, Pedidos.Pdo_FechaPdo, Sum ([Pdo_Precio]*[Pdo_Ctd]) As TotalPdo FROM Pedidos INNER JOIN [Detalle pedidos] ON Pedidos.Pdo_Numpdo = [Detalle pedidos].Pdo_Numpdo GROUP BY Pedidos.Pdo_Numpdo, Pedidos.Pdo_FechaPdo HAVING (Sum([Pdo_Precio]*[Pdo_Ctd])>10000)
6. La cláusula ORDER BY La cláusula ORDER BY ordena, de forma ascendente o descendente, los registros resultantes de una consulta en función del o de los campos especificados. Sintaxis [ORDER BY campo1 [ASC | DESC ][, campo2 [ASC | DESC ]][, ...]]]
ASC
Orden ascendente.
DESC
Orden descendente.
Ejemplo La consulta siguiente devuelve el número de pedidos pasados por cliente, ordenados por orden descendente del número de pedidos. SELECT Clientes.Cli_Empresa, Count (Pedidos.Pdo_Numpdo) As nb_Pdos FROM Clientes INNER JOIN Pedidos ON Clientes.Cli_NumCli=Pedidos.Pdo_CodCli GROUP BY Clientes.Cli_Empresa ORDER BY Count(Pedidos.Pdo_NumPdo) DESC
7. La instrucción UPDATE La instrucción UPDATE corresponde a una consulta de actualización que modifica los valores de los campos en la tabla especificada, para los registros que responden al criterio especificado (opcional).
Sintaxis UPDATE tabla SET campo1 = nuevovalor1[, campo2 = nuevovalor2]... [WHERE criterio] Si no se especifica ninguna cláusula Where, se actualizarán todos los registros.
Ejemplo Esta consulta modifica el código de país de todos los registros de la tabla Clientes. UPDATE Clientes SET Clientes.Cli_país = ’E’ La consulta siguiente modifica, en la tabla Clientes, el código de país de los registros cuyos clientes tengan por ciudad ’Valencia’. UPDATE Clientes SET Clientes.Cli_País = ’E’ WHERE Clientes.Cli_ciudad=’Valencia’
8. La instrucción DELETE La instrucción DELETE corresponde a una consulta de Eliminación que elimina registros en la tabla mencionada en la cláusula FROM, según los criterios proporcionados (opcionales). Sintaxis DELETE FROM tabla [WHERE criterios] Si no se especifica ninguna cláusula Where, se eliminan todos los registros.
Ejemplo Esta consulta elimina los pedidos anteriores a 2010. DELETE FROM Pedidos WHERE ((Pedidos.Pdo_FechaPdo) < #1/1/2010#)
9. La instrucción INSERT INTO La instrucción SQL INSERT INTO corresponde a una consulta de datos anexados que agrega registros a una tabla. Sintaxis Consulta de datos anexados con un solo registro: INSERT INTO [(campo1[, campo2[, ...]])] VALUES (valor1[, valor[, ...]]) La consulta debe contener el mismo número de valores (del mismo tipo y en el mismo orden) que de columnas a rellenar.
Consulta de datos anexados con uno o varios registros: INSERT INTO [(campo1[, campo2[, ...]])]
SELECT [.]campo1[, campo2[, ...]] FROM <lista de tablas> La instrucción SELECT debe devolver tantos valores, en el mismo orden y del mismo tipo, que las columnas a rellenar (campos de la instrucción INSERT).
Ejemplo Agregar un registro a la tabla Clientes. INSERT INTO Clientes ( Cli_CódigoCli, Cli_empresa, Cli_ciudad, Cli_país ) VALUES (’ENI’,’Ediciones ENI’, ’Barcelona’,’E’). Agregar registros de la tabla Prospección a la tabla Clientes. INSERT INTO Clientes SELECT Prospección.* FROM Prospección
10. Otras instrucciones Consultas de interrogación TRANSFORM
Crea una consulta de tabla de referencias cruzadas. Esta instrucción se utiliza al crear una consulta a partir del asistente para tablas de referencias cruzadas.
UNION
Crea una consulta que fusiona los resultados de dos, o varias, consultas o tablas independientes. Las estructuras de las tablas y/o de las consultas fusionadas deben ser idénticas.
Creación y gestión de tablas CREATE TABLE
Crea una nueva tabla.
CREATE INDEX
Crea un nuevo índice para una tabla existente.
ALTER TABLE
Modifica la estructura de una tabla.
DROP TABLE
Elimina una tabla de la base de datos.
DROP INDEX
Elimina un índice de una tabla.
Creación y gestión de usuarios y de grupos CREATE USER
Crea uno o varios nuevos usuarios.
ADD USER
Agrega uno o varios usuarios a un grupo de usuarios existente.
DROP USER
Elimina uno o varios usuarios.
CREATE GROUP
Crea uno o varios nuevos grupos.
DROP GROUP
Elimina uno o varios grupos de usuarios.
GRANT
Atribuye privilegios específicos a un usuario o a un grupo de usuarios existente.
REVOKE
Revoca privilegios específicos a un usuario o a un grupo de usuarios existente.
Puede obtener más información sobre el lenguaje SQL y sus instrucciones, a partir del tema
"Referencia de Microsoft jet SQL", del Contenido de la ayuda de Access.
Ejemplos de utilización de consultas SQL Para demostrar el interés del lenguaje SQL, los ejemplos siguientes proponen dos procedimientos equivalentes: uno utiliza el lenguaje SQL y el otro no. Para realizar estos ejemplos debe crear una tabla Clientes con un campo llamado Cli_Empresa e introducir algunos registros en dicha tabla.
1. Actualización de registros El código del ejemplo siguiente permite modificar el contenido de un campo en una tabla para registros que respondan a ciertos criterios. Código VBA utilizando una consulta SQL de tipo UPDATE. Private Sub Act_País() Dim cncPresupuesto As ADODB.Connection Dim strSQL As String ’ Actualización del código de país en la tabla clientes Set cncPresupuesto = CurrentProject.Connection strSQL = "UPDATE Clientes SET " _ & "Clientes.CLI_PAÍS = ’E’ " _ & "WHERE Clientes.CLI_CIUDAD = ’Valencia’" cncPresupuesto.Execute strSQL End Sub Código VBA equivalente sin consulta SQL. Private Sub Act_País1() Dim cncPresupuesto As ADODB.Connection Dim rstCliente As ADODB.Recordset ’ Apertura de un conjunto de registros Set cncPresupuesto = CurrentProject.Connection Set rstCliente = New ADODB.Recordset rstCliente.Open "CLIENTES", cncPresupuesto, adOpenForwardOnly, _ adLockOptimistic ’ Recorrido secuencial de la tabla Clientes Do While Not rstCliente.EOF If rstCliente("CLI_CIUDAD") = "Valencia" Then rstCliente("CLI_PAÍS") = "E" rstCliente.Update End If rstCliente.MoveNext Loop End Sub
2. Carga de una lista desplegable El código de ejemplo siguiente permite mostrar en una lista desplegable (control cuadro de lista) el nombre de los clientes cuyo nombre de Empresa empiece por una letra determinada (la letra se indica en un cuadro de texto). Para probar este ejemplo debe: crear un formulario llamado Clientes, agregar los controles siguientes al formulario: un cuadro de texto llamado txtNomEmp. un cuadro de lista llamado lstEmp.
un botón de comando cmdLista1. Código VBA que utiliza una consulta SQL de tipo SELECT. El contenido de la lista es el resultado de la consulta SQL. Private Sub cmdLista1_Click() Dim strSQL As String ’ Control del nombre introducido If txtNomEmp = "" Then MsgBox "Debe introducir al menos una letra", vbExclamation txtNomEmp.SetFocus Exit Sub End If ’ Propiedades de la lista desplegable ’ La lista contiene una consulta Me.lstEmp.RowSourceType = "Tabla/Consulta" strSQL = "SELECT Clientes.CLI_EMPRESA FROM Clientes " _ & "WHERE (Clientes.CLI_EMPRESA Like ’" & Me.txtNomEmp & "*’)" Me.lstEmp.RowSource = strSQL ’ Actualización de los datos de la lista Me.lstEmp.Requery End Sub Código VBA equivalente sin consulta SQL. La lista se rellena a partir de una lista de valores. Private Sub cmdLista1_Click() Dim cncPresupuesto As ADODB.Connection Dim rstCliente As ADODB.Recordset Dim strNomEmp as String ’ Control del nombre introducido If txtNomEmp = "" Or IsNull(txtNomEmp) Then MsgBox "Debe introducir al menos una letra", vbExclamation txtNomEmp.SetFocus Exit Sub End If ’ Inicialización de la lista desplegable ’ La lista contiene una lista de valores Me.lstEmp.RowSourceType = "Lista valores" Me.lstEmp.RowSource = "" Me.lstEmp.Requery ’ Apertura de un conjunto de registros Set cncPresupuesto = CurrentProject.Connection Set rstCliente = New ADODB.Recordset rstCliente.Open "CLIENTES", cncPresupuesto, adOpenForwardOnly, _ adLockOptimistic ’ Recorrido secuencial de la tabla e incorporación de elementos ’ a la lista Do While Not rstCliente.EOF If Ucase(Left(rstCliente("CLI_EMPRESA"), Len(Me.txtNomEmp))) = _ Ucase(Left(Me.txtNomEmp, Len(Me.txtNomEmp))) Then strNomEmp = rstCliente("CLI_EMPRESA") Me.lstEmp.AddItem strNomEmp End If rstCliente.MoveNext Loop rstCliente.close End Sub Los ejemplos anteriores permiten constatar que el código que utiliza SQL es más corto y su ejecución más rápida, hecho que puede resultar muy útil, por ejemplo, si la tabla Clientes contiene un número importante de registros.
Presentación 1. Definición Un evento es el resultado de una acción del usuario o del sistema sobre un objeto. Desencadena la ejecución del código correspondiente al procedimiento de evento del objeto activado.
La utilización de un procedimiento de evento o de una macro permite asociar un tratamiento específico en respuesta a un evento que se produzca en un formulario, en un informe o en un control.
2. Asociación de código VBA a un evento Puede asignar código VBA al evento de un objeto de dos maneras: a partir de la ficha Eventos de la ventana de propiedades del objeto en Access.
a partir de las listas desplegables de objetos y de eventos en el editor Visual Basic.
Categorías de eventos Las siguientes listas de eventos están clasificadas por tipo y contienen: el nombre del evento, el nombre de la propiedad correspondiente en la ventana de propiedades del objeto (entre paréntesis), la descripción del evento, la columna de la derecha (Cancelación) indica si el evento puede cancelarse. La cancelación de un evento se describe en el apartado Cancelación de un evento.
1. Eventos de tipo Ventana Cancelación Open
(AlAbrir) Se produce al abrir un formulario pero antes de que se muestre el primer registro. Se produce al abrir un informe, pero antes de su impresión.
Sí
Load
(AlCargar) Se produce al abrir un formulario cuando se muestra el primer registro.
No
Resize
(AlCambiarTamaño) Se produce al mostrar por primera vez el formulario y al cambiar su tamaño.
No
UnLoad
(AlDescargar) Se produce al cerrar y cuando se liberan los registros, pero antes de que el formulario desaparezca.
Sí
Close
(AlCerrar) Se produce cuando el formulario o el informe desaparece al cerrarlo.
No
2. Eventos de tipo Enfoque Les eventos de tipo "enfoque" pueden aplicarse a los formularios (Activate, Deactivate, GotFocus, LostFocus) o a los controles (Enter, Exit, SetFocus, LostFocus). Decimos que un objeto tiene el enfoque (o foco) cuando puede recibir una entrada del usuario a través de acciones con el ratón o con el teclado. Los objetos que tienen el enfoque se llaman objetos activos (ActiveForm o ActiveControl). El método SetFocus permite dar el foco a un control o a un formulario.
Cancelación Activate
(AlActivar) Se produce cuando la ventana del formulario o del informe se convierte en activa.
No
Deactivate
(AlDesactivar) Se produce al activar otra ventana, pero antes de que esta última esté activada. Se produce también al cerrar la ventana.
No
Enter
(AlEntrar)
No
Se produce antes de que un control tome el foco a partir de un control o al abrir el formulario. Exit
(AlSalir)
Sí
Se produce antes de que un control pierda el enfoque en provecho de otro control del formulario o de otro formulario. GotFocus
(AlRecibirEnfoque)
No
Se produce cuando un control o un formulario sin control activo recibe el foco. LostFocus
(AlPerderEnfoque)
No
Se produce cuando un control o un formulario pierde el enfoque.
3. Eventos de tipo Datos Los eventos de tipo "datos" se aplican a los formularios asociados a un origen de datos (propiedad RecordSource rellenada a partir de un nombre de tabla o de una consulta) y a los controles asociados a un campo del origen de datos del formulario (propiedad ControlSource rellenada). Cancelación AfterInsert
(DespuésDeInsertar) Se produce después de agregar un nuevo registro a la tabla.
No
AfterUpdate
(DespuésDeActualizar) Se produce después de la actualización de un control o de un registro con datos modificados.
No
AfterDelConfirm
(DespuésDeConfirmarEliminación) Se produce después de que el usuario haya respondido a la solicitud de eliminación de los registros.
No
BeforeInsert
(AntesDeInsertar) Se produce al teclear el primer carácter de un nuevo registro, pero antes de agregar realmente el registro.
Sí
BeforeUpdate
(AntesDeActualizar) Se produce antes de la actualización de un control o de un registro con datos modificados.
Sí
BeforeDelConfirm
(AntesDeConfirmarEliminación) Se produce después de que el usuario haya eliminado registros y antes que Access solicite confirmación.
Sí
NotInList
(AlNoEnLaLista) Se produce al entrar un valor que no existe en una lista y cuando la propiedad LimitarALista es verdadera.
No
Current
(AlActivarRegistro)
No
Se produce cuando el foco pasa de un registro a otro. Se produce también al abrir, antes de que el primer registro se convierta en el actual.
Change
(AlCambiar)
No
Se produce al modificar el contenido de un cuadro de texto o un cuadro combinado (teclado o macro/Visual Basic). Updated
(AlActualizar)
No
Se produce cuando los datos de un objeto OLE han sido modificados. Delete
(AlEliminar)
Sí
Se produce antes de la eliminación efectiva. Al pulsar [Supr] por ejemplo. Dirty
(AlCambiar)
Sí
Se produce cuando cambia el contenido de un formulario o la parte de texto de un cuadro combinado. Se produce también al pasar de una página a otra en un control Ficha.
4. Eventos de tipo Ratón Cancelación Click
(AlHacerClic) Se produce al pulsar el botón izquierdo del ratón sobre un control o una zona en blanco de un formulario.
No
DblClick
(AlHacerDobleClic) Se produce al pulsar dos veces el botón izquierdo del ratón sobre un control o una zona en blanco de un formulario.
Sí
MouseDown
(AlBajarMouse) Se produce al pulsar un botón del ratón sobre un control o un formulario.
Sí
MouseMove
(AlMoverMouse)
No
Se produce cuando el usuario desplaza el ratón sobre un formulario o sobre un control. MouseUp
(AlSubirMouse) Se produce cuando el usuario suelta el botón del ratón sobre un control o sobre un formulario.
No
5. Eventos de tipo Teclado Cancelación KeyDown
(AlBajarTecla)
No
Se produce al pulsar una tecla o al ejecutar SendKeys oEnviarTeclas. No obstante, es posible impedir al objeto recibir la tecla, atribuyendo el valor 0 al argumentoKeycode del procedimiento KeyDown del objeto. KeyPress
(AlPresionarTecla) Se produce al pulsar una tecla que emita un carácter ANSI estándar o al ejecutar SendKeys o EnviarTeclas. No obstante, también es posible impedir al objeto recibir la tecla, atribuyendo el valor 0 al argumento keyAsciidel procedimiento KeyPress del
Sí (a través de macro o VBA)
objeto. KeyUp
(AlSubirTecla)
No
Se produce cuando el usuario suelta la tecla o al ejecutarSendKeys o EnviarTeclas. No obstante, es posible impedir al objeto recibir la tecla, atribuyendo el valor 0 al argumento KeyCode del procedimiento KeyUp del objeto. La propiedad KeyPreview (vista previa de las teclas) de un formulario determina si los procedimientos de evento de teclado a nivel del formulario se invocan antes de aquéllos a nivel de los controles. Puede utilizar la propiedad KeyPreview para crear un procedimiento de gestión del teclado a nivel de un formulario.
Ejemplo El ejemplo siguiente explica cómo mostrar un formulario cuando el usuario pulsa la tecla [F1], cualquiera que sea el control activo. Private Sub Form_Load() KeyPreview = True End Sub Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) ’ Si la tecla es F1, se muestra el formulario Buscar ’ KeyCode se reinicializa para no mostrar la ayuda Access If KeyCode = vbKeyF1 Then DoCmd.OpenForm "Buscar" KeyCode = 0 End If End Sub
6. Eventos de tipo Impresión Estos eventos se aplican a los informes Access. Cancelación Format
(AlDarFormato) Se produce cuando Microsoft Access determina qué datos pertenecen a qué secciones.
Sí
Print
(AlImprimir)
Sí
Se produce al formatear datos de una sección para impresión. Retreat
(AlRetirarse) Se produce cuando Microsoft Access vuelve a una sección anterior durante la paginación de un informe.
No
NoData
(AlNoDatos)
Sí
Se produce cuando Microsoft Access ha paginado un informe para su impresión y éste no contiene datos. Page
(AlPaginar) Se produce después de que Microsoft Access haya paginado una página de un informe para su impresión, pero antes de que se imprima.
No
Los eventos Format, Print y Retreat se aplican a las secciones de los informes.
7. Eventos de tipo Filtro Cancelación ApplyFilter
(AlAplicarFiltro) Se produce cuando el usuario aplica un filtro.
Sí
Filter
(AlFiltrar) Se produce cuando el usuario crea un filtro.
Sí
8. Eventos de tipo Error y Cronómetro Cancelación Error
(AlOcurrirError)
No
Se produce cuando ocurre un error. Timer
(AlCronómetro) Se produce cuando transcurre un intervalo de tiempo especificado.
No
Cancelación de un evento En ciertos casos, es deseable poder anular un evento. Para ello, existen dos maneras de proceder: especificando el nombre de una macro que contenga la acción CancelarEvento, como parámetro de la propiedad de tipo evento correspondiente, por ejemplo para cancelar la actualización de un control o para colocar el nombre de la macro que contiene la acción CancelarEvento en su propiedadAntesDeActualizar. La acción CancelarEvento en Visual Basic utiliza el método CancelEvent del objeto Docmd. asignando el valor True al argumento Cancel de un procedimiento de evento. Ejemplo Si la fecha es incorrecta, el evento Exit (Salir) se anula: el cursor se mantiene posicionado sobre el campo. Private Sub txtFechaFin_Exit(Cancel As Integer) If IsNull(txtFechaFin) Then Exit Sub ’ La fecha debe ser correcta If Not IsDate(txtFechaFin) Then MsgBox "Fecha incorrecta", vbCritical Cancel = True Exit Sub End If ’ La fecha final debe ser >= fecha inicial If DateValue(txtFechaFin) < DateValue(txtFechaIni) Then MsgBox "Fecha final anterior a la fecha inicial", vbCritical Cancel = True Exit Sub End If End Sub No todos los eventos son cancelables (ver tablas de categorías de eventos precedentes).
Secuencias de tipos de eventos Una acción de usuario o de sistema genera directamente un evento, pero pueden activarse varios eventos subyacentes. Estas son algunas secuencias de tipos de encadenamiento de eventos: Abrir un formulario: Open →Load →Resize →Activate →Current Cerrar un formulario: UnLoad →Deactivate →Close Entrar en un control: Enter →GotFocus Salir de un control: Exit →LostFocus Pasar de un formulario a otro: Deactivate (form1) →Activate (form2) Modificar un cuadro de texto: KeyDown →KeyPress →Change →KeyUp Actualizar un control: KeyDown →KeyPress →Change →KeyUp →Exit (Zona1) →LostFocus (Zona1) →Enter (Zona2) →GotFocus (Zona2) Actualizar un registro: KeyDown →KeyPress →Change →KeyUp →BeforeUpdate (Cuadro de texto) →AfterUpdate (Cuadro de texto) →BeforeUpdate (Formulario) →AfterUpdate (Formulario)
Introducir en el primer campo de un nuevo registro: KeyDown →KeyPress →BeforeUpdate (Formulario) →Change →KeyUp Eliminar registros: Delete →Current →BeforeDelConfirm →AfterDelConfirm
Los eventos de actualización En Microsoft Access, los eventos de actualización intervienen a dos niveles: actualización de un control, actualización de un registro. En el caso de una actualización de un control, se ejecutan los eventos BeforeUpdate y AfterUpdate del mismo control. En el caso de una actualización de un registro, se ejecutan los eventos BeforeUpdate y AfterUpdate del formulario. Los eventos de "actualización de los controles" se ejecutan antes que los eventos de "actualización del formulario".
Los distintos tipos de error Distinguimos distintos tipos de error en el lenguaje VBA: los errores de sintaxis, los errores de compilación, los errores de ejecución, los errores de lógica.
1. Los errores de sintaxis Los errores de sintaxis pueden descubrirse automáticamente durante la introducción del código en VBA. Para activar la comprobación de sintaxis, en el menú Herramientas: Seleccione Opciones. Y luego seleccione la ficha Editor y active la casilla Comprobación automática de sintaxis. Ejemplo
Los errores de sintaxis no corregidos provocarán un error de compilación (Ver mensaje mostrado).
2. Los errores de compilación Les errores de compilación se descubren cuando Access intenta compilar su código. El código VBA puede compilarse de dos maneras: a petición del usuario seleccionando la opción Compilar del menú Depuración. En este caso el código se compila en su totalidad.
automáticamente al ejecutar el código. En este caso, el código contenido en los procedimientos se compila solamente en el momento de la primera llamada al procedimiento. Los procedimientos no llamados no se compilarán. Se recomienda compilar el programa antes de ejecutarlo, ya que así se gana tiempo en su puesta a punto.
Ejemplo
Es posible evitar los errores de ejecución debidos a variables no declaradas utilizando la instrucción Option Explicit. Si intenta utilizar una variable no declarada se producirá un error durante la compilación.
3. Los errores de ejecución Los errores de ejecución se descubren cuando Access inicia la ejecución del código. Una instrucción, una operación, una llamada a una función... no válidas provocan un error de ejecución. Por ejemplo, la utilización de una variable no declarada o un cálculo efectuado con una variable que contenga un valor no numérico pueden provocar un error de ejecución. Ejemplo La variable dblRadio pasada como argumento contiene un valor no numérico.
4. Los errores de lógica Los errores de lógica están vinculados a errores de razonamiento o a una mala traducción de un razonamiento en código VBA. Por ejemplo, un algoritmo de cálculo puede producir un error de resultado si, durante su transcripción en VBA, se omite o se traduce mal una operación, o si el algoritmo es erróneo. Los errores de lógica son los más difíciles de detectar. Generalmente no causan ningún error de ejecución, pero producen un resultado distinto del esperado. En el ejemplo citado anteriormente, si el valor de Pi es erróneo o la fórmula del volumen incorrecta, el valor devuelto por VolEsfera será erróneo.
Depuración con VBA 1. Presentación El modo de depuración permite, entre otras cosas, detectar y corregir interactivamente los errores, permitiendo la continuación de la ejecución del programa. Cuando se produce un error de ejecución, se muestra un código de error, Access interrumpe la ejecución del programa y se activa el modo de depuración. Con las distintas herramientas de depuración podemos: ejecutar el código paso a paso, agregar puntos de interrupción, conocer en todo momento el valor de una variable o de una expresión, modificar interactivamente el código, etc.
2. La barra de herramientas Depuración La barra de herramientas Depuración permite acceder directamente a las distintas herramientas de depuración.
1.
Modo de diseño
activa o desactiva el modo de diseño.
2.
Ejecutar ([F5])
ejecuta el código del procedimiento actual, la hoja UserForm activa o una macro.
3.
Interrumpir ([Ctrl][Pausa])
interrumpe la ejecución del programa actual y pasa al modo de interrupción
4.
Restablecer proyecto
borra el contenido de las variables y restablece el proyecto.
5.
Alternar punto de interrupción([F9])
establece o elimina un punto de interrupción en la línea actual; el código se ejecuta hasta el punto de interrupción y luego se pasa al modo de depuración.
6.
Paso a paso por instrucciones([F8])
ejecuta el código instrucción por instrucción, recorriendo el procedimiento actual y los procedimientos llamados.
7.
Paso a paso por procedimientos ([Mayús][F8])
ejecuta el código instrucción por instrucción solamente para el procedimiento actual (las instrucciones de los procedimientos llamados se ejecutan de forma continua).
8.
Paso a paso para salir ([Ctrl][Mayús][F8])
ejecuta de forma continua las líneas restantes del procedimiento actual.
9.
Ventana Locales
muestra los valores de las variables locales del
procedimiento. 10.
Ventana Inmediato (método abreviado [Ctrl] G)
muestra la ventana de ejecución que permite ejecutar interactivamente una instrucción.
11.
Ventana Inspecciones
muestra la lista de las variables inspeccionadas.
12.
Inspección rápida
muestra el valor actual de la expresión seleccionada.
([Mayús][F9]) 13.
Pila de llamadas
muestra la lista de las llamadas procedimientos que se están ejecutando.
a
3. El objeto Debug El objeto Debug permite enviar datos para mostrarlos en la ventana Inmediato en el momento de la ejecución.
Métodos Print
Muestra texto o el resultado de la evaluación de una expresión en la ventanaInmediato.
Assert
Suspende la ejecución de manera condicional en la línea en la que aparece el método.
Gestión de errores con VBA 1. Principios Cuando se produce un error de ejecución, Access genera un código de error. La gestión de errores consiste en identificar el error interceptando su código, y tratarlo para, por ejemplo: mostrar un mensaje más explícito que el definido por el sistema, corregir eventualmente el error. El sistema de gestión de errores de Access ofrece dos posibilidades para interceptar el error, según el lugar dónde éste se haya producido: en el procedimiento de evento Errorde un formulario o de un informe, si el error ha sido provocado en la interfaz de Microsoft Access o en el motor Microsoft Jet, utilizando la instrucción On Error si el error tiene lugar en el código VBA. Para poder tratar los errores, es necesario conocer la lista. La lista de los códigos de error está detallada en el anexo Funciones e instrucciones VBA Códigos de error interceptables.
2. El procedimiento de evento Error El procedimiento de evento Error posee dos argumentos: Sub Form_Error (DataErr As Integer, Response As Integer)
DataErr
Contiene el código del error.
Response
Permite mostrar (acDataErrDisplay) o no (acDataErrContinue) el mensaje de error estándar de Access.
Ejemplo El ejemplo siguiente permite interceptar un error y reemplazar el mensaje estándar de Access (ej: un índice o una clave principal no puede contener un valor nulo: correspondiente al número de error 3058), por un mensaje específico. Sub Form_Error (DataErr As Integer,Response As Integer) ’Índice Nulo If DataErr = 3058 Then MsgBox "Un empleado debe tener un número" ’el mensaje estándar de Access no se muestra Response = acDataErrContinue End If End Sub
3. La instrucción On Error On Error GoTo La instrucción On Error GoTo indica una secuencia de instrucciones que deben ejecutarse en caso de error. Esta instrucción debe estar situada antes de las instrucciones que pueden desencadenar el error. Sintaxis On Error {GoTo <etiqueta>| GoTo 0}
<etiqueta>
Nombre de la etiqueta que indica el inicio de la secuencia de instrucciones. Una etiqueta se compone de un nombre que empieza por una letra y del signo dos puntos (:). Ej: Gest_error: La secuencia de instrucciones llamada para gestionar los errores está situada generalmente al final del procedimiento o de la función, y precedida por una instrucción Exit Sub oExit Function para evitar su ejecución en el caso de que no se produzca ningún error.
0
Desactiva el tratamiento de errores.
Por otra parte, en la secuencia de instrucciones de tratamiento de errores, es necesario indicar en qué lugar debe continuar la ejecución del procedimiento o función después del tratamiento del error. Para este fin debe utilizarse una de las instrucciones siguientes:
Resume
Continúa la ejecución del programa en la instrucción que ha provocado el error.
Resume Next
Continúa la ejecución del programa en la instrucción siguiente a la que ha provocado el error.
Resume<etiqueta>
Continúa la ejecución del programa en la etiqueta definida.
Ejemplo Sub MiProcedimiento() On Error GoTo Error ... Exit Sub Error: Select Case Err Case 11 ’División por Cero MsgBox ... ... Resume Next Case 13 ’Tipos incompatibles ... End Select End Sub
4. El objeto Err El objeto Err contiene informaciones que permiten conocer el origen del error.
Propiedades Description
Devuelve una cadena de caracteres que explica el origen del error.
HelpContext
Devuelve el identificador de contexto asociado a un tema de un archivo de ayuda.
HelpFile
Devuelve una cadena de caracteres que contiene la ruta de acceso completa al archivo de ayuda.
LastDLLError
Devuelve un código de error de sistema producido por una llamada a una biblioteca de vínculos dinámicos.
Number
Devuelve un valor numérico que indica el número del error.
Source
Devuelve una cadena de caracteres que contiene el nombre del objeto o de la aplicación que ha generado el error.
Métodos
Clear
Borra de manera explícita el contenido del objeto Err.
Raise
Permite generar errores de ejecución.
Ejemplo El código siguiente permite mostrar un mensaje que da información sobre la naturaleza del error.
Ejemplo de cuadro de mensaje devuelto cuando se produce un error:
Presentación El lenguaje VBA le permite personalizar sus formularios e informes durante su ejecución. Podrá, por ejemplo, efectuar las operaciones siguientes: Modificar la apariencia de un control en un formulario o en un informe (color, tamaño, posición...). Agregar o eliminar controles en un formulario o en un informe. Encadenar formularios a partir de botones de comando. Mostrar o imprimir un informe. Aplicar filtros a los registros de un informe o de un formulario. Etc. Los asistentes para "Botones de comando" y para "Cuadros de lista" generan automáticamente código VBA en procedimientos de evento. Constituyen los primeros ejemplos sencillos de personalización de formularios y de informes. Encontrará otros ejemplos de personalización de formularios y de informes en la "miniaplicación" descrita en el capítulo Código de una miniaplicación.
Personalización de los formularios Un objeto Form forma parte de la colección Forms que representa todos los formularios que están abiertos. El objeto ActiveForm (Screen.ActiveForm) y el objeto Me designan el formulario activo. Utilice la palabra reservada Me para representar un objeto Form o Report en el código, solamente si hace referencia a ese formulario o informe a partir del código en el módulo de clase. Si la referencia se hace a partir de un módulo estándar o de otro módulo del formulario o del informe, deberá utilizar la referencia completa de dichos formularios o informes.
1. Sintaxis Para hacer referencia a un formulario, dispone de varias sintaxis que le permiten hacer referencia a un objeto de una colección: Forms! ej: Forms!Pedidos Forms![] ej: Forms![Pedidos] Forms("") ej: Forms("Pedidos") Forms(<índice>) ej: Forms(0) La sintaxis Forms! es la más habitual.
Si un nombre de formulario contiene un espacio, la primera sintaxis no funciona. Utilice siempre la misma sintaxis para facilitar la lectura del código. Es preferible referenciar un formulario específico por su nombre que por su índice, ya que este último puede cambiar.
Para hacer referencia a un subformulario a partir de un formulario, debe utilizar el nombre del control que contiene el subformulario seguido de la palabra clave Form. Ejemplo [sFrmParticipante].Form!txtNumAlumn [sFrmCursos].Form.RecordSource = strSQL [sFrmCursos].Form.Requery
2. Propiedades disponibles en vista Diseño Para conocer el nombre VBA y la descripción de una propiedad disponible en modo diseño, debe situarse en la ventana Propiedades del objeto Formulario y pulsar la tecla [F1].
Access muestra entonces una página web que indica el nombre de la propiedad VBA, la sintaxis VBA y otra información (valores posibles para la propiedad, ejemplo de código VBA, referencias...).
a. Propiedades de la ficha Formato
1.
Caption
Cadena de caracteres
2.
DefaultView 0 Un único formulario (modo simple)
Byte
1 Formularios continuos (modo continuo) 2 Hoja de datos 3 Tabla dinámica 4 Gráfico dinámico 5 Formulario de doble vista 3.
AllowFormView
Boleano
4.
AllowDataSheetView
Boleano
5.
AllowLayoutView
Boleano
6.
PictureType
Byte
0 Incrustado (o incorporado) 1 Vinculado (o relacionado) 7.
Picture
Cadena de caracteres
8.
PictureTiling
Boleano
9.
PictureAlignment 0 Esquina superior izquierda
Byte
1 Esquina superior derecha 2 Centro 3 Esquina inferior izquierda 4 Esquina inferior derecha 5 Centro del formulario 10.
0 Todos los registros 1 Registro activo 2 Página activa 4.
RibbonName
Cadena de caracteres
5.
ToolBar
Cadena de caracteres
6.
ShortcutMenu
Boleano
7.
MenuBar
Cadena de caracteres
8.
ShortcutMenuBar
Cadena de caracteres
9.
HelpFile
Cadena de caracteres
10.
HelpContextID
Entero Largo
11.
HasModule
Boleano
12.
FastLaserPrinting
Boleano
13.
Tag
Cadena de caracteres
3. Propiedades no disponibles en modo Diseño a. Propiedades relativas al modo de ver el formulario CurrentView
Devuelve la vista actual del formulario.
OpenArgs
Devuelve la expresión de cadena especificada en el argumentoOpenArgs del método OpenForm que ha abierto el formulario.
Page
Especifica el número de la página actual.
Section
Identifica una sección y permite acceder a las propiedades de esta sección.
SelHeight
Especifica o determina el número de filas seleccionadas (registros) en el rectángulo de selección actual.
SelLeft
Especifica o determina cuál es la columna (campo) que está más a la izquierda del rectángulo de selección actual.
SelTop
Especifica o determina cuál es la fila (registro) que está en la parte superior del rectángulo de selección.
SelWidth
Especifica o determina el número de columnas seleccionadas (campos) en el rectángulo de selección actual.
b. Propiedades relativas a los registros y a su actualización BookMark
Define un marcador que identifica de manera única un registro.
CurrentRecord
Permite identificar el registro actual.
Dirty
Permite determinar si el registro actual ha sido modificado desde la última vez que se guardó.
NewRecord
Determina si el registro actual es un nuevo registro.
RecordSet
Determina o devuelve el objeto DAO Recordset que representa el origen de registro de un formulario.
RecordSourceQualifer
Devuelve o define una cadena de caracteres que indica el nombre del propietario del origen de los registros SQL Server para el formulario.
c. Propiedades relativas a la presentación del formulario CurrentSectionLeft
Determina la distancia en twips entre la esquina superior izquierda de la sección actual y la esquina superior izquierda del formulario (twip: unidad de medida equivalente a 1/20 de punto o 1/1440 de pulgada. Un centímetro contiene 567 twips).
CurrentSectionTop
Representa la distancia en twips entre la esquina superior de la sección actual y la esquina superior del formulario.
DataSheetAlternateBackColor
Devuelve o define el color mostrado en otras lineas de la hoja de datos de un formulario.
DataSheetBackColor
Especifica o determina el color de fondo de toda la hoja de datos.
DatasheetBorderLineStyle
Indica el estilo de línea que debe emplearse para el borde de la hoja de datos.
DatasheetCellsEffect
Permite especificar si los efectos especiales se aplican a las celdas de una hoja de datos.
DatasheetColumnHeaderUnderlineStyle
Indica el estilo de línea que debe emplearse para el borde inferior de los encabezados de columna de la hoja de datos.
DatasheetFontHeight
Especifica el tamaño en puntos utilizado para mostrar e imprimir los nombres de los campos y los datos en la vista Hoja de datos.
DatasheetFontItalic
Aplica el estilo cursiva a los nombres de campos y a los datos en la vista Hoja de datos.
DatasheetFontName
Especifica la fuente utilizada para mostrar e imprimir los nombres de los campos y los datos en la vista Hoja de datos.
DatasheetFontUnderline
Subraya los nombres de campos y los datos en la vista Hoja de datos.
DatasheetFontWeight
Especifica el espesor de la fuente utilizada para mostrar e imprimir los caracteres de los nombres de campo y de los datos en la vista Hoja de datos.
DatasheetForeColor
Especifica o determina el color del texto de toda la Hoja de datos.
DatasheetGridlinesBehavior
Permite especificar el tipo de cuadrícula que debe aparecer en la vista Hoja de datos.
DatasheetGridlinesColor
Permite especificar el color de la cuadrícula de una hoja de datos.
HorizontalDatasheetGridlineStyle
Indica la cuadrícula horizontal que debe emplearse para el borde de la hoja de datos.
InsideHeight
Determina el alto (en twips) de la ventana que contiene un formulario.
InsideWidth
Determina el ancho (en twips) de la ventana que contiene un formulario.
Pages
Indica el número total de páginas.
Painting
Permite especificar si se debe volver a dibujar el formulario.
PaintPalette
Especifica la paleta que debe emplearse para el formulario.
PictureData
Permite copiar la imagen del formulario en otro objeto que reconozca la propiedad Imagen (Picture).
VerticalDatasheetGridlineStyle
Indica la cuadrícula vertical que debe emplearse para el borde de la hoja de datos.
WindowHeight
Indica el alto de un formulario expresado en twips.
WindowLeft
Indica la posición en pantalla, en twips, del borde izquierdo del formulario.
WindowTop
Indica la posición en pantalla, en twips, del borde superior del formulario.
WindowWidth
Devuelve el ancho de un formulario expresado en twips.
d. Propiedades que devuelven un objeto Application
Permite acceder al objeto Application de Access.
ChartSpace
Devuelve un objeto ChartSpace que representa el espacio gráfico.
Form
Permite hacer referencia a un formulario asociado a un control subformulario.
Module
Permite especificar un módulo de formulario. Los métodos InsertLines, DeleteLines y ReplaceLine del objeto Module permiten modificar el contenido de un módulo de código.
Parent
Permite hacer referencia al objeto principal.
PivotTable
Devuelve un objeto PivotTable que representa el contenedor de una lista de tabla dinámica.
Printer
Devuelve o define un objeto Printer que representa la impresora predeterminada del sistema actual.
RecordsetClone
Permite hacer referencia al objeto Recordset del formulario.
e. Propiedades relativas a la impresión del formulario PrtDevMode
Permite definir u obtener información relativa al modo del dispositivo de impresión especificado.
PrtDevNames
Permite definir u obtener información relativa a la impresora seleccionada.
PrtMip
Define o devuelve información sobre el modo del dispositivo seleccionado.
UseDefaultPrinter
Indica si el formulario utiliza la impresora predeterminada del sistema.
4. Métodos del objeto Form Métodos GotoPage
Mueve el foco al primer control de la página indicada.
Move
Desplaza y/o cambia el tamaño del formulario a las coordenadas indicadas por los valores de los argumentos.
Recalc
Recalcula inmediatamente los controles del formulario.
Refresh
Actualiza los datos del formulario para que contengan los últimos cambios que puedan haber realizado otros usuarios.
Repaint
Efectúa todas las actualizaciones en espera del formulario.
Requery
Actualiza los datos del formulario especificado.
SetFocus
Mueve el foco al formulario.
UnDo
Restablece un formulario que había sido modificado.
Ejemplo Muestra la ficha Cliente en función del nombre de la Empresa seleccionada en un cuadro de lista. Private Sub lstBuscCli_AfterUpdate() Dim rs As Object ’ Busca el registro correspondiente ’ al cliente seleccionado Set rs = Me.Recordset.Clone rs.FindFirst "[Cli_CódigoCli] = ’" & Me![lstBuscCli] & "’" If Not rs.EOF Then Me.Bookmark = rs.Bookmark End Sub Aplicación de un filtro en función del contenido de una casilla de selección: selección de los clientes españoles, extranjeros o de todos los clientes. Private Sub chkPaís_AfterUpdate() Select Case chkPaís ’ Clientes españoles Case 1 Me.FilterOn = True Me.Filter = "[Cli_País] = ’España’" Me.Refresh ’ Clientes extranjeros Case 2 Me.FilterOn = True Me.Filter = "[Cli_País] <> ’España’" Me.Refresh ’ Todos los clientes Case 3 Me.FilterOn = False Me.Refresh End Select End Sub
Personalización de los informes Un objeto Report forma parte de la colección Reports que representa todos los informes que están abiertos. El objeto ActiveReport (Screen.Active Report) y el objeto Me designan el informe activo.
1. Sintaxis Para hacer referencia a un informe están disponibles las mismas sintaxis que para los formularios. Ejemplo Reports![ListaPdo] Reports("ListaPdo") Reports![ListaPdo]![FechaPdo]
2. Propiedades disponibles en vista Diseño a. Propiedades de la ficha Formato
1.
Caption
Cadena de caracteres
2.
DefaultView 0 Vista Informes 1 Vista preliminar
Byte
3.
AllowReportView
Boleano
4.
AllowLayoutView
Boleano
5.
PictureType 0 Insertado vinculadas 1 Vinculado
Byte
2 Compartidas 6.
Picture
Cadena de caracteres
7.
PictureTiling
Boleano
8.
PictureAlignment 0 Esquina superior izquierda
Byte
1 Esquina superior derecha 2 Centro 3 Esquina inferior izquierda 4 Esquina inferior derecha 9.
0 Todas las páginas 1 Primera página 2 Ninguna página 26.
PageHeader
Byte
0 En todas las páginas 1 Sin encabezado de informe 2 Sin pie de informe 3 Sin encabezado/pie de informe 27.
PageFooter
Byte
0 En todas las páginas 1 Sin encabezado de informe 2 Sin pie de informe 3 Sin encabezado/pie de informe 28.
Orientation
Byte
0 De izquierda a derecha 1 De derecha a izquierda 29.
PaletteSource
Cadena de caracteres
b. Propiedades de la ficha Datos
1.
RecordSource
Cadena de caracteres
2.
Filter
Cadena de caracteres
3.
FilterOnLoad
Boleano
4.
OrderBy
Cadena de caracteres
5.
OrderByOnLoad
Boleano
6.
AllowFilters
Boleano
c. Propiedades de la ficha Eventos
1.
OnCurrent
Cadena de caracteres
2.
OnLoad
Cadena de caracteres
3.
OnNoData
Cadena de caracteres
4.
OnClick
Cadena de caracteres
5.
OnGotFocus
Cadena de caracteres
6.
OnLostFocus
Cadena de caracteres
7.
OnDblClick
Cadena de caracteres
8.
OnMouseDown
Cadena de caracteres
9.
OnMouseUp
Cadena de caracteres
10.
OnMouseMove
Cadena de caracteres
11.
OnKeyUp
Cadena de caracteres
12.
OnKeyDown
Cadena de caracteres
13.
OnKeyPress
Cadena de caracteres
14.
OnOpen
Cadena de caracteres
15.
OnClose
Cadena de caracteres
16.
OnResize
Cadena de caracteres
17.
OnActivate
Cadena de caracteres
18.
OnDeactivate
Cadena de caracteres
19.
OnUnload
Cadena de caracteres
20.
OnError
Cadena de caracteres
21.
MouseWheel
Cadena de caracteres
22.
OnFilter
Cadena de caracteres
23.
OnApplyFilter
Cadena de caracteres
24.
OnTimer
Cadena de caracteres
25.
TimerInterval
Cadena de caracteres
26.
OnPage
Cadena de caracteres
27.
KeyPreview
Boleano
d. Propiedades de la ficha Otras
1.
Popup
Boleano
2.
Modal
Boleano
3.
DateGrouping 0 Predeterminado para EE.UU. 1 Usar opciones del sistema
4.
Cycle 0 Todos los registros 1 Registro activo 2 Página activa
5. 6.
RecordLocks
Boleano
RibbonName
Cadena de caracteres
7.
ToolBar
Cadena de caracteres
8.
MenuBar
Cadena de caracteres
9.
ShortcutMenuBar
Cadena de caracteres
10.
HelpFile
Cadena de caracteres
11.
HelpContextID
Entero Largo
12.
HasModule
Boleano
13.
FastLaserPrinting
Boleano
14.
Tag
Cadena de caracteres
3. Propiedades no disponibles en modo Diseño a. Propiedades relativas al modo de ver el informe Moveable
Indica si otro usuario puede mover el informe.
Page
Indica el número de página actual.
b. Propiedades relativas a los registros y a su actualización CurrentRecord
Identifica el registro actual.
Dirty
Permite determinar si el registro actual ha sufrido modificaciones desde la última vez que se guardó.
HasData
Indica si el informe es dependiente de un conjunto de registros vacío.
RecordSourceQualifier
Devuelve o define una cadena de caracteres que indica el nombre del propietario del origen de los registros SQL Server para el informe.
c. Propiedades relativas a la presentación del informe DrawMode
Especifica cómo afecta la pluma (el color utilizado para el dibujo) a los colores de fondo del informe cuando utiliza los métodos Line, Circleo PSet para dibujar sobre un informe al imprimir.
DrawStyle
Especifica el estilo de línea cuando utiliza métodos Line y Circlepara imprimir líneas en un informe.
DrawWidth
Especifica el ancho de línea para los métodos Line, Circle y PSetcuando imprime líneas en un informe.
FillColor
Permite especificar el color de relleno de los rectángulos y de los círculos dibujados en un informe mediante los métodos Line yCircle.
FillStyle
Especifica si un círculo o una línea dibujada mediante el métodoCircle o Line es transparente, opaco o relleno con un patrón.
FontBold
Especifica si una fuente debe aparecer en negrita al imprimir controles de informes o al utilizar el método Print en un informe.
Left
Define la posición izquierda del informe.
Painting
Permite especificar si se debe volver a dibujar el informe.
PaintPalette
Especifica la paleta que debe emplear el informe.
ScaleLeft
Especifica las unidades de las coordenadas horizontales que representan el borde izquierdo de una página cuando utiliza los métodos Circle, Line, PSet o Print para la impresión o la vista
los
previa de un informe o para guardarlo como archivo. ScaleMode
Especifica la unidad de medida para las coordenadas de una página cuando utiliza los métodos Circle, Line, PSet, Print, TextHeight oTextWidth para la impresión o la vista previa de un informe o para guardarlo como archivo.
ScaleTop
Especifica las unidades de las coordenadas verticales que representan el borde superior de una página cuando utiliza los métodos Circle,Line, PSet o Print para la impresión o la vista previa de un informe o para guardarlo como archivo.
ScaleWidth
Especifica el número de unidades utilizadas en el ancho de página cuando utiliza los métodos Circle, Line, PSet o Print para la impresión o la vista previa de un informe o para guardarlo como archivo.
Top
Define la posición superior del informe.
WindowLeft
Indica la posición en la pantalla, en twips, desde el borde izquierdo del informe.
WindowTop
Indica la posición en la pantalla, en twips, desde el borde superior del informe.
d. Propiedades que devuelven un objeto Application
Permite acceder al objeto Application de Access.
Module
Permite especificar un módulo de informe. Los métodosInsertLines, DeleteLines y ReplaceLine del objeto Modulepermiten modificar el contenido de un módulo de código.
Parent
Permite hacer referencia al objeto principal.
Printer
Devuelve o define un objeto Printer que representa la impresora predeterminada del sistema actual.
Recordset
Determina o devuelve el objeto DAO Recordset que representa los registros de un informe.
Shape
Devuelve una cadena que representa el comando de tipo Shape y que permite efectuar la ordenación y el agrupamiento del informe especificado. Es sólo lectura.
Report
Permite hacer referencia al informe asociado a un control subinforme.
e. Propiedades relativas a la impresión del informe CurrentX
Permite especificar la coordenada horizontal de la posición inicial del siguiente método de impresión o de dibujo de un informe.
CurrentY
Permite especificar la coordenada vertical de la posición inicial del siguiente método de impresión o de dibujo de un informe.
MoveLayout
Especifica si Microsoft Access debe ir a la siguiente posición de impresión de la página.
NextRecord
Especifica si una sección debe pasar al registro siguiente.
Pages
Indica el número total de páginas.
PrintCount
Devuelve el número de evaluaciones de la propiedad AlImprimir (OnPrint) para la sección actual de un informe.
PrintSection
Especifica si debe imprimirse una sección.
PrtDevMode
Permite definir o restituir informaciones relativas al modo del dispositivo de impresión especificado.
PrtDevNames
Permite definir o devolver información relativa a la impresora seleccionada.
PrtMip
Define o devuelve información sobre el modo del dispositivo especificado.
UseDefaultPrinter
Indica si el informe utiliza la impresora predeterminada del sistema.
f. Otras propiedades FormatCount
Permite determinar el número de evaluaciones de la propiedad AlDarFormato (OnFormat) para la sección actual de un informe.
GroupLevel
Hace referencia al nivel de grupo por el que se está ordenando o agrupando en un informe.
Hwnd
Devuelve el controlador (un valor único de tipo Entero largo) atribuido a la ventana actual por Microsoft Windows.
PictureData
Permite copiar la imagen del informe en otro objeto que reconozca la propiedad Imagen (Picture).
Section
Identifica una sección y permite acceder a sus propiedades.
4. Métodos Circle
Permite dibujar un círculo o una elipse.
Line
Permite dibujar líneas o rectángulos.
Move
Desplaza y/o cambia el tamaño del informe a las coordenadas indicadas por los valores de los argumentos.
Print
Envía el texto definido al objeto Report.
Pset
Determina un punto del informe para modificar su color.
Requery
Actualiza los datos del informe especificado actualizando el origen de datos.
Scale
Define el sistema de coordenadas.
TextHeight
Indica el espacio vertical necesario para mostrar una cadena de texto en la fuente actual del informe especificado (la unidad de medida del valor de vuelto depende del valor de la propiedad ScaleMode).
TextWidth
Indica el espacio horizontal necesario para mostrar una cadena de texto en la fuente actual del informe especificado (la unidad de medida del valor devuelto depende del valor de la propiedad ScaleMode).
Los objetos Control Un objeto Control forma parte de la colección Controls que representa todos los controles de un formulario, de un informe o de un subformulario. El objeto ActiveControl (Screen.ActiveControl o.ActiveControl) designa el control activo.
1. Sintaxis Puede referenciar un control de manera implícita: |! ej: Me!FechaPdo |![] ej: Me![FechaPdo] |("") ej: Me("FechaPdo") |. ej: Me.FechaPdo o de manera explícita como miembro de la colección Controls: |.Controls{("")|!| (<índice control>)} ej: Me.Controls!FechaPdo Me.Controls![FechaPdo] Me.Controls("FechaPdo") Me.Controls(0) Cada control tiene sus propiedades, métodos y eventos particulares. Solamente se relacionan aquí las propiedades y métodos comunes a todos los controles. Para referenciar un control del formulario o del informe activo no es obligatoria la palabra clave Me. Puede utilizar directamente el nombre del control.
2. Propiedades comunes de la mayoría de los controles a. Propiedades que devuelvan objetos Application
Permite acceder al objeto Aplicación de Microsoft Access.
Hyperlink
Devuelve una referencia a un objeto hipervínculo.
Parent
Permite hacer referencia al objeto contenedor de un control (formulario, informe...).
b. Otras propiedades Height
Devuelve o define la altura de un control.
Left
Devuelve o define la posición vertical de un control en un formulario o un informe (corresponde a la propiedad "izquierda").
OldValue
Devuelve el valor sin editar del control dependiente (valor anterior).
Top
Devuelve o define la posición horizontal de un control en un formulario o un informe (corresponde a la propiedad "superior").
Width
Devuelve o define el valor de un control.
3. Métodos comunes a la mayoría de los controles
Requery
Recalcula el valor de un control.
SetFocus
Mueve el foco a un control.
SizeToFit
Ajusta un control para que quepa el texto o la imagen que contiene.
UnDo
Restablece un control que había sido modificado.
4. El método Move El método Move está disponible para la mayoría (CheckBox, ComboBox,CommandButton, Image, Label, Line, TextBox...).
de
controles
Permite desplazar y/o cambiar el tamaño del control en función de las coordenadas indicadas por los valores de los argumentos. Sintaxis del método Move <expresión>.Move(, , , )
<expresión>
Designa un control, informe o formulario.
Izquierda
Obligatorio. Posición en pantalla, en twips, desde el borde izquierdo del objeto en relación al borde izquierdo de la ventana de Microsoft Access.
Arriba
Opcional. Posición en pantalla, en twips, desde el borde superior del objeto en relación al borde superior de la ventana de Microsoft Access.
Ancho
Opcional. Ancho deseado, en twips, del objeto.
Alto
Opcional. Alto deseado, en twips, del objeto.
Los controles de Access 1. Presentación Microsoft Access 2013 contiene un interesante número de controles que facilitan la elaboración de una aplicación. Estos controles se sitúan en formularios o informes para poder obtener la interfaz deseada. Cada uno de ellos posee sus propias características (propiedades), sus propios comportamientos (métodos), así como una lista de eventos a los que pueden responder; todo esto es accesible mediante el examinador de objetos. Distinguimos dos tipos de controles: los controles intrínsecos, integrados directamente en el motor de Access, los controles ActiveX, siendo cada uno objeto de un archivo OCX. Los controles intrínsecos están todos en el cuadro de herramientas. Los controles ActiveX pueden seleccionarse mediante la herramienta
del cuadro de herramientas,
que da una lista de todos los controles ActiveX existentes en el sistema. Funcionan del mismo modo que los controles intrínsecos y se instalan en el sistema al instalar nuevos programas o mediante la adquisición de bibliotecas de controles ActiveX. La versión Office 2013 Professional permite especialmente la utilización del control Calendar (Calendario) que facilita la presentación y actualización de una fecha a partir de un calendario.
2. Lista de los controles Access Para acceder a los controles desde un formulario o un informe abierto en Vista Diseño, habilite la fichaCrear de la cinta de opciones: la lista de controles y de herramientas de edición está disponible desde el grupo Controles.
Nombre del control
Tipo de objeto VBA
1.
Cuadro de texto
TextBox
2.
Etiqueta
Label
3.
Botón
CommandButton
4.
Control de pestaña
TabControl
5.
Insertar hipervínculo
Hyperlink
6.
Control de explorador Web
WebBrowserControl
7.
Control de navegación
NavigationControl
8.
Grupo de opciones
OptionButton
9.
Insertar o quitar salto de página
PageBreak
10.
Cuadro combinado
ComboBox
11.
Insertar gráfico
Chart
12.
Línea
Line
13.
Botón de alternar
ToggleButton
14.
Cuadro de lista
ListBox
15.
Rectángulo
Rectangle
16.
Casilla de verificación
CheckBox
17.
Marco de objeto independiente
UnboundObjectFrame
18.
Datos adjuntos
Attachment
19.
Botón de opción
OptionButton
20.
Subformulario / Subinforme
SubForm / SubReport
21.
Marco de objeto dependiente
BoundObjectFrame
22.
Imagen
Image
Las opciones de inicio Las opciones de inicio de Access 2013 permiten definir el aspecto y el comportamiento de la aplicación cuando ésta se abre. Para modificar las opciones de inicio: Seleccione el comando Opciones de la pestaña Archivo. Seleccione la categoría Base de datos actual. La mayor parte de estas opciones corresponden a las propiedades de la base de datos actual (objetoCurrentDb) y se pueden modificar por medio del lenguaje VBA: Propiedad VBA
Descripción
Tipo
AllowFullMenus
Permitir menús completos
Boleano
AllowShortcutMenus
Permitir los menús contextuales por defecto
Boleano
AllowSpecialKeys
Permitir las teclas especiales Access
Boleano
AppIcon
Icono de la aplicación
Texto
AppTitle
Título de la aplicación
Texto
AutoCompact
Compactar la base de datos cuando se cierre
Boleano
RemovePersonalInformation
Eliminar la información personal en el registro de la base de datos
Boleano
StartupForm
Nombre del formulario que se muestra al abrir la base de datos
Texto
StartupShortcutMenuBar
Nombre de la barra de menu contextual
Texto
StartupShowStatusBar
Mostrar la barra de estado
Boleano
ThemedFormControls
Utilizar los controles con el tema de Windows en los formularios
Boleano
UseAppIconForFrmRpt
Utilizar el icono de la aplicación como icono de formulario e informe
Boleano
Para modificar una propiedad con ayuda del lenguaje VBA, debe utilizar la colección Propiedades del objeto Database. Si la propiedad no ha sido definida aún, deberá crearla mediante el método CreateProperty. El ejemplo siguiente permite modificar algunas opciones de inicio. Sub ModificaOpciones() Dim intX As Integer ’ Título de la aplicación intX = AddAppProperty("AppTitle", DB_Text, _ "Gestión de los cursos") ’ Icono de la aplicación intX = AddAppProperty("AppIcon", DB_Text, "C:\Cursos\Curso.bmp") ’ Opción "Utilizar como icono de formulario o de informe" intX = AddAppProperty("UseAppIconForFrmRpt", DB_BOOLEAN, 1) ’ Opción "Compactar al cerrar" intX = AddAppProperty("Auto Compact", DB_BOOLEAN, 1) End Sub
Function AddAppProperty(strName As String, _ varType As Variant, varValue As Variant) As Integer Dim dbs As Object, prp As Variant
Const conPropNotFoundError = 3270 ’ Modifica el valor de la propiedad Set dbs = CurrentDb On Error GoTo AddProp_Err dbs.Properties(strName) = varValue AddAppProperty = True AddProp_Bye: Exit Function AddProp_Err: ’ En caso de error agrega la propiedad ’ mediante el método CreateProperty If Err = conPropNotFoundError Then Set prp = dbs.CreateProperty(strName, varType, varValue) dbs.Properties.Append prp Resume Else AddAppProperty = False Resume AddProp_Bye End If End Function
Personalización de la cinta de opciones 1. Presentación En Access 2013, se puede personalizar íntegramente el aspecto de la cinta de opciones mediante lenguaje XML. Este lenguaje permite: ocultar las fichas existentes. crear nuevas fichas, grupos de comandos y comandos. personalizar la presentación de los comandos mediante iconos. asociar macros o código VBA a los comandos. ver comandos integrados en Access. El código XML puede ser almacenado en varios lugares pero se recomienda encarecidamente almacenarlo en una tabla del sistema de la base de datos. Las cintas de opciones creadas en lenguaje XML pueden asociarse a la aplicación Access o únicamente a algunos formularios e informes.
2. Configuración de Access para la personalización de la cinta de opciones Para poder crear y probar mejor su código XML, se recomienda modificar las opciones siguientes:
a. Mostrar las tablas del sistema en el panel de navegación De manera predeterminada, las tablas del sistema no se muestran en el panel de navegación y por tanto, no podrá acceder a la tabla del sistema que permite almacenar el código XML. Para modificar esta opción: Haga clic con el botón secundario del ratón en la barra de navegación situada en la parte superior delpanel de navegación. Seleccione la opción Opciones de navegación en el menú contextual. En el cuadro de diálogo Opciones de navegación, active la opción Mostrar objetos del sistemay a continuación haga clic en el botón Aceptar.
b. Mostrar mensajes de error contenidos en el código XML De manera predeterminada, los mensajes de error detectados en el código XML no se muestran. Por tanto, si su código XML contiene errores, la cinta de opciones no aparecerá y será difícil identificar la causa del error. Para modificar esta opción: Seleccione el comando Opciones de la pestaña Archivo. Seleccione la categoría Configuración de cliente. Seleccione la opción Mostrar errores de interfaz de usuario en el complemento debajo deGeneral. Haga clic en el botón Aceptar. Si se detecta un error durante la ejecución del código XML que permite generar la cinta personalizada, aparece un mensaje de error. Este mensaje indica el número de línea y de columna del código en el que
se encuentra el error así como la descripción del error. Ejemplo:
3. Creación de una tabla del sistema USysRibbons La tabla del sistema USysRibbons permite almacenar el código XML que permitirá crear una o varias cintas de opciones. Para crear esta tabla: Vaya a la ficha Crear. En el grupo Tablas, haga clic en Diseño de tabla. Inserte los campos siguientes: RibbonId
Autonumérico
RibbonName
Texto de 255 caracteres
RibbonXML
Memo
Seleccione el campo RibbonId y haga clic en el comando Clave principal (situado en el grupoHerramientas de la ficha Diseño). Haga clic en Guardar desde la barra de herramientas de Acceso rápido. Asigne a la nueva tabla el nombre USysRibbons.
4. Adición de código XML de personalización a la tabla USysRibbons Para asociar código XML a su tabla USysRibbons, la solución más sencilla es generar un formulario específico. Para ello: Seleccione la tabla USysRibbons en el panel de navegación. Vaya a la ficha Crear y a continuación haga clic en Formulario en el grupo Formularios. Introduzca el nombre de la cinta de opciones y el código XML asociado en el formulario. Ejemplo: El código XML siguiente permite ocultar las fichas Crear y Datos externos de la Cinta de opciones:
Para facilitar la introducción y la lectura del código XML, puede utilizar un editor XML o un software de desarrollo (ejemplos: Visual Web Developer Express disponible para su descarga desde el sitio web de Microsoft, Microsoft Visual Studio y su complemento Visual Studio Tools) para crear su código y copiarlo a la tabla USysRibbon.
5. Asociación de la cinta de opciones a la aplicación activa Seleccione el comando Opciones de la pestaña Archivo. Seleccione la categoría Base de datos actual en el menú de la izquierda. Inserte el nombre de la cinta (por ejemplo: Cinta1) en la lista Nombre de banda de opcionesdebajo de Opciones de barra de herramientas y de cinta de opciones.
Haga clic en el botón Aceptar. Aparecerá el mensaje siguiente:
Cierre la base de datos y vuelva a abrirla para activar la nueva cinta de opciones. El código XML de la cinta de opciones se ejecuta al abrir la base de datos. Para probar las modificaciones introducidas en el código XML, siempre deberá cerrar y volver a abrir la base de datos.
6. Asociación de la cinta de opciones a un formulario o a un informe Abra el formulario o el informe en vista Diseño. Muestre la hoja de propiedades del formulario o del informe. En la ficha Otras de la hoja de propiedades, haga clic en la lista Nombre de banda de opciones y seleccione la cinta que desee que se muestre cuando se abra el formulario o el informe.
Guarde y cierre el formulario. Abra el formulario en Vista Formulario: aparece entonces la cinta de opciones seleccionada. Al cerrar el formulario, la cinta de opciones asociada a la aplicación será restaurada.
Presentación del lenguaje XML 1. El lenguaje XML El lenguaje XML (eXtensible Markup Language Lenguaje de marcado extensible) es el lenguaje estándar de descripción y de intercambio de datos, utilizado especialmente en la web. Igual que el lenguaje HTML, el lenguaje XML utiliza marcas activas (o etiquetas) para delimitar un contenido. Una marca activa es fácilmente identificable porque comienza con el carácter < y termina con el carácter > (las marcas activas de fin de contenido comienzan por /).
2. Elementos XML utilizados para personalizar la cinta de opciones a. Principales marcas activas XML utilizadas en el código XML de una cinta de opciones Nombre de la marca
Descripción
<customUI>
Marca principal de una cinta de opciones personalizada
Marca que contiene la descripción de la cinta de opciones
Menú accesible desde el botón Microsoft Office
Ficha en la cinta de opciones
Grupo de una ficha en la cinta de opciones
Etiqueta (título)
<País>Alemania 030‐0074321030‐0076545 Introduzca el código siguiente en el módulo ImportExportXML. Guarde la tabla clientes en Access con otro nombre. Ejecute el procedimiento ImportTablaCliente.
Private Sub ImportTablaCliente() ’ Importación de la tabla Clientes ImportTabla ("Clientes") End Sub Private Sub ImportTabla(strTableName As String) ’ Importación de una tabla Application.ImportXML "C:\XML\" & strTableName & ".xml" End Sub La tabla Clientes se crea en Access con un solo registro.
Ejemplo de creación de un archivo HTML Usted puede, a partir del lenguaje VBA, usted puede crear un archivo HTML. Para ello debe utilizar el objetoFileSystemObject. Los métodos y propiedades de este objeto se detallan en el capítulo Programación en Windows.
El ejemplo siguiente permite crear el archivo ImageList.htm que contiene todas las imágenes del directorio seleccionado por el usuario. Private Sub CreaHTML() Dim fso As Object ’ Carpeta Dim fld As Object ’ Colección Files Dim fls As Object ’ Objeto File Dim fl As Object ’ Archivo Html Dim fHtml As Object Dim strFolder As String Dim strHtml As String ’ Selección de la carpeta strFolder = InputBox("Introduzca la ruta de acceso de la carpeta que _ contiene " _ & "las imágenes", "Test VBA", "C:\") ’ Búsqueda de los archivos de imagen Set fso = CreateObject("Scripting.FileSystemObject") If fso.folderExists(strFolder) Then Set fld = fso.GetFolder(strFolder & "\") Set fls = fld.Files strHtml = "" For Each fl In fls If Left(fl.Type, 5) = "Image" Then strHtml = strHtml & "" _ & fl.Name & " " End If Next ’ Crea el archivo HTML strHtml = strHtml & "" Set fHtml = fso.CreateTextFile(strFolder & "\" & _ "ImageList.htm", True) fHtml.Write (strHtml) Else MsgBox "Carpeta " & strFolder & " no encontrada" End If End Sub Vista en Mozilla Firefox de un archivo HTML creado con el código del ejemplo.
Presentación de las API La interfaz de programación Windows API (Application Programming Interface) ofrece funciones que permiten controlar los aspectos más internos del sistema operativo. Puede extender y personalizar sus aplicaciones Access llamando a funciones Windows API desde VBA. A pesar de que Access continúa evolucionando y que su lenguaje de programación nativo (VBA) integra cada vez más funciones del sistema, para ciertas tareas es necesario recurrir a funciones de la API. Una API es un conjunto de funciones que se puede utilizar para trabajar con un componente, una aplicación o el sistema operativo. Se compone generalmente de una o varias DLL (Dynamic Link Library o biblioteca de vínculos dinámicos). La API utilizada más habitualmente es la API Windows que incluye las DLL que constituyen el sistema operativo Windows. Cada aplicación Windows interactúa directa o indirectamente con el API Windows. Esto garantiza un comportamiento coherente de todas las aplicaciones que funcionan bajo Windows. Las DLL de Windows utilizadas más habitualmente son las siguientes: Kernel32.dll
Funciones de bajo nivel del sistema operativo, tales como la gestión de la memoria y la administración de los recursos.
User32.dll
Funciones de administración Windows, tales como el tratamiento de mensajes, relojes, menús y comunicaciones.
GDI32.dll
Biblioteca GDI (Graphics Device Interface) que contiene funciones de salida hacia los dispositivos (gráficos, contexto de presentación y gestión de las fuentes).
También hay disponibles otras API como, por ejemplo, la interfaz MAPI (Mail Application Programming Interface) que permite escribir aplicaciones de correo electrónico.
Llamada a una función de la API Windows Para llamar a una función de la API Windows, debe declararla utilizando la instrucción Declare en la sección de Declaraciones de un módulo de su propio proyecto (generalmente un módulo dedicado a los procedimientos generales de la aplicación).
1. Sintaxis de la instrucción Declare En las versiones 32 bits de Visual Basic, es obligatorio respetar las minúsculas y las mayúsculas en los nombres de funciones y de procedimientos de las DLL. [Public|Private] Declare Sub <nombre_proc> Lib ""_ [Alias ""] [([lista_argumentos])] [Public|Private] Declare Function _ Lib ""_ [Alias ""] [([Lista_argumentos])] [As <Tipo>]
Nombre_proc, Nombre_func
Nombre del procedimiento o de la función que sea válido en Visual Basic.
Nombre_DLL
Nombre de la DLL.
Nombre_alias
Nombre del procedimiento o de la función en la DLL.
Lista_argumentos
Parámetros que se pasan al procedimiento (ver capítulo El lenguage Visual Basic).
tipo
Tipo del valor de retorno de un procedimiento Function.
Ciertas DLL no proporcionan nombre para sus procedimientos y sus funciones y en su lugar proporcionan un número ordinal. La declaración de tales procedimientos o funciones utiliza la misma sintaxis, pero es necesario definir el número ordinal a nivel del Alias con el signo (#) seguido del nombre (ej: Alias "#52").
2. Paso de argumentos Las funciones y procedimientos de las DLL están escritas, en su mayoría, en lenguaje C y utilizan su sintaxis. Además, el paso de argumentos a un procedimiento o a una función de una DLL desde Visual Basic, no siempre es sencilla. En el caso de las DLL que utilizan la sintaxis de C, todos los argumentos se pasan por valor, salvo las matrices. Las cadenas en lenguaje C se consideran como matrices de caracteres. Ciertos argumentos de procedimientos de DLL pueden aceptar distintos tipos de datos (un poco como las Variant) y deben declararse como tipo Any (ej: variable As Any). Visual Basic, para este tipo de argumento, considera que se pasa sistemáticamente por referencia; si se debe pasar por valor, es necesario especificarlo en la llamada (y no en la declaración) del procedimiento o de la función con la palabra clave ByVal. Por defecto, Visual Basic pasa los argumentos por Referencia.
Tabla de las declaraciones de argumentos Declaración en lenguaje C BOOL
Declaración Visual Basic ByVal As Boolean
Llamada Una expresión cuya evaluación produce un valor de tipo Boolean.
long, DWORD, LONG, COLORREF
ByVal As Long
Una expresión cuya evaluación produce un valor de tipo Long.
WORD
ByVal As Long
Una expresión cuya evaluación produce un valor de tipo Long.
NULL
As Any o ByVal As Long
ByVal Nothing o ByVal 0$ o vbNullString.
int, short
ByVal As Integer
Una expresión cuya evaluación produce un valor de tipo Integer.
char, BYTE
ByVal As Byte
Una expresión cuya evaluación produce un valor de tipo Byte.
Entero (INT, UINT) 32 bits con compilador 32 bits
ByVal As Long
Una expresión cuya evaluación produce un valor de tipo Long.
Identificador Windows (hWnd, hDC, hMenu...)
ByVal As Long
Una expresión cuya evaluación produce un valor de tipo Long.
Vacío (valor devuelto de función)
Sub <procedimiento>
Sin objeto.
Puntero a una cadena (LPSTR)
ByVal As String
Una expresión cuya evaluación produce un valor de tipo String.
Puntero a un entero largo (LPDWORD)
As Long
Una variable de tipo Long.
Puntero a vacío
As Any
Una variable (utilice ByVal para pasar una cadena).
Puntero a un char
As Byte
Una expresión cuya evaluación produce un valor de tipo Byte.
Puntero a un entero (LPINT)
As Long
Una variable de tipo Long.
Puntero a una estructura
As
Una variable de este tipo definida por el usuario.
Lista de funciones de la API Windows Esta lista incluye las funciones de la API Windows utilizadas con mayor frecuencia. En el párrafo siguiente se proporcionan ejemplos de la utilización de algunas de estas funciones. GetWindowsDirectory()
Devuelve la ruta de acceso completa del directorio de Windows (aplicaciones, herramientas del sistema).
GetSystemDirectory()
Devuelve la ruta de acceso completa del directorio de sistema de Windows.
GetSystemInfo()
Devuelve información sobre el sistema. Estos datos se almacenan en una estructura de tipo SYSTEM_INFO.
GetActiveWindow()
Devuelve el handle de la ventana activa.
FindWindow()
Devuelve el handle de la ventana en función de su nombre y de la clase a partir de la cual ha sido definida.
SetFocus()
Atribuye el foco de entrada a la ventana refenciada por su handle.
GetPrivateProfileString()
Devuelve una opción extraída de un archivo .ini a partir de un nombre de sección y de clave.
WNetGetUser()
Devuelve el nombre del login de red utilizado por la sesión actual.
Ejemplos de utilización de funciones de la API Windows 1. Recuperación del directorio de Windows Declaración de la función API. Private Declare Function GetPrivateProfileString Lib _KERNEL32" _ Alias _GetPrivateProfileStringA" (ByVal lpApplicationName As String, _ ByVal lpKeyName As Any, _ ByVal lpDefault As String, _ ByVal lpReturnedString As String, _ ByVal nSize As Long, _ ByVal lpFileName As String) As Long Llamada de la función API. Function GetWinPath() As String ’ Esta función VBA devuelve el directorio de Windows Dim strResult As String Dim strProfile As String strResult = String(255, " ") strProfile = GetWindowsDirectory(strResult, 255) ’ Trunca la cadena en el primer carácter nulo If strProfile <> "" Then strResult = Trim(strResult) GetWinPath = Left(strResult, InStr(1, strResult, vbNullChar) ‐ 1) Else GetWinPath = "" End If End Function
2. Inicio de la aplicación Excel si no está activa Este ejemplo permite comprobar si la aplicación Excel está activada e iniciar su ejecución si es necesario. Se emplean dos funciones de la API: FindWindow permite buscar la ventana Excel y FindExecutable la ubicación del archivo Excel.exe. Declaración de la función API. ’ Esta función API busca una ventana Public Declare Function FindWindow Lib "user32" Alias _ "FindWindowA" (ByVal lpClassName As String, ByVal _ lpWindowName As String) As Long ’ Esta función API busca un archivo ejecutable Public Declare Function FindExecutable Lib "shell32.dll" _ Alias "FindExecutableA" (ByVal lpFile As String, _ ByVal lpDirectory As String, ByVal lpResult As String) As Long Llamada de las funciones API. Private Function IniciaExcel() As Boolean Dim strClassName As String Dim strWindowName As String Dim Hwnd As Long Dim blnExe As Boolean
Dim strDirExcel As String Dim Result As Long ’ Inicialización IniciaExcel = False ’ Busca la ventana Excel activa strClassName = vbNullString strWindowName = "Microsoft Excel ‐ Libro1" Hwnd = FindWindow(strClassName, strWindowName) ’ Si no la encuentra busca el directorio Excel ’ e inicia la aplicación Excel If Hwnd = 0 Then strDirExcel = String$(255, 0) Result = FindExecutable("Excel.exe", "C:\", strDirExcel) If Result = 0 Then Exit Function blnExe = Shell(strDirExcel, vbNormalFocus) If Not blnExe Then Exit Function End If IniciaExcel = True End Function
3. Recuperación de un valor en un archivo .ini El archivo AppPresupuesto.ini está constituido por las tres líneas siguientes: [BASE] BasePath=C:\PRESUPUESTO BaseName=PRESUPUESTO.ACCDB El ejemplo siguiente permite recuperar el nombre y la ruta de acceso en el archivo AppPresupuesto.ini situado en el directorio Windows (llamando a la función GetWinPath del ejemplo 1). Declaración de la función API. Public Declare Function GetPrivateProfileString Lib "kernel32" _ Alias "GetPrivateProfileStringA" _ (ByVal lpApplicationName As String, _ ByVal lpKeyName As Any, _ ByVal lpDefault As String, _ ByVal lpReturnedString As String, _ ByVal nSize As Long, _ ByVal lpFileName As String) As Long Llamada de la función API. Public Function LeerClave (Sección As String, Clave As String, _ Archivo As String) As String ’ Esta función devuelve el valor de la clave ’ que podemos encontrar en un archivo .ini cualquiera Dim strResult As String Dim strProfile As Integer Dim i As Integer strResult = String(255, " ") strProfile = GetPrivateProfileString(Sección, Clave, "", _ strResult, 255, Archivo) If strProfile = 0 Then LeerClave = "" Exit Function End If ’ Trunca la cadena en el primer carácter nulo
strResult = Trim(strResult) LeerClave = Left(strResult, InStr(1, strResult, vbNullChar) ‐ 1) End Function Llamada a la función VBA LeerClave. Private Sub Inic_Proyecto () Dim strBaseName As String Dim strPath As String Dim strWinPath As String ’ Buscar el nombre y el directorio de la base strWinPath = GetWinPath() If strWinPath = "" Then Exit Sub ’ Buscar valores en Presupuesto.ini strBaseName = Trim(LeerClave ("BASE", "BASENAME", strWinPath _ & "\" & "Presupuesto.ini")) strPath = Trim(LeerClave ("BASE", "BASEPATH", strWinPath & "\" _ & "Presupuesto.ini")) End Sub
El objeto FileSystemObject El objeto FileSystemObject proporciona acceso al sistema de archivos de un ordenador. Permite buscar, crear, eliminar o mover archivos o carpetas.
1. Métodos Métodos relativos a los archivos CopyFile
Copia uno o varios archivos de una ubicación a otra.
CreateTextFile
Crea un archivo en el disco que lleva el nombre especificado y devuelve un objeto TextStream que puede emplearse para leer o escribir en el archivo.
DeleteFile
Elimina un archivo especificado.
FileExists
Devuelve un valor boleano que indica si existe el archivo especificado.
MoveFile
Desplaza uno o varios archivos de una carpeta a otra.
OpenTextFile
Abre el archivo especificado y devuelve un objeto TextStream que puede emplearse para leer el archivo o para agregarle datos.
Métodos relativos a las carpetas CopyFolder
Copia una carpeta de una ubicación a otra.
CreateFolder
Crea una carpeta.
DeleteFolder
Elimina la carpeta especificada y su contenido.
FolderExists
Devuelve un valor boleano que indica si existe la carpeta especificada.
MoveFolder
Mueve una o varias carpetas de una ubicación a otra.
Métodos relativos a las unidades de disco DriveExists
Devuelve un valor boleano que indica si existe la unidad lógica especificada.
GetDrive
Devuelve un objeto Drive que corresponde a la unidad de una ruta de acceso especificada.
GetDriveName
Devuelve una cadena que contiene el nombre de la unidad correspondiente a una ruta de acceso especificada.
2. Propiedades Drives
Devuelve una colección constituida objetos Drivedisponibles en el equipo local.
por
todos
los
3. Ejemplo El ejemplo siguiente permite mostrar la lista de unidades disponibles y el espacio disponible en cada una de ellas. Sub MuestraUnidad() Dim fso As Object
Dim strMsg As String Dim drv As Object Dim drvs As Object Set fso = CreateObject("Scripting.FileSystemObject") Set drvs = fso.Drives For Each drv In drvs If drv.isready Then strMsg = strMsg & drv.driveletter & ": " _ & Format(EspacioDisponible(drv.driveletter & ":"), _ "# ### ##0") & " KBytes" & vbCrLf End If Next MsgBox strMsg End Sub
Presentación 1. Enunciado del problema El servicio de Personal de una empresa desea realizar un seguimiento de los cursos en los que participan sus empleados. La aplicación Access, realizada con este propósito y presentada en este capítulo, permite: introducir los cursos, buscar los cursos en función de un conjunto de criterios, imprimir la lista de los cursos seleccionados que concuerdan con los distintos criterios de selección.
2. Base de datos Cursos La base de datos Cursos que contiene esta aplicación está constituida por dos formularios y un informe: El formulario Cursos permite entrar, modificar y eliminar cursos. El formulario Buscar permite buscar cursos en función de distintos criterios. El informe Cursos muestra la lista de los cursos seleccionados en el formulario Buscar. La opción Eliminar en cascada está activada en la relación entre las tablas Cursos y Participantes.
3. Modelo relacional de la base
Formulario "Cursos" Este formulario puede abrirse directamente desde Access para agregar cursos o puede ser llamado desde el formulario "Buscar" para modificar o eliminar un curso existente.
La propiedad origen del formulario es Cursos (Tabla Cursos).
1. Lista de controles Nombre del control
Descripción
1
txtNombre
Cuadro de texto asociado al campo CUR_TITULO
2
cboOrganismo
Cuadro combinado basado en la tabla Organismos y asociado al campo CUR_IDORGA
3
cboCampo
Cuadro combinado basado en la tabla Campos y asociado al campo CUR_IDCAMP
4
txtCoste
Cuadro de texto asociado al campo CUR_COSTE
5
txtCosteAlumno
Cuadro de texto
6
txtFechaIni
Cuadro de texto en formato Fecha asociado al campo CUR_FECHAINI
7
txtFechaFin
Cuadro de texto en formato Fecha asociado al campo CUR_FECHAFIN
8
txtDuracion
Cuadro de texto asociado al campo CUR_DURACION
9
sFrmParticipante
Control subformulario que muestra el subformulario AccessSF Participantes
10
txtNumAlumno
Cuadro de texto
11
cmdGuardar
Botón de comando
12
cmdEliminar
Botón de comando
13
cmdCerrar
Botón de comando
Control Form
Propiedad específica Entrada Datos = Sí Origen = Cursos
txtNumAlumno
Valor predeterminado = 0 Bloqueado = Sí Origen Control = [sFrmParticipante].[Formulario]![txtNumAlumno]
txtCosteAlumno
Bloqueado = Sí
2. Código VBA El código VBA asociado a este formulario muestra los aspectos siguientes: sincronización entre formulario y subformulario: al agregar o eliminar un participante, se recalculan y actualizan el número de alumnos y el coste por alumno, gestión de los duplicados a nivel de subformulario, utilización de un control calendario para entrar fechas, llamada a una función para efectuar cálculos sobre las fechas, ...
Código VBA general a la aplicación: procedimientos y declaraciones comunes Introduzca el código siguiente en un módulo estándar (ProcGene por ejemplo). Option Compare Database Option Explicit ’ Criterios de búsqueda Public p_strCond As String ’ N° de empleado Public p_lngEmp As Long ’ Titulo del informe Public p_strTítulo As String ___________________________________________________________________ Function NumDíasLab(Date1, Date2) As Integer Dim NumDias, NumSem As Integer ’ Calcula el número de días laborables ’ entre dos fechas NumDias = DateDiff("d", Date1, Date2) + 1 ’ Número de semanas entre las 2 fechas NumSem = DateDiff("ww", Date1, Date2) NumDíasLab = NumDias ‐ (NumSem * 2) End Function
Código VBA del formulario Option Explicit Dim blnAct As Boolean ___________________________________________________________________ Private Sub cmdGuardar_Click() Dim intRep As String
’ Control de los campos obligatorios If Not Ctrl_Info Then Exit Sub If IsNull(txtFechaIni) Or IsNull(txtFechaFin <> "") Then If MsgBox("Fechas no introducidas, ¿desea guardar " _ & "el registro ?", vbQuestion & vbYesNo) = vbNo Then txtFechaFin.SetFocus Exit Sub End If End If ’ Pasa a la creación de un nuevo curso ’ si se encuentra en modo entrada de datos If Me.DataEntry Then txtDuracion = "" txtCosteAlumno = "" blnAct = False DoCmd.GoToRecord , , acNewRec txtNombre.SetFocus CmdEliminar.Enabled = False cmdGuardar.Enabled = False Else DoCmd.Close End If End Sub ___________________________________________________________________ Private Sub cmdCerrar_Click() ’ Comprueba si introducción de curso activada If txtNombre <> "" Then MsgBox ("Guarde o elimine el curso antes de cerrar") Else DoCmd.Close End If End Sub ___________________________________________________________________ Private Sub cmdEliminar_Click() On Error GoTo Err_Supr If blnAct Then ’ Elimina el registro si se ha modificado DoCmd.DoMenuItem acFormBar, acEditMenu, 8, , acMenuVer70 DoCmd.DoMenuItem acFormBar, acEditMenu, 6, , acMenuVer70 Else ’ En caso contrario anula la entrada DoCmd.DoMenuItem acFormBar, acEditMenu, acUndo, , acMenuVer70 End If On Error GoTo 0 Exit Sub Err_Supr: MsgBox "No se puede eliminar: " & Err.Number, vbCritical On Error GoTo 0 End Sub ___________________________________________________________________ Private Sub Form_AfterUpdate() ’ Indicador de actualización blnAct = True End Sub ___________________________________________________________________ Private Sub Form_Load() ’ Desactiva los botones Eliminar ’ y Guardar si está en modo agregar datos If Me.DataEntry Then cmdGuardar.Enabled = False CmdEliminar.Enabled = False Else ’ Calcula el coste por alumno Me.Recalc
If txtNumAlumno > 0 Then txtCosteAlumno = txtCoste / txtNumAlumno End If blnAct = True End If End Sub ___________________________________________________________________ Private Sub sFrmParticipante_Enter() ’ Control de campos obligatorios Ctrl_Info End Sub ___________________________________________________________________ Private Sub txtCoste_AfterUpdate() ’ Calcula el coste por alumno If txtCoste > 0 And txtNumAlumno > 0 Then txtCosteAlumno = txtCoste / txtNumAlumno End If End Sub ___________________________________________________________________ Private Sub txtFechaIni_LostFocus() ’ Cálculo de la duración del curso Calc_Duración End Sub ___________________________________________________________________ Private Sub txtFechaFin_LostFocus() ’ Cálculo de la duración del curso Calc_Duración End Sub ___________________________________________________________________ Private Sub txtNombre_BeforeUpdate(Cancel As Integer) ’ Activa el botón Eliminar CmdEliminar.Enabled = True End Sub ___________________________________________________________________ Private Function Ctrl_Info() As Boolean ’ Comprueba si se han introducido los campos obligatorios If IsNull(txtNombre) Then MsgBox "Nombre obligatorio", vbCritical txtNombre.SetFocus Exit Function End If If IsNull(cboOrganismo) Then MsgBox "Organismo obligatorio", vbCritical cboOrganismo.SetFocus Exit Function End If If IsNull(cboCampo) Then MsgBox "Campo obligatorio", vbCritical cboCampo.SetFocus Exit Function End If If IsNull(txtCoste) Then MsgBox "Coste del curso obligatorio", vbCritical txtCoste.SetFocus Exit Function End If Ctrl_Info = True CmdEliminar.Enabled = True cmdGuardar.Enabled = True End Function ___________________________________________________________________ Private Sub Calc_Duración() Dim intDuracion As Integer ’ Si se han introducido las dos fechas ’ Comprobación de las fechas y cálculo de la duración If txtFechaIni <> "" And txtFechaFin <> "" Then intDuracion = DateValue(txtFechaFin) ‐ DateValue(txtFechaIni)
If intDuracion < 0 Then MsgBox "Debe especificar una fecha de inicio anterior " _ & "a la fecha de fin", vbCritical, "Gestión de Cursos" Exit Sub Else txtDuracion = NumDíasLab(DateValue(txtFechaIni), _ DateValue(txtFechaFin)) End If End If End Sub
3. Subformulario "SF Participantes" El formulario "Cursos" y el subformulario "SF Participantes" están vinculados por los campos CUR_IDCURSO y PART_IDCURSO.
Nombre del control
Descripción
1
cboEmpleado
Cuadro combinado basado en la tabla Empleados asociada al campo EMP_IDEMP
2
txtNumAlumno
Cuadro de lista independiente
Control
Propiedad específica
Form
Origen = Participantes
txtNumAlumno
Origen Control = Cuenta([PART_IDEMP])
4. Código VBA Private Sub cboEmpleado_AfterUpdate() ’ Si Duplicado: El método Resfresh falla On Error GoTo Duplicados Me.Refresh On Error GoTo 0 ’ Recalcula el coste por alumno ’ Si el formulario principal es Cursos If UCase(Screen.ActiveForm.Name) = "CURSOS" Then CalcCosteAlumno End If Exit Sub ’ Gestión de Duplicados: mensaje de error Duplicados:
If Err.Number = 3022 Then MsgBox "Participante ya introducido" Else MsgBox "Error al agregar el participante: " _ & Err.Number, vbCritical End If ’ Vuelve a dejar el campo vacío cboEmpleado = "" End Sub ___________________________________________________________________ Private Sub Form_AfterDelConfirm(Status As Integer) ’ Recalcula el coste por alumno ’ Si el formulario principal es Cursos If UCase(Screen.ActiveForm.Name) = "CURSOS" Then CalcCosteAlumno End If End Sub ___________________________________________________________________ Private Sub CalcCosteAlumno() Dim frmFormat As Object ’ Calcula el coste / Alumno Set frmFormat = Forms![CURSOS] frmFormat.Recalc If frmFormat.txtCoste < > 0 And txtNumAlumno < > 0 Then frmFormat.txtCosteAlumno = frmFormat.txtCoste / txtNumAlumno End If ’ Activa el botón de comando Guardar If txtNumAlumno < > 0 Then frmFormat.cmdGuardar.Enabled = True End Sub
Formulario "Buscar" Este formulario permite mostrar e imprimir la lista de los cursos que responden a ciertos criterios. Este formulario no está asociado a ningún origen de datos.
1. Lista de controles Nombre del control
Descripción
1
cboOrganismo
Cuadro combinado basado en la tabla Organismos
2
cboCampo
Cuadro combinado basado en la tabla Campos
3
cboEmpleado
Cuadro combinado basado en la tabla Empleados
4
txtFechaIni
Cuadro de texto en formato Fecha
5
cboOperac1
Cuadro combinado que contiene los valores "=", ">", "<"
6
txtFechaFin
Cuadro de texto en formato Fecha asociado al campo CUR_FECHAFIN
7
cboOperac2
Cuadro combinado que contiene los valores "=", ">", "<"
8
cmdBuscar
Botón de comando
9
cmdBorrar
Botón de comando
10
cmdImprimir
Botón de comando
11
cmdCerrar
Botón de comando
12
sFrmcurso
Control subformulario que muestra el subformulario Access SF Cursos
2. Código VBA El código VBA asociado a este formulario muestra los aspectos siguientes: constitución de una consulta de tipo SQL a partir de unos criterios introducidos, asignación de la consulta al subformulario para mostrar solamente los registros deseados, asignación de la consulta a un informe para imprimir solamente los registros deseados. Option Compare Database Option Explicit Dim strSQL As String ___________________________________________________________________ Private Sub cmdBuscar_Click() ’ Crea la consulta en función de los criterios introducidos If cboEmpleado <> "" Then ’ Tablas Cursos y Participantes strSQL = "SELECT CUR_IDCURSO, CUR_TÍTULO, " _ & "CUR_IDCAMP, CUR_IDORGA, CUR_FECHAINI, CUR_FECHAFIN, " _ & "PART_IDEMP FROM CURSOS INNER JOIN PARTICIPANTES " _ & "ON CURSOS.CUR_IDCURSO = PARTICIPANTES.PART_IDFORM" Else ’ Tabla Cursos strSQL = "SELECT CUR_IDCURSO, CUR_TÍTULO, " _ & "CUR_IDCAMP, CUR_IDORGA, " _ & "CUR_FECHAINI, CUR_FECHAFIN FROM CURSOS " End If ’ Prepara la claúsula Where de la consulta SQL ’ concatenando los criterios p_strCond = "" p_lngEmp = 0 If cboCampo <> "" Then p_strCond = p_strCond _ & " AND CUR_IDCAMP = " & cboCampo End If If cboOrganismo <> "" Then p_strCond = p_strCond _ & " AND CUR_IDORGA = " & cboOrganismo End If If cboEmpleado <> "" Then p_strCond = p_strCond _ & " AND PART_IDEMP = " & cboEmpleado p_lngEmp = cboEmpleado End If ’ Criterios sobre las fechas If cboOperac1 <> "" And txtFechaIni <> "" Then p_strCond = p_strCond & " AND (CUR_FECHAINI " & cboOperac1 _ & " #" & Format(DateValue(txtFechaIni), "DD/MM/YY") & "#)" End If If cboOperac2 <> "" And txtFechaFin <> "" Then p_strCond = p_strCond & " AND (CUR_FECHAFIN " & cboOperac2 _ & " #" & Format(DateValue(txtFechaFin), "DD/MM/YY") & "#)" End If ’ Eliminación del primer AND If p_strCond <> "" Then p_strCond = Right(p_strCond, (Len(p_strCond) ‐ 4)) End If
’ Asigna la consulta SQL al subformulario If p_strCond <> "" Then strSQL = strSQL & " WHERE " & p_strCond & " ORDER BY CUR_FECHAINI" Else strSQL = strSQL & " ORDER BY CUR_FECHAINI" End If SFrmCursos.Form.RecordSource = strSQL SFrmCursos.Form.Requery End Sub ___________________________________________________________________ Private Sub cmdBorrar_Click() Dim ctl As Control ’ Borra los cuadros de texto y cuadros combinados For Each ctl In Me.Controls If TypeOf ctl Is TextBox Or TypeOf ctl Is ComboBox Then ctl.Value = "" End If Next End Sub ___________________________________________________________________ Private Sub cmdImprimir_Click() ’ Construcción del título del informe p_strTítulo = "" If cboCampo <> "" Then p_strTítulo = p_strTítulo & " ‐ Campo: " & cboCampo.Column(1) End If If cboOrganismo <> "" Then p_strTítulo = p_strTítulo & " ‐ Organismo: " & cboOrganismo.Column(1) End If If cboEmpleado <> "" Then p_strTítulo = p_strTítulo & " ‐ Empleado: " & cboEmpleado.Column(1) End If ’ Criterios sobre las fechas If cboOperac1 <> "" And txtFechaIni <> "" Then p_strTítulo = p_strTítulo & " ‐ Fecha de inicio " & cboOperac1 _ & " " & txtFechaIni End If If cboOperac2 <> "" And txtFechaFin <> "" Then p_strTítulo = p_strTítulo & " ‐ Fecha de fin " & cboOperac1 _ & " " & txtFechaIni End If If p_strTítulo <> "" Then p_strTítulo = Right(p_strTítulo, Len(p_strTítulo) ‐ 3) End If ’ Abre el informe que cumple ’ los criterios de la búsqueda DoCmd.OpenReport "Cursos", acViewPreview End Sub ___________________________________________________________________ Private Sub cmdCerrar_Click() DoCmd.Close End Sub
3. Subformulario "SF Cursos" El subformulario "SF Cursos" está basado en una consulta a partir de la tabla "Cursos". La propiedad RecordSource del formulario es "SELECT * FROM CURSOS".
Código VBA Option Compare Database Private Sub Form_DblClick(Cancel As Integer) Dim lngIdForm As Long ’ Visualización del formulario CURSOS lngIdForm = [CUR_IDCURSO] DoCmd.OpenForm "Cursos", acNormal, , "[CUR_IDCURSO]=" & lngIdForm, acFormEdit End Sub
4. Informe "Cursos" El informe "SF Cursos" está basado en la tabla "Cursos".
Código VBA
Option Compare Database Option Explicit Private Sub Report_Open(Cancel As Integer) ’ Título determinado en función de los criterios de selección txtCriterios.Caption = p_strTítulo ’ Modifica el origen de datos si se ha seleccionado un empleado If p_lngEmp <> 0 Then Me.RecordSource = "SELECT CURSOS.*, EMPLEADOS.EMP_IDEMP, " _ & "PARTICIPANTES.PART_IDEMP " _ & "FROM EMPLEADOS INNER JOIN (CURSOS INNER JOIN " _ & "PARTICIPANTES ON CURSOS.CUR_IDCURS = PARTICIPANTES.PART_IDCURS)" _ & "ON EMPLEADOS.EMP_IDEMP = PARTICIPANTES.PART_IDEMP" Else Me.RecordSource = "CURSOS" End If ’ Criterios de selección Me.FilterOn = True Me.Filter = p_strCond End Sub
Funciones e instrucciones VBA 1. Manipulación de cadenas de caracteres Funciones Format()
Da formato a una cadena.
Instr()
Busca una subcadena de caracteres.
Lcase()
Conversión en minúsculas.
Left()
Extracción de la parte izquierda de una cadena de caracteres.
Len()
Longitud de una cadena.
Ltrim()
Supresión de los espacios a la izquierda.
Mid()
Devuelve un valor de tipo Variant (String) que contiene un número indicado de caracteres extraídos de una cadena de caracteres.
Right()
Extracción de la parte derecha de una cadena de caracteres.
Rtrim()
Supresión de los espacios a la derecha.
Space()
Creación de una cadena de espacios.
StrComp()
Comparación de cadenas.
StrConv
Devuelve un valor de tipo Variant (String) convertido al formato indicado.
String()
Creación de una cadena de caracteres repetidos.
Trim()
Supresión de los espacios a la izquierda y a la derecha.
Ucase()
Conversión en mayúsculas.
Instrucciones Lset
Alineación a la izquierda de una cadena de caracteres.
Option Compare
Método de comparación predeterminado.
Rset
Alineación a la derecha de una cadena de caracteres.
2. Control del funcionamiento del programa Funciones Choose()
Devuelve el valor de una lista de opciones en función de un índice.
DoEvents()
Detiene momentáneamente la ejecución para que el sistema operativo pueda tratar otros eventos.
IIf()
Devuelve un valor en función de una condición.
Switch()
Devuelve el valor asociado a la primera expresión verdadera.
Instrucciones Call
Llama a un procedimiento Sub.
Do...Loop
Creación de un bucle.
End
Finalización del programa.
Exit Do
Salida de un bucle.
Exit For
Salida de un bucle.
For Each... Next
Permite recorrer todos los elementos de una colección o de una matriz.
For... Next
Creación de un bucle.
Function... End Function
Define el inicio y el final de una función.
GoSub... Return
Llama a un subprograma.
Goto
Efectúa un salto incondicional hasta una línea determinada de un procedimiento.
If... Then... Else
Creación de una alternativa.
On... GoSub
Ejecución de subprogramas en función de una variable.
On... Goto
Salto hacia varias etiquetas de programa en función de una variable.
Property Get
Declaración de un procedimiento Property Get.
Property Let
Declaración de un procedimiento Property Let.
Property Set
Declaración de un procedimiento Property Set.
Select Case
Creación de una alternativa.
Stop
Interrupción provisional del código ACCESS BASIC.
Sub... End Sub
Define el inicio y el final de un procedimiento.
While... Wend
Creación de un bucle.
With
Permite ejecutar una serie de instrucciones sobre un objeto.
3. Conversión de datos Funciones Asc()
Valor Ascii de un carácter.
Cbool()
Conversión de una expresión en Boolean (boleano).
CByte()
Conversión de una expresión en Byte.
CCur()
Conversión de cadena de caracteres numéricos de tipo Currency.
Cdate()
Conversión de una expresión en Date.
CDbl()
Conversión de una cadena de caracteres numéricos en tipo Double.
CDec()
Conversión de una expresión en Decimal.
Chr()
Carácter Ascii de un número.
CInt()
Conversión de una cadena de caracteres en un número de tipo Entero.
CIng()
Conversión de una cadena de caracteres en un número de tipo Long.
CSng()
Conversión de una cadena de caracteres en un número de tipo Single.
CStr()
Conversión de una expresión en formato String.
CVar()
Conversión de una cadena de caracteres en un número de tipo
Variant. CVErr
Devuelve un código de error especificado por el usuario.
DateSerial()
Creación de un número fecha a partir de AA MM DD.
DateValue()
Conversión de una expresión de cadena o de una expresión que representa una fecha en fecha.
Day()
Día de una fecha.
Hex()
Conversión de un número en una cadena en representación Hexadecimal.
Oct()
Conversión de un número en una cadena en representación Octal.
Str()
Conversión de un número en cadena de caracteres.
Val()
Conversión de cadena de caracteres en número.
4. Fecha y hora Funciones Date()
Fecha y hora actual.
DateAdd()
Agrega una fecha.
DateDiff()
Diferencia entre dos fechas.
DatePart()
Extracción de una parte de una fecha.
DateSerial()
Devuelve una fecha a partir del día, del mes y del año.
DateValue()
Devuelve una fecha a partir de una cadena.
Day()
Devuelve el número del día en el mes.
Hour()
Devuelve el número de la hora (0 a 23) de una expresión hora.
IsDate()
Indica si el argumento Variant puede ser convertido en Fecha.
Minute()
Devuelve el número de minutos (0 a 59) de una expresión hora.
Month()
Devuelve el número del mes de una fecha.
Now()
Fecha y hora actual.
Second()
Devuelve el número de segundos (0 a 59) de una expresión hora.
Time()
Devuelve la hora del sistema.
Timer()
Número de segundos transcurridos desde Medianoche.
TimeSerial()
Devuelve la hora actual para una hora, minuto y segundo específicos.
TimeValue()
Devuelve una hora a partir de una cadena.
WeekDay()
Devuelve el número del día de la semana a partir de una fecha.
Year()
Devuelve el valor del año a partir de una fecha.
Instrucciones Date
Permite modificar la fecha del sistema.
Time
Permite modificar la hora del sistema.
5. Declaración Instrucciones
Const
Define una constante simbólica.
Declare
Declara una subrutina de DLL.
Deftype
Definición de un tipo predeterminado.
Dim
Define una variable.
Let
Asigna un valor a una variable.
Option Base
Define el valor más pequeño del índice de una matriz.
Option Compare
Define el modo de comparación de los archivos de texto.
Option Explicit
Fuerza la declaración de las variables.
Private
Define una variable o un procedimiento como privado.
Public
Define una variable global.
Redim
Redefine las dimensiones de una matriz dinámica.
Set
Asigna un objeto a una variable.
Static
Define una variable estática.
Type
Define variables estructuradas de usuario.
6. Dominio Funciones DAvg()
Promedio de un dominio.
DCount()
Cuenta de los elementos de un dominio.
DFirst()
Primero de un dominio.
DLast()
Último de un dominio.
DLookUp()
Búsqueda en un dominio.
DMax()
Máximo de un dominio.
DMin()
Mínimo de un dominio.
DStDevP()
Desviación estándar de una población de un dominio.
DStDev()
Desviación estándar de una muestra de un dominio.
DSum()
Suma de un dominio.
DVar()
Varianza de una muestra de un dominio.
DVarP()
Varianza de una población de un dominio.
7. Intercambio dinámico de datos Funciones DDE()
Crea un canal DDE y pide una información.
DDEInitiate()
Abre un canal DDE.
DDERequest()
Solicita una información a través de un canal DDE.
DDESend()
Envía una información a través de un canal DDE.
Instrucciones
DDEExecute
Utiliza un canal DDE abierto para enviar un comando a una aplicación.
DDEPoke
Utiliza un canal DDE abierto para enviar datos a una aplicación.
DDETerminate
Cierra un canal DDE.
DDETerminate All
Cierra todos los canales DDE abiertos.
8. Entrada y salida de archivos Funciones Curdir()
Devuelve el último directorio utilizado en el cuadro de diálogo "Abrir".
Dir()
Busca archivos correspondientes a una ruta de acceso y un nombre genérico.
Eof()
Fin de archivo.
FileAttr()
Devuelve el modo del archivo abierto.
FileDateTime()
Devuelve la fecha y la hora de creación o de última modificación de un archivo.
FileLen()
Devuelve el tamaño de un archivo.
FreeFile()
Devuelve el próximo número de archivo disponible.
GetAttr()
Devuelve los atributos de un archivo o de un directorio.
Loc()
Posición actual en el archivo.
Lof()
Devuelve la longitud de un archivo.
Seek()
Devuelve la posición actual en un archivo.
Spc()
Desplazamiento de x espacios en una instrucción Print.
Tab()
Desplazamiento de x tabulaciones en una instrucción Print.
Instrucciones Chdir
Cambio de directorio actual.
Chdrive
Cambio de unidad de disco actual.
Close
Cierra un archivo.
FileCopy
Permite la copia de un archivo.
Get
Lectura de datos en un archivo secuencial.
Input
Lectura en un archivo secuencial.
Kill
Eliminación de un archivo del disco.
Line Input
Lectura de una línea en un archivo secuencial.
Lock
Bloqueo de acceso a un segmento de archivo.
Mkdir
Creación de un directorio.
Name
Asignación de un nuevo nombre a un archivo de disco.
Open
Abre un archivo.
Print
Escritura de datos en un archivo secuencial.
Put
Escritura de una variable en un archivo.
Reset
Cierra todos los archivos.
RmDir
Elimina un directorio.
SetAttr
Modifica los atributos de un archivo.
Unlock
Desbloqueo de acceso a un segmento de archivo.
Width
Asignación de un ancho de línea de salida a un archivo.
Write
Escritura de datos en un archivo secuencial.
9. Financieras Funciones DDB()
Depreciación de un bien durante un período específico utilizando el método de balance de doble declinación u otro método que se especifique.
FV()
Valor futuro de una anualidad sobre la base de una serie de pagos periódicos constantes y un tipo de interés constante.
IPmt()
Pago de intereses durante un período determinado sobre la base de pagos constantes y periódicos y un tipo de interés también fijo.
IRR()
Tasa interna de retorno de una serie de pagos.
MIRR()
Tasa interna de retorno modificada para una serie de pagos.
Nper()
Número de períodos de una anualidad sobre la base de pagos periódicos constantes y de un tipo de interés también constante.
NPV()
Valor actual neto de una inversión sobre la base de una serie de pagos periódicos y de un tipo de interés.
Pmt()
Pago de una anualidad sobre la base de una serie de pagos periódicos constantes y de un tipo de interés también constante.
PPmt()
Pago nominal para un período determinado de una anualidad sobre la base de pagos periódicos constantes y de un tipo de interés también constante.
PV()
Valor actual de una anualidad sobre la base de pagos periódicos constantes y de un tipo de interés también constante.
RATE()
Tipo de interés por un período de una anualidad.
SLN()
Depreciación lineal de un bien durante un período determinado.
SYD()
Depreciación de un bien para un período determinado expresado de manera proporcional al orden numérico inverso de los años.
10. Gestión de errores Funciones CVErr
Devuelve la variable Error.
Err()
Código de error en forma de integer.
Error()
Devuelve el mensaje estándar correspondiente a un número de error.
IsError()
Indica si una expresión es un valor de error.
Instrucciones
Error
Simula un error.
On error
Opción del salto que debe realizarse en caso de error.
Resume
Opción del salto que debe realizarse después del tratamiento del error.
11. Gráficos en los informes impresos Funciones QBColor()
Devuelve el valor de un color RGB en función de un número de color.
RGB()
Devuelve un entero largo que representa un color RGB.
12. Vinculación e incrustación de objetos Funciones CreateObject()
Crea y devuelve una referencia a un objeto ActiveX.
GetObject()
Devuelve una referencia a un objeto proporcionado por un componente ActiveX.
13. Manipulación de objetos Métodos del objeto Aplicación CreateControl
Crea un control en un formulario abierto.
CreateForm
Crea un formulario.
CreateReport
Crea un informe.
CreateReportControl
Crea un control en un informe abierto.
DeleteControl
Elimina un control de formulario.
DeleteReportControl
Elimina un control de informe.
14. Matemáticas Funciones Abs()
Valor absoluto de un número.
Atn()
Arcotangente de un número.
Cos()
Coseno de un ángulo en radianes.
Exp()
Elevación a una potencia.
Fix()
Parte entera de un número. Para los números negativos, devuelve el primer número entero negativo superior o igual.
Int()
Parte entera de un número. Para los números negativos, devuelve el primer entero negativo inferior o igual.
Log()
Logaritmo neperiano.
Rnd()
Devuelve un número aleatorio.
Sgn()
Valor que indica el signo de un número.
Sin()
Seno de un ángulo en radianes.
Sqr()
Raíz cuadrada de un número.
Tan()
Tangente de un ángulo en radianes.
Instrucciones Randomize
Inicialización del generador aleatorio.
15. SQL Funciones Avg()
Devuelve el promedio de los valores de un campo de una serie de registros.
Count()
Cuenta de registros (controles o expresiones SQL).
First()
Devuelve el valor de un campo del primer registro de una consulta, formulario o informe.
Last()
Devuelve el valor de un campo del último registro de una consulta, formulario o informe.
Max()
Devuelve el máximo de los valores de un campo de una serie de registros.
Min()
Devuelve el mínimo de los valores de un campo de una serie de registros.
StDevP(), StDev()
Devuelve una estimación de la desviación estándar de una población o de una muestra de población.
Sum()
Devuelve la suma de los valores de un campo de una serie de registros.
VarP(), Var()
Devuelve una estimación de la varianza de una población o de una muestra de población.
16. Matrices Funciones IsArray()
Devuelve un valor de tipo Boolean (boleano) que indica si una variable es una matriz.
Array()
Devuelve una variable de tipo Variant que contiene una tabla.
Instrucciones Erase
Inicializa una matriz de tamaño fijo y libera la memoria asignada a una matriz dinámica.
Lbound, Ubound
Buscan el menor y el mayor subíndice de una matriz.
Option Base
Declara el límite inferior del subíndice de una matriz.
ReDim
Redimensiona matrices de forma dinámica.
17. Control de variables Funciones IsDate()
Evalúa si una variable es de tipo fecha.
IsEmpty()
Evalúa si una variable está vacía.
IsMissing()
Indica si un argumento opcional ha sido pasado a un procedimiento.
IsNull()
Evalúa si una variable es Null.
IsNumeric()
Evalúa si una variable es de tipo numérico.
IsObject()
Indica si una expresión hace referencia a un objeto.
TypeName()
Devuelve una cadena que indica el tipo de una variable.
VarType()
Determina el tipo de datos origen de una variable de tipo Variant.
18. Funciones e instrucciones diversas Funciones Command()
Contiene la parte de argumentos de la línea de comandos utilizada para iniciar Microsoft Access.
CreateGroupLevel()
Creación de un nuevo grupo en un informe.
CurrentUser()
Devuelve el nombre del usuario conectado actualmente.
DoEvents()
Cede el control de la ejecución a WINDOWS para que pueda procesar eventos.
Environ()
Devuelve la cadena asociada a una variable de entorno.
GetAllSettings
Devuelve la lista de las claves (y sus respectivos valores) que figuran en una entrada de aplicación de la base de registro de Windows.
GetSetting
Devuelve un valor de clave de la entrada del registro de Windows de una aplicación.
InputBox
Muestra un mensaje en un cuadro de diálogo y luego devuelve el contenido del cuadro de texto en forma de valor de tipo String.
MsgBox()
Muestra un mensaje en un cuadro de diálogo.
Shell()
Ejecución de un subprograma.
StrReverse
Devuelve une cadena que contiene caracteres cuyo orden ha sido invertido en relación a una cadena determinada.
Instrucciones AppActivate
Activación de una ventana de aplicación Windows.
Beep
Emite un Bip.
SendKeys
Envía una secuencia de pulsaciones de teclas.
DeleteSetting
Elimina una sección o una clave de una entrada de registro de Windows.
Rem
Permite incluir comentarios explicativos en un programa.
SaveSetting
Guarda o crea una entrada de aplicación en el registro de Windows.
19. Códigos de error interceptables Pueden producirse errores interceptables durante la ejecución de una aplicación. Algunos también pueden
producirse durante el desarrollo o la compilación. Puede hacer pruebas y responder a errores interceptables mediante la instrucción On Error y el objeto Err. Code Error
Descripción
3
Return sin GoSub.
5
Llamada de procedimiento incorrecta.
6
Desbordamiento.
7
Memoria insuficiente.
9
Índice fuera del intervalo.
10
La matriz es fija o está temporalmente bloqueada.
11
División por cero.
13
Tipo incompatible.
14
Espacio de cadena insuficiente.
16
Expresión demasiado compleja.
17
Imposible ejecutar la operación requerida.
18
Interrupción por parte del usuario.
20
Continúa sin error.
28
Espacio de pila insuficiente.
35
Sub, Function o Property no definida.
47
Demasiados clientes para la aplicación DLL.
48
Error de carga de la DLL.
49
Convención de llamada a DLL incorrecta.
51
Error interno.
52
Nombre o número de archivo incorrecto.
53
Archivo no encontrado.
54
Modo de acceso al archivo incorrecto.
55
Archivo ya abierto.
57
Error de entrada/salida de dispositivo.
58
Este archivo ya existe.
59
Longitud de registro incorrecta.
61
Disco lleno.
62
La entrada de datos sobrepasa el final del archivo.
63
Número de registro incorrecto.
67
Demasiados archivos.
68
Dispositivo no disponible.
70
Permiso denegado.
71
El disco no está listo.
74
Imposible cambiar el nombre con una unidad de disco diferente.
75
Error en la ruta de acceso.
76
Ruta de acceso no encontrada.
91
Variable de objeto o variable de bloque With no definida.
92
Bucle For no inicializado.
93
Formato de cadena incorrecto.
94
Utilización incorrecta de Null.
97
Imposible llamar a un procedimiento Friend de un objeto que no tiene una instancia definida.
98
Una llamada a una propiedad o a un método no puede hacer referencia a un objeto privado, ni como argumento ni como valor de retorno.
298
Imposible cargar la DLL de sistema.
320
Imposible utilizar nombres de dispositivos de caracteres en los nombres de archivos especificados.
El archivo especificado no está actualizado. Este programa requiere una versión más reciente.
371
El objeto especificado no se puede utilizar como propietario de la hoja para el método Show.
380
Valor de propiedad incorrecta.
381
Índice de matriz de propiedades incorrecto.
382
Property Set no puede ser ejecutado en tiempo de ejecución.
383
Property Set no puede ser utilizado con una propiedad de sólo lectura.
385
Índice de matriz de propiedad requerido.
387
Property Set no autorizado.
393
Property Get no puede ser ejecutado en tiempo de ejecución.
394
Property Get no puede ser ejecutado sobre una propiedad de sólo escritura.
400
Formulario ya mostrado; no se puede mostrar en forma modal.
402
El código primero debe cerrar el formulario modal superior.
419
Autorización para utilizar el objeto denegada.
422
Propiedad no encontrada.
423
Propiedad o método no encontrado.
424
Objeto requerido.
425
Utilización de objeto incorrecta.
429
Un componente no puede crear el objeto o proporcionar una referencia a ese objeto.
430
Esta clase no acepta Automatización.
432
Nombre de archivo o de clase no encontrado durante una operación de Automatización.
438
Este objeto no gestiona esta propiedad o método.
440
Error Automatización.
442
Se ha perdido la conexión a la biblioteca de tipos o de objetos para procesos remotos.
443
El objeto Automatización no tiene valor predeterminado.
445
El objeto no gestiona esta acción.
446
El objeto no acepta argumentos con nombres.
447
El objeto no acepta la configuración regional actual.
448
Argumento con nombre no encontrado.
449
Argumento no opcional o asignación de propiedad incorrecta.
450
Número de argumentos incorrecto o asignación de propiedad no válida.
451
Este objeto no es una colección.
452
Número ordinal incorrecto.
453
Función DLL especificada no encontrada.
454
Recurso de código no encontrado.
455
Error en el bloqueo del recurso de código.
457
Esta clave está ya asociada a un elemento de esta colección.
458
Esta variable utiliza un tipo de Automatización no manejado por Visual Basic.
459
Este componente no acepta este conjunto de eventos.
460
Formato del Portapapeles incorrecto.
461
Método o dato miembro no encontrado.
462
El servidor remoto no existe o no está disponible.
463
La clase no está registrada en el equipo local.
480
Imposible crear una imagen AutoRedraw.
481
Imagen incorrecta.
482
Error de impresora.
483
El controlador de impresora no admite la propiedad especificada.
484
Problemas para obtener información de la impresora desde el sistema. Asegúrese de que la impresora está instalada correctamente.
485
Tipo de imagen incorrecto.
486
Imposible imprimir la imagen de formulario en este tipo de impresora.
520
Imposible vaciar el Portapapeles.
521
Imposible abrir el Portapapeles.
735
Imposible guardar el archivo en un directorio TEMP.
744
No se encuentra el texto buscado.
746
Sustituciones demasiado largas.
31001
Memoria insuficiente.
31004
Ningún objeto.
31018
Clase no definida.
31027
Imposible activar el objeto.
31032
Imposible crear un objeto incrustado.
31036
Error al guardar en archivo.
31037
Error al cargar de archivo.
Constantes VBA Visual Basic para Aplicaciones permite definir constantes para mejorar la legibilidad del código y facilitar su mantenimiento. También puede utilizar las constantes VBA (constantes intrínsecas) siguientes en cualquier parte de su código.
1. Constantes de color Constante
Valor
Descripción
vbBlack
0x0
Negro
vbRed
0xFF
Rojo
vbGreen
0xFF00
Verde
vbYellow
0xFFFF
Amarillo
vbBlue
0x0FF0000
Azul
vbMagenta
0x0FF00FF
Magenta
vbCyan
0x0FFFF00
Cián
vbWhite
0x0FFFFFF
Blanco
2. Constantes de fecha Constante
Valor
Descripción
vbSunday
1
Domingo
vbMonday
2
Lunes
vbTuesday
3
Martes
vbWednesday
4
Miércoles
vbThursday
5
Jueves
vbFriday
6
Viernes
vbSaturday
7
Sábado
3. Constantes de teclas teclado alfanumérico Los valores de las teclas A a Z son los mismos que sus equivalentes ASCII. Constante
Valor
Descripción
vbKeyA
65
Tecla A
vbKeyB
66
Tecla B
vbKeyC
67
Tecla C
...
...
...
vbKeyZ
90
Tecla Z
Los valores de las teclas 0 a 9 son los mismos que sus equivalentes ASCII. Constante
Valor
Descripción
vbKey0
48
Tecla 0
vbKey1
49
Tecla 1
vbKey2
50
Tecla 2
...
...
...
vbKey9
57
Tecla 9
4. Constantes de teclas de función Constante
Valor
Descripción
vbKeyF1
0x70
Tecla F1
vbKeyF2
0x71
Tecla F2
...
...
vbKeyF11
...
0x7A
...
...
vbKeyF16
Tecla F11 ...
0x7F
Tecla F16
5. Constantes de teclas diversas Constante
Valor
Descripción
vbKeyCancel
0x3
Tecla CANCELAR
vbKeyBack
0x8
Tecla [Retroceso]
vbKeyTab
0x9
Tecla [Tab]
vbKeyClear
0xC
Tecla SUPR
vbKeyReturn
0xD
Tecla [Intro]
vbKeyShift
0x10
Tecla [Mayús]
vbKeyControl
0x11
Tecla [Ctrl]
vbKeyMenu
0x12
Tecla MENÚ
vbKeyPause
0x13
Tecla [Break]
vbKeyCapital
0x14
Tecla [Bloq Mayús]
vbKeyEscape
0x1B
Tecla [Esc]
vbKeySpace
0x20
Tecla ESPACIO
vbKeyPageUp
0x21
Tecla [Re Pág]
vbKeyPageDown
0x22
Tecla [Av Pág]
vbKeyEnd
0x23
Tecla [Fin]
vbKeyHome
0x24
Tecla [Inicio]
vbKeyUp
0x25
Tecla [Flecha arriba]
vbKeyDown
0x26
Tecla [Flecha abajo]
vbKeyRight
0x27
Tecla [Flecha derecha]
vbKeyLeft
0x28
Tecla [Flecha izquierda]
vbKeySelect
0x29
Tecla SELECCIONAR
vbKeyPrint
0x2A
Tecla [Impr Pant]
vbKeyExecute
0x2B
Tecla EJECUTAR
vbKeySnapshot
0x2C
Tecla [Impr Pant]
vbKeyInsert
0x2D
Tecla [Insert]
vbKeyDelete
0x2E
Tecla [Del]
vbKeyHelp
0x2F
Tecla AYUDA
vbKeyNumlock
0x90
Tecla [Bloq Mayús]
vbKeyLButton
0x1
Botón izquierdo del ratón
vbKeyRButton
0x2
Botón secundario del ratón
Métodos abreviados [F1]
Ayuda acerca de la palabra clave en la que se encuentra el cursor.