Está en la página 1de 260

Ediciones ENI

VBA Excel 2013


Programación en Excel:
Macros y Lenguaje VBA

Colección
Recursos Informáticos

Extracto del Libro


283

Capítulo 8
Administración de eventos

1. Presentación
Administración de eventos

Un evento es una acción del usuario o del sistema reconocido por un objeto
de Microsoft Excel. El evento desencadena un procedimiento, asociado al
evento del objeto activo.
Estos procedimientos le permiten asociar un código personalizado en 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

2.1 Eventos de libro, de hoja o de formulario

Usted puede acceder a los procedimientos de eventos asociados a un objeto de


la siguiente manera:
dEn la ventana Explorador de proyectos, haga doble clic en el objeto de-
seado (libro, hoja o formulario) para hacer aparecer la ventana de código
correspondiente.
dAbra la lista desplegable a la izquierda de la ventana de código y seleccione
Workbook, Worksheet o UserForm, según el objeto seleccionado.
dTambién puede seleccionar un evento vinculado al objeto seleccionado en la
lista desplegable de la derecha, para asociarle un código personalizado.

Observación
La ejecución de los procedimientos de eventos, se puede desactivar en
cualquier momento asignando el valor False a la propiedad EnableEvents del
objeto Application.

© Editions ENI - All rights reserved


Administración de eventos 285
Capítulo 8

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

2.2 Eventos del objeto Application

Se necesitan tres etapas para la escritura y ejecución de los eventos del objeto
Application.

Etapa 1

dInserte un módulo de clase:


Insertar - Módulo de clase

o abra la lista y haga clic en Módulo de clase.


dUna vez insertado el módulo, asígnele un nombre.

Ejemplo

Dele el nombre ObjApplication al módulo de clase.

Etapa 2

dEn el módulo de clase, cree un objeto Application con el siguiente código:


Public WithEvents NomObjeto As Application

Ejemplo

Creación del objeto MiAplicación como aplicación.


Public WithEvents MiAplicacion As Application

El objeto así creado queda disponible en la lista de la izquierda del módulo.


dSeleccione el objeto creado en la lista de la izquierda del módulo y luego se-

© Editions ENI - All rights reserved


leccione el evento esperado en la lista de la derecha. Escriba el código de los
procedimientos que desea generar.
Administración de eventos 287
Capítulo 8

Ejemplo

Creación de dos procedimientos de eventos: el primero realiza la inserción


de una nueva hoja; el segundo, la creación de un nuevo libro.
Public WithEvents MiAplicacion As Excel.Application
______________________________________________________________________
Private Sub MiAplicacion_WorkbookNewSheet _
(ByVal Wb As Workbook, ByVal Sh As Object)
Dim NomHoja As String
' Cada vez que se agrega una hoja se pide al usuario
' que introduzca un nombre que a continuación se destinará a la hoja
' insertada tras las hojas existentes
NomHoja = InputBox("Introduzca el nombre de la hoja")
ActiveSheet.Name = NomHoja
ActiveSheet.Move After:=Sheets(Sheets.Count)
End Sub
______________________________________________________________________
Private Sub MiAplicacion_NewWorkbook(ByVal Wb As Workbook)
Dim NbHojas As Integer
Dim NbActual As Integer
Dim Diferencia As Integer
' Por cada nuevo libro,
' solicitamos al usuario la cantidad de hojas
' Según el caso, se agregan o eliminan las hojas necesarias
Do
NbHojas = Application.InputBox _
("¿Cantidad de hojas?", Type:=1)
Loop While NbHojas = False
NbActual = Sheets.Count
Diferencia = NbActual - NbHojas
' Eliminar las hojas de más
' Eliminar los mensajes de alerta con el fin
' de no obtener mensajes en la eliminación de hojas
Do While Diferencia > 0
Application.DisplayAlerts = False
Sheets.Item(Diferencia).Select
ActiveWindow.SelectedSheets.Delete
Diferencia = Diferencia - 1
Loop

' Agregar hojas necesarias


' Se desactivan los eventos para
' no indicar los nombres de las nuevas hojas
Do While Diferencia < 0
Application.EnableEvents = False
Sheets.Add
288 VBA Excel 2013
Programación en Excel: macros y lenguaje VBA

Diferencia = Diferencia + 1
Loop
' Reactivar eventos y alertas
Application.EnableEvents = True
Application.DisplayAlerts = True
End Sub

Etapa 3

dActive un módulo cualquiera y conecte el objeto declarado en el módulo de


clase con el objeto Application para las siguientes instrucciones:
Dim NomVariable As New NomModuloDeClase

Sub NomProced ()
Set NomVariable.NomObjeto = Application
End Sub

Ejemplo

Agregue el siguiente código en el módulo Declaraciones.


Option Explicit
Dim app As New ObjApplication
________________________________________________________________
Sub InicializaMiAplicacion()
Set app.MiAplicacion = Application
End Sub

Finalmente, llame al procedimiento InicializaMiAplicacion al abrir el libro


(módulo de clase ThisWorkbook).
Private Sub Workbook_Open()
InicializaMiAplicacion
End Sub

© Editions ENI - All rights reserved


Cuando se abra el libro, se ejecutarán automáticamente los procedimientos de
eventos creados durante la etapa 2 y se agregarán los libros o las hojas. Estos
procedimientos se desactivarán al cerrar el libro.
Ediciones ENI

VBA Access 2013


Programar en Access

Colección
Recursos Informáticos

Extracto del Libro


207

Capítulo 6
Gestión de los eventos

1. Presentación
Gestión de los eventos

1.1 Definición

Un evento es el resultado de una acción del usuario o del sistema sobre un


objeto. Desencadena la ejecución del código correspondiente al procedimiento
de evento del objeto activado.
208 VBA Access 2013
Programar en Access

La utilización de un procedimiento de evento o de una macro permite asociar


un tratamiento específico en respuesta a un evento que se produzca en un
formulario, en un informe o en un control.

1.2 Asociación de código VBA a un evento


Puede asignar código VBA al evento de un objeto de dos maneras:
– a partir de la ficha Eventos de la ventana de propiedades del objeto en Access.

– a partir de las listas desplegables de objetos y de eventos en el editor Visual


Basic.

© Editions ENI - All rights reserved


Gestión de los eventos 209
Capítulo 6

2. Categorías de eventos
Las siguientes listas de eventos están clasificadas por tipo y contienen:
– el nombre del evento,
– el nombre de la propiedad correspondiente en la ventana de propiedades del
objeto (entre paréntesis),
– la descripción del evento,
– la columna de la derecha (Cancelación) indica si el evento puede cancelarse.
La cancelación de un evento se describe en el apartado Cancelación de un
evento.

2.1 Eventos de tipo Ventana

Cancelación
Open (AlAbrir) Sí
Se produce al abrir un formulario pero antes de
que se muestre el primer registro. Se produce al
abrir un informe, pero antes de su impresión.
Load (AlCargar) No
Se produce al abrir un formulario cuando se
muestra el primer registro.
Resize (AlCambiarTamaño) No
Se produce al mostrar por primera vez el 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

2.2 Eventos de tipo Enfoque

Les eventos de tipo "enfoque" pueden aplicarse a los formularios (Activate,


Deactivate, GotFocus, LostFocus) o a los controles (Enter, Exit, SetFocus,
LostFocus). Decimos que un objeto tiene el enfoque (o foco) cuando puede re-
cibir una entrada del usuario a través de acciones con el ratón o con el teclado.
Los objetos que tienen el enfoque se llaman objetos activos (ActiveForm o
ActiveControl).

Observación
El método SetFocus permite dar el foco a un control o a un formulario.

