Documente Academic
Documente Profesional
Documente Cultură
Colección
Recursos Informáticos
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 respues-
ta a un evento que se produce en un objeto Excel (libro, hoja, formulario, grá-
fico, etc.).
284 VBA Excel 2013
Programación en Excel: macros y lenguaje VBA
2. Escritura de eventos
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.
Ejemplo
Este ejemplo muestra cómo obtener un listado histórico de todos los hiper-
vínculos visitados en la hoja de cálculo activa.
Resultado en Excel:
286 VBA Excel 2013
Programación en Excel: macros y lenguaje VBA
Se necesitan tres etapas para la escritura y ejecución de los eventos del objeto
Application.
Etapa 1
Ejemplo
Etapa 2
Ejemplo
Ejemplo
Diferencia = Diferencia + 1
Loop
' Reactivar eventos y alertas
Application.EnableEvents = True
Application.DisplayAlerts = True
End Sub
Etapa 3
Sub NomProced ()
Set NomVariable.NomObjeto = Application
End Sub
Ejemplo
Colección
Recursos Informáticos
Capítulo 6
Gestión de los eventos
1. Presentación
Gestión de los eventos
1.1 Definición
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.
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 formu-
lario y al cambiar su tamaño.
UnLoad (AlDescargar) Sí
Se produce al cerrar y cuando se liberan los regis-
tros, pero antes de que el formulario desaparezca.
Close (AlCerrar) No
Se produce cuando el formulario o el informe
desaparece al cerrarlo.
210 VBA Access 2013
Programar en Access
Observación
El método SetFocus permite dar el foco a un control o a un formulario.
Cancelación
Activate (AlActivar) No
Se produce cuando la ventana del formulario o
del informe se convierte en activa.
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.
Enter (AlEntrar) No
Se produce antes de que un control tome el
foco a partir de un control o al abrir el formula-
rio.
Exit (AlSalir) Sí
Se produce antes de que un control pierda el
enfoque en provecho de otro control del formu-
lario o de otro formulario.
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 actualiza-
ció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 eli-
minación de los registros.
BeforeInsert (AntesDeInsertar) Sí
Se produce al teclear el primer carác-
ter 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.
212 VBA Access 2013
Programar en Access
Cancelación
NotInList (AlNoEnLaLista) No
Se produce al entrar un valor que no
existe en una lista y cuando la pro-
piedad 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 ejem-
plo.
Dirty (AlCambiar) Sí
Se produce cuando cambia el conte-
nido de un formulario o la parte de
texto de un cuadro combinado.
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 12 Restablecer
un procedimiento (Función o Sub)
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
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]
<variable> [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:
<variable> = 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> [, [<tipo>][, <título>]]
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> , [<botones>][, <título>]
[,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
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.
Tipo de icono
vbCritical 16
Muestra el icono
vbQuestion 32
Muestra el icono
vbExclamation 48
Muestra el icono
vbInformation 64
Muestra el icono
Botón predeterminado
vbDefaultButton1 0 Primer botón.
Modalidad
vbApplicationModal 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.
Presentación
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).
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
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 3,402823E38 a 1,401298E45 (valores negativos) 4
coma flotante) 1,401298E45 a 3,402823E38 (valores positivos)
Double (real doble con 1,79769313486231E308 a 4,94065645841247E 8
coma flotante) 324 (valores negativos) 4,94065645841247E324
a
1,79769313486231E308 (valores positivos)
Currency (moneda con 922 337 203 685 477, 5808 a 922 337 203 685 8
coma fija) 477, 5807
Decimal +/79 228 162 514 264 337 593 543950 335 sin 12
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
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 <Nombrevariable> [As Type]
Static <Nombrevariable> [As Type]
en un módulo:
Private <Nombrevariable> [As Type]
Public <Nombrevariable> [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!<NombreFormulario>.<NombreVariable>
Reports!<NombreInforme>.<NombreVariable>
4. Las matrices
Una matriz se declara del mismo modo que las variables, mediante
instrucciones Dim, Static, Private oPublic.
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
Microsoft Access ac acForm, acNormal
Visual Basic vb vbCurrency, vbYellow
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 <cond.> Then <inst.> [Else <inst.>]
<inst.> puede estar compuesta de varias instrucciones separadas por el carácter (:).
Sintaxis 2 (múltiples líneas)
If <condición 1> Then
<secuencia de instrucciones 1>
[ElseIf <condición 2> Then
<secuencia de instrucciones 2>]
[Else
<secuencia de instrucciones 3>]
End If
Otra posibilidad
If <condición 1> Then
<secuencia de instrucciones 1>
[Else
If <condición 2> 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 (<condición>, <valor si verdadero>, <valor si falso>)
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} <condición>]
<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} <condición>]
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
intCont = 0
Do
intCont = intCont + 1
curGastosAnuales = curGastosAnuales + curGastosMensuales (intCont)
Loop Until intCont = 12
MsgBox "Los Gastos Anuales son: " & curGastosAnuales
2. La instrucción While...Wend
While...Wend
Ejecuta una secuencia de instrucciones mientras la condición especificada se cumpla.
Sintaxis
While <condición>
<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 <contador> = <inicio> To <fin> [Step <incremento>]
<secuencia de instrucciones>
[Exit For]
<secuencia de instrucciones>
Next [<contador> [,<contador2>] [, ...]]
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>/<colección>
<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<B<E<Z<a<b<e<z<À<Ê...
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>= 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 <comentario>
’<comentario>
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 Objeto que agrupa varias colecciones de objetos Access específicos
CodeProject) (AllForms: colección de todos los formularios de la base, etc.).
CurrentData (o Objeto que agrupa varias colecciones de objetos Access de acceso
CodeData) 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
{<objeto> | <variable objeto>}.<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.
Me Form o Report El objeto Form o Report cuyo
código se está ejecutando.
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
{<objeto> | <variable objeto>}.<método> [<Lista de argumentos>]
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
<variable> = {<objeto> | <variable objeto>}.<método>
([<Lista de argumentos>])
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.
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 <objeto>
<código que utiliza métodos y propiedades>
<relacionadas con el objeto>
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>|<colección>}
<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 <objeto> Is <TipoObjeto> Then
<código que utiliza métodos y propiedades>
<relacionadas con el objeto>
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 <NombreObjeto> = New <expresión objeto>
Set <NombreObjeto> = <método que permite crear el objeto>
<NombreObjeto> 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 <NombreObjeto> = <expresión objeto>
<NombreObjeto> 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 <NombreObjeto> = 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
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.
CurrentObjectType Devuelve el tipo del objeto activo.
acTable 0 Tabla
acQuery 1 Consulta
acForm 2 Formulario
acReport 3 Informe
acMacro 4 Macro
acModule 5 Módulo
acFunction 10 Función
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.
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.
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.
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.
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.
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.
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).
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.
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:
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 Recordset
AbsolutePosition 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 T
Devuelve la hora de la última modificación de la tabla de origen subyacente.
Name DSTF
Devuelve el nombre del Recordset.
NoMatch DST
Indica si el registro buscado ha sido encontrado.
PercentPosition DST
Devuelve la posición actual de un registro en porcentaje del número total de
registros.
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 Recordset
AddNew 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 DS
Localiza el último registro que responde al criterio y lo convierte en el
registro actual.
FindNext DS
Localiza el registro siguiente que responde al criterio y lo convierte en el
registro actual.
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 DT
Actualiza el registro.
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
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...).
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
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.
Métodos
CreateField Crea un nuevo objeto Field.
Colecciones
Fields, Properties
Ejemplo
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
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
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.
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.
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.
Open Abre una conexión a un origen de datos para poder ejecutar
comandos.
RollbackTrans Anula los cambios realizados a los datos durante la transacción en
curso y detiene esta última.
Propiedades
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.
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.
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.
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
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.
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.
GetRows Extrae varios registros de un objeto Recordset y los coloca en
una matriz.
GetString Devuelve un objeto Recordset en forma de cadena.
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.
Resync Actualiza los datos del objeto Recordset en curso a partir de la
base de datos subyacente.
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.
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.
BOF Indica si el puntero de registro está posicionado antes del
primer registro del objeto Recordset. Sólo lectura.
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
objetoRecordset. Sólo lectura.
PageSize Indica el número de registros contenidos en una página
delRecordset.
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.
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.
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.
14. La colección Properties
Métodos
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
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.
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,
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) Se tienen en cuenta todos los registros que respondan
a los criterios.
Nombre de la o de las tablas que contienen los datos
<lista de tablas> 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 <Operador de comparación> tabla2.campo2
[ LEFT | RIGHT Estos operadores permiten definir el tipo de combinación entre
|INNER ] 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: <tabla 1>) incluso para los que no existe un valor
correspondiente en la segunda tabla (la de la derecha:
<tabla 2>).
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: <tabla 2>) incluso para los
que no existe un valor correspondiente en la primera tabla (la
de la izquierda: <tabla 1>).
INNER JOIN Utilice INNER JOIN para crear una combinación que incluya
solamente los registros cuyos datos de los campos vinculados
son idénticos.
<operador de Utilice todos los operadores de comparación relacionales, como:
comparación> =, <, >, <=, >=, <> (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 <TablaDestino> [(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 <TablaDestino> [(campo1[, campo2[, ...]])]
SELECT [<Tablaorigen>.]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.
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) 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.
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) No
Se produce cuando la ventana del formulario o del
informe se convierte en activa.
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.
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) 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.
BeforeDelConfirm (AntesDeConfirmarEliminación) Sí
Se produce después de que el usuario haya
eliminado registros y antes que Access
solicite confirmación.
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 (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) No
Se produce al pulsar el botón izquierdo del ratón
sobre un control o una zona en blanco de un
formulario.
DblClick (AlHacerDobleClic) Sí
Se produce al pulsar dos veces el botón izquierdo
del ratón sobre un control o una zona en blanco de
un formulario.
MouseDown (AlBajarMouse) Sí
Se produce al pulsar un botón del ratón sobre un
control o un formulario.
MouseMove (AlMoverMouse) No
Se produce cuando el usuario desplaza el ratón
sobre un formulario o sobre un control.
MouseUp (AlSubirMouse) No
Se produce cuando el usuario suelta el botón del
ratón sobre un control o sobre un formulario.
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.
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) Sí
Se produce cuando Microsoft Access determina qué datos
pertenecen a qué secciones.
Print (AlImprimir) Sí
Se produce al formatear datos de una sección para
impresión.
Retreat (AlRetirarse) No
Se produce cuando Microsoft Access vuelve a una sección
anterior durante la paginación de un informe.
NoData (AlNoDatos) Sí
Se produce cuando Microsoft Access ha paginado un
informe para su impresión y éste no contiene datos.
Page (AlPaginar) No
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.
Los eventos Format, Print y Retreat se aplican a las secciones de los informes.
7. Eventos de tipo Filtro
Cancelación
ApplyFilter (AlAplicarFiltro) Sí
Se produce cuando el usuario aplica un filtro.
Filter (AlFiltrar) Sí
Se produce cuando el usuario crea un filtro.
8. Eventos de tipo Error y Cronómetro
Cancelación
Error (AlOcurrirError) No
Se produce cuando ocurre un error.
Timer (AlCronómetro) No
Se produce cuando transcurre un intervalo de tiempo
especificado.
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.
4. Restablecer proyecto borra el contenido de las variables y restablece
el proyecto.
5. Alternar punto de establece o elimina un punto de interrupción en
interrupción([F9]) la línea actual; el código se ejecuta hasta el
punto de interrupción y luego se pasa al modo
de depuración.
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.
Ejemplo
VolEsfera = 4 / 3 * Pi * ((dblRadio) ˆ 3)
Debug.print dblRadio
Debug.Assert VolEsfera > 0
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.
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!<Nombreformulario>
ej: Forms!Pedidos
Forms![<Nombreformulario>]
ej: Forms![Pedidos]
Forms("<Nombreformulario>")
ej: Forms("Pedidos")
Forms(<índice>)
ej: Forms(0)
La sintaxis Forms!<Nombreformulario> 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 Byte
0 Un único formulario (modo simple)
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 Byte
0 Esquina superior izquierda
1 Esquina superior derecha
2 Centro
3 Esquina inferior izquierda
4 Esquina inferior derecha
5 Centro del formulario
36. Orientation
0 De izquierda a derecha
1 De derecha a izquierda
b. Propiedades de la ficha Datos
1. RecordSource Cadena de caracteres
2. TypeRecordSet Byte
0 Dynaset
1 Dynaset (Actualizaciones incoherentes)
2 Archivo Snapshot
3. FetchDefaults Boleano
4. Filter Cadena de caracteres
5. FilterOnLoad Boleano
6. OrderBy Cadena de caracteres
7. OrderByOnLoad Boleano
8. DataEntry Boleano
9. AllowAdditions Boleano
c. Propiedades de la ficha Eventos
1. OnCurrent Cadena de caracteres
2. OnLoad Cadena de caracteres
3. OnClick Cadena de caracteres
4. AfterUpdate Cadena de caracteres
5. BeforeUpdate Cadena de caracteres
6. BeforeInsert Cadena de caracteres
7. AfterInsert Cadena de caracteres
8. BeforeDelConfirm Cadena de caracteres
9. OnDelete Cadena de caracteres
d. Propiedades de la ficha Otras
1. Popup Boleano
2. Modal Boleano
3. Cycle Byte
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
3. Propiedades no disponibles en modo Diseño
a. Propiedades relativas al modo de ver el formulario
CurrentView Devuelve la vista actual del 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.
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.
c. Propiedades relativas a la presentación del formulario
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.
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.
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.
InsideHeight Determina el alto (en twips) de la ventana
que contiene un formulario.
Pages Indica el número total de páginas.
PictureData Permite copiar la imagen del formulario en
otro objeto que reconozca la propiedad
Imagen (Picture).
WindowTop Indica la posición en pantalla, en twips, del
borde superior del formulario.
d. Propiedades que devuelven un objeto
Application Permite acceder al objeto Application de Access.
Form Permite hacer referencia a un formulario asociado a un control
subformulario.
Parent Permite hacer referencia al objeto principal.
RecordsetClone Permite hacer referencia al objeto Recordset del formulario.
e. Propiedades relativas a la impresión del formulario
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 Byte
0 Vista Informes
1 Vista preliminar
3. AllowReportView Boleano
4. AllowLayoutView Boleano
5. PictureType Byte
0 Insertado vinculadas
1 Vinculado
2 Compartidas
6. Picture Cadena de caracteres
7. PictureTiling Boleano
8. PictureAlignment Byte
0 Esquina superior izquierda
1 Esquina superior derecha
2 Centro
3 Esquina inferior izquierda
4 Esquina inferior derecha
9. PictureSizeMode Byte
0 Recortar
1 Escala
2 Zoom
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
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. RecordLocks Boleano
6. RibbonName Cadena de caracteres
7. ToolBar Cadena de caracteres
8. MenuBar Cadena de caracteres
9. ShortcutMenuBar 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.
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.
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.
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.
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.
Parent Permite hacer referencia al objeto principal.
Printer Devuelve o define un objeto Printer que representa la impresora
predeterminada del sistema actual.
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.
e. Propiedades relativas a la impresión del 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.
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<NombreFormulario>.ActiveControl) designa el control
activo.
1. Sintaxis
Puede referenciar un control de manera implícita:
<Formulario>|<Informe>!<NombreControl> ej: Me!FechaPdo
<Formulario>|<Informe>![<NombreControl>] ej: Me![FechaPdo]
<Formulario>|<Informe>("<NombreControl>") ej: Me("FechaPdo")
<Formulario>|<Informe>.<NombreControl> ej: Me.FechaPdo
o de manera explícita como miembro de la colección Controls:
<Formulario>|<Informe>.Controls{("<control>")|!<control>|
(<í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 de controles
(CheckBox, ComboBox,CommandButton, Image, Label, Line, TextBox...).
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(<Izquierda>, <Arriba>, <Ancho>, <Alto>)
<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
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:
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
<ribbon> Marca que contiene la descripción de la cinta de
opciones
<OfficeMenu> Menú accesible desde el botón Microsoft Office
<tab> Ficha en la cinta de opciones
<group> Grupo de una ficha en la cinta de opciones
<labelControl> Etiqueta (título)
<button> Botón de comando
<splitButton> Botón de menú
<toggleButton> Botón de alternar
<menu> Menú desplegable
<dynamicMenu> Menú desplegable dinámico
<gallery> Galería o paleta de selección
<dialogBoxLauncher> Botón que acciona la apertura de un cuadro de diálogo
b. Propiedades asociadas a los objetos de una cinta de opciones
Las propiedades siguientes permiten personalizar los diferentes controles que aparecen en la cinta (botón
de comando, menú desplegable...)
Propiedad Descripción
Id Identificador único de un control personalizado.
idMso Identificador único de un control estándar de Microsoft.
enabled "true" si el control es accesible, "false" si no lo es. El valor
predeterminado es "true".
insertBeforeMso Coloca el objeto antes de un control de Office existente.
insertAfterMso Coloca el objeto después de un control de Office existente.
imageMso Nombre de la imagen que utilizará el control.
itemSize Tamaño de los elementos del menú
label Texto mostrado sobre el control.
onAction Macro o código VBA asociado al control.
screentip Especifica el título de la información que aparece cuando un
usuario mantiene el puntero sobre el control.
supertip Especifica el texto que aparece cuando un usuario mantiene
el puntero sobre el control.
size Tamaño del control ("normal" o "large").
showImage "true" si se ve la imagen del control y "false" si no. El valor
predeterminado es "true".
showLabel "true" si se ve el título del control y "false" si no. El valor
predeterminado es "true".
visible "true" si el control es visible y "false" si no. El valor
predeterminado es "true".
Las propiedades siguientes permiten personalizar la cinta de opciones:
Propiedad Descripción
onLoad Macro o código VBA asociado a la carga de la cinta de opciones.
startFromScratch "true" si la cinta de opciones debe reemplazar a la cinta
estándar de Access. Si "false", las nuevas fichas se agregan a
las fichas de la cinta de Access.
Ejemplo de cinta de opciones personalizada
El ejemplo de código XML descrito en este capítulo permite crear la cinta de opciones presentada
continuación:
1. Código XML de la cinta de opciones personalizada
<customUI
xmlns="http://schemas.microsoft.com/office/2006/01/customui"
onLoad="Inicialización">
<ribbon startFromScratch="true">
<!‐‐ Modificación del menú Microsoft Office ‐‐>
<officeMenu>
<!‐‐ Diseño de un botón de menú ‐‐>
<splitButton id="spltLista1"
insertBeforeMso="FileCloseDatabase">
<menu id="spltMenu"
itemSize="large" label="Listas de formularios" >
<button id="Option1" label="Todas las listas"
imageMso="FileCreateDocumentWorkspace"
onAction="AbreListas" />
<button id="Option2" label="Lista de los clientes"
imageMso="DirectRepliesTo"
onAction="AbreListaClientes" />
<button id="Option3" label="Lista de los empleados"
imageMso="DistributionListAddNewMember"
onAction="AbreListaEmpleados" />
<button id="Option4" label="Lista de los proveedores"
imageMso="DistributionListRemoveMember"
onAction="AbreListaProveedores" />
</menu>
</splitButton>
<!‐‐ Oculta los botones estándar del menú de Microsoft Office ‐‐>
<button idMso="FileNewDatabase" visible="false" />
<button idMso="FileOpenDatabase" visible="false" />
<splitButton idMso="FileSaveAsMenuAccess" visible="false" />
</officeMenu>
<!‐‐ Diseño de fichas personalizadas ‐‐>
<tabs>
<!‐‐ Ficha Listas ‐‐>
<tab id="Listas" label="Listas">
<!‐‐ Grupo Etiqueta ‐‐>
<group id="grpListas1" label="Etiquetas">
<labelControl id="lbl1" label="Lista de los clientes" />
<labelControl id="lbl2" label="Lista de los empleados" />
<labelControl id="lbl3" label="Lista de los proveedores" />
</group>
<!‐‐ Grupo de botones ‐‐>
<group id="grpBotones" label="Grupo de botones">
<button id="btn1" label="Todas las listas"
imageMso="FileCreateDocumentWorkspace"
onAction="AbreListas"
size="large" />
<button id="btn2" label="Lista de los clientes"
imageMso="DirectRepliesTo"
onAction="AbreListaClientes"
size="normal" />
<button id="btn3" label="Lista de los empleados"
imageMso="DistributionListAddNewMember"
onAction="AbreListaEmpleados"
size="normal" />
<button id="btn4" label="Lista de los proveedores"
imageMso="DistributionListRemoveMember"
onAction="AbreListaProveedores"
size="normal" />
</group>
<!‐‐ Grupo botón de opciones ‐‐>
<group id="grpSplit" label="Botón de opciones">
<splitButton id="spl1" size="large">
<button id="btnSplit" label="Listas"
onAction = "AbreListas"
imageMso="DistributionListSelectMembers" />
<menu id="mnuSplit" label="Menu" itemSize="large">
<button id="btnSplit1" label="Listas de los clientes"
imageMso="DirectRepliesTo"
onAction = "AbreListaClientes" />
<button id="btnSplit2" label="Lista de los empleados"
imageMso="DistributionListAddNewMember"
onAction = "AbreListaEmpleados" />
<button id="btnSplit3" label="Lista de los proveedores"
imageMso="DistributionListRemoveMember"
onAction = "AbreListaProveedores" />
<button id="btnSplit4" label="Todas las listas"
imageMso="DistributionListSelectMembers"
onAction = "AbreListas" />
</menu>
</splitButton>
</group>
<!‐‐ Grupo botón alternar ‐‐>
<group id="grptb1" label="Botón de alternar">
<toggleButton id="tb1" label="Mostrar/Ocultar las listas"
imageMso="PictureBrightnessGallery"
size="large"
onAction = "MostrarListas" />
</group>
<!‐‐ Grupo Menús ‐‐>
<group id="grpMenus" label="Menus">
<menu id="menu1" label="Menú 1"
imageMso="DistributionList SelectMembers">
<button id="btnMenu1"
label="Lista de los clientes"
onAction = "AbreListaClientes" />
<button id="btnMenu2"
label="Lista de los empleados "
onAction = "AbreListaEmpleados" />
<button id="btnMenu3"
label="Lista de los proveedores"
onAction = "AbreListaProveedores" />
<button id="btnMenu4"
label="Todas las listas"
onAction = "AbreListas" />
</menu>
<menu id="menu2"
label="Menu 2"
itemSize="large"
imageMso="DistributionListSelectMembers">
<button id="btnMenu5"
label="Lista de los clientes"
imageMso="DirectRepliesTo"
onAction = "AbreListaClientes" />
<button id="btnMenu6"
label="Lista de los empleados"
imageMso="DistributionListAddNewMember"
onAction = "AbreListaEmpleados" />
<button id="btnMenu7"
label="Lista de los proveedores"
imageMso="DistributionListRemoveMember"
onAction = "AbreListaProveedores" />
<button id="btnMenu8"
label="Todas las listas"
imageMso="DistributionListSelectMembers"
onAction = "AbreListas" />
</menu>
</group>
</tab>
<!‐‐ Ficha Herramientas Access ‐‐>
<tab id="tabAccess" label="Herramientas Access">
<group idMso="GroupPrintPreviewPrintAccess" />
<group id="grpExport" label="Exportar">
<button idMso="ExportExcel" label="ExportarExcel"
screentip="Export Excel"
supertip="Hacer clic aquí para exportar a formato Excel" />
<button idMso="FileSaveAsPdfOrXps" label="Exportar PDF"
screentip="Export PDF"
supertip="Hacer clic aquí para exportar a formato PDF" />
</group>
</tab>
</tabs>
</ribbon>
</customUI>
2. Código VBA llamado por los comandos de la cinta de opciones
personalizada
El código VBA que aparece a continuación es llamado mediante las propiedades OnAction de los diferentes
controles.
Option Compare Database
Option Explicit
_______________________________________________________________________
Sub Inicialización(cinta As IRibbonUI)
’ Mensaje de bienvenida
MsgBox "Bienvenido a la aplicación NorthWind 2007"
’ Bloquea el panel de navegación
DoCmd.LockNavigationPane True
End Sub
_______________________________________________________________________
Sub AbreListas(ctl As IRibbonControl)
’ Abre los tres formularios Listas
DoCmd.OpenForm "Lista de clientes"
DoCmd.OpenForm "Lista de empleados"
DoCmd.OpenForm "Lista de proveedores"
End Sub
_______________________________________________________________________
Sub AbreListaClientes(ctl As IRibbonControl)
DoCmd.OpenForm "Lista de clientes"
End Sub
_______________________________________________________________________
Sub AbreListaEmpleados(ctl As IRibbonControl)
DoCmd.OpenForm "Lista de empleados"
End Sub
_______________________________________________________________________
Sub AbreListaProveedores(ctl As IRibbonControl)
DoCmd.OpenForm "Lista de proveedores"
End Sub
_______________________________________________________________________
Sub MostrarListas(ctl As IRibbonControl, blnActif As Boolean)
’ Muestra u oculta los formularios
If blnActif Then
DoCmd.OpenForm "Lista de clientes"
DoCmd.OpenForm "Lista de empleados"
DoCmd.OpenForm "Lista de proveedores"
Else
DoCmd.Close acForm, "Lista de clientes"
DoCmd.Close acForm, "Lista de empleados"
DoCmd.Close acForm, "Lista de proveedores"
End If
End Sub
Imágenes de la galería de iconos de Microsoft Office
Los nombres de las imágenes utilizadas para personalizar la cinta de opciones (atributo Image MSO)
corresponden al título del icono en la galería de iconos de Microsoft Office.
Para ver la lista de nombres de iconos de la galería de Microsoft Office:
Abra en Excel el archivo Office2007iconsGallery.xlsm (archivo entregado con los ejemplos o descargable
del sitio web de Microsoft).
Habilite la ficha DESARROLLADOR.
Haga clic en uno de los botones Gallery para ver la lista de iconos.
Cuando mire los iconos, su nombre se muestra en el texto que aparece al dejar el ratón sobre el icono
asociado (también puede pulsar el icono para visualizar su nombre en un cuadro de diálogo):
Si la ficha DESARROLLADOR no aparece en Excel:
Haga clic en la pestaña ARCHIVO, y luego en Opciones.
Seleccione la categoría Personalizar cinta de opciones.
Debajo de Personalizar esta cinta de opciones, en la lista Fichas principales, seleccione la
casillaDESARROLLADOR.
Haga clic en Aceptar: se ha añadido la ficha DESARROLLADOR a la cinta de Excel, a la derecha de la
pestaña VISTA.
La tecnología Automatización
1. Presentación
Automatización, llamada también OLE (Object Linking and Embedding) u Automatización OLE, es una
tecnología que le permite manejar datos de otra aplicación directamente desde Access o VBA Access.
Para funcionar, Automatización requiere un cliente y un servidor llamado servidor OLE. El servidor es la
aplicación o el componente que proporciona los servicios al cliente. El cliente (llamado también controlador)
utiliza estos servicios para controlar la aplicación servidor y manipular sus objetos. Por ejemplo, si usted
inicia una distribución masiva de correo Word desde VBA Access, Access es el cliente y Word el servidor OLE.
Una biblioteca de objetos es un archivo, generalmente con la extensión olb, que proporciona la
información que permite manipular los objetos disponibles de un servidor. Puede utilizar el Examinador de
objetos para examinar el contenido de una biblioteca de objetos.
Para tener acceso a los objetos de otra aplicación debe referenciar su biblioteca de objetos del modo
siguiente:
En un módulo, seleccione el menú Herramientas Referencias.
Aparece el cuadro de diálogo Referencias con todos los servidores OLE registrados en la base de registro.
Active la referencia deseada.
Mediante el examinador de objetos, es fácil consultar la lista de los objetos, métodos y propiedades de
un servidor OLE.
2. Utilización de la tecnología Automatización
Para poder manipular los objetos de otra aplicación, debe proceder de la manera siguiente:
defina en el código VBA una variable objeto,
utilice las funciones CreateObject o GetObject para hacer referencia al objeto.
Ejemplo
Inicio de Word.
Dim AppWord as Object
Set AppWord = CreateObject("Word.Application")
Dim appWord As New Word.Application
Referencia a un documento Word existente.
Dim DocWord As New Word.Document
Set DocWord = GetObject("C:\Clientes\reactivación.doc")
Los párrafos siguientes describen cómo controlar distintos programas del paquete Microsoft Office utilizando
la tecnología Automatización.
Puesto que son muy numerosos todos los objetos, colecciones, métodos y propiedades de los modelos
de objeto del paquete Microsoft Office, nos limitaremos, en los párrafos siguientes, a describir los más
comunes.
Controlar Word desde Access
1. El modelo Objeto Word
2. Principales colecciones del modelo de objetos Word
AutoCaptions Colección de objetos AutoCaption que representa las leyendas
añadidas automáticamente cuando se añaden elementos como
tablas o imágenes a un documento.
CaptionLabels Colección de objetos CaptionLabels que representa los títulos
de las leyendas añadidas automáticamente cuando se añaden
elementos como tablas o imágenes a un documento.
CommandBars Colección de objetos CommandBar que representa una barra
de comandos Word.
RecentFiles Colección de objetos RecentFile que representa a los últimos
ficheros abiertos en Word.
Tasks Colección de objetos Task que representa el conjunto de las
aplicaciones en curso de ejecución.
3. Principales objetos del modelo objeto de Word
EmailOptions Objeto que contiene los atributos globales que Microsoft Word
utiliza cuando usted crea y modifica mensajes electrónicos y
respuestas a estos mensajes.
FileDialog Objeto que representa un cuadro de diálogo que permite
efectuar acciones sobre un fichero (ej. : apertura de un
fichero, guardar un fichero...).
FontNames Objeto que contiene la lista de los nombres de todas las
fuentes disponibles.
LanguageSettings Objeto que devuelve información del diccionario de sinónimos.
MailMessage Objeto que representa el mensaje electrónico activo si Word es
su editor de correo electrónico.
Selection Representa la selección en curso de una ventana o un panel.
SynonymInfo Representa la información relativa a los sinónimos, antónimos
o también las palabras o expresiones afines para el intervalo
especificado o para una cadena determinada.
System Contiene datos sobre el sistema de su ordenador.
4. La colección Documents
Principales métodos
La colección Documents está constituida por todos los objetos Document abiertos en Word.
Add Crea un nuevo Document y lo agrega a la colección Documents.
Ej:Documents.Add Template:="Normal"
Close Cierra todos los documentos Word abiertos. Ej: Documents.Close
Open Abre el Document especificado y lo agrega a la colecciónDocuments.
Ej:
Documents.Open _
FileName:="C:\Clientes\Reactivación.docx", _
ReadOnly:=True
Save Guarda todos los documentos abiertos. Ej: Documents.Save
5. Los objetos Document
Un objeto Document permite hacer referencia a un documento Word. ActiveDocument designa el
documento activo.
Principales métodos
PrintOut Imprime la totalidad o una parte del documento especificado. Ej:
Impresión de las tres primeras páginas del documento actual.
ActiveDocumento.ActiveWindow.PrintOut
Range:=wdPrintFromTo, From:="1", To:="3"
SaveAs Guarda un documento con un nuevo nombre y/o en un nuevo formato.
Ej: ActiveDocument.SaveAs FileName:=strDocName
Principales colecciones
Characters Colección de los caracteres ubicados en un documento, en un
intervalo o en una selección.
Paragraphs Colección de los párrafos de un documento.
Principales objetos
DocumentTheme Objeto que representa el tema Office aplicado al documento
especificado.
PageSetup Objeto que representa las opciones de configuración de página
del documento.
Permissions Objeto que representa los parámetros de permisos para el
documento especificado.
WebOptions Objeto que representa los atributos globales que Microsoft Word
utiliza al guardar el documento como página Web.
Ejemplo
Aplicar el formato negrita a los caracteres de un documento Word.
Private Sub Word_EnNegrita()
Dim appWord As New Word.Application
With appWord
.Documents.Open (CurrentProject.Path & "\Reactivación.docx)
.ActiveDocument.Select
.Selection.Font.Bold = True
.ActiveDocument.Close wdSaveChanges
.Quit
End With
End Sub
Inicio de la combinación de correspondencia
El siguiente código permite generar una carta de recordatorio para los clientes a los que se haya entregado
un pedido y no lo hayan abonado. La combinación de correspondencia recurre a la consulta "Pedidos no
abonados" de la base Clientes.accdb.
Private Sub Reactivaciones()
Dim AppWord As Word.Application
Dim DocWord As Word.Document
Dim m_Provider As String
’ Inicia Word
Set AppWord = New Word.Application
AppWord.Visible = True
’ Abre la carta modelo
Set DocWord = AppWord.Documents.Open(CurrentProject.Path & _
"\Reactivación.docx")
’ Provider = Base Access Clientes.accdb
m_Provider = "Microsoft.ACE.OLEDB.15.0;Password="""";User ID=Admin;" _
& "Data Source=" & CurrentProject.Path & "\Clientes.accdb; " _
& "Mode=Read;"
’ Prepara la combinación de correspondencia para los pedidos
’ no abonados
With DocWord.MailMerge
.OpenDataSource Name:= _
CurrentProject.Path & "\Clientes.accdb", _
ConfirmConversions:=False, _
ReadOnly:=False, LinkToSource:=True, AddToRecentFiles:=False, _
Connection:= m_Provider, _
SQLStatement:="SELECT * FROM `PEDIDOS NO ABONADOS`"
.Destination = wdSendToNewDocument
.SuppressBlankLines = True
With .DataSource
.FirstRecord = wdDefaultFirstRecord
.LastRecord = wdDefaultLastRecord
End With
’ Ejecuta la combinación de correspondencia
.Execute
End With
End Sub
Controlar Excel desde Access
1. El modelo Objeto Excel
2. Principales colecciones de la aplicación Excel
Watches Colección de objetos Watch que representa a los intervalos
durante el nuevo cálculo de la hoja activa.
3. La colección Workbooks
La colección Workbooks representa todos los libros abiertos en Excel. Los principales métodos de esta
colección son los siguientes:
Add Crea un nuevo libro que se convierte en el libro activo y lo agrega a la
colección Workbooks. Ej: Workbooks.Add
Close Cierra todos los libros Excel abiertos. Ej: Workbooks.Close
Open Abre el libro especificado que se convierte en el libro activo y lo agrega
a la colección Workbooks. Ej: Workbooks.Open
Filename:="C:\Presupuesto\ presupuesto.xlsx"
Save Guarda todos los libros abiertos. Ej: Workbooks.Save
4. Los objetos Workbook
Un objeto Workbook permite hacer referencia a un libro Excel.
La propiedad ActiveWorkbook designa el libro activo.
a. Principales métodos del objeto Workbook
PrintOut Imprime la totalidad o una parte del libro especificado.
PrintPreview Muestra la hoja activa de un libro en la Vista preliminar.
Ej:ActiveWorkbook.PrintPreview
Save Guarda un libro. Ej: ActiveWorkbook.Save
SaveAs Guarda un libro bajo un nuevo nombre y/o en un nuevo
formato. Ej:ActiveWorkbook.SaveAs FileName:=
"Presupuesto.xlsx"
b. Las principales colecciones asociadas al objeto Workbook
Charts Colección de objetos Chart que representa a todas las hojas gráficas
del libro especificado.
WorkSheets Colección de objetos WorkSheet que representa a todas las hojas de
cálculo del libro especificado.
Styles Colección de objetos Style que representa a todos los estilos
asociados al libro especificado.
5. Escritura de datos en celdas Excel
El siguiente código permite mostrar la lista de pedidos no abonados.
Private Sub ExportXLS_Pedidos()
’ Objetos Access
Dim dbsClientes As DAO.Database
Dim rstPedidos As DAO.Recordset
Dim fld As DAO.Field
’ Objetos Excel
Dim appExcel As Excel.Application
Dim wbkPedidos As Excel.Workbook
Dim wksPedidos As Excel.Worksheet
’ Variables de bucles
Dim intLin As Integer
Dim intCol As Integer
’ Crea el libro de Excel
Set appExcel = CreateObject("Excel.application")
Set wbkPedidos = appExcel.Workbooks.Add
Set wksPedidos = appExcel.ActiveSheet
appExcel.Visible = True
’ Abre la tabla Pedidos
Set dbsClientes = DBEngine.OpenDatabase(CurrentProject.Path _
& "\Clientes.accdb")
Set rstCommandes = dbsClients.OpenRecordset _
("PEDIDOS NO ABONADOS", dbOpenDynaset)
’ Actualiza la hoja activa
With wksPedidos
’ Encabezados de columna cumplimentados a partir de los nombres
’ de campo
intCol = 1
For Each fld In rstPedidos.Fields
.Cells(1, intCol).Value = fld.Name
intCol = intCol + 1
Next fld
’ Recorre los registros
’ Agrega una línea por registro
intLin = 2
Do While Not rstPedidos.EOF
intCol = 1
For Each fld In rstPedidos.Fields
.Cells(intLin, intCol).Value = rstPedidos(intCol ‐ 1)
intCol = intCol + 1
Next fld
intLin = intLin + 1
rstPedidos.MoveNext
Loop
’ Asigna un nombre a la hoja de Excel
.Name = "Lista de pedidos no abonados"
End With
’ Cierra los objetos Access
rstPedidos.Close
dbsClientes.Close
’ Activa el libro en Excel
appExcel.ActiveWindow.Activate
End Sub
Controlar Outlook desde Access
1. El modelo Objeto Outlook
Extracto del modelo Objeto Outlook:
2. Ejemplo: mostrar los contactos de Outlook
Este ejemplo permite mostrar la lista de contactos de Outlook (nombre y dirección de correo electrónico) en
un cuadro de lista de un formulario Access.
Para probar este ejemplo debe:
crear un nuevo formulario,
agregar al formulario un cuadro de lista lstContactos y un botón de comando cmdContactos.
Private Sub lstContactos_Click()
Dim objOle As Outlook.Application
Dim objNamespace As Namespace
Dim objAddrList As AddressList
Dim objAddrEntries As AddressEntries
Dim objAddrEntry As AddressEntry
Dim i As Integer
’ Inicialización de la lista desplegable
With Me.lstContacts
.ColumnCount = 1
.RowSourceType = "Lista valores"
.RowSource = " "
End With
’ Aplicación Outlook
Set objOle = CreateObject("Outlook.Application")
’ Apertura de la libreta de direcciones Contactos
Set objNamespace = objOle.GetNameSpace("MAPI")
Set objAddrList = objNamespace.AddressLists("Contactos")
Set objAddrEntries = objAddrList.AddressEntries
’ Acceso al primer contacto
Set objAddrEntry = objAddrEntries.GetFirst
’ Agregar contactos a la lista
For i = 1 To objAddrEntries.Count
With Me.lstContactos
.AddItem objAddrEntry.Name
.AddItem objAddrEntry.Name, 0
.AddItem objAddrEntry.Address, 1
End With
’ Contacto siguiente
Set objAddrEntry = objAddrEntries.GetNext
Next i
End Sub
Importación y exportación de datos en formato XML
El lenguaje XML (eXtensible Markup Language) es el lenguaje estándar de descripción e intercambio de datos
en la Web, mientras que HTML (HyperText Markup Language) es el lenguaje estándar de creación y
presentación de páginas Web.
XSL (eXtensible Stylesheet Language) es una instancia de XML que permite controlar la presentación de los
documentos XML.
Microsoft Access 2013 ofrece la posibilidad de importar o de exportar datos en formato XML y presentaciones
en formato XSL.
En VBA puede utilizar los métodos ImportXML y ExportXML del objeto Application para importar o
exportar datos en formato XML.
1. El método ExportXML
El método ExportXML permite exportar los datos y/o la presentación de un objeto Access específico. Es
posible exportar en formato XML los objetos Access siguientes:
tablas,
consultas,
formularios,
informes,
páginas de acceso a datos.
Sintaxis
ExportXML(<ObjectType>, <DataSource>,[<DataTarget>], [<SchemaTarget>],
[<PresentationTarget>], [<ImageTarget>], [<Encoding>],[<OtherFlags>],
[<WhereCondition>],[<AdditionalData>])
ObjectType Obligatorio. Tipo de objeto Access que se va a exportar
(acExportDataAccessPage, acExportForm,acExportReport...).
DataSource Obligatorio. Cadena de caracteres que indica el nombre del objeto
Access que se va a exportar.
DataTarget Opcional. Cadena de caracteres que indica el nombre del archivo y
la ruta de acceso de los datos exportados. Si se omite este
argumento, los datos no se exportan.
SchemaTarget Opcional. Cadena de caracteres que indica el nombre del archivo y
la ruta de acceso de la información de los datos exportados. Si se
omite este argumento, la información del esquema se incrusta en
el documento de los datos.
PresentationTarget Opcional. Cadena de caracteres que indica el nombre del archivo y
la ruta de acceso para la información de presentación exportada. Si
se omite este argumento, esta información no se exporta.
ImageTarget Opcional. Cadena de caracteres que indica la ruta de acceso para las
imágenes exportadas. Si se omite este argumento, las imágenes no
se exportan.
Encoding Opcional. Indica la codificación de texto que se utilizará para el
archivo XML exportado.
OtherFlags Opcional. Entero largo que representa la suma de los valores de las
opciones descritas en la lista siguiente.
WhereConditions Opcional. Cadena de caracteres que especifica los registros a
exportar.
AdditionalData Objeto de tipo AdditionalData que especifica los demás objetos
Access a exportar.
Valor Descripción
1 Tablas relacionadas: incluye las distintas tablas para el objeto
especificado por DataSource.
2 Propiedades relacionales: crea propiedades de esquemas relacionales.
4 Ejecutar desde servidor: crea un wrapper ASP; si no, es por defecto un
wrapper HTML. Se aplica solamente al exportar informes.
8 Propiedades especiales: crea propiedades de esquema extendidas.
2. El método ImportXML
El método ImportXML permite importar datos y/o informaciones de presentación en una tabla Microsoft
Access a partir de un archivo XML.
Sintaxis
Application.ImportXML(<DataSource>, [<ImportOptions>])
Datasource Cadena de caracteres que contiene el nombre y la ruta de acceso del
archivo que se va a importar.
ImportOptions Opcional. Define las opciones relativas a la importación del archivo XML.
Constantes utilizables para definir las opciones de importación:
acAppendData Si una tabla lleva ya el nombre del archivo XML, los datos se
agregan a la tabla, si no, se crea la tabla.
acStructureAndData Valor predeterminado. Importa la estructura y los datos. Si una
tabla lleva ya el nombre del archivo XML, Access genera un nuevo
nombre de tabla.
acStructureOnly Importa solamente la estructura. Si una tabla lleva ya el nombre
del archivo XML, Access genera un nuevo nombre de tabla.
3. Ejemplo de importación/exportación XML
En el ejemplo siguiente veremos cómo:
exportar una tabla en formato XML,
mostrar el archivo XML en el navegador Internet Explorer,
exportar una presentación de formulario,
importar el archivo XML en una nueva tabla después de haber modificado su contenido.
Para realizar este ejemplo, debe crear un directorio C:\XML.
Etapa 1: Exportación de la tabla Clientes
Entre el código siguiente en un nuevo módulo llamado ImportExportXML y ejecute el
procedimientoExportTabCliente.
Private Sub ExportTabCliente()
’ Exportación de la tabla Clientes
ExportTabla ("Clientes")
End Sub
Private Sub ExportTabla(strTableName As String)
’ Exportación de los datos (XML) y de su presentación (XSL)
Application.ExportXML _
ObjectType:=acExportTable, _
DataSource:=strTableName, _
DataTarget:="C:\XML\" & strTableName & ".xml", _
PresentationTarget:="C:\XML\" & strTableName & ".xsl", _
Encoding:=acUTF8
End Sub
Etapa 2: Vínculo entre los archivos XML y XSL
En el directorio XML se han creado los tres archivos siguientes: clientes.xml, clientes.xsl yclientes.htm.
Si abre el archivo clientes.xml en Internet Explorer, obtendrá el resultado siguiente:
Para poder mostrar correctamente la lista de clientes, debe, ya sea utilizar el archivo clientes.htm que
hace de vínculo entre los archivos xml y xsl, o bien modificar el archivo clientes.xml para asociarle el
archivo clientes.xsl (insertar la segunda línea).
Para modificar el código contenido en los archivos xml o xsl, puede utilizar el Bloc de notas de
Windows (Notepad.exe) o cualquier otro editor de archivos de texto.
<?xml version="1.0" encoding="UTF‐8"?>
<?xml‐stylesheet type="text/xsl" href="Clientes.xsl"?>
<dataroot xmlns:od="urn:schemas‐microsoft‐com:officedata">
<Clientes>
Etapa 3: Exportación de una presentación de formulario
Private Sub ExportFormCliente()
’ Exportación de la tabla Clientes
ExportFormulario ("Clientes")
End Sub
Private Sub ExportFormulario(strFormName As String)
’ Exportación de la presentación (XSL) de un formulario
Application.ExportXML _
ObjectType:=acExportForm, _
DataSource:=strFormName, _
PresentationTarget:="C:\XML\" & strFormName & ".xsl", _
Encoding:=acUTF8
End Sub
El archivo clientes.xsl ha sido reemplazado en el directorio C:\XML.
Abra el archivo clientes.xml en Internet Explorer.
Obtendrá el siguiente resultado:
Etapa 4: Importación del archivo Clientes.XML después de su modificación
Modifique el archivo clientes.xml conservando solamente el primer registro.
<?xml version="1.0" encoding="UTF‐8"?>
<?xml‐stylesheet type="text/xsl" href="Clientes.xsl"?>
<dataroot xmlns:od="urn:schemas‐microsoft‐com:officedata">
<Clientes>
<IdCliente>ALFKI</IdCliente>
<NombreCompañía>Alfreds Futterkiste</NombreCompañía>
<NombreContacto>Maria Anders</NombreContacto>
<CargoContacto>Representante de ventas</CargoContacto>
<Dirección>Obere Str. 57</Dirección>
<Cuidad>Berlín</Ciudad
<CódPostal>12209</CódPostal>
<País>Alemania</País>
<Teléfono>030‐0074321</Teléfono>
<Fax>030‐0076545</Fax>
</Clientes>
</dataroot>
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 = "<html>"
For Each fl In fls
If Left(fl.Type, 5) = "Image" Then
strHtml = strHtml & "<img src=" & "’" & strFolder & "\" _
& fl.Name & "’" & "height=" & x & 100 & x & ">" _
& fl.Name & "<BR>"
End If
Next
’ Crea el archivo HTML
strHtml = strHtml & "</html>"
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.
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 "<Nombre_DLL>"_
[Alias "<Nombre_alias>"] [([lista_argumentos])]
[Public|Private] Declare Function <Nombre_func> _
Lib "<Nombre_DLL>"_
[Alias "<Nombre_alias>"] [([Lista_argumentos])] [As <Tipo>]
Nombre_proc, Nombre del procedimiento o de la función que sea válido en
Nombre_func Visual Basic.
Nombre_DLL Nombre de la DLL.
Nombre_alias Nombre del procedimiento o de la función en la DLL.
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
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.
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.
GetDriveName Devuelve una cadena que contiene el nombre de la unidad
correspondiente a una ruta de acceso especificada.
2. Propiedades
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 Propiedad específica
Form 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.
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 Define el inicio y el final de una función.
Function
GoSub... Return Llama a un subprograma.
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".
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.
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
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.
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.
321 Formato de archivo incorrecto.
322 Imposible crear el archivo temporal necesario.
325 Formato incorrecto en el archivo de recursos.
327 Valor del objeto de datos no encontrado.
328 Parámetro incorrecto. Imposible escribir matrices.
335 Imposible acceder al registro del sistema.
336 El componente no está correctamente registrado.
337 Componente no encontrado.
338 Ejecución incorrecta del componente.
360 Objeto ya cargado.
361 Imposible cargar o descargar este objeto.
363 Control especificado no encontrado.
364 El objeto se ha descargado.
365 Imposible descargar dentro de este contexto.
368 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
2. Constantes de fecha
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.
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.
vbKey1 49 Tecla 1
vbKey2 50 Tecla 2
vbKey9 57 Tecla 9
4. Constantes de teclas de función
5. Constantes de teclas diversas
[F1] Ayuda acerca de la palabra clave en la que se encuentra el
cursor.
[F5] Ejecutar un procedimiento.
[F8] Paso a paso por instrucciones.
[Mayús][F8] Paso a paso por procedimientos.
[Ctrl][Mayús][F8] Paso a paso para salir.
[Ctrl][F8] Ejecutar hasta el cursor.
[Mayús][F9] Inspección rápida.
[F9] Alternar punto de interrupción.
[Ctrl][Mayús][F9] Borrar todos los puntos de interrupción.
[Ctrl][F9] Establecer instrucción siguiente.