Cancelación
Activate (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.

© Editions ENI - All rights reserved


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.
Gestión de los eventos 211
Capítulo 6

2.3 Eventos de tipo Datos

Los eventos de tipo "datos" se aplican a los formularios asociados a un origen


de datos (propiedad RecordSource rellenada a partir de un nombre de tabla o
de una consulta) y a los controles asociados a un campo del origen de datos del
formulario (propiedad ControlSource rellenada).

Cancelación
AfterInsert (DespuésDeInsertar) No
Se produce después de agregar un
nuevo registro a la tabla.
AfterUpdate (DespuésDeActualizar) No
Se produce después de la 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.

© Editions ENI - All rights reserved


Se produce también al pasar de una
página a otra en un control Ficha.
Introducción
Access  2013  dispone  del  lenguaje  de  programación  Visual  Basic  para  Aplicaciones  (VBA)  que  permite
extender su funcionalidad para ofrecerle mejor rendimiento.

Es un lenguaje potente que no presenta ninguna dificultad para ser comprendido por los prin
Objetivos del libro
Este libro se dirige a los desarrolladores y usuarios avezados que desean crear aplicaciones profesionales con
Access.

El  objetivo  de  este  libro  consiste  en  presentar  el  abanico  de  posibilidades  propuestas  por  la  potencia  del
lenguaje  VBA.  Los  diferentes  ejemplos,  disponibles  para  descargar  en  la  página  Información,  le  permitirán
poner en práctica fácil y progresivamente los conocimientos adquiridos.

El único requisito necesario para aprovechar el contenido de este libro es el de tener un buen conocimiento
de  la  interfaz  de  Access.  Poseer  nociones  de  programación  o  conocer  un  lenguaje  de  programación  le
ayudará a dominar el lenguaje VBA. Sin embargo, no son indispensables para sacarle partido a este libro.

En una primera fase, aprenderá a transformar macros a lenguaje VBA, a emplear el entorno de desarrollo de
Access,  a  familiarizarse  con  las  nociones  básicas  del  lenguaje  VBA  y  usarlas  para  manipular  los  objetos
Access (tablas, formularios, informes...), modificar las opciones Access y automatizar algunos procesos.

En una segunda fase, descubrirá gradualmente cómo crear aplicaciones profesionales con Access mediante
los siguientes módulos:

Manejo  de  datos  contenidos  en  las  diferentes  tablas:  búsqueda  de  registros  según  criterios
específicos, actualización de registros, modificación de la estructura de una tabla, etc.

El uso del lenguaje SQL para traducir cualquier tipo de petición al lenguaje VBA.

La  interceptación  de  eventos  de  un  formulario  o  un  informe  con  el  fin  de  asociarle  un  tratamiento
personalizado en lenguaje VBA (programación orientada a eventos).

El uso de herramientas de depuración para identificar y corregir los diferentes tipos de errores.

La optimización de la fiabilidad del código VBA gracias a la implementación de un gestor de errores.

La personalización dinámica de la presentación de los formularios e informes.

La mejora de la interfaz usuario Access.

La creación de una cinta Microsoft Office específicamente para su aplicación.

La manipulación de aplicaciones Microsoft Office 2010 Word, Excel y Outlook, en particular mediante
los  ejemplos  siguientes:  generación  de  correspondencia  con  Word,  creación  de  un  libro  Excel,
visualización de los contactos Outlook.

El  acceso  a  las  funcionalidades  relacionadas  con  Internet:  importar  y  exportar  ficheros  XML,  y
generación de ficheros HTML.

El  control  del  sistema  operativo  a  través  de  llamadas  a  las  funciones  API  de  Windows  (Application
Programming Interface).

Para  terminar,  el  último  capítulo  del  libro  le  guía  en  la  creación  completa  de  una  aplicación  en  Access.  La
aplicación propuesta permite gestionar los cursos seguidos por los empleados de una empresa mediante las
funcionalidades siguientes: entrada de los cursos que integran cálculos automáticos, el registro de los cursos
tras el control de la coherencia de los datos introducidos, la búsqueda de los cursos según diferentes criterios
e impresión de la lista de los cursos que cumplen esos criterios.

Al  final  de  este  libro,  estará  convencido  de  la  necesidad  de  utilizar  el  lenguaje  VBA  para  crear  aplicaciones
profesionales, eficaces y amenas con Access.
Revisión de conceptos
Una base Access está constituida por un único archivo con la extensión .ACCDB que contiene los distintos
objetos de la aplicación. Estos objetos son:

Las tablas

Contienen los datos de la base y pueden estar relacionadas entre ellas.

Las consultas

Permiten efectuar:

selecciones y ordenaciones en las tablas,

cálculos sencillos y referencias cruzadas,

acciones (agregar, eliminar, actualizar registros, crear tablas),

operaciones SQL.

Los formularios

Se utilizan para consultar o actualizar los datos.

Los informes

Se  utilizan  para  imprimir  listados  desde  la  simple  lista  de  una  tabla  hasta  informes  más  complejos  que
contengan agrupamientos de registros y cálculos.

Las macros

Permiten automatizar varias tareas mediante un lenguaje particular, sin alcanzar, sin embargo, la potencia
de desarrollo de VBA.

Los módulos

Contienen  una  parte  del  código  VBA  de  la  aplicación,  es  decir,  declaraciones  de  funciones,  procedimientos,
etc.
Principios fundamentales de VBA
VBA presenta un entorno de programación orientado a objetos.

Un  objeto  es  una  entidad  autónoma  que  posee  características  (propiedades:  tamaño,  color,  valor...)  y
comportamientos  (métodos)  que  le  son  propios.  Ciertos  objetos  poseen  una  representación  visual
(Formularios,  Informes...),  mientras  que  otros  sólo  son  accesibles  mediante  código  VBA  (DBEngine,
Container...).

La  mayoría  de  objetos  visuales  tienen  la  posibilidad  de  responder  a  eventos  (al  abrir,  después  de
actualizar...).

Mediante el código, la programación en VBA permite inducir comportamientos particulares de los objetos en
función  de  los  eventos:  métodos,  procedimientos  y  funciones.  Para  este  fin,  la  escritura  del  código  se  ve
facilitada  ya  que  se  basa  en  una  concepción  modular.  De  este  modo  permite  una  gran  flexibilidad  de
funcionamiento y un mantenimiento más sencillo.

Estructura de un objeto

Evento Acción del usuario o del sistema que actúa sobre un objeto y
desencadena el código correspondiente.

Método Código predefinido referido a un tipo de objeto.

Procedimiento Secuencia de instrucciones que no devuelve ningún valor.

Función Secuencia de instrucciones que devuelve un valor.
Conversión de macros a VBA
Las macros representan una manera fácil de gestionar el encadenamiento de acciones sencillas tales como
abrir y cerrar formularios.

Sin embargo, VBA presenta otras ventajas:

facilita el mantenimiento de las bases de datos ya que los procedimientos de evento de Visual Basic
están integrados en la definición del formulario o del informe,

mejora y facilita la gestión de los errores,

permite llevar a cabo acciones en el sistema,

autoriza la manipulación de un solo registro a la vez,

acepta el paso de argumentos al código en curso de ejecución.

Cualquier macro puede convertirse automáticamente en código VBA.

1. Conversión de las macros en un formulario o en un informe
  En el panel de exploración, haga clic con el botón secundario del ratón en el formulario o el informe y
a continuación haga clic en Diseño.

  Bajo  la  pestaña  DISEÑO,  haga  clic  en  el  icono  Convertir  macros  del  formulario  a  Visual
Basic  oConvertir  macros  del  informe  a  Visual  Basic  situado  en  la  parte  inferior  derecha  del
grupoHerramientas:

Aparece entonces el siguiente cuadro de diálogo:

  Si lo desea desactive las opciones que aparecen por defecto. No obstante se recomienda conservar el
control  de  errores  para  la  fiabilidad  de  la  aplicación  y  los  comentarios  para  simplificar  la  lectura  del
código.

  Haga clic en Convertir para continuar.

2. Conversión de macros globales
  En  el  panel  de  navegación,  use  el  botón  secundario  del  ratón  para  hacer  clic  en  la  macro  y,  a
continuación, en Modo Diseño.

  Bajo la pestaña DISEÑO, haga clic en el icono Convertir macros a Visual Basic situado en la parte
inferior derecha del grupo Herramientas.

  En el cuadro de diálogo Convertir macros seleccione las opciones deseadas.

  Haga  clic  en  Convertir  para  poder  continuar:  la  macro  habrá  sido  convertida  a  código  VBA  en  un
módulo denominado Macro convertida seguido del nombre de la macro.
Seguridad de la base de datos
Los parámetros de seguridad de las macros permiten controlar lo que se produce cuando se abre una base
de datos de Access que contiene una macro o código VBA.

1. Modificación de los parámetros de seguridad de una base de datos Access
De  manera  predeterminada,  cuando  se  instala  Access,  se  abren  las  bases  de  datos  en
modoDeshabilitado. Esto significa que los siguientes componentes no pueden ser ejecutados:

Código VBA.

Acciones no securizadas en Macros: aquéllas que permitirían a un usuario modificar el contenido de
la base de datos o acceder a recursos externos a ella. 

Consultas: todas aquellas que permitan insertar, modificar o suprimir datos de tablas.

Controles ActiveX.

Si abre una base de datos Access en modo deshabilitado, el sistema le presentará una advertencia en la
barra de mensajes:

Para activar de forma permanente el contenido de una base de datos haga clic en Habilitar contenido. La
base de datos se convierte así en un documento aceptado; la advertencia de seguridad no se volverá a
mostrar en el momento de su apertura.

La  aceptación  de  la  base  de  datos  se  restringe  a  una  localización  precisa;  si  la  mueve  de  lugar  se
mostrará de nuevo la advertencia de seguridad en el momento de su apertura.

También puede habilitar el contenido sólo para una sesión (esto es, durante el tiempo que tenga la base de
datos abierta) de la siguiente manera:

  Cuando  el  sistema  le  muestre  la  advertencia  de  seguridad,  pulse  en  el  enlace  Haga  clic  para
obtener más detalles de la barra de mensajes o pulse en la pestaña Archivo.

  En la zona Advertencia de seguridad abra la lista Habilitar contenido.

  Seleccione Opciones avanzadas.

  En  el  cuadro  de  diálogo Opciones  de  seguridad  Microsoft  Office,  seleccione  la  opción  Habilitar
contenido para esta sesión.

  De esta manera Access ocultará la advertencia de seguridad: volverá a ser mostrada la próxima vez
que abra el fichero.

2. Modificación de los parámetros de seguridad por defecto
También puede modificar los parámetros de seguridad por defecto de todas las bases de datos Access de la
siguiente manera:

  Seleccione el comando Opciones en la pestaña Archivo.

  Seleccione la categoría Centro de confianza en el menú de la izquierda.

  Haga clic en el botón Configuración del centro de confianza.

  Seleccione  la  categoría  Configuración  de  macros  en  el  menú  de  la  izquierda  para  modificar  la
configuración de las macros y del código VBA.

  En caso de modificación de la configuración de seguridad, la nueva opción seleccionada será aplicada al
conjunto de todas las bases de datos Access con excepción de la base de datos activa actualmente.
Para aplicar la nueva configuración a esta base de datos deberá cerrarla y volver a abrirla.

Para  modificar  la  configuración  de  seguridad  de  los  controles  ActiveX  seleccione  Configuración
ActiveX en el menú de la izquierda de la ventana Centro de confianza.

3. Descripción de las diferentes opciones de seguridad
El término "macros" engloba todos los comandos macro y el código VBA.

Deshabilitar todas las macros sin notificación

Se deshabilitan todas las macros y todas las alertas de seguridad.

Deshabilitar todas las macros con notificación

Opción predeterminada. Se deshabilitan las macros, pero aparece la alerta de seguridad.

Deshabilitar todas las macros excepto las macros firmadas digitalmente

Si las macros de un archivo están firmadas digitalmente por un editor de confianza, pueden ser
ejecutadas. Si el editor no es de confianza, aparece una notificación y entonces se pueden
habilitar las macros firmadas o confiar en el editor. Las macros no firmadas digitalmente no
podrán ser habilitadas.

Habilitar todas las macros

Si se selecciona esta opción, se habilitan todas las macros. No se recomienda utilizar esta
configuración de manera permanente.

Sea cual sea la opción elegida, si se instala un software antivirus que funcione con Microsoft Office
System 2013, los archivos que contienen macros son analizados antes de ser abiertos.

4. Documentos confiables
El  término  ”documento  confiable”  es  un  término  genérico  común  al  conjunto  de  las  aplicaciones  Office
2013. Un documento confiable es un archivo Microsoft Office (Base de datos Access, Hoja de cálculo Excel,
Documento  Word...)  en  el  que  todos  los  componentes  inseguros  (código  VBA,  macros,  componentes
ActiveX...) se habilitan en cuanto se abre el archivo.

Access puede dar por válida una base de datos de diferentes maneras:

Habilitando el contenido inseguro de la base de datos después de una advertencia de seguridad.

Añadiendo la ubicación de la base de datos a la lista de ubicaciones de confianza.

Validando al editor de la base de datos.

Es posible deshabilitar cualquier documento confiable por activación del contenido de la siguiente manera:

  Seleccione el comando Opciones de la pestaña Archivo.
  Seleccione la categoría Centro de confianza en el menú de la izquierda.

  Haga clic en el botón de comando Configuración del Centro de confianza.

  Seleccione la categoría Documentos confiables en el menú izquierdo.

  Marque la casilla Deshabilitar los documentos confiables.

En  lo  concerniente  a  los  documentos  validados  por  otros  métodos,  en  todo  momento  se  puede  suprimir
una ubicación de confianza o un editor de confianza.

5. Ubicaciones de confianza
Si lo desea, puede definir de la siguiente manera una lista de ubicaciones para las cuales todas las bases de
datos Access serán consideradas ”de confianza”:

  Seleccione el comando Opciones de la pestaña Archivo.

  Seleccione la categoría Centro de confianza en el menú izquierdo.

  Seleccione la categoría Ubicaciones de confianza en el menú izquierdo.

  Haga clic en el botón Agregar una ubicación.

  Seleccione la ubicación deseada mediante el botón Examinar... y complete los datos requeridos en el
cuadro de diálogo Ubicación de confianza de Microsoft Office.

  Haga clic en el botón Aceptar: la ruta escogida será añadida a la lista de ubicaciones de confianza.

6. Editores de confianza
Las aplicaciones Access desarrolladas por editores de confianza se caracterizan por los siguientes criterios:

El código está firmado por el programador mediante una firma digital;

La firma digital es válida;

La firma digital está actualizada (no ha caducado);

El  certificado  asociado  a  la  firma  digital  fue  emitido  por  una  entidad  emisora  de  certificados
acreditada.
Para agregar un editor a la lista de Editores de confianza:

  Abra  una  base  de  datos  Access  cuyo  código  ha  sido  firmado  por  un  editor  (paquete  firmado  con  la
extensión accdc).

  Seleccione  la  opción  Confiar  en  todo  contenido  del  editor  en  el  cuadro  de  diálogo  Aviso  de
seguridad de Microsoft Access.

Puede ver en cualquier momento la lista de editores de confianza de la siguiente manera:

  Seleccione el comando Opciones de la pestaña Archivo.

  Seleccione la categoría Centro de confianza en el menú de la izquierda.

  Seleccione la categoría Editores de confianza en el menú de la izquierda.

También es posible desactivar un editor de confianza haciendo clic en el botón Quitar.
Publicar una base de datos Access mediante un paquete
firmado
Para publicar una aplicación Access, es necesario crear un paquete y firmarlo para implementar la seguridad.
Cuando los usuarios reciban el paquete, la firma garantiza que la base de datos no ha sido modificada desde
la creación del paquete. La firma permite, además, comprobar la procedencia de la aplicación y confiar en el
editor.

La  firma  se  aplica  a  todos  los  objetos  de  la  base  de  datos,  y  no  solamente  a  las  macros  o  códigos  VBA.
Además, se comprime el fichero de paquete para reducir los tiempos de descarga.

1. Obtener un certificado digital
Para firmar de manera digital un paquete, es necesario obtener previamente un certificado digital de una
autoridad de certificación comercial como Verisign (www.verisign.com) o Thawte (www.thawte.com).

La  herramienta  Selfcert.exe  (programa  entregado  con  Microsoft  Office  2013  y  ubicado  en  la  carpeta
C:\Archivos  de  Programas\Microsoft  Office\Office  15)  le  permite  crear  un  certificado  digital  para  efectuar
pruebas de paquete (no se podrá desplegar el paquete en puestos de trabajo distíntos a aquél en que ha
sido creado).

Para crear un certificado digital con la herramienta Selfcert.exe:

  Lance el programa Selfcert.exe.

  Introduzca el nombre de su certificación (Ej.: ENI), luego haga clic en el botón de comando Aceptar.

Puede  obtener  la  lista  de  las  autoridades  certificadoras  pulsando  el  enlace  Haga  clic  aquí  para
obtener una lista de entidades comerciales emisoras de certificados.

2. Crear y firmar un paquete
Es posible crear un paquete firmado de la siguiente manera:

  Abra la base de datos en Access.

  Seleccione el comando Guardar como en la pestaña Archivo.

  Haga doble clic en Empaquetar y firmar situado debajo de Avanzadas.

  Seleccione  un  certificado  digital  y  luego  haga  clic  en  el  botón  de  comando  Aceptar  (el  botón  de
comando  Mostrar  el  certificado  le  permite  modificar  las  propiedades  de  un  certificado  o
deshabilitarlo).

  En el cuadro de diálogo Crear un paquete firmado Microsoft Access, seleccione la ubicación de su
paquete en la lista Guardar como y haga clic en el botón de comando Crear.

  A  continuación  Access  crea  un  paquete  firmado  con  la  extensión  accdc  en  la  ubicación  que  Usted
escogió.
El entorno de desarrollo IDE

1. Presentación
El IDE (Integrated Development Environment) es el entorno en el que puede introducir, modificar y probar
su código VBA. Este entorno también se llama VBE (Visual Basic Editor).

Desde Access, se puede acceder al entorno de desarrollo IDE:

  Mediante la combinación [Ctrl][F11].

  Haciendo clic en el icono   debajo de la pestaña Herramientas de base de datos.

  Seleccionando  un  procedimiento  de  evento  desde  una  hoja  de  propiedades  en  un  formulario  o  un
informe.

El IDE pone a su disposición una gran cantidad de herramientas que facilitan la programación y la puesta a
punto  de  su  código  VBA:  herramientas  de  depuración,  lista  de  miembros  automática,  examinador  de
objetos...

2. Ventanas del entorno IDE

Se pueden mostrar todas las ventanas del entorno IDE a partir del menú Ver.

La barra de herramientas Estándar (1)
1 Ver Microsoft Access 11 Interrumpir

2 Agregar un módulo, un módulo de clase o 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

Constante simbólica Valor Significado


Número y tipo de botones

vbOKOnly 0 Muestra solamente el botón Aceptar.

vbOKCancel 1 Muestra los botones Aceptar y Cancelar.

vbAbortRetryIgnore 2 Muestra los
botones Anular, Reintentar eIgnorar.

vbYesNoCancel 3 Muestra los botones Sí, No y Cancelar.

vbYesNo 4 Muestra los botones Sí y No.

vbRetryCancel 5 Muestra los botones Reintentar y Cancelar.

vbMsgBoxHelpButton 16384 Muestra un botón de ayuda.

Tipo de icono

vbCritical 16
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.

vbDefaultButton2 256 Segundo botón.

vbDefaultButton3 512 Tercer botón.

vbDefaultButton4 768 Cuarto 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.

vbSystemModal 4 096 Sistema modal. Todas las aplicaciones se


interrumpen hasta que el usuario responda al
mensaje mostrado en el cuadro de mensaje.

Presentación

vbMsgBoxHelpButton 16384 Agregar el botón "Ayuda" al cuadro de


mensaje.

vbMsgBoxSetForeground 65536 Muestra la ventana de mensaje en primer


plano.

vbMsgBoxRight 524288 Alinea el texto a la derecha.

vbMsgBoxRtlReading 1048576 Define un orden de lectura de derecha a


izquierda para los sistemas hebreo y árabe.

Los valores de retorno están igualmente definidos por constantes:
Constante Valor de retorno Botón seleccionado

vbOK 1 Aceptar

vbCancel 2 Cancelar

vbAbort 3 Anular

vbRetry 4 Reintentar

vbIgnore 5 Ignorar

vbYes 6 Sí

vbNo 7 No

Ejemplos: utilización de la función MsgBox

Dim lngRep As Long 
lngRep = MsgBox ("¿Desea confirmar?", 292, "Confirmación")

El  valor  292  corresponde  a  la  suma  de  los  valores  de  los  constantes  vbYesNo  (4),  vbQuestion  (32)  y
vbDefaultButton2 (256).

Dim strRep As Long 
strRep = MsgBox ("¿Desea confirmar?", vbYesNo + vbQuestion_ 
                  + vbDefaultButton2, "Confirmación")

Utilización de la instrucción MsgBox

MsgBox "Resultado falso",vbCritical,"Error"
1. Los tipos de variables
Las variables permiten almacenar valores intermedios en cualquier momento de la ejecución del código VBA
con el fin de utilizarlas posteriormente para realizar cálculos, comparaciones, pruebas...

Las variables se identifican con un nombre que permite referenciar el valor que éstas contienen y un tipo
que determina la naturaleza de los datos que pueden almacenar.

Numéricas

Tipo Rango Tamaño


en bytes

Byte 0 a 255 1

Integer (entero) ­32 738 a 32 767 2

Long (entero largo) ­2 147 483 648 a 2 147 483 647 4

Single (real simple con ­3,402823E38 a 1,401298E­45 (valores negativos) 4
coma flotante) ­1,401298E­45 a 3,402823E38 (valores positivos)

Double (real doble con ­1,79769313486231E308 a 4,94065645841247E­ 8
coma flotante) 324 (valores negativos) 4,94065645841247E­324
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

Biblioteca Prefijo Ejemplos

Microsoft Access ac acForm, acNormal

Visual Basic vb vbCurrency, vbYellow

Microsoft Office mso msoSortByFileName

Las  constantes  de  la  biblioteca  Visual  Basic  se  describen  en  el  anexo  Constantes  VBA  del  presente
manual.  Para  utilizar  las  constantes  de  Microsoft  Office  2013  deberá  seleccionar  la  referencia
"Microsoft Office 15.0 Object Library" (opción Referencias del menú Herramientas).

Existen  varias  categorías  de  constantes  intrínsecas  (constantes  de  acción,  constantes  de
procedimientos de eventos, etc.).

Ejemplo

El siguiente ejemplo muestra cómo visualizar y personalizar un formulario. El ejemplo utiliza las constantes
strNomAppli y strNomSoc declaradas en el código y varias constantes intrínsecas.
Resultado en Access: visualización del formulario personalizado Empleado.
Las estructuras de decisión
A menudo es necesario evaluar condiciones específicas antes de ejecutar instrucciones.

Las estructuras de decisión, llamadas también alternativas o de bifurcación condicional, permiten, al finalizar
una evaluación, optar por un bloque de código u otro.

Distinguimos dos tipos de instrucciones de bifurcación condicional:

If ... Then ... Else

Select ... Case

La función IIf también puede emplearse para definir un valor en función de una condición.

1. La instrucción IF

If

Permite ejecutar instrucciones en función del resultado de una condición.

Las instrucciones If...Then...Else pueden anidarse en tantos niveles como sea necesario.

La  sintaxis  de  múltiples  líneas,  con  una  indentación  apropiada,  presenta  la  ventaja  de  una  mayor
legibilidad.

Sintaxis 1 (línea única)

If <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.

Propiedad Del objeto Objeto retornado

ActiveControl Screen Objeto Control que representa el


control activo.

ActiveDataAccessPage Screen Objeto DataAccessPage que


representa la página de acceso a
los datos activos.

ActiveForm Screen Objeto Form que representa el


formulario activo.

ActiveReport Screen Objeto Report que representa el


informe activo.

Application Múltiples objetos Objeto Application que


representa la aplicación de
Access.

Form Control subformulario Objeto Form asociado al control


de subformulario.

Me Form o Report El objeto Form o Report cuyo
código se está ejecutando.

Module Form o Report Objeto Módulo que contiene el


código asociado al formulario o al
informe.

Parent Múltiples objetos Objeto o colección que contiene


el objeto.
PreviousControl Screen El objeto Control anteriormente
activo.

RecordsetClone Form Un Recordset copia del conjunto


de registros subyacente del
formulario.

Report Controlsubinforme Objeto Report asociado al


control de subinforme.

Section Form, Report Sección de un formulario o de un


informe.

3. Los métodos
Los métodos permiten efectuar acciones propias de los objetos.

Se presentan como procedimientos:

pueden utilizar o no argumentos,

algunos  métodos  pueden  devolver  un  valor  del  mismo  modo  que  los  procedimientos  Function,
otros no, al igual que los procedimientos Sub.

Sintaxis de método que no devuelve valor

{<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 

Forms![Cursos].[txtFechaIni].Value 

Forms!Cursos.txtFechaIni.Value 

Forms!Cursos!txtFechaIni.Value

6. Presentación automática de instrucciones
El editor VBA dispone de una tecnología que permite asistirle durante la utilización de objetos. Al teclear un
nombre de objeto reconocido por VBA seguido de un punto, se muestra la lista desplegable de los métodos y
propiedades de dicho objeto. Si selecciona un método, el asistente también le ayuda a introducir los distintos
argumentos que comporta.

Ejemplo

  Teclee el nombre de objeto DoCmd seguido de un punto y aparece la lista desplegable siguiente.

El icono   representa los métodos, el icono   representa las propiedades.

Puede hacer pasar los elementos de la lista desplegable tecleando las primeras letras del método, propiedad
o colección que está buscando o por medio de la barra de desplazamiento. Para seleccionar un elemento de
la lista, haga un doble clic encima de él.

Teclee  un  punto  si  acaba  de  seleccionar  un  objeto  y  si  desea  ver  la  lista  de  propiedades  y  métodos
relacionados.  Si  ha  seleccionado  un  método,  teclee  un  espacio  para  introducir  la  lista  de  parámetros  del
método.

Para proseguir el ejemplo:

  Seleccione el método OpenForm.
  Y teclee un espacio:

Se muestra entonces la lista de argumentos del método y se adapta a medida que los introduce.

Los  argumentos  opcionales  están  entre  corchetes.  El  argumento  actual  aparece  en  negrita.  Si  para  un
argumento  determinado  existe  una  lista  de  valores  predefinidos,  aparece  la  lista  desplegable  de  las
correspondientes constantes.

  Introduzca  el  nombre  del  parámetro  pasado  a  la  función,  es  decir  StrFormName,  seguido  de  una
coma, el argumento acNormal y tres comas (para los dos argumentos opcionales).

En el ejemplo aparece la lista de valores posibles del argumento DataMode.

Para  obtener  la  lista  de  propiedades  y  métodos  de  un  objeto  también  es  posible  proceder  de  la
siguiente manera: coloque el cursor tras el punto (situado después del nombre del objeto), haga clic
en  el  botón  secundario  del  ratón  y  seleccione  la  opción Lista  de  propiedades  y  métodos  del  menú
contextual o utilice el método abreviado [Ctrl] J.

Asimismo, para obtener la lista de constantes disponibles como argumento de un método, se puede
proceder como sigue: coloque el cursor donde está el argumento (después del método o después de
la  coma),  haga  clic  en  el  botón  secundario  del  ratón  y  seleccione  la  opción  Lista  de  constantes  del
menú contextual.
Instrucciones utilizadas con los objetos

1. La instrucción With
La instrucción With permite acceder varias veces al mismo objeto nombrándolo una sola vez.

Ofrece varias ventajas:

optimización del tiempo de ejecución del código,

ahorro de tiempo en el trabajo de escritura,

mejor legibilidad del código.

Sintaxis

With <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

AutomationSecurity Devuelve  o  define  una


constanteMsoAutomationSecurity  que  representa  el
modelo de seguridad utilizado por Microsoft Access cuando
abre ficheros por programación.

BrokenReference Devuelve un valor de tipo Boleano que indica si la base de
datos activa posee referencias rotas hacia bases de datos o
bibliotecas de tipos.

Build Devuelve un valor de tipo Entero Largo que representa el
número  de  la  copia  de  Microsoft  Office  Access  2013
actualmente instalada.

CodeContextObject Devuelve el objeto en el que se está ejecutando una macro
o código Visual Basic.

CurrentObjectName Devuelve  el  nombre  del  objeto  activo  (tabla,  consulta,


formulario, informe, macro, módulo).

CurrentObjectType Devuelve el tipo del objeto activo.

Constante Valor Descripción

acTable 0 Tabla

acQuery 1 Consulta

acForm 2 Formulario

acReport 3 Informe

acMacro 4 Macro

acModule 5 Módulo

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 sub­formulario al especificar el
argumentoPathToSubFormControl.

Close (Cerrar) Cierra un objeto (formulario, informe...).
CloseDatabase (CerrarBaseDeDatos) Cierra la base de datos abierta en
la interfaz Access. Si la base de datos contiene objetos que
no hayan sido grabados cuando utiliza el
métodoCloseDatabase, aparecen cuadros de diálogo
idénticos a los que se muestran cuando hace clic en Cerrar
base de datos.

CopyObject (CopiarObjeto) Permite copiar un objeto Access en la
misma base o en otra base.

DeleteObject (EliminarObjeto) Elimina un objeto.
GotoControl (IrAControl) Mueve el enfoque a un control.
GotoPage (IrAPágina) Mueve el enfoque al primer control de la
página indicada del formulario activo.

OpenDataAccessPage (AbrirPáginaAccesoDatos) Abre una página de acceso
a los datos.

OpenDiagram (AbrirDiagrama) Abre un esquema de base de datos.
OpenForm (AbrirFormulario) Abre un formulario.
OpenFunction (AbrirFunción) Abre una función de usuario en una
base de datos Microsoft SQL Server para mostrarla en
Microsoft Access.

OpenModule (AbrirMódulo) Abre un módulo VBA.
OpenQuery (AbrirConsulta) Abre una consulta.
OpenReport (AbrirInforme) Abre un informe.
OpenStoredProcedure (AbrirProcedimientoAlmacenado) Abre un
procedimiento almacenado en la vista Hoja de datos, en
vista Diseño o en vista Preliminar.

OpenTable (AbrirTabla) Abre una tabla.
OpenView (AbrirPáginaAccesoADatos) Abre una página de
acceso a datos.

PrintOut (Imprimir) Imprime en papel.
Rename (CambiarNombre) Cambiar el nombre a un objeto.
RepaintObject (RepintarObjeto) Repintar un objeto (formulario...).
Save (Guardar) Guarda el objeto especificado o el objeto
activo.

SelectObject (SeleccionarObjeto) Selecciona un objeto de base de
datos.

SetHiddenAttribute Permite modificar la visibilidad de un objeto Access.

SetParameter (EstablecerParametro) Crea un parámetro que los
métodos BrowseTo, OpenForm, OpenQuery, OpenReport o
RunDataMacro pueden utilizar.

Acciones sobre los registros

FindNext (EncontrarSiguiente) Continúa la búsqueda.
FindRecord (EncontrarRegistro) Búsqueda de un registro.
GoToRecord (AlcanzarRegistro) Alcanza un registro.
RefreshRecord (RefrescarRegistro) Refresca los datos de los registros
del objeto Access activo (formulario, informe...)

Requery (Actualizar) Actualiza los datos de la pantalla (vuelve a
lanzar la consulta fuente del objeto).

SearchForRecord (BuscarRegistro) Permite buscar un registro específico
en una tabla, una consulta, un formulario o un informe.

SetFilter (EstablecerFiltro) Aplica un filtro a los registros del
objeto Access activo: hoja de datos, formulario, informe o
tabla.

SetOrderBy (EstablecerOrdenPor) Ordena los registros del objeto
Access activo: hoja de datos, formulario, informe o tabla.

ShowAllRecords (MostrarTodosRegistros) Deshabilita un filtro y vuelve
a mostrar todos los registros.

Importar/Exportar Datos

CopyDatabaseFile (CopiarArchivoDeBaseDeDatos) Copia la base de datos
conectada al proyecto activo a un archivo de base de datos
Microsoft SQL Server para exportarla.

OutPutTo (SalidaHacia) Permite exportar un objeto Access (tabla,
formulario) a otra base Access o a otro tipo de fichero (Excel,
XML...)

RunSavedImportExport (EjecutarImportaciónExportacionGuardada)Ejecuta
una especificación de importación o exportación guardada,
creada a partir del Ayudante para la Importación o del
Ayudante para la Exportación.
SendObject (EnviarObjeto) Envía un objeto hacia la mensajería.
TransferDatabase (TransferirBase) Importa o exporta una base de datos.
TransferSpreadSheet (TransferirHojaCalculo) Importa o exporta una hoja
de cálculo.

TransferSharePointList (TransferirListaSharePoint) Permite importar o
relacionar datos a partir de un sitio Microsoft Windows
SharePoint Services 3.0.

TransferSQLDatabase (TransferirBaseDeDatosSQL) Transferir la integridad de
la base de datos Microsoft SQL Server especificada hacia otra
base de datos SQL Server.

TransferText (TransferirTexto) Importa o exporta texto en formato
ASCII.

Manipulaciones de la ventana activa

Maximize (Maximizar) Maximiza una ventana.
Minimize (Minimizar) Reduce la ventana activa a un icono.
MoveSize (DesplazarTamaño) Desplaza o cambia el tamaño de
la ventana activa.

Restore (Restaurar) Recupera el tamaño normal de la
ventana activa.

Modificación de la interfaz Access

AddMenu (AgregarMenú) Permite crear una barra de menú o
un menú contextual.

DoMenuItem (MostrarBarraHerramientas) Muestra el
comando de menú apropiado para Microsoft Access.

Hourglass (RelojDeArena) Muestra el puntero del ratón en
forma de reloj de arena o no.

LockNavigationPane (BloquearPanelExploración) Permite impedir a
los usuarios suprimir objetos de base de datos que se
muestran en el panel de navegación.

SetDisplayedCategories (DefinirCategoríasMostradas) Precisa las
categorías que se muestran en Desplazarse a la
categoría en la barra de título del panel de
navegación.

SetMenuItem (EstablecerElementoMenú) Permite establecer el
estado (activo o inactivo, seleccionado o no
seleccionado) de elementos de menú personalizado o
global para la ventana activa.

SetWarnings (EstablecerAdvertencias) Activa o desactiva la
visualización de los mensajes de advertencia estándar.

ShowToolbar (MostrarBarraDeHerramientas) Muestra u oculta
una barra de herramientas.

Diversos

Beep (Bip) Emite un bip sonoro.
ClearMacroError (BorrarErrorDeMacro) Suprime la información
relativa a un error guardada en un
objetoErrorDeMacro.

Echo (Eco) Oculta o muestra los resultados de una macro
durante su ejecución.

PlainText Suprime el formato del texto enriquecido de una
cadena y devuelve una cadena de texto plano.

SetDefaultWorkgroupFile Define el archivo especificado como archivo de grupo de
trabajo predeterminado.

SingleStep (PasoaPaso) Suspende la ejecución de la macro
activa y abre el cuadro de diálogo Paso a paso.

Acciones de macros no tomadas en cuenta por el objeto DoCmd

El  objeto  DoCmd  no  toma  en  cuenta  las  siguientes  macros  pero  éstas  pueden  ser  sustituidas  por  una
función o una instrucción VBA.

CuadroMsj Utilice la función o la instrucción MsgBox.

EjecutarAplicación Utilice la función Shell.

EjecutarCódigo Llame directamente a la función en Visual Basic.

EnviarTeclas Utilice la instrucción SendKeys.

Las acciones DetenerTodasMacros y DetenerMacro no tienen equivalente en Visual Basic.

3. El objeto Screen
El objeto Screen hace referencia al objeto activo ya se trate de un formulario, de una página de acceso a
datos, de un informe o de un control.

El  objeto  Screen  se  utiliza  especialmente  en  los  procedimientos  de  evento  de  esos  distintos  objetos
(Control, Data Access Page, Form, Report). Este objeto sólo contiene propiedades.

Propiedades

ActiveControl Proporciona una referencia al control activo.

ActiveDataAccessPage Proporciona una referencia a la página de acceso a datos
activa.

ActiveDataSheet Proporciona una referencia a la hoja de datos activa.

ActiveForm Proporciona una referencia al formulario activo.

ActiveReport Proporciona una referencia al informe activo.

Application Permite acceder al objeto Application y a sus propiedades.

MousePointer Permite especificar el tipo de puntero del ratón.

Parent Proporciona una referencia al padre (objeto principal) de
un control, de una sección, de un subformulario, etc.

PreviousControl Proporciona una referencia al último control activo antes
del control actual.

Ejemplo

Sub CmdScreen_Click() 
’  Muestra el nombre del control anterior 
Dim ctl As Control 
Set ctl = Screen.PreviousControl 
MsgBox ctl.Name  
’  Transforma el puntero del ratón en un reloj de arena 
Screen.MousePointer = 11 
’  Recupera el puntero predeterminado  
Screen.MousePointer = 0  
’  Muestra el nombre del formulario activo 
Dim frm As Form 
Set frm = Screen.ActiveForm 
MsgBox frm.Name  
’  Modifica el título del formulario 
frm.Caption = "Formulario de entrada de los empleados" 
End Sub

4. La colección References
La colección References contiene los objetos Reference correspondientes a las bibliotecas de objetos que
provienen de otras aplicaciones.

Para agregar (o eliminar) una referencia a una biblioteca de objetos, seleccione la opción Referencias  del
menú Herramientas.

La ventana siguiente le permite seleccionar las referencias deseadas:

Propiedades

Count Determina el número de objetos referencia.

Parent No empleada.

Métodos

AddFromFile Crea una referencia a una biblioteca a partir de un nombre de archivo.

AddFromGuid Crea una referencia a una biblioteca a partir de su GUID (identificador
global único en el registro de Windows).
Item Devuelve una referencia en función de su posición en la
colecciónReferences.

Remove Elimina un objeto referencia de la colección References.

Propiedades del objeto Reference

BuiltIn Indica si una referencia predeterminada es necesaria para que Access
funcione correctamente.

FullPath Devuelve la ruta de acceso y el nombre del archivo de la biblioteca
referenciada.

Guid Devuelve el GUID, identificador de la biblioteca en el Registro de
Windows.

IsBroken Indica si una referencia válida está asignada al objeto en el Registro de
Windows.

Kind Indica el tipo de referencia del objeto.

Major Indica el número de versión principal de la aplicación a la que está
asociada la referencia.

Minor Indica el número de versión secundario de la aplicación.

Name Indica el nombre de la referencia.

Ejemplo

Private Sub cmdReferencias_Click() 
Dim ref As Reference 
Dim i As Integer  
 
’  Muestra el número total de referencias 
MsgBox "El número total de referencias es: " & References.Count 
’  Recorre las referencias y muestra su nombre y ruta de acceso 
i = 0 
For Each ref In Application.References 
    MsgBox " Nombre: " & ref.Name & " " & Chr(13) & Chr(13) _ 
    & " Ruta: " & ref.FullPath 
Next ref  
 
’  Agrega las bibliotecas de objeto Excel y Word 
’  Error si la biblioteca ya ha sido referenciada 
On Error Resume Next 
Application.References.AddFromFile "Excel.exe" 
Application.References.AddFromFile "MsWord.olb" 
On Error GoTo 0  
 
’  Muestra el número total de referencias 
MsgBox "El número total de referencias es: " & References.Count 
 
End Sub

5. La colección Printers
La colección Printers contiene objetos Printer que  representan  cada  uno  una  impresora  disponible  en  el
sistema actual.

El objeto Printer no existía en las versiones anteriores de Access.

Propiedades del objeto Printer
BottomMargin En combinación con las
propiedades TopMargin, RightMargin yLeftMargin, esta
propiedad permite especificar los márgenes de una página.

ColorMode Indica si la impresora debe imprimir en color (acPRCMColor) o
no (acPRCMMonochrome).

ColumnSpacing Indica el espaciado vertical de las secciones de Detalle de un
formulario.

Copies Indica el número de copias que deben imprimirse.

DataOnly Permite imprimir solamente los datos de una tabla o de una
consulta en la vista Hoja de datos.

DefaultSize Devuelve el valor True si se emplea el tamaño de la sección de
detalle en vista Diseño al imprimir un informe o un formulario.

DeviceName Indica el nombre del dispositivo de impresión.

DriverName Indica el nombre del controlador utilizado por la impresora.

Duplex Indica cómo gestiona la impresora la impresión dúplex.

ItemLayout Indica si la impresora traza las columnas en horizontal y luego en
vertical o en vertical y luego en horizontal.

ItemsAcross Devuelve o define un valor de tipo Entero Largo que indica el
número de columnas que deben imprimirse en el caso de
informes o de etiquetas en varias columnas.

ItemSizeHeight Devuelve o define un valor de Entero Largo que indica la altura
de la sección de detalle de un formulario o de un informe en
twips.

ItemSizeWidth Devuelve o define un valor de tipo Entero Largo que indica la
anchura de la sección de detalle de un formulario o de un informe
en twips.

LeftMargin Margen izquierdo de una página impresa.

Orientation Indica la orientación de la impresión
(acPRORPortrait oacPRORLandscape).

PaperBin Indica qué bandeja de papel debe utilizar la impresora.

PaperSize Indica el tamaño de papel que debe utilizarse durante la
impresión.

Port Indica el puerto al que está conectada la impresora.

PrintQuality Indica la resolución que debe utilizar la impresora para los
trabajos de impresión.

RightMargin Margen derecho de una página impresa.

RowSpacing Devuelve o define un valor de tipo Entero Largo que representa
el espaciado horizontal de las secciones de detalle en twips.

TopMargin Margen superior de una página impresa.

Las  demás  propiedades  (ColumnSpacing,  RowSpacing,  ItemSizeHeight...)  permiten  definir  el


formato de la sección Detalle de un formulario o de un informe.
Objetos de acceso a datos DAO y ADO
Los  objetos  de  acceso  a  datos  son  muy  útiles:  permiten,  mediante  VBA,  manipular  los  datos  (búsquedas,
actualizaciones, agregar registros...) de bases de datos locales o remotas.

En  las  versiones  anteriores  a  Access  2000,  el  único  modelo  de  acceso  a  datos  era  el  modelo  DAO:  Data
Access Objects.

Con Access 2000 aparece el modelo ADO: ActiveX Data Objects.

Microsoft recomienda utilizar el modelo ADO por los motivos siguientes:

mejor implementación de SQL Server,

mejor rendimiento en entornos cliente/servidor,

código VBA más corto y más sencillo.

Si desarrolla una  nueva  aplicación,  puede  utilizar  el  modelo  ADO  incluso  si  su  aplicación  accede  a  una
base de datos local de tipo Access. Si desea más adelante migrar sus datos a MSDE (Microsoft Data Engine) o
SQL Server, su código funcionará de manera óptima.

Si hace evolucionar una aplicación existente utilizando el modelo DAO, es posible modificar su código para
transformar los objetos DAO en objetos ADO.
El modelo de acceso a datos DAO

1. Presentación
La  biblioteca  de  objetos  DAO  (Data  Access  Objects)  incorpora  dos  entornos  de  bases  de  datos  distintos,
llamados espacios de trabajo:

los  espacios  de  trabajo  Microsoft  Jet:  permiten  acceder  a  bases  de  datos  de  tipo  Access,  a
servidores de bases de datos ODBC (Open Database Connectivity) y a bases de datos externas como
dBASE,  Microsoft  Excel  y  Paradox  accesibles  mediante  un  controlador  ISAM  (Indexed  Sequential
Access Method).

los espacios de trabajo ODBCDirect: permiten acceder a servidores de bases de datos ODBC de
manera  "directa",  es  decir  sin  cargar  el  motor  de  base  de  datos  Microsoft  Office  14.  Por
consiguiente,  este  espacio  de  trabajo  está  recomendado  para  ejecutar  consultas,  procedimientos
almacenados o funciones específicas de ODBC en un servidor remoto de tipo SQL Server.

Para poder utilizar la biblioteca de objetos DAO, es necesario seleccionar la referencia Microsoft  DAO  3.6


Object Library en la lista de referencia de las bibliotecas de objetos (para mostrar esta lista, seleccione la
opción Referencias del menú Herramientas).

Si  esta  referencia  no  está  disponible,  debe  seleccionar  el  archivo  DAO360.dll  mediante  el  botón  de
comando  Examinar.  Este  archivo  está  generalmente  situado  en  el  directorio  C:\Archivos  de
programa\Common Files\Microsoft Shared\DAO.

El archivo de ayuda DAO360.chm, proporcionado con los ejemplos del libro, le permite obtener información
detallada sobre la utilización del modelo de objetos DAO.

2. Jerarquía de los objetos DAO
3. Descripción de las colecciones
Existe una colección para cada uno de los tipos de objeto DAO, con la excepción del objeto DBEngine.

Todas  las  colecciones  incluyen  todos  los  objetos  de  un  tipo  determinado.  Por  ejemplo,  la
colecciónDataBases contiene todos los objetos DataBase abiertos.

Todos los objetos DAO poseen una colección Properties, con la excepción de los objetos Error.

La mayoría de los objetos DAO disponen de colecciones por defecto. Por ejemplo, la colección por defecto de
un objeto Recordset es la colección Fields. De este modo puede simplificarse el código.

Containers Conjunto de los objetos Container de una base de datos.

Databases Contiene todas las bases de datos (objetos DataBase) abiertas en un
Workspace.

Documents Conjunto de los objetos Document de un Container.

Errors Conjunto de los errores (Error) del motor de acceso a datos
(DBEngine).

Fields Conjunto de los campos (Field) de una tabla (TableDef), de una
consulta (QueryDef), de un índice (Index), de un conjunto de
registros (Recordset) o de una relación (Relation).

Groups Conjunto de los grupos de usuarios (Group) de un Workspace o
conjunto de los grupos de usuarios (Group) a los que pertenece un
usuario (User).

Indexes Conjunto de los índices (Index) de una tabla (TableDef).

Parameters Conjunto de los parámetros (Parameter) de una consulta
(QueryDef).

Properties Conjunto de las propiedades (Property) de un objeto.

QueryDefs Contiene todas las definiciones de consulta (QueryDef) de una base
de datos (Database).

Recordsets Conjunto de los conjuntos de registros abiertos (Recordset) de una
base de datos (Database).

Relations Conjunto de las relaciones (Relation) de una base de datos
(Database).

TableDefs Contiene todas las definiciones de tabla (TableDef) de una base de
datos (Database).

Users Conjunto de los usuarios (User) de un Workspace o de un grupo de
usuarios (Group).

Workspaces Contiene todos los objetos Workspace activos.

Propiedades

Count Devuelve el número de elementos en la colección.

Item Devuelve un miembro específico de una colección en función de su
posición o de su clave.

Todas las colecciones pueden utilizar estas propiedades.

Ejemplo

Lista de las tablas de la base de datos actual.

Dim intI As Integer 
For intI = 0 To CurrentDb.TableDefs.Count ‐ 1 
    MsgBox CurrentDb.TableDefs.Item(intI).Name 
Next intI

Métodos

Append Agrega un elemento a la colección.

Delete Elimina un elemento de la colección.

Refresh Actualiza el contenido de la colección.

Las  colecciones  Errors,  Databases,  Containers,  Documents,  Parameters  y  Recordsets  no  pueden
utilizar los métodos Append y Delete. Su contenido está gestionado directamente por el motor de la base
de datos.

4. El objeto DBEngine
Representa el motor de acceso a datos Microsoft Jet. Contiene y controla el conjunto de los objetos DAO.
Propiedades

DefaultType Define  el  tipo  de  espacio  de  trabajo,  Microsoft  Jet  o
ODBCDirect.

DefaultUser yDefaultPassword Nombre de usuario y contraseña utilizados por el motor
de  base  de  datos  Microsoft  Jet  cuando  un  objeto
Workspace se crea sin nombre de usuario ni contraseña
específica.

IniPath Define  o  devuelve  informaciones  sobre  la  clave  del


Registro  de  Windows  que  contiene  valores  relativos  al
motor de base de datos Microsoft Jet.

SystemDB Define  o  devuelve  la  ruta  de  acceso  al  archivo  de


informaciones sobre el grupo de trabajo actual (MDW).

Version Valor  que  indica  la  versión  de  la  base  de  datos  o  del
motor de base de datos asociado al objeto.

Métodos

CompactDatabase Compacta una base de datos cerrada.

CreateWorkspace Crea un nuevo objeto Workspace.

Idle Interrumpe  el  tratamiento,  permitiendo  al  motor  de  base  de


datos Microsoft Jet terminar las tareas en espera.

SetOption Permite  modificar  temporalmente  las  opciones  del  motor  de


acceso a datos Microsoft Jet.

Colecciones

Workspaces, Properties, Errors

Ejemplo

Compactar la base de datos Presupuesto en Presupuesto2.

DBEngine.CompactDatabase "c:\Presupuesto\Presupuesto.accdb", _ 
                         "c:\Presupuesto\Presupuesto2.accdb"

Mostrar la versión del motor Microsoft Jet.

MsgBox DBEngine.Version, vbExclamation, "Número de versión" _ 
                                       & "del motor Microsoft Jet"

5. Los objetos Workspace
Un objeto Workspace (espacio de trabajo) permite definir una sesión de trabajo para un usuario.

Propiedades

Name Devuelve el nombre del objeto Workspace.

Type Devuelve  o  define  el  tipo  de  conexión  del  objeto  Workspace
(constante  dbUseJet  si  el  objeto  Workspace  está  conectado  al
motor de base de datos Microsoft Jet, constante dbUseODBC si
el  objeto  Workspace  está  conectado  a  un  origen  de  datos
ODBC).
UserName Devuelve el nombre del propietario del objeto Workspace.

Otras propiedades

DefaultCursorDriver, IsolateODBCTrans, LoginTimeout

Métodos

BeginTrans Inicia una nueva transacción.

Close Cierra el Workspace.

CommitTrans Termina y valida la transacción actual.

CreateDatabase Crea un nuevo objeto Database.

CreateGroup Crea un nuevo grupo de usuarios.

CreateUser Crea un nuevo usuario.

OpenDatabase Abre una base de datos.

RollBack Anula  y  termina  una  transacción  en  curso  y  restablece  el


estado anterior de la base de datos.

Colecciones

Databases, Users, Groups, Properties

Ejemplo

Apertura de la base de datos Presupuesto en el espacio de trabajo activo.

Dim wrk As Workspace 
Dim dbs As Database 
Set wrk = DBEngine.Workspaces(0) 
Set dbs = wrk.OpenDatabase("C:\Presupuesto\Presupuesto.accdb")

6. Les objetos Database
Un objeto Database representa una base de datos abierta.

Propiedades

CollatingOrder Define el método de comparación de las cadenas de caracteres
según el idioma.

Connect Determina  la  información  necesaria  para  abrir  una  base  de


datos externa o para adjuntar una tabla de una base externa.

DesignMasterID Determina  el  GUID  del  diseño  principal  de  un  conjunto  de
réplicas.

Name Devuelve el nombre de la base.

RecordsAffected Indica  el  número  de  registros  afectados  por  el  último
métodoExecute.

Replicable Indica si la base de datos se puede replicar.

ReplicaID Devuelve el identificador de una réplica.

Transactions Indica  si  la  base  de  datos  de  la  conexión  toma  en  cuenta  las
transacciones (ODBCDirect).

Updatable Indica  si  las  modificaciones  del  objeto  Database  están


autorizadas.

Version Identifica la versión del formato de la base de datos.

Métodos

Close Cierra el objeto Database.

CreateProperty Crea un nuevo objeto Property.

CreateQueryDef Crea un nuevo objeto QueryDef.

CreateRelation Crea un nuevo objeto Relation.

CreateTableDef Crea un nuevo objeto TableDef.

Execute Ejecuta una consulta de acción o una instrucción SQL.

MakeReplica Crea una réplica de la base de datos.

NewPassword Define una nueva contraseña para una base de datos Microsoft
Jet.

OpenRecordset Crea un nuevo objeto Recordset.

PopulatePartial Sincroniza  los  cambios  aportados  a  una  réplica  parcial  con  la


réplica completa.

Synchronize Sincroniza dos réplicas.

Colecciones

TableDefs, QueryDefs, Relations, Containers, Recordsets, Properties

Ejemplo

Inicialización de una referencia sobre la base de datos actual.

Dim dbsPresupuesto As DAO.Database 
Set dbsPresupuesto = CurrentDb()

Apertura de una base de datos externa.

Dim dbsPresupuesto As DAO.Database 
Set dbsPresupuesto = DBEngine.OpenDatabase _ 
("C:\Presupuesto\Presupuesto.accdb")

Creación de un objeto RecordSet de tipo tabla en sólo lectura en la tabla Clientes de la base de datos actual.

Dim dbsPresupuesto As Database 
Dim rstCli As DAO.Recordset 
Set dbsPresupuesto = DBEngine.OpenDatabase("C:\Presupuesto\ 
Presupuesto.accdb" 
Set rstCli = dbsPresupuesto.OpenRecordset("Clientes", dbOpenTable, _ 
dbReadOnly)

7. Los objetos Recordset
Un objeto Recordset representa los registros de una tabla o los resultantes de una consulta.

Existen cuatro tipos de objetos Recordset:

Recordset Definición Interés Constante de


declaración
Table Representa una Permite utilizar los dbOpenTable
tabla. índices.

Dynaset (hoja de Representa el Permite trabajar dbOpenDynaset


respuestas dinámica) resultado de una sobre los datos
consulta cuyos originarios de
registros pueden varias tablas.
actualizarse.

ForwardOnly(adelante Idem Snapshot Velocidad dbOpenForwardOnly


solamente) pero el
desplazamiento de
los registros
solamente hacia
delante.

Snapshot(instantánea) Representa el Velocidad en dbOpenSnapshot


resultado de una comparación con
consulta en sólo el Dynaset.
lectura.

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 con­vierte en el
registro actual.

FindLast DS
Localiza el último registro que responde al criterio y lo con­vierte en el
registro actual.
FindNext DS
Localiza el registro siguiente que responde al criterio y lo con­vierte en el
registro actual.

FindPrevious DS
Localiza el registro anterior que responde al criterio y lo con­vierte 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

Attributes Determina  las  características  de  la  tabla  descrita  por


elTableDef (exclusividad, tabla vinculada, tabla del sistema...).

ConflictTable Devuelve el nombre de la tabla de conflictos que contiene los
registros  que  entraban  en  conflicto  durante  una  operación  de
sincronización de réplicas.

Connect Devuelve la información para el origen del objeto TableDef.

DateCreated Indica la fecha y la hora de creación de la tabla subyacente.

KeepLocal Determina  si  la  tabla  no  debe  formar  parte  de  una  operación
de réplica.

LastUpdated Indica  la  fecha  y  la  hora  de  la  última  modificación  de  la  tabla
subyacente.

Name Devuelve el nombre de la tabla.

RecordCount Indica el número de registros de la tabla.

Replicable Determina  si  la  tabla  debe  formar  parte  de  una  operación  de
réplica.

ReplicaFilter Define  los  registros  de  una  tabla  que  deban  formar  parte  de
una operación de réplica.

SourceTableName Especifica el nombre de la tabla vinculada.

Updatable Indica si está autorizada la modificación de la estructura.

ValidationText Especifica  el  mensaje  de  error  si  la  condición  de  validación  es
falsa.

ValidationRule Especifica  la  condición  que  debe  respetarse  para  la  validación
del objeto.

Métodos

CreateField Crea un nuevo campo (Field).

CreateIndex Crea un nuevo Index.

CreateProperty Crea un nuevo objeto Property.

OpenRecordset Crea un nuevo Recordset.

RefreshLink Actualiza los datos a partir de una tabla vinculada.

Colecciones

Fields, Indexes, Properties

Ejemplo

Agregar un campo de tipo Memo a la tabla Clientes.

Dim dbs As DAO.Database 
Dim tdf As DAO.TableDef 
Dim fld As DAO.Field 
Set dbs = CurrentDb 
Set tdf = dbs.TableDefs("Clientes") 
Set fld = tdf.CreateField("Cli_Coment", dbMemo) 
tdf.Fields.Append fld

9. Los objetos Field e Index

a. Field
Un  objeto  Field  representa  un  campo  de  una  tabla  (TableDef),  de  una  relación  (Relation),  de  una
consulta (QueryDef), de un conjunto de registros (Recordset) o de un índice (Index).

Propiedades

AllowZeroLength Define si autoriza a una cadena vacía como valor de campo.

Attributes Indica ciertas características del campo.

CollatingOrder Especifica las características de comparación de cadenas de
caracteres y de la ordenación.

DataUpdatable Indica si el campo puede actualizarse.

DefaultValue Define el valor por defecto del campo.

FieldSize Devuelve  el  tamaño  de  un  campo  Memo  o  Binario  Largo
(Objeto OLE).

ForeignName Especifica, en una relación Relation, el nombre del campo de
una  tabla  externa  (tabla  vinculada)  que  corresponde  a  un
campo  (clave  primaria)  de  la  tabla  de  origen  (tabla  de
referencia).

Name Devuelve el nombre del campo.

OrdinalPosition Especifica el orden de presentación de los campos.

Required Define si el campo debe contener obligatoriamente un valor.

Size Define o devuelve el tamaño del campo.

SourceField Indica el nombre del campo origen de los datos.

SourceTable Indica el nombre de la tabla origen de los datos.

Type Indica el tipo de datos del campo.

Value Devuelve el valor del campo.

ValidationText Especifica  el  mensaje  de  error  devuelto  si  la  condición  de
validación del campo es falsa.

ValidateOnSet Especifica  si  la  validación  de  valor  del  campo  es  inmediata
después de su modificación.

ValidationRule Especifica la condición de validación del campo.

Métodos

AppendChunk Agrega  datos  de  una  expresión  de  cadena  a  un  campo  de
tipoMemo u Objeto OLE.

CreateProperty Crea un nuevo objeto Property.

GetChunk Lee la totalidad o parte de un campo Memo u Objeto OLE.

Colecciones

Properties

Ejemplo

Muestra la lista de todos los campos (nombre y tipo) de la tabla Clientes, en la ventana Inmediato.

Dim dbs As DAO.Database 
Dim tdf As DAO.TableDef 
Dim fld As DAO.Field 
Set dbs = CurrentDb 
Set tdf = dbs.TableDefs("Clientes") 
For Each fld In tdf.Fields 
   Debug.Print fld.Name & " " & fld.Type 
Next

b. Index

Un objeto Index representa un índice asociado a un objeto TableDef o Recordset de tipo tabla.

Propiedades

Clustered Indica  si  el  índice  representa  el  índice  por  grupos  en  una
tabla.

DistinctCount Devuelve el número de valores únicos para este índice en la
tabla asociada.

Foreign Indica si el índice es una clave externa de la tabla.

IgnoreNulls Indica si existe una entrada de índice para los registros cuyos
campos indexados contienen el valor Null.

Name Devuelve el nombre del índice.

Primary Indica si el índice es la clave primaria.

Required Define  si  todos  los  campos  del  índice  deben  contener
obligatoriamente un valor.

Unique Indica si los valores del índice son únicos (sin duplicados).

Métodos

CreateField Crea un nuevo campo para el índice.

CreateProperty Crea una nueva propiedad.

Colecciones

Fields, Properties

Ejemplo

Creación del índice Empresa en el campo Cli_Empresa de la tabla Clientes.

Dim dbs As DAO.Database 
Dim tdf As DAO.TableDef 
Dim fld As DAO.Field 
Dim idx As DAO.Index 
Set dbs = CurrentDb 
Set tdf = dbs.TableDefs("Clientes") 
Set idx = tdf.CreateIndex("Empresa") 
Set fld = idx.CreateField("Cli_Empresa") 
idx.Unique = False 
idx.Fields.Append fld 
tdf.Indexes.Append idx

10. Los objetos QueryDef y Parameter

a. QueryDef

El objeto QueryDef representa la definición guardada de una consulta en una base de datos.
Propiedades

Connect Proporciona información sobre la base de datos utilizada en la
consulta.

DateCreated Indica la fecha y la hora de creación de la consulta.

KeepLocal Determina  si  la  consulta  debe  formar  parte  o  no  de  una
operación de replicación.

LastUpdated Indica  la  fecha  y  la  hora  de  última  actualización  de  la
consulta.

MaxRecords Define  el  número  máximo  de  registros  que  debe  devolver  la
consulta.

Name Devuelve el nombre de la consulta.

RecordsAffected Indica  el  número  de  registros  afectados  por  el  último
métodoExecute.

Replicable Determina si la consulta debe formar parte de una operación
de replicación.

ReturnsRecords Indica si la consulta ha devuelto registros.

SQL Define o devuelve la instrucción SQL asociada a la consulta.

Type Define el tipo de la consulta (selección, agregar...).

Updatable Indica  si  se  autorizan  las  actualizaciones  a  través  de  la


consulta.

Métodos

Close Cierra la consulta.

CreateProperty Crea una nueva propiedad.

Execute Inicia un consulta de acción o ejecuta una instrucción SQL.

OpenRecordset Crea un nuevo Recordset.

Colecciones

Fields, Parameters, Properties

Ejemplo

Creación de una nueva consulta basada en una instrucción SQL.

Private Sub cmdSQL_Click() 
   Dim dbs As Database 
   Dim qdf As QueryDef 
 
   On Error GoTo cmdSQL_Error 
   Set dbs = CurrentDb 
   Set qdf = dbs.CreateQueryDef("Lista de " _ 
      & "empleados seleccionados por fecha de contratación") 
   qdf.SQL = "Select * from Empleados " _ 
        & "Order by [Fecha Contratación]" 
   Exit Sub 
cmdSQL_Error: 
   MsgBox "La consulta ya existe" 
End Sub

b. Parameter
Un objeto Parameter representa un parámetro de un objeto QueryDef con parámetros.

Propiedades

Name Define o devuelve el nombre del parámetro.

Type Define o devuelve el tipo de datos del parámetro.

Value Define o devuelve el valor del parámetro.

Colecciones

Properties

Ejemplo

Creación de una consulta con parámetros y presentación del número de parámetros.

Private Sub cmdSQL_Click() 
   Dim dbs As Database 
   Dim qdf As QueryDef 
   Dim prm As Parameter 
 
   On Error GoTo cmdSQL_Error 
   Set dbs = CurrentDb 
   Set qdf = dbs.CreateQueryDef("Lista de los empleados" _ 
       & " contratados en un periodo determinado") 
   qdf.SQL = "Select * from Empleados Where " _ 
       & "[Fecha contratación] >= [Introduzca la fecha de inicio] " _ 
       & " And [Fecha contratación] <= [Introduzca la fecha de fin] " 
   MsgBox qdf.Parameters.Count 
   Exit Sub 
cmdSQL_Error: 
   MsgBox "La consulta ya existe" 
End Sub

11. Los objetos Relation
Un objeto Relation representa una relación entre los campos de dos objetos TableDef.

Propiedades

Attributes Indica  ciertas  características  de  la  relación  (uno  a  varios,


integridad...).

ForeignTable Define o devuelve el nombre de la tabla externa.

Name Define o devuelve el nombre de la relación.

PartialReplica Define  si  la  relación  debe  tenerse  en  cuenta  cuando  se  rellena
unaRéplica parcial a partir de una Réplica completa.

Table Define o devuelve el nombre de la TableDef o  del  QueryDef  de


origen.

Métodos

CreateField 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

AllPermissions Devuelve  todos  los  permisos  que  se  aplican  a  la


propiedadUserName del objeto Container actual.

Inherit Indica  si  los  nuevos  objetos Document  heredarán  o  no,  un


valor para la propiedad Permissions.

Name Indica el nombre del container.

Owner Indica el propietario del container.

Permissions Define los permisos de un usuario o de un grupo de usuarios
identificados  por  la  propiedad  UserName  del  objeto
Container.

UserName Define el nombre del usuario.

Ejemplo

Muestra la lista de los nombres de todos los objetos Container de la base en la ventana Inmediato.

Dim dbs As DAO.Database 
Set dbs = CurrentDb 
Dim ctn As Container 
 
For Each ctn In dbs.Containers 
    Debug.Print ctn.Name 
Next

b. Document

Un objeto Document representa el conjunto de la información relacionada con un tipo de objeto (base de
datos,  tabla,  consulta  o  relación  guardadas).  Cada  objeto  Container  dispone  de  una
colecciónDocuments que contiene objetos Document.

Propiedades

AllPermissions Devuelve  todos  los  permisos  que  se  aplican  a  la


propiedadUserName actual del objeto Document.

Container Devuelve  el  nombre  del  objeto  Container  al  que  pertenece
elDocument.

DateCreated Devuelve la fecha y la hora de creación de la tabla subyacente.

LastUpdated Devuelve la fecha y la hora de la última modificación de la tabla
subyacente.

Name Devuelve el nombre del Document.

Owner Devuelve el nombre del propietario del Document.
Permissions Define  los  permisos  del  usuario  o  del  grupo  de  usuarios
identificados  mediante  la  propiedad  UserName  del
objetoDocument.

Properties Lista  de  propiedades  (fecha  de  creación,  de  la  última
actualización...) del objeto Document.

UserName Define el nombre del usuario.

Colecciones

Properties

Ejemplo

Muestra la lista de todos los formularios en la ventana Inmediato:

Dim dbs As DAO.Database 
Dim ctn As Container 
Dim doc As Document 
 
Set dbs = CurrentDb 
For Each ctn In dbs.Containers 
    If ctn.Name = "Forms" Then 
       For Each doc In ctn.Documents 
           Debug.Print doc.Name 
       Next 
    End If 
Next

13. Los objetos Group y User

a. User

Un objeto User representa una cuenta de usuario con sus permisos.

Propiedades

Name Define o devuelve el nombre de la cuenta de usuario.

PID Devuelve el número de identificación personal de la cuenta de
usuario.

PassWord Devuelve la contraseña de la cuenta de usuario.

Métodos

CreateGroup Crea un nuevo objeto Group.

NewpassWord Define una nueva contraseña para el usuario.

Colecciones

Groups, Properties

b. Group

Un objeto Group representa un grupo de usuarios que poseen los mismos permisos. 

Propiedades
Name Define o devuelve el nombre del grupo de usuarios.

PID Define el número personal de la cuenta de grupo.

Métodos

CreateUser Crea un nuevo objeto User.

Colecciones

Users, Properties

Ejemplo

Para  cada  grupo  de  trabajo,  muestra  en  la  ventana  Inmediato  el  nombre  del  grupo  y  la  lista  de  sus
usuarios.

Dim wrk As Workspace 
Dim usr As dao.User 
Dim grp As dao.Group 
 
Set wrk = DBEngine.Workspaces(0) 
For Each grp In wrk.Groups 
   Debug.Print grp.Name 
   With grp 
      For Each usr In .Users 
         Debug.Print usr.Name 
      Next 
   End With 
Next

14. El objeto Error
Un objeto Error representa el detalle de un error de acceso a los datos.

Propiedades

Description Devuelve el texto del error.

HelpContext Proporciona un identificador de contexto de ayuda en forma de
variable de cadena, correspondiente a un tema de un archivo
de ayuda Microsoft Windows.

HelpFile Indica  la  ruta  de  acceso  completa  al  archivo  de  ayuda
correspondiente.

Number Devuelve el número del error.

Source Proporciona  el  nombre  del  objeto  o  de  la  aplicación  que  ha
generado el error.

Ejemplo

Desencadena intencionadamente un error y muestra todas las propiedades del objeto Error.

Private Sub cmdError_Click() 
 
On Error GoTo Gest_Error 
   ’ Desencadena intencionadamente un error 
   ’ El fichero Presupuesto1.accdb no existe en el Archivo C:\Presupuesto 
   DBEngine.Workspaces(0).OpenDatabase _ 
   ("C:\Presupuesto\presupuesto1.accdb") 
   Exit Sub 
    
Gest_Error: 
   Dim strError As String 
   Dim errLoop As Variant 
 
’ Recorre los elementos de la colección Errors 
’ Muestra un mensaje con la descripción del error 
For Each errLoop In Errors 
   With errLoop 
      strError = _ 
         "Error #" & .Number & vbCr 
      strError = strError & _ 
         " " & .Description & vbCr 
      strError = strError & _ 
         "(Origen: " & .Source & ")" & vbCr 
      strError = strError & _ 
         "Pulse F1 para ver " & _ 
         "el tema " & .HelpContext & vbCr 
      strError = strError & _ 
         "en el archivo " & .HelpFile & "." 
   End With 
   MsgBox strError 
Next 
 
End Sub

El mensaje que aparece es el siguiente:

15. Los objetos Property
Un objeto Property representa una propiedad de un objeto.

Propiedades

Inherited Indica si la propiedad es heredada.

Name Define el nombre de la propiedad.

Type Define o devuelve el tipo de la propiedad.

Value Define o devuelve el valor de la propiedad.

Ejemplo

Presentación del nombre y del valor de cada propiedad de un objeto Recordset en la ventana Inmediato.

Dim dbs As DAO.Database 
Dim rst As DAO.Recordset 
Dim prp As DAO.Property 
 
Set dbs = CurrentDb 
Set rst = dbs.OpenRecordset("Clientes") 
’   Recorre las propiedades 
For Each prp In rst.Properties 
    On Error Resume Next 
    Debug.Print prp.Name & " : " & prp.Value 
Next
El modelo de acceso a datos ADO

1. Presentación
La biblioteca de objetos ADO (ActiveX  Data  Objects)  le  permite  escribir  una  aplicación  que  accede  a  datos
situados en un servidor de bases de datos y manejar éstas mediante un proveedor OLE DB.

ADO tiene la ventaja de ser fácil de usar, con buen rendimiento y usando poca memoria y espacio de disco.
ADO ofrece las funcionalidades básicas que permiten crear aplicaciones cliente/servidor y aplicaciones Web.

Para  poder  utilizar  la  biblioteca  de  objetos  ADO,  es  necesario  seleccionar  la  referencia  Microsoft  ActiveX
Data Objects 6.0 Library en la lista de referencias a las bibliotecas de objetos. Si esta referencia no está
disponible,  debe  seleccionar  el  archivo  MSADO15.dll  mediante  el  botón  de  comando  Examinar.
Generalmente,  este  archivo  está  ubicado  en  el  directorio  C:\Archivos  de  programa\Common
Files\System\ADO.

Igualmente puede utilizar las extensiones ADO seleccionando la referencia Microsoft ADO Ext 6.0 for DLL
and Security (archivo  MSADOX.DLL).  Estas  extensiones  le  permiten  acceder  a  objetos  complementarios
(catalgo, users, views…) del modelo ADO.

El  archivo  de  ayuda  ADO210.chm  ubicado  en  el  directorio  C:\Archivos  de  Programa\Common
Files\MicrosoftShared\Office  15\1036,  le  permite  obtener  información  detallada  sobre  la  utilización  de  los
modelos ADO.

2. ADO y OLE DB
OLE DB es una tecnología que permite un acceso uniforme a los datos almacenados en diversas fuentes de
información:  bases  de  datos  relacionales  o  no  relacionales,  correo,  sistemas  de  archivos…  Prácticamente
todos los datos de la empresa son accesibles mediante OLE DB.

ADO (ActiveX  Data  Objects)  es  la  interfaz  de  programación  utilizada  para  acceder  a  los  datos  de  todos  los
proveedores de datos OLE DB.

Arquitectura tecnológica
Los proveedores de datos o Providers son  controladores  que  permiten  comunicar  con  los  orígenes
de datos.

3. Jerarquía de los objetos ADO
4. Modelo de base de programación ADO
ADO le permite ejecutar la siguiente secuencia de acciones:

establecer una conexión a una base de datos OLE DB o ODBC por medio del objeto Connection,

crear un comando que permita enviar una consulta SQL al servidor utilizando el objeto Command,

ejecutar el comando. Si el comando devuelve filas, almacenarlas en un objeto Recordset,

utilizar los datos del objeto Recordset: ordenar, filtrar, modificar, eliminar los registros,

actualizar  los  datos:  validar  los  eventuales  cambios  del  objeto  Recordset,  incorporar  las
actualizaciones en una transacción,

si se ha utilizado una transacción: aceptar o desechar las actualizaciones aportadas durante ésta.

Ejemplo

Dim cnn As New ADODB.Connection 
Dim cmd As New ADODB.Command 
Dim rs As New ADODB.Recordset 
 
 
’ Etapa 1: establecer una conexión a un origen de datos 
’ SQL Server mediante la tecnología OLEDB 
cnn.Open "Provider=SQLOLEDB.1;Data Source=SRV; _ 
       & "Initial Catalog=Presupuesto;" _ 
       & "Integrated Security=SSPI;Persist Security Info=False;" 
 
 
’ Etapa 2: crear un comando 
Set cmd.ActiveConnection = cnn 
cmd.CommandText = "SELECT * FROM Clientes" 
 
 
’   Etapa 3: ejecutar el comando 
rs.CursorLocation = adUseClient 
rs.Open cmd, , adOpenStatic, adLockBatchOptimistic 
 
 
’   Etapa 4 : manipular los datos 
rs.Filter = "CLI_CIUDAD LIKE ’Barcelona’" 
Do While Not rs.EOF 
   rs("CLI_PAÍS") = "E" 
   rs.MoveNext 
Loop 
 
 
’   Etapa 5: actualizar los datos modificados 
cnn.BeginTrans 
rs.UpdateBatch 
  
’   Etapa 6: terminar la actualización de la base SQL 
If MsgBox("¿Desea confirmar las actualizaciones?", ​_ 
    vbYesNo) = vbYes Then 
   cnn.CommitTrans 
Else 
   cnn.RollbackTrans 
End If

5. Descripción de los objetos ADO

Connection Representa una conexión con un origen de datos.

Command Define un comando específico que debe ejecutarse sobre un origen de
datos.
Recordset Representa el conjunto de registros completo de una tabla de bases de
datos o los resultados de un comando (ej: resultados de una consulta
SQL).

Record Funciona esencialmente como un objeto Recordset de una sola línea.
El origen de los datos en un objeto Record puede ser un comando que
devuelve  una  línea  de  datos  a  partir  del  servidor.  La  utilización  de
objetos Record en lugar de Recordset para recibir los resultados de una
consulta  que  devuelve  una  sola  línea  de  datos  elimina  el  exceso  de
tratamiento  vinculado  a  la  instanciación  del  objeto  Recordset,  que  es
más complejo.

Stream Proporciona  el  medio  para  leer,  escribir  y  gestionar  un  flujo  de  bytes
formado por texto o datos binarios.

6. Las colecciones ADO

Parameters Colección de todos los objetos Parameter de un objeto Command. El
objeto Parameter representa un parámetro o argumento asociado a
un objeto  Command  basado  en  una  consulta  con  parámetros  o  un
procedimiento almacenado con parámetros.

Properties Colección de todos los objetos Property para  un  objeto  determinado


(Connection,  Command,  Recordset).  El
objeto Propertyrepresenta  una  característica  dinámica  de  un  objeto
ADO definido por el usuario.

Errors Colección de todos los objetos Error creados en respuesta a un error
único  vinculado  al  proveedor  OLE  DB.  El  objeto  Error  contiene
informaciones relativas a un error de acceso a los datos.

Fields Colección de todos los objetos Field correspondientes  a  una  columna


(o campo) de un objeto Recordset.

7. Los objetos Connection

Métodos

BeginTrans Empieza una nueva transacción.

Cancel Interrumpe y anula la ejecución de una consulta iniciada en modo
asíncrono mediante los métodos Execute u Open.

Close Cierra  una  conexión  abierta,  así  como  todos  los  objetos  que
dependen de ésta.

CommitTrans Guarda los cambios efectuados a los datos y detiene la transacción
en curso.

Execute Ejecuta  la  consulta,  la  instrucción  SQL,  el  procedimiento


almacenado o el texto propio del proveedor OLE DB.

Open Abre  una  conexión  a  un  origen  de  datos  para  poder  ejecutar
comandos.

OpenSchema Obtiene  informaciones  procedentes  del  proveedor  OLE  DB,


relativas al esquema de la base de datos.

RollbackTrans Anula los cambios realizados a los datos durante la transacción en
curso y detiene esta última.

Propiedades

Attributes Define  o  devuelve  una  o  varias  características  de  un


objetoConnection. El valor por defecto es cero.
CommandTimeout Indica  el  intervalo  de  espera,  en  segundos,  que  debe
respetarse  al  intentar  la  ejecución  de  un  comando,  antes  de
interrumpir el intento y generar un mensaje de error. El valor
por defecto es 30.
ConnectionString Define o devuelve la información utilizada para establecer una
conexión con el origen de datos.

ConnectionTimeout Indica  el  intervalo  de  tiempo,  en  segundos,  que  debe
respetarse  al  intentar  una  conexión,  antes  de  abortarla  y
generar un mensaje de error. El valor por defecto es 15.

CursorLocation Define  o  devuelve  el  tipo  de  cursor  que  debe  emplearse  por
defecto para esta conexión (cursor del lado cliente o cursor del
lado servidor).

DefaultDatabase Indica la base de datos por defecto de un objeto Connection.

IsolationLevel Indica el nivel de aislamiento de un objeto Connection.

Mode Indica  los  permisos  de  modificación  de  datos  de  un


objetoConnection.

Provider Indica el nombre del proveedor OLE DB del objetoConnection.

State Indica  si  el  objeto  Connection  está  abierto  o  cerrado.  Sólo
lectura.

Version Indica el número de versión ADO. Sólo lectura.

Ejemplo

Creación de una referencia sobre la base de datos actual.

Dim cncPresupuesto as ADODB.Connection 
Set cncPresupuesto = CurrentProject.Connection

Apertura de una base de datos externa.

Dim cncPresupuesto as ADODB.Connection 
cncPresupuesto.Open "Provider=Microsoft.ACE.OLEDB.15.0.;" _ 
              & "Data Source = C:\Presupuesto\Presupuesto.accdb";

Utilización  de  los  métodos  CommitTrans  y  RollbackTrans  para  confirmar  o  anular  la  actualización  de
registros.

Dim cnc As ADODB.Connection 
Dim strSQL As String 
Dim strMessage As String 
 
’   Abre la conexión. 
Set cnc = CurrentProject.Connection 
 
’   Inicio de la transacción 
cnc.BeginTrans 
 
’   Consultas SQL de actualización 
strSQL = "UPDATE CLIENTES SET CLI_PAIS = ’España’" _ 
       & "WHERE CLI_CIUDAD = ’Madrid’" 
cnc.Execute strSQL 
 
strSQL = "UPDATE CLIENTES SET CLI_PAIS = ’Francia’" _ 
       & "WHERE CLI_CIUDAD = ’París’" 
cnc.Execute strSQL 
 
’   Pregunta al usuario si desea validar las actualizaciones 
If MsgBox("¿Desea confirmar la actualización de los países?", vbYesNo) _ 
   = vbYes Then    
 
    ’  Guarda los cambios 
   cnc.CommitTrans 
Else 
 
    ’   Anula los cambios 
   cnc.RollbackTrans 
End If

8. Los objetos Command

Métodos

Cancel Interrumpe y cancela la ejecución de una consulta iniciada en
modo asíncrono mediante el método Execute.

CreateParameter Crea  un  nuevo  objeto  Parameter  y  especifica  sus


propiedades.

Execute Ejecuta  la  consulta,  la  instrucción  SQL  o  el  procedimiento


almacenado  especificado  mediante  la
propiedadCommandText.

Propiedades

ActiveConnection Indica el objeto Connection al que está asociado el comando.

CommandText Contiene el texto del comando que debe enviarse al proveedor
OLE DB.

CommandTimeout Indica  el  intervalo  de  tiempo  (en  segundos)  que  debe
respetarse  al  intentar  la  ejecución  del  comando,  antes  de
interrumpir el intento y generar un mensaje de error. El valor
por defecto es 30.

CommandType Indica el tipo del objeto Command.

Name Indica el nombre del objeto Command.

Prepared Indica  si  es  necesario  guardar  una  versión  compilada  del
comando en el servidor antes de la ejecución.

State Indica si el objeto Command está  abierto  o  cerrado.  En  sólo


lectura.

Ejemplo

Utilización del objeto Command para crear un conjunto de registros.

Dim cnc As New ADODB.Connection 
Dim cmd As New ADODB.Command 
Dim rst As New ADODB.Recordset 
 
’  Abre la conexión 
cnc.Open "Provider=Microsoft.ACE.OLEDB.15.0.;" _ 
    & "Data Source = C:\Presupuesto\Presupuesto.accdb;PersistSecurity 
Info=False" 
 
’  Ejecuta el comando Select 
Set cmd.ActiveConnection = cnc 
cmd.CommandType = adCmdText 
cmd.CommandText = "SELECT * FROM CLIENTES WHERE" _ 
             & " CLI_CIUDAD = ’Madrid’" 
 
Set rst = cmd.Execute  
 
’  Muestra el nombre de la empresa 
’  en la ventana Inmediato 
Do While Not rst.EOF 
   Debug.Print rst("CLI_EMPRESA") 
   rst.MoveNext 
Loop 
rst.Close 
cnc.Close

9. Los objetos Recordset

Métodos

AddNew Crea un nuevo registro para un objeto Recordset que  pueda


actualizarse.

Cancel Cancela  la  ejecución  de  una  operación  Open  asíncrona  en


espera.

CancelBatch Cancela una actualización por lotes en espera.

CancelUpdate Cancela todas las modificaciones aportadas al registro actual o
a un nuevo registro antes de llamar al método Update.

Clone Crea  un  objeto  Recordset  duplicado  a  partir  de  un


objetoRecordset existente.

Close Cierra el objeto Recordset abierto, así como todos los objetos
que dependen de éste.

CompareBookmarks Compara  dos  marcadores  y  devuelve  un  valor  que  indica  sus
posiciones relativas.

Delete Elimina el registro actual o un grupo de registros.

Find Busca  en  un  objeto  Recordset  el  registro  correspondiente  a


criterios específicos.

GetRows Extrae varios registros de un objeto Recordset y los coloca en
una matriz.

GetString Devuelve un objeto Recordset en forma de cadena.

Move Desplaza  la  posición  del  registro  actual  en  un


objetoRecordset.

MoveFirst Desplaza la posición del registro actual hasta el primer registro
del objeto Recordset.

MoveLast Desplaza la posición del registro actual hasta el último registro
del objeto Recordset.

MoveNext Desplaza  la  posición  del  registro  actual  hasta  el  registro
siguiente del objeto Recordset.

MovePrevious Desplaza  la  posición  del  registro  actual  hasta  el  registro
anterior del objeto Recordset.

NextRecordset Devuelve el conjunto de registros siguiente en el caso de que
un comando conlleve varias consultas de selección.

Open Abre un cursor que representa los registros de una tabla o los
resultados de una consulta.

Requery Actualiza  los  datos  de  un  objeto  Recordset  volviendo  a


ejecutar la consulta en la que se basa el objeto.

Resync Actualiza los datos del objeto Recordset en curso a partir de la
base de datos subyacente.
Save Guarda el objeto Recordset en un archivo.

Seek Busca  en  el  índice  de  un  objeto  Recordset  un  registro
correspondiente a un valor y reemplaza el registro actual por el
registro encontrado.

Supports Determina  si  un  objeto  Recordset  soporta  un  tipo  de


funcionalidad particular.

Update Guarda  los  cambios  aportados  al  registro  actual  del


objetoRecordset.

UpdateBatch Guarda  en  el  disco  todas  las  actualizaciones  por  lotes  en
espera.

Propiedades

AbsolutePage Indica la página del registro actual.

AbsolutePosition Indica  la  posición  ordinal  del  registro  actual  dentro  de  un
objeto Recordset.

ActiveCommand Indica  el  objeto  Command  que  ha  creado  el


objeto Recordsetcorrespondiente. Sólo lectura.

ActiveConnection Indica  a  qué  objeto  Connection  pertenece  el


objetoRecordset.

BOF Indica  si  el  puntero  de  registro  está  posicionado  antes  del
primer registro del objeto Recordset. Sólo lectura.

Bookmark Devuelve  un  marcador  que  identifica  de  manera  única  el


registro  actual  en  el  objeto  Recordset  o  desplaza  el  registro
actual a un registro identificado por un marcador válido.

CacheSize Indica  el  número  de  registros  de  un


objeto Recordsetalmacenado en memoria caché.

CursorLocation Define  o  devuelve  el  tipo  de  cursor  por  defecto  para  esta
conexión (cursor lado cliente o cursor lado servidor).

CursorType Indica el tipo de cursor utilizado para este objeto Recordset.

DataMember Indica el nombre del miembro de datos que debe extraerse del
objeto definido por la propiedad DataSource. Sólo lectura.

DataSource Indica  que  un  objeto  que  contiene  datos  debe  representarse
como objeto Recordset. Sólo lectura.

EditMode Indica  el  estado  de  modificación  del  registro  actual.  Sólo
lectura.

EOF Indica  si  el  puntero  de  registro  está  posicionado  después  del
último registro en el objeto Recordset. Sólo lectura.

Filter Define un filtro de datos en el Recordset.

Index Indica el nombre del índice actual para el Recordset.

LockType Indica  el  tipo  de  bloqueo  de  los  registros  durante  las
modificaciones.

MarshalOptions Indica qué registros se devuelven al servidor.

MaxRecords Indica el número máximo de registros que se devuelven a un
objeto  Recordset  desde  una  misma  consulta.  El  valor  por
defecto es cero (no hay límite).

PageCount Indica  el  número  de  páginas  de  datos  contenidas  en  el
objetoRecordset. Sólo lectura.

PageSize Indica  el  número  de  registros  contenidos  en  una  página
delRecordset.

Properties Referencia  a  la  Colección  de  los  objetos  Property  del


objetoRecordset actual.

RecordCount Indica  el  número  de  registros  en  el  objeto  Recordset.  Sólo
lectura.

Sort Especifica uno o varios nombres de campos según los cuales se
ordena  el  objeto  Recordset,  y  determina  el  criterio  de
ordenación de cada campo.

Source Indica el origen de los datos de un objeto Recordset.

State Indica  el  estado  del  Recordset:  abierto,  cerrado  u  operación


asíncrona en curso. Sólo lectura.

Status Indica  el  estado  del  registro  actual  correspondiente  a  las


actualizaciones  por  lotes  u  otras  operaciones  globales.  Sólo
lectura.

StayInSync Indica,  en  un  objeto  Recordset  jerárquico,  si  la  fila  principal
debe  cambiar  cuando  cambia  el  conjunto  de  los  registros
secundarios subyacentes. Sólo lectura.

Ejemplo

Transformación en mayúsculas de los caracteres del campo Cli_Empresa en la tabla Clientes.

Dim cnc As New ADODB.Connection 
Dim rstCli As New ADODB.Recordset 
 
’ Creación del Recordset 
Set cnc = CurrentProject.Connection 
rstCli.Open "Select from Clientes", cnc, _ 
          adOpenKeyset, adLockOptimistic  
 
’ Recorrido de los registros 
With rstCli 
   Do Until .EOF 
      rstCli("Cli_Empresa") = _ 
                UCase(rstCli("Cli_Empresa")) 
     ’ Actualización 
     .Update 
     ’ Registro siguiente 
     .MoveNext 
   Loop 
End With 
rstCli.Close 
cnc.Close

Utilización del método Seek: búsqueda de un cliente a partir de su código.

Dim cnc As New ADODB.Connection 
Dim rstCli As New ADODB.Recordset 
Dim strCodigoCli As String 
 
’   Creación del Recordset 
Set cnc = CurrentProject.Connection 
rstCli.Open "Clientes", cnc, adOpenKeyset, _ 
       adLockReadOnly, adCmdTableDirect 
With rstCli 
   ’   Entrada del código cliente 
   strCodigoCli = _ 
   InputBox("Introduzca el código cliente") 
   ’   Índice actual: clave primaria 
   .Index = "PrimaryKey" 
   ’   Búsqueda 
   .Seek strCodigoCli, adSeekFirstEQ 
   ’   Registro no encontrado 
   If .EOF Then 
      MsgBox "Cliente no encontrado" 
   Else 
   ’  Registro encontrado 
      MsgBox "Empresa: " & rstCli("Cli_Empresa") 
   End If 
End With 
rstCli.Close 
cnc.Close

Utilización  del  método  Find:  búsqueda  de  los  clientes  cuyo  nombre  de  Empresa  empiece  por  un  valor
determinado.

Dim cnc As New ADODB.Connection 
Dim rstCli As New ADODB.Recordset 
Dim strEmp As String 
Dim strCrit As String 
Dim bkm As Variant 
 
’   Creación del Recordset 
Set cnc = CurrentProject.Connection 
rstCli.Open "Clientes", cnc, adOpenKeyset, _ 
       adLockReadOnly, adCmdTableDirect 
With rstCli 
   ’   Entrada del código cliente 
   strEmp = InputBox("Introduzca las primeras "_ 
          & "letras de la Empresa") 
   ’   Búsqueda 
   strCrit = "Cli_Empresa Like ’" & strEmp & "%’" 
   .Find strCrit, , adSearchForward 
      ’   Registro no encontrado 
   If .EOF Then 
      MsgBox "Cliente no encontrado" 
   Else 
      ’  Si encuentra: búsqueda de los siguientes 
      Do While Not .EOF 
         MsgBox rstCli("Cli_Empresa") 
         ’   Posición actual 
         bkm = .Bookmark 
         .Find strCrit, 1, adSearchForward, bkm 
      Loop 
   End If 
End With 
rstCli.Close 
cnc.close

10. La colección Fields

Métodos

Append Agrega un objeto Field a una colección Fields.

Delete Elimina un objeto Field de la colección Fields.

Refresh Actualiza los objetos Field en la colección Fields.

11. Los objetos Field

Métodos

AppendChunk Agrega  datos  a  un  objeto  Field  de  tipo  binario  o  de  gran
tamaño.

GetChunk Devuelve todo o parte del contenido de un objeto Field de tipo
binario o de gran tamaño.

Propiedades

ActualSize Indica la longitud del valor de un campo. Sólo lectura.

Attributes Indica una o varias características de un objeto Field.

DefinedSize Indica el tamaño del objeto Field. Sólo lectura.

Name Indica el nombre del objeto Field.

NumericScale Indica la escala de los valores numéricos del objeto Field. Sólo
lectura.

OriginalValue Indica  el  valor  del  objeto Field antes  de  la  modificación.  Sólo
lectura.

Precision Indica el grado de precisión de los valores de tipo numérico en
el objeto Field. Sólo lectura.

Properties Contiene todos los objetos Property de un objeto Field.

Type Indica el tipo de datos del objeto Field.

UnderlyingValue Indica el valor actual del objeto Field en la base de datos. Sólo
lectura.

Value Indica el valor del objeto Field.

12. La colección Parameters

Métodos

Append Agrega un objeto Parameter a la colección Parameters.

Delete Elimina un objeto Parameter de la colección Parameters.

Refresh Actualiza los objetos Parameter en la colección Parameters.

Ejemplo

Muestra la lista de todos los campos (nombre y tipo) de la tabla Clientes en la ventana Inmediato.

Dim cnc As New ADODB.Connection 
Dim rstCli As New ADODB.Recordset 
Dim fld As ADODB.Field 
 
’   Creación del Recordset 
Set cnc = CurrentProject.Connection 
rstCli.Open "Empleados", cnc, adOpenKeyset, adLockReadOnly, _ 
adCmdTableDirect 
For Each fld In rstCli.Fields 
   Debug.Print fld.Name & " " & fld.Type 
Next 
rstCli.close

13. Los objetos Parameter

Métodos

AppendChunk Agrega datos a un objeto Parameter de tipo binario o texto de
gran tamaño.
Propiedades

Attributes Indica una o varias características de un objeto Parameter.

Direction Indica si el objeto Parameter corresponde a un parámetro de
entrada,  de  salida,  o  ambos,  o  si  el  parámetro  es  el  tipo  de
retorno de un procedimiento almacenado.

Name Indica el nombre del objeto Parameter.

NumericScale Indica  la  escala  de  los  valores  numéricos  del


objetoParameter.

Precision Indica el grado de precisión de los valores de tipo Numeric del
objeto Parameter.

Properties Contiene todos los objetos Property de un objeto Parameter.

Size Indica  el  tamaño  máximo,  en  bytes  o  en  caracteres,  de  un
objeto Parameter.

Type Indica el tipo de datos del objeto Parameter.

Value Indica el valor atribuido al objeto Parameter.

14. La colección Properties

Métodos

Refresh Actualiza  los  objetos  Property  en  la  colección  Properties  a


partir de las informaciones del proveedor.

15. Los objetos Property

Propiedades

Attributes Indica una o varias características de un objeto Property. 

Name Indica el nombre del objeto Property. En sólo lectura.

Type Indica el tipo de datos del objeto Property.

Value Indica el valor del objeto Property.

16. La colección Errors

Métodos

Clear Elimina el conjunto de los objetos Error de la colección Errors.

Refresh Actualiza  los  objetos  Error  a  partir  de  las  informaciones  del
proveedor OLE DB.

Propiedades

Count Indica el número de objetos Error de  la  colección  Errors.  En


sólo lectura.

Item Permite la indexación de la colección Errors para referenciar a
un objeto Error específico. Sólo lectura.

17. Los objetos Error
Propiedades

Description Devuelve  la  cadena  descriptiva  asociada  al  objeto  Error.  Sólo
lectura.

HelpContext Indica  el  ContextID  del  archivo  de  ayuda  asociado  al


objetoError. Sólo lectura.

HelpFile Indica el nombre del archivo de ayuda asociado al objetoError.
Sólo lectura.

NativeError Indica  el  código  de  error  específico  del  proveedor  asociado  al
objeto Error. Sólo lectura.

Number Indica  el  número  que  identifica  de  manera  única  el  error  del
objeto Error. Sólo lectura.

Source Indica  el  nombre  del  objeto  o  de  la  aplicación  que  originó  el
error. Sólo lectura.

SQLState Indica  el  valor  devuelto  por  el  proveedor  OLE  DB.  Cadena  de
cinco caracteres conforme a la norma SQL ANSI. Sólo lectura.
Presentación
El  lenguaje  SQL  (Structured  Query  Langage  o  lenguaje  de  consulta  estructurado)  es  un  lenguaje  de
consulta y de gestión de bases de datos relacionales.

Access  2013  utiliza  SQL  como  lenguaje  de  consulta.  Cuando  se  crea  una  consulta  en  la  vista  Diseño  de
consulta, Access construye, como tarea en segundo plano, las instrucciones equivalentes en SQL. De hecho,
la mayoría de las propiedades de las consultas en la vista Diseño de consulta tienen cláusulas equivalentes y
opciones accesibles en lenguaje SQL.

Es posible mostrar o modificar la instrucción SQL correspondiente a una consulta pasando a la vista SQL.

Ejemplo

  Abra una consulta existente en la vista Diseño.

  A continuación, haga clic sobre la opción Vista SQL del icono Ver.
Obtendrá la instrucción SQL correspondiente a su consulta.

Esta operación es muy interesante, especialmente si no está habituado al lenguaje SQL: puede crear
sus consultas en Access y recuperar la instrucción SQL generada para incluirla en su código VBA.

Ciertas consultas SQL, llamadas consultas específicas SQL, no pueden ser creadas en la cuadrícula de diseño
de consultas, sino que deben ser entradas directamente en la vista SQL. Se trata:

de las "consultas paso a través" que le permiten trabajar directamente con las tablas del servidor,

las "consultas de definición de datos" que le permiten crear, eliminar o modificar la estructura de
las tablas,

las "consultas de combinación  o  de  unión" que le permiten agrupar los campos de dos tablas (o


más)  en  un  mismo  campo  resultado  de  la  consulta.  Estas  consultas  son  muy  útiles  para  fusionar
registros procedentes de tablas distintas.
Lenguaje SQL y VBA
Las  consultas  SQL  se  integran  perfectamente  en  VBA  y  pueden  emplearse  a  partir  de  los  métodos  de
distintos objetos:

método OpenRecordset de los objetos DataBase y Connection,

método CreateQueryDef de los objetos DataBase y Connection,

método Execute de los objetos Command y Connection,

etc.

Las consultas SQL se utilizan frecuentemente también en los formularios:

propiedad RecordSource de un formulario o de un informe,

propiedad RowSource de una lista desplegable,

etc.

La mayoría de estas propiedades pueden modificarse utilizando código VBA.

Las ventajas de la utilización de instrucciones SQL en VBA son las siguientes:

Velocidad de ejecución: una instrucción Select es más rápida que el recorrido secuencial de una tabla.

Mejor rendimiento: en modo cliente/servidor, las consultas son compiladas por el SGBD que optimiza su
rendimiento.

Mantenimiento simplificado: el código de las instrucciones SQL es más corto y por tanto más legible que
el equivalente en VBA.

Estandarización: el lenguaje SQL es el estándar de consulta de las bases de datos relacionales.
Descripción del lenguaje SQL

1. La instrucción SELECT
SELECT  es  la  instrucción  SQL  más  empleada:  corresponde  a  la  consulta  de  selección  en  Access.  Permite
extraer campos de un conjunto de registros que responden a ciertos criterios.

Sintaxis

SELECT [ALL | DISTINCT] <lista de campos> 
FROM <lista de tablas> 
[WHERE... ] 
[GROUP BY...]  
[HAVING... ] 
[ORDER BY... ]

All (valor predeterminado) Se tienen en cuenta todos los registros que respondan
a los criterios.

Se  omiten  los  registros  cuyos  campos  seleccionados


Distinct contienen datos duplicados.

Lista  de  los  campos  seleccionados,  separados  por


<lista de campos> comas,  respetando  la  sintaxis  siguiente:  *  |  tabla.*  |
[tabla.]campo1  [AS  alias1]  [,  [tabla.]campo2  [AS
alias2] [, ...]]

Indica  que  se  seleccionan  todos  los  campos  de  la(s)


* tabla(s) especificada(s).

Indican  los  nombres  que  deben  utilizarse  como


alias1, alias2 encabezados  de  columna  en  lugar  de  los  nombres  de
columna originales de la tabla.

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.

GRANT Atribuye  privilegios  específicos  a  un  usuario  o  a  un  grupo  de


usuarios existente.

REVOKE Revoca  privilegios  específicos  a  un  usuario  o  a  un  grupo  de


usuarios existente.

Puede  obtener  más  información  sobre  el  lenguaje  SQL  y  sus  instrucciones,  a  partir  del  tema
"Referencia de Microsoft jet SQL", del Contenido de la ayuda de Access.
Ejemplos de utilización de consultas SQL
Para  demostrar  el  interés  del  lenguaje  SQL,  los  ejemplos  siguientes  proponen  dos  procedimientos
equivalentes: uno utiliza el lenguaje SQL y el otro no.

Para realizar estos ejemplos debe crear una tabla Clientes con un campo llamado Cli_Empresa e introducir
algunos registros en dicha tabla.

1. Actualización de registros
El código del ejemplo siguiente permite modificar el contenido de un campo en una tabla para registros que
respondan a ciertos criterios.

Código VBA utilizando una consulta SQL de tipo UPDATE.

Private Sub Act_País() 
Dim cncPresupuesto As ADODB.Connection 
Dim strSQL As String 
’  Actualización del código de país en la tabla clientes 
Set cncPresupuesto = CurrentProject.Connection 
strSQL = "UPDATE Clientes SET " _ 
       & "Clientes.CLI_PAÍS = ’E’ " _ 
       & "WHERE Clientes.CLI_CIUDAD = ’Valencia’" 
cncPresupuesto.Execute strSQL 
End Sub

Código VBA equivalente sin consulta SQL.

Private Sub Act_País1() 
Dim cncPresupuesto As ADODB.Connection 
Dim rstCliente As ADODB.Recordset  
’   Apertura de un conjunto de registros 
Set cncPresupuesto = CurrentProject.Connection 
Set rstCliente = New ADODB.Recordset 
rstCliente.Open "CLIENTES", cncPresupuesto, adOpenForwardOnly, _ 
adLockOptimistic 
 
’   Recorrido secuencial de la tabla Clientes 
Do While Not rstCliente.EOF 
   If rstCliente("CLI_CIUDAD") = "Valencia" Then 
      rstCliente("CLI_PAÍS") = "E" 
      rstCliente.Update 
   End If 
   rstCliente.MoveNext 
Loop 
 
End Sub

2. Carga de una lista desplegable
El código de ejemplo siguiente permite mostrar en una lista desplegable (control cuadro de lista) el nombre
de los clientes cuyo nombre de Empresa empiece por una letra determinada (la letra se indica en un cuadro
de texto).

Para probar este ejemplo debe:

crear un formulario llamado Clientes,

agregar los controles siguientes al formulario:
un cuadro de texto llamado txtNomEmp.

un cuadro de lista llamado lstEmp.
un botón de comando cmdLista1.

Código  VBA  que  utiliza  una  consulta  SQL  de  tipo  SELECT.  El  contenido  de  la  lista  es  el  resultado  de  la
consulta SQL.

Private Sub cmdLista1_Click() 
Dim strSQL As String 
 
’   Control del nombre introducido 
If txtNomEmp = "" Then 
   MsgBox "Debe introducir al menos una letra", vbExclamation 
   txtNomEmp.SetFocus 
   Exit Sub 
End If 
  
’   Propiedades de la lista desplegable
’   La lista contiene una consulta 
Me.lstEmp.RowSourceType = "Tabla/Consulta" 
strSQL = "SELECT Clientes.CLI_EMPRESA FROM Clientes " _ 
   & "WHERE (Clientes.CLI_EMPRESA Like ’" & Me.txtNomEmp & "*’)" 
Me.lstEmp.RowSource = strSQL 
’   Actualización de los datos de la lista 
Me.lstEmp.Requery 
 
End Sub

Código VBA equivalente sin consulta SQL. La lista se rellena a partir de una lista de valores.

Private Sub cmdLista1_Click() 
Dim cncPresupuesto As ADODB.Connection 
Dim rstCliente As ADODB.Recordset 
Dim strNomEmp as String 
’   Control del nombre introducido 
If txtNomEmp = "" Or IsNull(txtNomEmp) Then 
   MsgBox "Debe introducir al menos una letra", vbExclamation 
   txtNomEmp.SetFocus 
   Exit Sub 
End If  
’   Inicialización de la lista desplegable
’   La lista contiene una lista de valores 
Me.lstEmp.RowSourceType = "Lista valores" 
Me.lstEmp.RowSource = "" 
Me.lstEmp.Requery 
 
’   Apertura de un conjunto de registros 
Set cncPresupuesto = CurrentProject.Connection 
Set rstCliente = New ADODB.Recordset 
rstCliente.Open "CLIENTES", cncPresupuesto, adOpenForwardOnly, _ 
   adLockOptimistic 
 
’   Recorrido secuencial de la tabla e incorporación de elementos
’   a la lista 
Do While Not rstCliente.EOF 
   If Ucase(Left(rstCliente("CLI_EMPRESA"), Len(Me.txtNomEmp))) = _ 
      Ucase(Left(Me.txtNomEmp, Len(Me.txtNomEmp))) Then 
      strNomEmp = rstCliente("CLI_EMPRESA") 
      Me.lstEmp.AddItem strNomEmp 
   End If 
   rstCliente.MoveNext 
Loop 
rstCliente.close 
 
End Sub

Los ejemplos anteriores permiten constatar que el código que utiliza SQL es más corto y su ejecución
más rápida, hecho que puede resultar muy útil, por ejemplo, si la tabla Clientes contiene un número
importante de registros.
Presentación

1. Definición
Un  evento  es  el  resultado  de  una  acción  del  usuario  o  del  sistema  sobre  un  objeto.  Desencadena  la
ejecución del código correspondiente al procedimiento de evento del objeto activado.

La utilización de un procedimiento de evento o de una macro permite asociar un tratamiento específico en
respuesta a un evento que se produzca en un formulario, en un informe o en un control.

2. Asociación de código VBA a un evento
Puede asignar código VBA al evento de un objeto de dos maneras:

a partir de la ficha Eventos de la ventana de propiedades del objeto en Access.
a partir de las listas desplegables de objetos y de eventos en el editor Visual Basic.
Categorías de eventos
Las siguientes listas de eventos están clasificadas por tipo y contienen:

el nombre del evento,

el  nombre  de  la  propiedad  correspondiente  en  la  ventana  de  propiedades  del  objeto  (entre
paréntesis),

la descripción del evento,

la  columna  de  la  derecha  (Cancelación)  indica  si  el  evento  puede  cancelarse.  La  cancelación  de  un
evento se describe en el apartado Cancelación de un evento.

1. Eventos de tipo Ventana

Cancelación

Open (AlAbrir) 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.

BeforeDel­Confirm (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.

KeyPress (AlPresionarTecla) Sí (a través de


Se  produce  al  pulsar  una  tecla  que  emita  un  carácter macro o VBA)
ANSI estándar o al ejecutar SendKeys o EnviarTeclas.
No obstante, también es posible impedir al objeto recibir
la  tecla,  atribuyendo  el  valor  0  al
argumento  keyAsciidel  procedimiento  KeyPress  del
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.

2. Ejecutar ([F5]) ejecuta  el  código  del  procedimiento  actual,  la


hoja UserForm activa o una macro.

3. Interrumpir ([Ctrl][Pausa]) interrumpe  la  ejecución  del  programa  actual  y


pasa al modo de interrupción

4. Restablecer proyecto borra el contenido de las variables y restablece
el proyecto.

5. Alternar punto de 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.

6. Paso a paso por ejecuta  el  código  instrucción  por  instrucción,


instrucciones([F8]) recorriendo  el  procedimiento  actual  y  los
procedimientos llamados.

7. Paso a paso por ejecuta  el  código  instrucción  por  instrucción


procedimientos ([Mayús][F8]) solamente  para  el  procedimiento  actual  (las
instrucciones de los procedimientos llamados se
ejecutan de forma continua).

8. Paso a paso para salir ejecuta  de  forma  continua  las  líneas  restantes


([Ctrl][Mayús][F8]) del procedimiento actual.

9. Ventana Locales muestra  los  valores  de  las  variables  locales  del


procedimiento.

10. Ventana Inmediato muestra  la  ventana  de  ejecución  que  permite


(método abreviado [Ctrl] G) ejecutar interactivamente una instrucción.

11. Ventana Inspecciones muestra la lista de las variables inspeccionadas.

12. Inspección rápida muestra  el  valor  actual  de  la  expresión


([Mayús][F9]) seleccionada.

13. Pila de llamadas muestra  la  lista  de  las  llamadas  a


procedimientos que se están ejecutando.

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.

Response Permite  mostrar  (acDataErrDisplay)  o  no  (acDataErrContinue)  el


mensaje de error estándar de Access.

Ejemplo

El ejemplo siguiente permite interceptar un error y reemplazar el mensaje estándar de Access (ej: un índice
o una clave principal no puede contener un valor nulo: correspondiente al número de error 3058), por un
mensaje específico. 

Sub Form_Error (DataErr As Integer,Response As Integer) 
  ’Índice Nulo 
   If DataErr = 3058 Then 
    MsgBox "Un empleado debe tener un número" 
     ’el mensaje estándar de Access no se muestra 
    Response = acDataErrContinue 
   End If 
End Sub

3. La instrucción On Error

On Error GoTo

La instrucción On Error GoTo indica una secuencia de instrucciones que deben ejecutarse en caso de error.
Esta instrucción debe estar situada antes de las instrucciones que pueden desencadenar el error.

Sintaxis

On Error {GoTo <etiqueta>| GoTo 0}
<etiqueta> Nombre de la etiqueta que indica el inicio de la secuencia de instrucciones.
Una  etiqueta  se  compone  de  un  nombre  que  empieza  por  una  letra  y  del
signo dos puntos (:). Ej: Gest_error: La secuencia de instrucciones llamada
para  gestionar  los  errores  está  situada  generalmente  al  final  del
procedimiento  o  de  la  función,  y  precedida  por  una  instrucción  Exit
Sub  oExit  Function  para  evitar  su  ejecución  en  el  caso  de  que  no  se
produzca ningún error.

0 Desactiva el tratamiento de errores.

Por otra parte, en la secuencia de instrucciones de tratamiento de errores, es necesario indicar en qué lugar
debe  continuar  la  ejecución  del  procedimiento  o  función  después  del  tratamiento  del  error.  Para  este  fin
debe utilizarse una de las instrucciones siguientes:

Resume Continúa  la  ejecución  del  programa  en  la  instrucción  que  ha
provocado el error.

Resume Next Continúa la ejecución del programa en la instrucción siguiente a la
que ha provocado el error.

Resume<etiqueta> Continúa la ejecución del programa en la etiqueta definida.

Ejemplo

Sub MiProcedimiento() 
    On Error GoTo Error 
    ... 
    Exit Sub 
    Error: 
        Select Case Err 
            Case 11 
            ’División por Cero 
                MsgBox ... 
                ... 
                Resume Next 
            Case 13  
            ’Tipos incompatibles 
                ... 
        End Select 
End Sub

4. El objeto Err
El objeto Err contiene informaciones que permiten conocer el origen del error.

Propiedades

Description Devuelve una cadena de caracteres que explica el origen del error.

HelpContext Devuelve  el  identificador  de  contexto  asociado  a  un  tema  de  un
archivo de ayuda.

HelpFile Devuelve  una  cadena  de  caracteres  que  contiene  la  ruta  de  acceso
completa al archivo de ayuda.

LastDLLError Devuelve un código de error de sistema producido por una llamada a
una biblioteca de vínculos dinámicos.

Number Devuelve un valor numérico que indica el número del error.

Source Devuelve una cadena de caracteres que contiene el nombre del objeto
o de la aplicación que ha generado el error.

Métodos
Clear Borra de manera explícita el contenido del objeto Err.

Raise Permite generar errores de ejecución.

Ejemplo

El código siguiente permite mostrar un mensaje que da información sobre la naturaleza del error.

Ejemplo de cuadro de mensaje devuelto cuando se produce un error:
Presentación
El lenguaje VBA le permite personalizar sus formularios e informes durante su ejecución. Podrá, por ejemplo,
efectuar las operaciones siguientes:

Modificar la apariencia de un control en un formulario o en un informe (color, tamaño, posición...).

Agregar o eliminar controles en un formulario o en un informe.

Encadenar formularios a partir de botones de comando.

Mostrar o imprimir un informe.

Aplicar filtros a los registros de un informe o de un formulario.

Etc.

Los asistentes para "Botones de comando" y para "Cuadros de lista" generan automáticamente código VBA
en procedimientos de evento. Constituyen los primeros ejemplos sencillos de personalización de formularios
y de informes.

Encontrará  otros  ejemplos  de  personalización  de  formularios  y  de  informes  en  la  "mini­aplicación"
descrita en el capítulo Código de una mini­aplicació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

10. PictureSizeMode Byte


0 Recortar
1 Escala
2 Zoom

11. Width Entero

12. AutoCenter Boleano

13. AutoResize Boleano

14. FitToScreen Boleano

15. BorderStyle Byte


0 Ninguno
1 Fino
2 Ajustable
3 Trazo doble fijo

16. RecordSelectors Boleano

17. NavigationButtons Boleano

18. NavigationCaption Boleano

19. DividingLines Boleano

20. ScrollBars Byte


0 Ninguna
1 Sólo horizontal
2 Sólo vertical
3 Ambas

21. ControlBox Boleano

22. CloseButton Boleano

23. MinMaxButtons Byte


0 Ninguno
1 Minimizar activado
2 Maximizar activado
3 Ambos activados

24. Moveable Boleano

25. SplitFormSize Entero Largo

26. SplitFormOrientation Byte


0 Hoja de datos arriba
1 Hoja de datos abajo
2 Hoja de datos a la izquierda
3 Hoja de datos a la derecha

27. SplitFormSplitterBar Boleano

28. SplitFormDatasheet Byte


0 Permitir modificaciones
1 Sólo lectura

29. SplitFormPrinting Byte


0 Sólo formulario
1 Sólo hoja de datos

30. SplitFormSplitterBarSave Boleano

31. SubdatasheetExpanded Boleano

32. SubdatasheetHeight Entero

33. GridX Entero

34. GridY Entero

35. LayoutForPrint Boleano

36. Orientation
0 De izquierda a derecha
1 De derecha a izquierda

37. PaletteSource Cadena de caracteres

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

10. AllowDeletions Boleano

11. AllowEdits Boleano

12. AllowFilters Boleano

13. RecordLocks Byte


0 Ninguno
1 General
2 Regmodificado

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

10. AfterDelConfirm Cadena de caracteres

11. OnDirty Cadena de caracteres

12. OnGotFocus Cadena de caracteres

13. OnLostFocus Cadena de caracteres

14. OnDblClick Cadena de caracteres

15. OnMouseDown Cadena de caracteres

16. OnMouseUp Cadena de caracteres

17. OnMouseMove Cadena de caracteres

18. OnKeyUp Cadena de caracteres

19. OnKeyDown Cadena de caracteres

20. OnKeyPress Cadena de caracteres

21. OnUndo Cadena de caracteres

22. OnOpen Cadena de caracteres

23. OnClose Cadena de caracteres

24. OnResize Cadena de caracteres

25. OnActivate Cadena de caracteres

26. OnDeactivate Cadena de caracteres


27. OnUnload Cadena de caracteres

28. OnErrorr Cadena de caracteres

29. MouseWheel Cadena de caracteres

30. OnFilter Cadena de caracteres

31. OnApplyFilter Cadena de caracteres

32. OnTimer Cadena de caracteres

33. TimerInterval Cadena de caracteres

34. SelectionChange Cadena de caracteres

35. BeforeRender Cadena de caracteres

36. AfterFinalRender Cadena de caracteres

37. AfterRender Cadena de caracteres

38. AfterLayout Cadena de caracteres

39. OnConnect Cadena de caracteres

40. OnDisconnect Cadena de caracteres

41. BeforeQuery Cadena de caracteres

42. Query Cadena de caracteres

43. DataChange Cadena de caracteres


44. DataSetChange Cadena de caracteres

45. CommandExecute Cadena de caracteres

46. CommandBeforeExecute Cadena de caracteres

47. CommandEnabled Cadena de caracteres

48. CommandChecked Cadena de caracteres

49. ViewChange Cadena de caracteres

50. PivotTableChange Cadena de caracteres

51. BeforeScreenTip Cadena de caracteres

52. KeyPreview Boleano

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

10. HelpContextID Entero Largo

11. HasModule Boleano


12. FastLaserPrinting Boleano

13. Tag Cadena de caracteres

3. Propiedades no disponibles en modo Diseño

a. Propiedades relativas al modo de ver el formulario

CurrentView Devuelve la vista actual del formulario.

OpenArgs Devuelve  la  expresión  de  cadena  especificada  en  el


argumentoOpenArgs del  método  OpenForm  que  ha  abierto  el
formulario.

Page Especifica el número de la página actual.

Section Identifica una sección y permite acceder a las propiedades de esta
sección.

SelHeight Especifica o determina el número de filas seleccionadas (registros)
en el rectángulo de selección actual.

SelLeft Especifica o determina cuál es la columna (campo) que está más
a la izquierda del rectángulo de selección actual.

SelTop Especifica  o  determina  cuál  es  la  fila  (registro)  que  está  en  la
parte superior del rectángulo de selección.

SelWidth Especifica  o  determina  el  número  de  columnas  seleccionadas


(campos) en el rectángulo de selección actual.

b. Propiedades relativas a los registros y a su actualización

BookMark Define un marcador que identifica de manera única un registro.

CurrentRecord Permite identificar el registro actual.

Dirty Permite  determinar  si  el  registro  actual  ha  sido  modificado
desde la última vez que se guardó.

NewRecord Determina si el registro actual es un nuevo registro.

RecordSet Determina o devuelve el objeto DAO Recordset que representa
el origen de registro de un formulario.

RecordSourceQualifer Devuelve  o  define  una  cadena  de  caracteres  que  indica  el


nombre  del  propietario  del  origen  de  los  registros  SQL  Server
para el formulario.

c. Propiedades relativas a la presentación del formulario

CurrentSectionLeft Determina  la  distancia  en  twips  entre  la


esquina  superior  izquierda  de  la  sección
actual  y  la  esquina  superior  izquierda  del
formulario  (twip:  unidad  de  medida
equivalente  a  1/20  de  punto  o  1/1440  de
pulgada.  Un  centímetro  contiene  567
twips).

CurrentSectionTop Representa  la  distancia  en  twips  entre  la


esquina  superior  de  la  sección  actual  y  la
esquina superior del formulario.

DataSheetAlternateBackColor Devuelve  o  define  el  color  mostrado  en


otras  lineas  de  la  hoja  de  datos  de  un
formulario.
DataSheetBackColor Especifica o determina el color de fondo de
toda la hoja de datos.

DatasheetBorderLineStyle Indica el estilo de línea que debe emplearse
para el borde de la hoja de datos.

DatasheetCellsEffect Permite especificar si los efectos especiales
se  aplican  a  las  celdas  de  una  hoja  de
datos.

DatasheetColumnHeaderUnderlineStyle Indica el estilo de línea que debe emplearse
para el borde inferior de los encabezados de
columna de la hoja de datos.

DatasheetFontHeight Especifica  el  tamaño  en  puntos  utilizado


para mostrar e imprimir los nombres de los
campos  y  los  datos  en  la  vista  Hoja  de
datos.

DatasheetFontItalic Aplica  el  estilo  cursiva  a  los  nombres  de


campos  y  a  los  datos  en  la  vista  Hoja  de
datos.

DatasheetFontName Especifica la fuente utilizada para mostrar e
imprimir  los  nombres  de  los  campos  y  los
datos en la vista Hoja de datos.

DatasheetFontUnderline Subraya los nombres de campos y los datos
en la vista Hoja de datos.

DatasheetFontWeight Especifica  el  espesor  de  la  fuente  utilizada


para  mostrar  e  imprimir  los  caracteres  de
los nombres de campo y de los datos en la
vista Hoja de datos.

DatasheetForeColor Especifica o determina el color del texto de
toda la Hoja de datos.

DatasheetGridlinesBehavior Permite especificar el tipo de cuadrícula que
debe aparecer en la vista Hoja de datos.

DatasheetGridlinesColor Permite especificar el color de la cuadrícula
de una hoja de datos.

HorizontalDatasheetGridlineStyle Indica  la  cuadrícula  horizontal  que  debe


emplearse  para  el  borde  de  la  hoja  de
datos.

InsideHeight Determina el alto (en twips) de la ventana
que contiene un formulario.

InsideWidth Determina  el  ancho  (en  twips)  de  la


ventana que contiene un formulario.

Pages Indica el número total de páginas.

Painting Permite  especificar  si  se  debe  volver  a


dibujar el formulario.

PaintPalette Especifica  la  paleta  que  debe  emplearse


para el formulario.

PictureData Permite copiar la imagen del formulario en
otro  objeto  que  reconozca  la  propiedad
Imagen (Picture).

VerticalDatasheetGridlineStyle Indica  la  cuadrícula  vertical  que  debe


emplearse  para  el  borde  de  la  hoja  de
datos.
WindowHeight Indica  el  alto  de  un  formulario  expresado
en twips.
WindowLeft Indica la posición en pantalla, en twips, del
borde izquierdo del formulario.

WindowTop Indica la posición en pantalla, en twips, del
borde superior del formulario.

WindowWidth Devuelve  el  ancho  de  un  formulario


expresado en twips.

d. Propiedades que devuelven un objeto

Application Permite acceder al objeto Application de Access.

ChartSpace Devuelve  un  objeto  ChartSpace  que  representa  el  espacio


gráfico.

Form Permite hacer referencia a un formulario asociado a un control
subformulario.

Module Permite  especificar  un  módulo  de  formulario.  Los  métodos


InsertLines,  DeleteLines  y  ReplaceLine  del  objeto  Module
permiten modificar el contenido de un módulo de código.

Parent Permite hacer referencia al objeto principal.

PivotTable Devuelve un objeto PivotTable que  representa  el  contenedor


de una lista de tabla dinámica.

Printer Devuelve  o  define  un  objeto  Printer  que  representa  la


impresora predeterminada del sistema actual.

RecordsetClone Permite hacer referencia al objeto Recordset del formulario.

e. Propiedades relativas a la impresión del formulario

PrtDevMode Permite  definir  u  obtener  información  relativa  al  modo  del


dispositivo de impresión especificado.

PrtDevNames Permite  definir  u  obtener  información  relativa  a  la  impresora


seleccionada.

PrtMip Define  o  devuelve  información  sobre  el  modo  del  dispositivo


seleccionado.

UseDefaultPrinter Indica  si  el  formulario  utiliza  la  impresora  predeterminada  del
sistema.

4. Métodos del objeto Form

Métodos

GotoPage Mueve el foco al primer control de la página indicada.

Move Desplaza  y/o  cambia  el  tamaño  del  formulario  a  las  coordenadas
indicadas por los valores de los argumentos.

Recalc Recalcula inmediatamente los controles del formulario.

Refresh Actualiza  los  datos  del  formulario  para  que  contengan  los  últimos
cambios que puedan haber realizado otros usuarios.

Repaint Efectúa todas las actualizaciones en espera del formulario.

Requery Actualiza los datos del formulario especificado.

SetFocus Mueve el foco al formulario.
UnDo Restablece un formulario que había sido modificado.

Ejemplo

Muestra la ficha Cliente en función del nombre de la Empresa seleccionada en un cuadro de lista.

Private Sub lstBuscCli_AfterUpdate() 
Dim rs As Object 
 
’   Busca el registro correspondiente 
’   al cliente seleccionado 
Set rs = Me.Recordset.Clone 
rs.FindFirst "[Cli_CódigoCli] = ’" & Me![lstBuscCli] & "’" 
If Not rs.EOF Then Me.Bookmark = rs.Bookmark 
 
End Sub

Aplicación  de  un  filtro  en  función  del  contenido  de  una  casilla  de  selección:  selección  de  los  clientes
españoles, extranjeros o de todos los clientes.

Private Sub chkPaís_AfterUpdate() 
 
Select Case chkPaís 
 
    ’   Clientes españoles 
   Case 1 
       Me.FilterOn = True 
       Me.Filter = "[Cli_País] = ’España’" 
       Me.Refresh 
        
    ’   Clientes extranjeros 
   Case 2 
       Me.FilterOn = True 
       Me.Filter = "[Cli_País] <> ’España’" 
       Me.Refresh  
   ’   Todos los clientes 
   Case 3 
       Me.FilterOn = False 
       Me.Refresh 
        
End Select 
End Sub
Personalización de los informes
Un objeto Report forma parte de la colección Reports que representa todos los informes que están abiertos.
El objeto ActiveReport (Screen.Active­ Report) y el objeto Me designan el informe activo.

1. Sintaxis
Para hacer referencia a un informe están disponibles las mismas sintaxis que para los formularios.

Ejemplo

Reports![ListaPdo] 
Reports("ListaPdo") 
Reports![ListaPdo]![FechaPdo]

2. Propiedades disponibles en vista Diseño

a. Propiedades de la ficha Formato

1. Caption Cadena de caracteres
2. DefaultView 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

10. Width Entero

11. AutoCenter Boleano

12. AutoResize Boleano

13. FitToPage Boleano

14. BorderStyle Byte


0 Ninguno
1 Fino
2 Ajustable
3 Diálogo

15. ScrollBars Byte


0 Ninguna
1 Sólo horizontal
2 Sólo vertical
3 Ambas

16. ControlBox Boleano

17. CloseButton Boleano

18. MinMaxButtons Byte


0 Ninguno
1 Minimizar activado
2 Maximizar activado
3 Ambos activados

19. Moveable Boleano

20. ShowPageMargins Boleano

21. GridX Entero


22. GridY Entero

23. LayoutForPrint Boleano

24. GrpKeepTogether Byte


0 Por página
1 Por Columna

25. PicturePages Byte


0 Todas las páginas
1 Primera página
2 Ninguna página

26. PageHeader Byte


0 En todas las páginas
1 Sin encabezado de informe
2 Sin pie de informe
3 Sin encabezado/pie de informe

27. PageFooter Byte


0 En todas las páginas
1 Sin encabezado de informe
2 Sin pie de informe
3 Sin encabezado/pie de informe

28. Orientation Byte


0 De izquierda a derecha
1 De derecha a izquierda

29. PaletteSource Cadena de caracteres

b. Propiedades de la ficha Datos

1. RecordSource Cadena de caracteres

2. Filter Cadena de caracteres

3. FilterOnLoad Boleano

4. OrderBy Cadena de caracteres

5. OrderByOnLoad Boleano

6. AllowFilters Boleano

c. Propiedades de la ficha Eventos
1. OnCurrent Cadena de caracteres

2. OnLoad Cadena de caracteres

3. OnNoData Cadena de caracteres

4. OnClick Cadena de caracteres

5. OnGotFocus Cadena de caracteres

6. OnLostFocus Cadena de caracteres

7. OnDblClick Cadena de caracteres

8. OnMouseDown Cadena de caracteres

9. OnMouseUp Cadena de caracteres

10. OnMouseMove Cadena de caracteres

11. OnKeyUp Cadena de caracteres

12. OnKeyDown Cadena de caracteres

13. OnKeyPress Cadena de caracteres

14. OnOpen Cadena de caracteres

15. OnClose Cadena de caracteres

16. OnResize Cadena de caracteres


17. OnActivate Cadena de caracteres

18. OnDeactivate Cadena de caracteres

19. OnUnload Cadena de caracteres

20. OnError Cadena de caracteres

21. MouseWheel Cadena de caracteres

22. OnFilter Cadena de caracteres

23. OnApplyFilter Cadena de caracteres

24. OnTimer Cadena de caracteres

25. TimerInterval Cadena de caracteres

26. OnPage Cadena de caracteres

27. KeyPreview Boleano

d. Propiedades de la ficha Otras

1. Popup Boleano

2. Modal Boleano

3. DateGrouping
0 Predeterminado para EE.UU.
1 Usar opciones del sistema

4. Cycle
0 Todos los registros
1 Registro activo
2 Página activa

5. RecordLocks Boleano

6. RibbonName Cadena de caracteres
7. ToolBar Cadena de caracteres

8. MenuBar Cadena de caracteres

9. ShortcutMenuBar Cadena de caracteres

10. HelpFile Cadena de caracteres

11. HelpContextID Entero Largo

12. HasModule Boleano

13. FastLaserPrinting Boleano

14. Tag Cadena de caracteres

3. Propiedades no disponibles en modo Diseño

a. Propiedades relativas al modo de ver el informe

Moveable Indica si otro usuario puede mover el informe.

Page Indica el número de página actual.

b. Propiedades relativas a los registros y a su actualización

CurrentRecord Identifica el registro actual.

Dirty Permite  determinar  si  el  registro  actual  ha  sufrido


modificaciones desde la última vez que se guardó.

HasData Indica  si  el  informe  es  dependiente  de  un  conjunto  de
registros vacío.

RecordSourceQualifier Devuelve o define una cadena de caracteres que indica
el nombre del propietario del origen de los registros SQL
Server para el informe.

c. Propiedades relativas a la presentación del informe

DrawMode Especifica cómo afecta la pluma (el color utilizado para el dibujo) a los
colores  de  fondo  del  informe  cuando  utiliza  los
métodos  Line,  Circleo  PSet  para  dibujar  sobre  un  informe  al
imprimir.

DrawStyle Especifica  el  estilo  de  línea  cuando  utiliza  los


métodos Line y Circlepara imprimir líneas en un informe.

DrawWidth Especifica  el  ancho  de  línea  para  los


métodos Line, Circle y PSetcuando imprime líneas en un informe.

FillColor Permite  especificar  el  color  de  relleno  de  los  rectángulos  y  de  los
círculos dibujados en un informe mediante los métodos Line yCircle.

FillStyle Especifica  si  un  círculo  o  una  línea  dibujada  mediante  el


métodoCircle o Line es transparente, opaco o relleno con un patrón.

FontBold Especifica  si  una  fuente  debe  aparecer  en  negrita  al  imprimir
controles de informes o al utilizar el método Print en un informe.

Left Define la posición izquierda del informe.

Painting Permite especificar si se debe volver a dibujar el informe.

PaintPalette Especifica la paleta que debe emplear el informe.

ScaleLeft Especifica  las  unidades  de  las  coordenadas  horizontales  que


representan  el  borde  izquierdo  de  una  página  cuando  utiliza  los
métodos  Circle,  Line,  PSet  o  Print  para  la  impresión  o  la  vista
previa de un informe o para guardarlo como archivo.

ScaleMode Especifica  la  unidad  de  medida  para  las  coordenadas  de  una  página
cuando  utiliza  los
métodos Circle,  Line,  PSet,  Print,  TextHeight  oTextWidth  para
la  impresión  o  la  vista  previa  de  un  informe  o  para  guardarlo  como
archivo.

ScaleTop Especifica las unidades de las coordenadas verticales que representan
el  borde  superior  de  una  página  cuando  utiliza  los
métodos  Circle,Line,  PSet  o  Print  para  la  impresión  o  la  vista
previa de un informe o para guardarlo como archivo.

ScaleWidth Especifica  el  número  de  unidades  utilizadas  en  el  ancho  de  página
cuando  utiliza  los  métodos  Circle,  Line,  PSet  o  Print  para  la
impresión  o  la  vista  previa  de  un  informe  o  para  guardarlo  como
archivo.

Top Define la posición superior del informe.

WindowLeft Indica la posición en la pantalla, en twips, desde el borde izquierdo del
informe.

WindowTop Indica la posición en la pantalla, en twips, desde el borde superior del
informe.

d. Propiedades que devuelven un objeto

Application Permite acceder al objeto Application de Access.

Module Permite  especificar  un  módulo  de  informe.  Los


métodosInsertLines,  DeleteLines  y  ReplaceLine  del
objeto  Modulepermiten  modificar  el  contenido  de  un  módulo  de
código.

Parent Permite hacer referencia al objeto principal.

Printer Devuelve  o  define  un  objeto  Printer  que  representa  la  impresora
predeterminada del sistema actual.

Recordset Determina o devuelve el objeto DAO Recordset  que  representa  los


registros de un informe.

Shape Devuelve  una  cadena  que  representa  el  comando  de  tipo  Shape  y
que  permite  efectuar  la  ordenación  y  el  agrupamiento  del  informe
especificado. Es sólo lectura.

Report Permite  hacer  referencia  al  informe  asociado  a  un  control


subinforme.

e. Propiedades relativas a la impresión del informe

CurrentX Permite  especificar  la  coordenada  horizontal  de  la  posición


inicial  del  siguiente  método  de  impresión  o  de  dibujo  de  un
informe.

CurrentY Permite  especificar  la  coordenada  vertical  de  la  posición  inicial
del siguiente método de impresión o de dibujo de un informe.

MoveLayout Especifica si Microsoft Access debe ir a la siguiente posición de
impresión de la página.

NextRecord Especifica si una sección debe pasar al registro siguiente.

Pages Indica el número total de páginas.

PrintCount Devuelve el número de evaluaciones de la propiedad AlImprimir
(OnPrint) para la sección actual de un informe.
PrintSection Especifica si debe imprimirse una sección.

PrtDevMode Permite  definir  o  restituir  informaciones  relativas  al  modo  del


dispositivo de impresión especificado.

PrtDevNames Permite  definir  o  devolver  información  relativa  a  la  impresora


seleccionada.

PrtMip Define  o  devuelve  información  sobre  el  modo  del  dispositivo


especificado.

UseDefaultPrinter Indica  si  el  informe  utiliza  la  impresora  predeterminada  del
sistema.

f. Otras propiedades

FormatCount Permite  determinar  el  número  de  evaluaciones  de  la  propiedad
AlDarFormato (OnFormat) para la sección actual de un informe.

GroupLevel Hace  referencia  al  nivel  de  grupo  por  el  que  se  está  ordenando  o
agrupando en un informe.

Hwnd Devuelve  el  controlador  (un  valor  único  de  tipo  Entero  largo)
atribuido a la ventana actual por Microsoft Windows.

PictureData Permite copiar la imagen del informe en otro objeto que reconozca la
propiedad Imagen (Picture).

Section Identifica una sección y permite acceder a sus propiedades.

4. Métodos

Circle Permite dibujar un círculo o una elipse.

Line Permite dibujar líneas o rectángulos.

Move Desplaza  y/o  cambia  el  tamaño  del  informe  a  las  coordenadas
indicadas por los valores de los argumentos.

Print Envía el texto definido al objeto Report.

Pset Determina un punto del informe para modificar su color.

Requery Actualiza  los  datos  del  informe  especificado  actualizando  el  origen  de
datos.

Scale Define el sistema de coordenadas.

TextHeight Indica el espacio vertical necesario para mostrar una cadena de texto
en la fuente actual del informe especificado (la unidad de medida del
valor de vuelto depende del valor de la propiedad ScaleMode).

TextWidth Indica  el  espacio  horizontal  necesario  para  mostrar  una  cadena  de
texto en la fuente actual del informe especificado (la unidad de medida
del valor devuelto depende del valor de la propiedad ScaleMode).
Los objetos Control
Un  objeto  Control  forma  parte  de  la  colección  Controls  que  representa  todos  los  controles  de  un
formulario,  de  un  informe  o  de  un  subformulario.  El
objeto ActiveControl (Screen.ActiveControl o<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

10. Cuadro combinado ComboBox

11. Insertar gráfico Chart

12. Línea Line

13. Botón de alternar ToggleButton

14. Cuadro de lista ListBox

15. Rectángulo Rectangle

16. Casilla de verificación CheckBox

17. Marco de objeto independiente UnboundObjectFrame

18. Datos adjuntos Attachment

19. Botón de opción OptionButton

20. Subformulario / Subinforme SubForm / SubReport

21. Marco de objeto dependiente BoundObjectFrame

22. Imagen Image


Las opciones de inicio
Las opciones de inicio de Access 2013 permiten definir el aspecto y el comportamiento de la aplicación cuando
ésta se abre.

Para modificar las opciones de inicio:

  Seleccione el comando Opciones de la pestaña Archivo.

  Seleccione la categoría Base de datos actual.

La  mayor  parte  de  estas  opciones  corresponden  a  las  propiedades  de  la  base  de  datos  actual
(objetoCurrentDb) y se pueden modificar por medio del lenguaje VBA:

Propiedad VBA Descripción Tipo

AllowFullMenus Permitir menús completos Boleano

AllowShortcutMenus Permitir  los  menús  contextuales  por Boleano


defecto

AllowSpecialKeys Permitir las teclas especiales Access Boleano

AppIcon Icono de la aplicación Texto

AppTitle Título de la aplicación Texto

AutoCompact Compactar  la  base  de  datos  cuando  se Boleano


cierre

RemovePersonalInformation Eliminar  la  información  personal  en  el Boleano


registro de la base de datos

StartupForm Nombre  del  formulario  que  se  muestra Texto


al abrir la base de datos

StartupShortcutMenuBar Nombre de la barra de menu contextual Texto

StartupShowStatusBar Mostrar la barra de estado Boleano

ThemedFormControls Utilizar  los  controles  con  el  tema  de Boleano


Windows en los formularios

UseAppIconForFrmRpt Utilizar  el  icono  de  la  aplicación  como Boleano


icono de formulario e informe

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

AddIns Colección  de  objetos  AddIns  que  representa  los  modelos  y


complementos  disponibles  en  Word,  que  estén  actualmente
cargados o no.

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.

COMAddIns Colección  de  objetos  COMAddIns  que  representa  los


complementos  COM  (Component  Object  Model)  accesibles
desde  Word  (complemento  COM:  programa  complementario
que  extiende  las  posibilidades  ofrecidas  por  un  programa
Microsoft  Office,  al  añadir  comandos  personalizados  y
funcionalidades  especializadas.  Los  complementos  COM  se
pueden  ejecutar  en  uno  o  varios  programas  Office.  Utilizan  la
extensión de nombre de fichero .dll o .exe.).

CommandBars Colección de objetos CommandBar que representa una barra
de comandos Word.

Dialogs Colección  de  objetos  Dialog  que  representa  los  cuadros  de


diálogo integrados de Word.

Documents Colección  de  objetos  Document  que  representa  todos  los


ficheros actualmente abiertos en Word.

FileConverters Colección  de  objetos FileConverter que  representa  todos  los


conversores  de  ficheros  disponibles  para  la  apertura  y  el
registro de ficheros desde Word.

Languages Colección  de  objetos  Language  que  representa  todos  los


idiomas  disponibles  en  Word  para  las  comprobaciones
lingüísticas.

Listgalleries Colección  de  objetos  ListGallery  que  representa  las  tres


librerías  de  modelos  de  viñetas  y  numeración  (con  Viñetas,
Números y Jerarquía).

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.

Templates Colección  de  objetos  Template  que  representa  a  todos  los


modelos disponibles.

Windows Colección  de  objeto  Window  que  representa  a  todas  las


ventanas actualmente disponibles en la aplicación Word.

3. Principales objetos del modelo objeto de Word

AutoCorrect Objeto  que  contiene  la  información  relativa  a  las  correcciones


automáticas de Word (opciones, excepciones…).

DefaultWebOptions Objeto  que  representa  los  atributos  globales  que  Microsoft


Word utiliza al salvaguardar un documento como página Web o
al abrir una página Web.

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.

MailingLabel Objeto  que  representa  etiquetas  de  correspondencia


combinada.

MailMessage Objeto que representa el mensaje electrónico activo si Word es
su editor de correo electrónico.

Options Representa  las  opciones  de  aplicación  y  de  documento  de


Word.  La  mayoría  de  las  propiedades  del
objeto  Optionscorresponden  a  elementos  del  cuadro  de
diálogo Opciones(menú Herramientas).

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

Activate Activa  un  documento  ya  abierto.


Ej:Documents("Compras.docx").Activate

Close Cierra  un  documento  Word  abierto.


Ej:Documents("Compras.docx").Close o ActiveDocument.Close

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"

PrintPreview Muestra  un  documento  en  la  Vista  preliminar.


Ej:ActiveDocument.PrintPreview
Range Devuelve un objeto Range (intervalo). Ej:ActiveDocument.Range(0,
50).Bold = True
Save Guarda un documento. Ej: ActiveDocument.Save

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.

Words Colección  de  las  palabras  de  un  documento.


Ej:ActiveDocument.Words.Count

Principales objetos

AttachedTemplate Devuelve  un  objeto  Template  que  representa  el  modelo


adjuntado al documento especificado.

DocumentTheme Objeto  que  representa  el  tema  Office  aplicado  al  documento
especificado.

MailMerge Objeto  que  permite  acceder  a  las  funcionalidades  de  fusión  y


combinación de correspondencia de Word.

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

AddIns Colección  de  objetos  AddIns  que  representa  los


complementos  listados  en  el  cuadro  de
diálogoComplementos  (comando  Complementos  bajo  la
pestañaProgramador).

COMAddIns Colección  de  objetos  COMAddIns  que  representa  los


complementos  COM  (Component  Object  Model)  accesibles
desde Excel (complemento COM: programa complementario
que  extiende  las  posibilidades  ofrecidas  por  un  programa
Microsoft  Office,  al  añadir  comandos  personalizados  y
funcionalidades  especializadas.  Los  complementos  COM  se
pueden ejecutar en uno o varios programas Office. Utilizan la
extensión de nombre de fichero .dll o .exe.).

CommandBars Colección  de  objetos  CommandBar  que  representa  una


barra de comandos de Excel.

Dialogs Colección  de  objetos  Dialog  que  representa  los  cuadros  de


diálogo integrados de Excel.

FileExpertConverters Colección  de  objetos  FileExpertConverter  que  representa


todos los conversores de ficheros disponibles para la apertura
y el registro de ficheros desde Excel.

Names Colección  de  objetos  Name  que  representa  todos  los


intervalos o celdas nombradas en el libro activo.

RecentFiles Colección  de  objetos  RecentFile  que  representa  a  los


últimos libros abiertos en Excel.

Watches Colección de objetos Watch que representa a los intervalos
durante el nuevo cálculo de la hoja activa.

Windows Colección  de  objetos  Window  que  representa  a  todas  las


ventanas activas en Excel.

Workbooks Colección de objetos Workbook que  representa  a  todos  los


libros abiertos en Excel.

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

Activate Activa  un  libro  ya  abierto.


Ej:Workbooks("Compras.xlsx").Activate

Close Cierra  un  libro  Excel  abierto.


Ej:Workbooks("Compras.xlsx").Close oActiveWorkbook.Close

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.

PivotCaches Colección  de  objetos  PivotCache  que  representa  a  los  cachés  de


tablas dinámicas 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

  Entre  el  código  siguiente  en  el  módulo  ImportExportXML  y  ejecute  el


procedimiento ExportFormCliente.

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.

User32.dll Funciones  de  administración  Windows,  tales  como  el  tratamiento  de


mensajes, relojes, menús y comunicaciones.

GDI32.dll Biblioteca  GDI  (Graphics  Device  Interface)  que  contiene  funciones  de


salida  hacia  los  dispositivos  (gráficos,  contexto  de  presentación  y
gestión de las fuentes).

También  hay  disponibles  otras  API  como,  por  ejemplo,  la  interfaz  MAPI  (Mail  Application  Programming
Interface) que permite escribir aplicaciones de correo electrónico.
Llamada a una función de la API Windows
Para llamar a una función de la API Windows, debe declararla utilizando la instrucción Declare en la sección
de  Declaraciones  de  un  módulo  de  su  propio  proyecto  (generalmente  un  módulo  dedicado  a  los
procedimientos generales de la aplicación).

1. Sintaxis de la instrucción Declare
En  las  versiones  32  bits  de  Visual  Basic,  es  obligatorio  respetar  las  minúsculas  y  las  mayúsculas  en  los
nombres de funciones y de procedimientos de las DLL.

[Public|Private] Declare Sub <nombre_proc> Lib "<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.

Lista_argumentos Parámetros  que  se  pasan  al  procedimiento  (ver  capítulo  El


lenguage Visual Basic).

tipo Tipo del valor de retorno de un procedimiento Function.

Ciertas DLL no proporcionan nombre para sus procedimientos y sus funciones y en su lugar proporcionan
un número ordinal. La declaración de tales procedimientos o funciones utiliza la misma sintaxis, pero es
necesario definir el número ordinal a nivel del Alias con el signo (#) seguido del nombre (ej: Alias "#52").

2. Paso de argumentos
Las  funciones  y  procedimientos  de  las  DLL  están  escritas,  en  su  mayoría,  en  lenguaje  C  y  utilizan  su
sintaxis.  Además,  el  paso  de  argumentos  a  un  procedimiento  o  a  una  función  de  una  DLL  desde  Visual
Basic, no siempre es sencilla. En el caso de las DLL que utilizan la sintaxis de C, todos los argumentos se
pasan por valor, salvo las matrices.

Las cadenas en lenguaje C se consideran como matrices de caracteres.

Ciertos argumentos de procedimientos de DLL pueden aceptar distintos tipos de datos (un poco como las
Variant)  y  deben  declararse  como  tipo  Any  (ej:  variable  As  Any).  Visual  Basic,  para  este  tipo  de
argumento,  considera  que  se  pasa  sistemáticamente  por  referencia;  si  se  debe  pasar  por  valor,  es
necesario  especificarlo  en  la  llamada  (y  no  en  la  declaración)  del  procedimiento  o  de  la  función  con  la
palabra clave ByVal.

Por defecto, Visual Basic pasa los argumentos por Referencia.

Tabla de las declaraciones de argumentos

Declaración en Declaración Visual Llamada


lenguaje C Basic

BOOL ByVal <variable> As Una expresión cuya evaluación


Boolean produce un valor de tipo Boolean.
long, DWORD, LONG, ByVal <variable> As Long Una expresión cuya evaluación
COLORREF produce un valor de tipo Long.

WORD ByVal <variable> As Long Una expresión cuya evaluación


produce un valor de tipo Long.

NULL As Any o ByVal <variable> ByVal Nothing o ByVal 0$ o


As Long vbNullString.

int, short ByVal <variable> As Una expresión cuya evaluación


Integer produce un valor de tipo Integer.

char, BYTE ByVal <variable> As Byte Una expresión cuya evaluación


produce un valor de tipo Byte.

Entero (INT, UINT) ByVal <variable> As Long Una expresión cuya evaluación


32 bits con compilador produce un valor de tipo Long.
32 bits

Identificador Windows ByVal <variable> As Long Una expresión cuya evaluación


(hWnd, hDC, hMenu...) produce un valor de tipo Long.

Vacío (valor devuelto de Sub <procedimiento> Sin objeto.


función)

Puntero a una cadena ByVal <variable> As Una expresión cuya evaluación


(LPSTR) String produce un valor de tipo String.

Puntero a un entero <variable> As Long Una variable de tipo Long.


largo (LPDWORD)

Puntero a vacío <variable> As Any Una variable (utilice ByVal para


pasar una cadena).

Puntero a un char <variable> As Byte Una expresión cuya evaluación


produce un valor de tipo Byte.

Puntero a un entero <variable> As Long Una variable de tipo Long.


(LPINT)

Puntero a una estructura <variable> As <type> Una variable de este tipo definida


por el usuario.
Lista de funciones de la API Windows
Esta lista incluye las funciones de la API Windows utilizadas con mayor frecuencia. En el párrafo siguiente se
proporcionan ejemplos de la utilización de algunas de estas funciones.

GetWindowsDirectory() Devuelve  la  ruta  de  acceso  completa  del  directorio  de


Windows (aplicaciones, herramientas del sistema).

GetSystemDirectory() Devuelve  la  ruta  de  acceso  completa  del  directorio  de


sistema de Windows.

GetSystemInfo() Devuelve  información  sobre  el  sistema.  Estos  datos  se


almacenan en una estructura de tipo SYSTEM_INFO.

GetActiveWindow() Devuelve el handle de la ventana activa.

FindWindow() Devuelve  el  handle  de  la  ventana  en  función  de  su
nombre y de la clase a partir de la cual ha sido definida.

SetFocus() Atribuye el foco de entrada a la ventana refenciada por
su handle.

GetPrivateProfileString() Devuelve una opción extraída de un archivo .ini a partir
de un nombre de sección y de clave.

WNetGetUser() Devuelve  el  nombre  del  login  de  red  utilizado  por  la
sesión actual.
Ejemplos de utilización de funciones de la API Windows

1. Recuperación del directorio de Windows
Declaración de la función API.

Private Declare Function GetPrivateProfileString Lib _KERNEL32" _ 
             Alias _GetPrivateProfileStringA" 
                    (ByVal lpApplicationName As String, _ 
                     ByVal lpKeyName As Any, _ 
                     ByVal lpDefault As String, _ 
                     ByVal lpReturnedString As String, _ 
                     ByVal nSize As Long, _ 
                     ByVal lpFileName As String) As Long

Llamada de la función API.

Function GetWinPath() As String 
 
’ Esta función VBA devuelve el directorio de Windows 
Dim strResult As String 
Dim strProfile As String 
 
strResult = String(255, " ") 
strProfile = GetWindowsDirectory(strResult, 255) 
 
  ’ Trunca la cadena en el primer carácter nulo 
If strProfile <> "" Then 
   strResult = Trim(strResult) 
   GetWinPath = Left(strResult, InStr(1, strResult, vbNullChar) ‐ 1) 
Else 
   GetWinPath = "" 
End If 
End Function

2. Inicio de la aplicación Excel si no está activa
Este ejemplo permite comprobar si la aplicación Excel está activada e iniciar su ejecución si es necesario.

Se emplean dos funciones de la API: FindWindow permite buscar la ventana Excel y FindExecutable la
ubicación del archivo Excel.exe.

Declaración de la función API.

’   Esta función API busca una ventana 
Public Declare Function FindWindow Lib "user32" Alias _  
"FindWindowA" (ByVal lpClassName As String, ByVal _ 
lpWindowName As String) As Long 
 
’   Esta función API busca un archivo ejecutable 
Public Declare Function FindExecutable Lib "shell32.dll" _ 
Alias "FindExecutableA" (ByVal lpFile As String, _ 
ByVal lpDirectory As String, ByVal lpResult As String) As Long

Llamada de las funciones API.

Private Function IniciaExcel() As Boolean 
Dim strClassName As String 
Dim strWindowName As String 
Dim Hwnd As Long 
Dim blnExe As Boolean 
Dim strDirExcel As String 
Dim Result As Long 
 
’   Inicialización 
IniciaExcel = False 
 
’   Busca la ventana Excel activa 
strClassName = vbNullString 
strWindowName = "Microsoft Excel ‐ Libro1" 
Hwnd = FindWindow(strClassName, strWindowName) 
 
’   Si no la encuentra busca el directorio Excel 
’   e inicia la aplicación Excel 
If Hwnd = 0 Then 
   strDirExcel = String$(255, 0) 
 
   Result = FindExecutable("Excel.exe", "C:\", strDirExcel) 
   If Result = 0 Then Exit Function 
   blnExe = Shell(strDirExcel, vbNormalFocus) 
   If Not blnExe Then Exit Function 
End If 
IniciaExcel = True 
 
End Function

3. Recuperación de un valor en un archivo .ini
El archivo AppPresupuesto.ini está constituido por las tres líneas siguientes:

[BASE] 
BasePath=C:\PRESUPUESTO 
BaseName=PRESUPUESTO.ACCDB

El  ejemplo  siguiente  permite  recuperar  el  nombre  y  la  ruta  de  acceso  en  el  archivo  AppPresupuesto.ini
situado en el directorio Windows (llamando a la función GetWinPath del ejemplo 1).

Declaración de la función API.

Public Declare Function GetPrivateProfileString Lib "kernel32" _ 
   Alias "GetPrivateProfileStringA" _ 
   (ByVal lpApplicationName As String, _ 
   ByVal lpKeyName As Any, _ 
   ByVal lpDefault As String, _ 
   ByVal lpReturnedString As String, _ 
   ByVal nSize As Long, _ 
   ByVal lpFileName As String) As Long

Llamada de la función API.

Public Function LeerClave (Sección As String, Clave As String, _ 
Archivo As String) As String 
 
’   Esta función devuelve el valor de la clave 
’   que podemos encontrar en un archivo .ini cualquiera    
Dim strResult As String 
Dim strProfile As Integer 
Dim i As Integer 
 
strResult = String(255, " ") 
strProfile = GetPrivateProfileString(Sección, Clave, "", _ 
             strResult, 255, Archivo) 
If strProfile = 0 Then 
          LeerClave = "" 
          Exit Function 
End If 
 
’ Trunca la cadena en el primer carácter nulo 
strResult = Trim(strResult) 
LeerClave = Left(strResult, InStr(1, strResult, vbNullChar) ‐ 1) 
 
End Function

Llamada a la función VBA LeerClave.

Private Sub Inic_Proyecto () 
Dim strBaseName As String 
Dim strPath As String 
Dim strWinPath As String 
 
’   Buscar el nombre y el directorio de la base 
strWinPath = GetWinPath() 
If strWinPath = "" Then Exit Sub 
 
’   Buscar valores en Presupuesto.ini 
strBaseName = Trim(LeerClave ("BASE", "BASENAME", strWinPath _ 
& "\" & "Presupuesto.ini")) 
strPath = Trim(LeerClave ("BASE", "BASEPATH", strWinPath & "\" _ 
& "Presupuesto.ini")) 
 
End Sub
El objeto FileSystemObject
El  objeto  FileSystemObject  proporciona  acceso  al  sistema  de  archivos  de  un  ordenador.  Permite  buscar,
crear, eliminar o mover archivos o carpetas.

1. Métodos

Métodos relativos a los archivos

CopyFile Copia uno o varios archivos de una ubicación a otra.

CreateTextFile Crea  un  archivo  en  el  disco  que  lleva  el  nombre  especificado  y
devuelve un objeto TextStream que puede emplearse para leer
o escribir en el archivo.

DeleteFile Elimina un archivo especificado.

FileExists Devuelve  un  valor  boleano  que  indica  si  existe  el  archivo
especificado.

MoveFile Desplaza uno o varios archivos de una carpeta a otra.

OpenTextFile Abre  el  archivo  especificado  y  devuelve  un  objeto  TextStream


que puede emplearse para leer el archivo o para agregarle datos.

Métodos relativos a las carpetas

CopyFolder Copia una carpeta de una ubicación a otra.

CreateFolder Crea una carpeta.

DeleteFolder Elimina la carpeta especificada y su contenido.

FolderExists Devuelve  un  valor  boleano  que  indica  si  existe  la  carpeta
especificada.

MoveFolder Mueve una o varias carpetas de una ubicación a otra.

Métodos relativos a las unidades de disco

DriveExists Devuelve  un  valor  boleano  que  indica  si  existe  la  unidad  lógica
especificada.

GetDrive Devuelve un objeto Drive que  corresponde  a  la  unidad  de  una


ruta de acceso especificada.

GetDriveName Devuelve  una  cadena  que  contiene  el  nombre  de  la  unidad
correspondiente a una ruta de acceso especificada.

2. Propiedades

Drives Devuelve  una  colección  constituida  por  todos  los


objetos Drivedisponibles en el equipo local.

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.

DoEvents() Detiene  momentáneamente  la  ejecución  para  que  el  sistema


operativo pueda tratar otros eventos.

IIf() Devuelve un valor en función de una condición.

Switch() Devuelve el valor asociado a la primera expresión verdadera.

Instrucciones

Call Llama a un procedimiento Sub.
Do...Loop Creación de un bucle.

End Finalización del programa.

Exit Do Salida de un bucle.

Exit For Salida de un bucle.

For Each... Next Permite recorrer todos los elementos de una colección o de una
matriz.

For... Next Creación de un bucle.

Function... End Define el inicio y el final de una función.
Function

GoSub... Return Llama a un subprograma.

Goto Efectúa  un  salto  incondicional  hasta  una  línea  determinada  de


un procedimiento.

If... Then... Else Creación de una alternativa.

On... GoSub Ejecución de subprogramas en función de una variable.

On... Goto Salto  hacia  varias  etiquetas  de  programa  en  función  de  una
variable.

Property Get Declaración de un procedimiento Property Get.

Property Let Declaración de un procedimiento Property Let.

Property Set Declaración de un procedimiento Property Set.

Select Case Creación de una alternativa.

Stop Interrupción provisional del código ACCESS BASIC.

Sub... End Sub Define el inicio y el final de un procedimiento.

While... Wend Creación de un bucle.

With Permite ejecutar una serie de instrucciones sobre un objeto.

3. Conversión de datos

Funciones

Asc() Valor Ascii de un carácter.

Cbool() Conversión de una expresión en Boolean (boleano).

CByte() Conversión de una expresión en Byte.

CCur() Conversión de cadena de caracteres numéricos de tipo Currency. 

Cdate() Conversión de una expresión en Date.

CDbl() Conversión de una cadena de caracteres numéricos en tipo Double.

CDec() Conversión de una expresión en Decimal.

Chr() Carácter Ascii de un número.

CInt() Conversión  de  una  cadena  de  caracteres  en  un  número  de  tipo
Entero.

CIng() Conversión de una cadena de caracteres en un número de tipo Long.

CSng() Conversión de una cadena de caracteres en un número de tipo Single.

CStr() Conversión de una expresión en formato String.

CVar() Conversión  de  una  cadena  de  caracteres  en  un  número  de  tipo
Variant.

CVErr Devuelve un código de error especificado por el usuario.

DateSerial() Creación de un número fecha a partir de AA MM DD.

DateValue() Conversión  de  una  expresión  de  cadena  o  de  una  expresión  que
representa una fecha en fecha.

Day() Día de una fecha.

Hex() Conversión  de  un  número  en  una  cadena  en  representación
Hexadecimal.

Oct() Conversión de un número en una cadena en representación Octal.

Str() Conversión de un número en cadena de caracteres.

Val() Conversión de cadena de caracteres en número.

4. Fecha y hora

Funciones

Date() Fecha y hora actual.

DateAdd() Agrega una fecha.

DateDiff() Diferencia entre dos fechas.

DatePart() Extracción de una parte de una fecha.

DateSerial() Devuelve una fecha a partir del día, del mes y del año.

DateValue() Devuelve una fecha a partir de una cadena.

Day() Devuelve el número del día en el mes.

Hour() Devuelve el número de la hora (0 a 23) de una expresión hora. 

IsDate() Indica si el argumento Variant puede ser convertido en Fecha. 

Minute() Devuelve el número de minutos (0 a 59) de una expresión hora.

Month() Devuelve el número del mes de una fecha.

Now() Fecha y hora actual.

Second() Devuelve el número de segundos (0 a 59) de una expresión hora.

Time() Devuelve la hora del sistema.

Timer() Número de segundos transcurridos desde Medianoche.

TimeSerial() Devuelve la hora actual para una hora, minuto y segundo específicos.

TimeValue() Devuelve una hora a partir de una cadena.

WeekDay() Devuelve el número del día de la semana a partir de una fecha. 

Year() Devuelve el valor del año a partir de una fecha.

Instrucciones

Date Permite modificar la fecha del sistema.

Time Permite modificar la hora del sistema.

5. Declaración

Instrucciones
Const Define una constante simbólica.

Declare Declara una subrutina de DLL.

Deftype Definición de un tipo predeterminado.

Dim Define una variable.

Let Asigna un valor a una variable.

Option Base Define el valor más pequeño del índice de una matriz.

Option Compare Define el modo de comparación de los archivos de texto.

Option Explicit Fuerza la declaración de las variables.

Private Define una variable o un procedimiento como privado.

Public Define una variable global.

Redim Redefine las dimensiones de una matriz dinámica.

Set Asigna un objeto a una variable.

Static Define una variable estática.

Type Define variables estructuradas de usuario.

6. Dominio

Funciones

DAvg() Promedio de un dominio.

DCount() Cuenta de los elementos de un dominio.

DFirst() Primero de un dominio.

DLast() Último de un dominio.

DLookUp() Búsqueda en un dominio.

DMax() Máximo de un dominio.

DMin() Mínimo de un dominio.

DStDevP() Desviación estándar de una población de un dominio.

DStDev() Desviación estándar de una muestra de un dominio.

DSum() Suma de un dominio.

DVar() Varianza de una muestra de un dominio.

DVarP() Varianza de una población de un dominio.

7. Intercambio dinámico de datos

Funciones

DDE() Crea un canal DDE y pide una información.

DDEInitiate() Abre un canal DDE.

DDERequest() Solicita una información a través de un canal DDE.

DDESend() Envía una información a través de un canal DDE.

Instrucciones
DDEExecute Utiliza  un  canal  DDE  abierto  para  enviar  un  comando  a  una
aplicación.

DDEPoke Utiliza un canal DDE abierto para enviar datos a una aplicación.

DDETerminate Cierra un canal DDE.

DDETerminate All Cierra todos los canales DDE abiertos.

8. Entrada y salida de archivos

Funciones

Curdir() Devuelve  el  último  directorio  utilizado  en  el  cuadro  de  diálogo
"Abrir".

Dir() Busca  archivos  correspondientes  a  una  ruta  de  acceso  y  un


nombre genérico.

Eof() Fin de archivo.

FileAttr() Devuelve el modo del archivo abierto.

FileDateTime() Devuelve la fecha y la hora de creación o de última modificación
de un archivo.

FileLen() Devuelve el tamaño de un archivo.

FreeFile() Devuelve el próximo número de archivo disponible.

GetAttr() Devuelve los atributos de un archivo o de un directorio.

Loc() Posición actual en el archivo.

Lof() Devuelve la longitud de un archivo.

Seek() Devuelve la posición actual en un archivo.

Spc() Desplazamiento de x espacios en una instrucción Print.

Tab() Desplazamiento de x tabulaciones en una instrucción Print.

Instrucciones

Chdir Cambio de directorio actual.

Chdrive Cambio de unidad de disco actual.

Close Cierra un archivo.

FileCopy Permite la copia de un archivo.

Get Lectura de datos en un archivo secuencial.

Input Lectura en un archivo secuencial.

Kill Eliminación de un archivo del disco.

Line Input Lectura de una línea en un archivo secuencial.

Lock Bloqueo de acceso a un segmento de archivo.

Mkdir Creación de un directorio.

Name Asignación de un nuevo nombre a un archivo de disco.

Open Abre un archivo.

Print Escritura de datos en un archivo secuencial.

Put Escritura de una variable en un archivo.
Reset Cierra todos los archivos.

RmDir Elimina un directorio.

SetAttr Modifica los atributos de un archivo.

Unlock Desbloqueo de acceso a un segmento de archivo.

Width Asignación de un ancho de línea de salida a un archivo.

Write Escritura de datos en un archivo secuencial.

9. Financieras

Funciones

DDB() Depreciación  de  un  bien  durante  un  período  específico  utilizando  el
método  de  balance  de  doble  declinación  u  otro  método  que  se
especifique.

FV() Valor  futuro  de  una  anualidad  sobre  la  base  de  una  serie  de  pagos
periódicos constantes y un tipo de interés constante.

IPmt() Pago  de  intereses  durante  un  período  determinado  sobre  la  base  de
pagos constantes y periódicos y un tipo de interés también fijo.

IRR() Tasa interna de retorno de una serie de pagos.

MIRR() Tasa interna de retorno modificada para una serie de pagos.

Nper() Número  de  períodos  de  una  anualidad  sobre  la  base  de  pagos
periódicos constantes y de un tipo de interés también constante.

NPV() Valor actual neto de una inversión sobre la base de una serie de pagos
periódicos y de un tipo de interés.

Pmt() Pago de una anualidad sobre la base de una serie de pagos periódicos
constantes y de un tipo de interés también constante.

PPmt() Pago nominal para un período determinado de una anualidad sobre la
base  de  pagos  periódicos  constantes  y  de  un  tipo  de  interés  también
constante.

PV() Valor  actual  de  una  anualidad  sobre  la  base  de  pagos  periódicos
constantes y de un tipo de interés también constante.

RATE() Tipo de interés por un período de una anualidad.

SLN() Depreciación lineal de un bien durante un período determinado.

SYD() Depreciación  de  un  bien  para  un  período  determinado  expresado  de
manera proporcional al orden numérico inverso de los años.

10. Gestión de errores

Funciones

CVErr Devuelve la variable Error.

Err() Código de error en forma de integer.

Error() Devuelve el mensaje estándar correspondiente a un número de error.

IsError() Indica si una expresión es un valor de error.

Instrucciones
Error Simula un error.

On error Opción del salto que debe realizarse en caso de error.

Resume Opción del salto que debe realizarse después del tratamiento del error.

11. Gráficos en los informes impresos

Funciones

QBColor() Devuelve el valor de un color RGB en función de un número de color.

RGB() Devuelve un entero largo que representa un color RGB.

12. Vinculación e incrustación de objetos

Funciones

CreateObject() Crea y devuelve una referencia a un objeto ActiveX.

GetObject() Devuelve  una  referencia  a  un  objeto  proporcionado  por  un


componente ActiveX.

13. Manipulación de objetos

Métodos del objeto Aplicación

CreateControl Crea un control en un formulario abierto.

CreateForm Crea un formulario.

CreateReport Crea un informe.

CreateReportControl Crea un control en un informe abierto.

DeleteControl Elimina un control de formulario.

DeleteReportControl Elimina un control de informe.

14. Matemáticas

Funciones

Abs() Valor absoluto de un número.

Atn() Arcotangente de un número.

Cos() Coseno de un ángulo en radianes.

Exp() Elevación a una potencia.

Fix() Parte  entera  de  un  número.  Para  los  números  negativos,
devuelve el primer número entero negativo superior o igual.

Int() Parte  entera  de  un  número.  Para  los  números  negativos,
devuelve el primer entero negativo inferior o igual.

Log() Logaritmo neperiano.

Rnd() Devuelve un número aleatorio.

Sgn() Valor que indica el signo de un número.

Sin() Seno de un ángulo en radianes.

Sqr() Raíz cuadrada de un número.
Tan() Tangente de un ángulo en radianes.

Instrucciones

Randomize Inicialización del generador aleatorio.

15. SQL

Funciones

Avg() Devuelve  el  promedio  de  los  valores  de  un  campo  de  una
serie de registros.

Count() Cuenta de registros (controles o expresiones SQL).

First() Devuelve  el  valor  de  un  campo  del  primer  registro  de  una
consulta, formulario o informe.

Last() Devuelve  el  valor  de  un  campo  del  último  registro  de  una
consulta, formulario o informe.

Max() Devuelve el máximo de los valores de un campo de una serie
de registros.

Min() Devuelve el mínimo de los valores de un campo de una serie
de registros.

StDevP(), StDev() Devuelve  una  estimación  de  la  desviación  estándar  de  una
población o de una muestra de población.

Sum() Devuelve la suma de los valores de un campo de una serie de
registros.

VarP(), Var() Devuelve  una  estimación  de  la  varianza  de  una  población  o
de una muestra de población.

16. Matrices

Funciones

IsArray() Devuelve un valor de tipo Boolean (boleano) que indica si una
variable es una matriz.

Array() Devuelve  una  variable  de  tipo  Variant  que  contiene  una
tabla.

Instrucciones

Erase Inicializa  una  matriz  de  tamaño  fijo  y  libera  la


memoria asignada a una matriz dinámica.

Lbound, Ubound Buscan el menor y el mayor subíndice de una matriz.

Option Base Declara el límite inferior del subíndice de una matriz.

ReDim Redimensiona matrices de forma dinámica.

17. Control de variables

Funciones

IsDate() Evalúa si una variable es de tipo fecha.
IsEmpty() Evalúa si una variable está vacía.

IsMissing() Indica  si  un  argumento  opcional  ha  sido  pasado  a  un


procedimiento.

IsNull() Evalúa si una variable es Null.

IsNumeric() Evalúa si una variable es de tipo numérico.

IsObject() Indica si una expresión hace referencia a un objeto.

TypeName() Devuelve una cadena que indica el tipo de una variable.

VarType() Determina  el  tipo  de  datos  origen  de  una  variable  de  tipo
Variant.

18. Funciones e instrucciones diversas

Funciones

Command() Contiene  la  parte  de  argumentos  de  la  línea  de  comandos
utilizada para iniciar Microsoft Access.

CreateGroupLevel() Creación de un nuevo grupo en un informe.

CurrentUser() Devuelve el nombre del usuario conectado actualmente.

DoEvents() Cede el control de la ejecución a WINDOWS para que pueda
procesar eventos.

Environ() Devuelve la cadena asociada a una variable de entorno.

GetAllSettings Devuelve la lista de las claves (y sus respectivos valores) que
figuran en una entrada de aplicación de la base de registro de
Windows.

GetSetting Devuelve  un  valor  de  clave  de  la  entrada  del  registro  de
Windows de una aplicación.

InputBox Muestra  un  mensaje  en  un  cuadro  de  diálogo  y  luego
devuelve el contenido del cuadro de texto en forma de valor
de tipo String.

MsgBox() Muestra un mensaje en un cuadro de diálogo.

Shell() Ejecución de un subprograma.

StrReverse Devuelve une cadena que contiene caracteres cuyo orden ha
sido invertido en relación a una cadena determinada. 

Instrucciones

AppActivate Activación de una ventana de aplicación Windows.

Beep Emite un Bip.

SendKeys Envía una secuencia de pulsaciones de teclas.

DeleteSetting Elimina  una  sección  o  una  clave  de  una  entrada  de  registro
de Windows.

Rem Permite incluir comentarios explicativos en un programa.

SaveSetting Guarda  o  crea  una  entrada  de  aplicación  en  el  registro  de
Windows.

19. Códigos de error interceptables
Pueden producirse errores interceptables durante la ejecución de una aplicación. Algunos también pueden
producirse durante el desarrollo o la compilación. Puede hacer pruebas y responder a errores interceptables
mediante la instrucción On Error y el objeto Err.

Code Error Descripción

3 Return sin GoSub.

5 Llamada de procedimiento incorrecta.

6 Desbordamiento.

7 Memoria insuficiente.

9 Índice fuera del intervalo.

10 La matriz es fija o está temporalmente bloqueada.

11 División por cero.

13 Tipo incompatible.

14 Espacio de cadena insuficiente.

16 Expresión demasiado compleja.

17 Imposible ejecutar la operación requerida.

18 Interrupción por parte del usuario.

20 Continúa sin error.

28 Espacio de pila insuficiente.

35 Sub, Function o Property no definida.

47 Demasiados clientes para la aplicación DLL.

48 Error de carga de la DLL.

49 Convención de llamada a DLL incorrecta.

51 Error interno.

52 Nombre o número de archivo incorrecto.

53 Archivo no encontrado.

54 Modo de acceso al archivo incorrecto.

55 Archivo ya abierto.

57 Error de entrada/salida de dispositivo.

58 Este archivo ya existe.

59 Longitud de registro incorrecta.

61 Disco lleno.

62 La entrada de datos sobrepasa el final del archivo.

63 Número de registro incorrecto.

67 Demasiados archivos.

68 Dispositivo no disponible.

70 Permiso denegado.

71 El disco no está listo.

74 Imposible cambiar el nombre con una unidad de disco diferente.

75 Error en la ruta de acceso.
76 Ruta de acceso no encontrada.

91 Variable de objeto o variable de bloque With no definida.

92 Bucle For no inicializado.

93 Formato de cadena incorrecto.

94 Utilización incorrecta de Null.

97 Imposible llamar a un procedimiento Friend de un objeto que no tiene una
instancia definida.

98 Una llamada a una propiedad o a un método no puede hacer referencia a
un objeto privado, ni como argumento ni como valor de retorno.

298 Imposible cargar la DLL de sistema.

320 Imposible utilizar nombres de dispositivos de caracteres en los nombres de
archivos especificados.

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

Constante Valor Descripción

vbBlack 0x0 Negro

vbRed 0xFF Rojo

vbGreen 0xFF00 Verde

vbYellow 0xFFFF Amarillo

vbBlue 0x0FF0000 Azul

vbMagenta 0x0FF00FF Magenta

vbCyan 0x0FFFF00 Cián

vbWhite 0x0FFFFFF Blanco

2. Constantes de fecha

Constante Valor Descripción

vbSunday 1 Domingo

vbMonday 2 Lunes

vbTuesday 3 Martes

vbWednesday 4 Miércoles

vbThursday 5 Jueves

vbFriday 6 Viernes

vbSaturday 7 Sábado

3. Constantes de teclas teclado alfanumérico
Los valores de las teclas A a Z son los mismos que sus equivalentes ASCII.

Constante Valor Descripción

vbKeyA 65 Tecla A

vbKeyB 66 Tecla B

vbKeyC 67 Tecla C

... ... ...

vbKeyZ 90 Tecla Z

Los valores de las teclas 0 a 9 son los mismos que sus equivalentes ASCII.

Constante Valor Descripción


vbKey0 48 Tecla 0

vbKey1 49 Tecla 1

vbKey2 50 Tecla 2

... ... ...

vbKey9 57 Tecla 9

4. Constantes de teclas de función

Constante Valor Descripción

vbKeyF1 0x70 Tecla F1

vbKeyF2 0x71 Tecla F2

... ... ...

vbKeyF11 0x7A Tecla F11

... ... ...

vbKeyF16 0x7F Tecla F16

5. Constantes de teclas diversas

Constante Valor Descripción

vbKeyCancel 0x3 Tecla CANCELAR

vbKeyBack 0x8 Tecla [Retroceso]

vbKeyTab 0x9 Tecla [Tab]

vbKeyClear 0xC Tecla SUPR

vbKeyReturn 0xD Tecla [Intro]

vbKeyShift 0x10 Tecla [Mayús]

vbKeyControl 0x11 Tecla [Ctrl]

vbKeyMenu 0x12 Tecla MENÚ

vbKeyPause 0x13 Tecla [Break]

vbKeyCapital 0x14 Tecla [Bloq Mayús]

vbKeyEscape 0x1B Tecla [Esc]

vbKeySpace 0x20 Tecla ESPACIO

vbKeyPageUp 0x21 Tecla [Re Pág]

vbKeyPageDown 0x22 Tecla [Av Pág]

vbKeyEnd 0x23 Tecla [Fin]

vbKeyHome 0x24 Tecla [Inicio]

vbKeyUp 0x25 Tecla [Flecha arriba]

vbKeyDown 0x26 Tecla [Flecha abajo]

vbKeyRight 0x27 Tecla [Flecha derecha]

vbKeyLeft 0x28 Tecla [Flecha izquierda]

vbKeySelect 0x29 Tecla SELECCIONAR


vbKeyPrint 0x2A Tecla [Impr Pant]

vbKeyExecute 0x2B Tecla EJECUTAR

vbKeySnapshot 0x2C Tecla [Impr Pant]

vbKeyInsert 0x2D Tecla [Insert]

vbKeyDelete 0x2E Tecla [Del]

vbKeyHelp 0x2F Tecla AYUDA

vbKeyNumlock 0x90 Tecla [Bloq Mayús]

vbKeyLButton 0x1 Botón izquierdo del ratón

vbKeyRButton 0x2 Botón secundario del ratón


Métodos abreviados

[F1] Ayuda  acerca  de  la  palabra  clave  en  la  que  se  encuentra  el
cursor.

[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.

También podría gustarte