You are on page 1of 49

Programar Eventos en Access 2007.

Página 1 de 49

Online Los formularios y cada uno de sus componentes


tienen adheridos varias propiedades que podemos
visualizar de dos maneras.

 Dando doble clic sobre el elemento en vista de


diseño
 Utilizando el icono de
propiedades al momento de tener
señalado el elemento.

Las propiedades manejan en la gran mayoría 5 pestañas


<Formato, Datos, Eventos, Otras, Todas>. Cada una de
ellas atiende una parte en particular del elemento, y
son agrupadas en la pestaña <Todas>.

Formato. Se ocupa de la presentación del elementos


como (Si es posible maximizar ó Minimizar), Estilo de
los bordes, distribución de la imagen si existe alguna,
Color del fondo, Color del texto. Sii es un formulario nos
permite definir la forma de presentación etc. Cuando
usted busque hacer un cambio en la presentación lo
hacemos por medio de la pestaña formulario.
Datos. Es muy variable, pero evalúa como se debe
comportar los datos. Si sobre el elemento se agrega
información la podemos condicionar como: (Bloquear
edición, Texto de validación, Valor predeterminado)
Eventos. Una de las partes más importantes de las propiedades. Los eventos se comportan de forma transparente
mientras no se adicione código; es mediante Visual basic, donde logramos que el formulario y sus campos hagan
las cosas que queremos.
Otras. Cosas anexas, seria mirar o involucrarlas dentro de los ejemplos.

Veamos algo de programación e iremos estructurando en ejemplos utilizando cada evento de los objetos.

Podemos decir que existen muchos lenguajes de programación y algunas formas conocidas de programar.

1- Secuencial (El lenguaje va en una dirección y solo ejecuta la sentencia siguiente si la anterior ya se ha ejecutado)
Ejemplo (C, Cobol, PlSql, Pascal)
2- Eventos (Es más un complemento entre aplicativo y lenguaje. El aplicativo crea los eventos y el lenguaje se ubica
en cada uno de ellos para que el usuario lo ejecute según el proceso lo requiera) Ejemplo MsAccess(Visual Basic),
Unify(Accell IDS), FormsDeveloper(PlSql), JavaDeveloper(Java)
3- Objetos (Los objetos <Elementos del mundo real> se crean para mejorar los lenguajes de programación
Secuencial, donde se hace una reutilización de código optimizando y acortando los programas) Ejemplo Java, C++,
C#, Java, J#

Existen muchas formas de crear programas y lenguajes, pero podríamos decir que las mencionadas son las más conocidas.
En este curso de programación utilizaremos Visual Basic como un lenguaje orientado a eventos con Access 2007.
Programar Eventos en Access 2007. Página 2 de 49

Visual Basic, es un lenguaje que podemos utilizar en muchos paquetes como (office, CorelDraw, AutoCad, Punto Net). Por
consiguiente su sintaxis puede variar con palabras reservadas de cada aplicativo, pero un gran porcentaje es igual.

Cuando trabajamos Access, encontramos 3 tipos de Módulos. Los módulos es el recipiente donde vamos a guardar el
código de Visual Basic.

Existen en Access. Modulo (Generales para ubicar variables y métodos públicos, de Clase que contienen los formularios)

Iniciemos creando un nuevo Módulo; Para hagamos lo siguiente.


 Herramientas de Base de datos.
 Visual Basic

El modulo esta vacio excepto por una ó dos líneas al inicio

Y una en este caso.


Debemos tener en cuenta que falta una segunda línea conocida como
<Option Explicit>; En que afecta la ausencia de esta línea adicional. Cuando
no aparece declarada el aplicativo no obliga a que las variables que utilicemos estén declaradas (Nombre y tipo de dato) .
Si al crear el modulo no está dentro de las declaraciones, vamos a:
 Herramientas
 Opciones
 Requerir declaración de Variables.

Al cerramos el modulo que acabamos de crear y creamos


uno nuevo, nos debe aparecer Option Explicit

1. Cerremos el módulo y creemos un formulario. Este


formulario lo crearemos en: Crear  Diseño del
Formulario. Guardémoslo como saludo.

2. Añadamos una etiqueta con la palabra saludo.


3. Vamos a la hoja de propiedades de la etiqueta y -
coloca
mos en
Programar Eventos en Access 2007. Página 3 de 49

el nombre LblSaludo, desde la pestaña <Todas>


- En la pestaña Formato vamos a Color del texto y colocamos Rojo, tamaño de la fuente 24 y alineación del
texto <centro>
-

4. Añadamos un botón.
Ignoremos el cuadro que aparece al crearlo dando cancelar. Ingresemos a las
propiedades del botón y coloquemos en el nombre cmdSaludo y en Titulo Saludo

5. Entremos a las propiedades del formulario en la pestaña Formato y definamos a No las siguientes opciones.
- Separadores de Registro
- Selectores de Registro
- Botones de desplazamiento
6. Pestaña Formato Propiedad Centrado automático en Sí y el Título Código Inicial
7. Coloquemos un cuadro alrededor y demos un relieve.

8. Vamos Ver  Vista de formulario y debe verse de esta manera. Si presionamos el botón de Saludo no pasa nada;
entonces lo siguiente es crear el código para que cuando presionemos aparezca un mensaje que diga “!
Felicitaciones este es mi primer Código!”

Ya tenemos un formulario una serie de elementos que los acompañan <Etiqueta, botón y el mismo formulario>, cada
uno de ellos tienen propiedades y eventos que responden. Los eventos responden a métodos que están explícitos en
Access <al hacer clic, al hacer doble clic, al entrar, al salir etc>.
Ejemplo. Si damos clic sobre el botón cmdSaludo (Saludo) podemos aprovechar ese evento para hacer una acción
como por ejemplo cambiar el texto de la etiqueta LblSaludo. Hagámoslo entonces.
 Vamos a vista de diseño y sobre el botón cmdSaludo ingresemos a sus propiedades  pestaña Eventos  al
hacer clic.

 Demos clic en los tres puntos del lado derecho, seleccionamos generar código y damos aceptar
Programar Eventos en Access 2007. Página 4 de 49

Se abre un modulo de formulario y en el dos partes importante


1- Option Explicit <Declarar cualquier variable que sea declarada>
2- El encabezado y final del procedimiento correspondiente al evento donde nos hemos ubicado.
 El código que vamos a crear se debe hacer entre Private Sub NombreProcedimiento y End sub. Hagamos dos
cosas.
 Vamos a colocar en la etiqueta LblSaludo un texto que afecte la propiedad Titulo, <Caption> “!
Felicitaciones este es mi primer Código!”
 En la propiedad Titulo, <caption> del formulario, un texto que diga Formulario Inicial.
 Como la letra que tenemos es demasiado grande, entonces coloquemos un tamaño de letra menor
con la propiedad <Fontsize>

El código que
acabamos de crear tiene una palabra llamada Me; esta se refiere al formulario actual

Esta sería la manera de identificar el formulario de forma específica.

 Ya hemos creado un pequeño código, ahora veamos que ventanas tenemos a disposición en el entorno de
trabajo.
Programar Eventos en Access 2007. Página 5 de 49

Ventana de
código. Donde
escribimos cada
método del
formulario.
Explorador de
proyecto.
Tenemos todos los
módulos
asociados a
nuestra aplicación
y al dar doble clic
sobre cualquiera
de ellos lo
veremos en la
ventana de
código.
Ventana de
Inmediato. Con
ella podemos
hacer
comprobaciones
del programa
(Depurar). Ejemplo imprimiendo un mensaje cuando el programa pasa por alguna rutina.
Locales. Exponer el valor de una variable de la cual no sabemos qué valor puede estar tomando y nos este
causando un posible error.

Cómo usar la ventana Inmediato. Hagamos un ejemplo con la ventana inmediato, escribiendo sobre ella.
Si hacemos una suma y utilizamos la palabra reservada Print.
Podemos hacer varias operaciones e incluso crear variables como a
y c que a su vez podemos llamar para hacer más operaciones; como

elevar a a la

potencia de c.
Si presionamos

el botón veremos que las variables que hemos creado en la ventana Inmediato se han inicializado. Cuando volvemos

hacer la operación de a a la potencia de c, el valor es 1.


Si ahora colocáramos la siguiente expresión, no nos daría 6 si no 24 ya que como ambos valores están entre comillas el
aplicativo lo asume como texto y el operador mas (+) los concatena.

Hablemos ahora de constantes y Variables. Las constantes son valores que no cambian Ejemplo.
PI = 3,1416, Iva = 16% y variable es algo que tiende a tener varios valores en el tiempo. Ejemplo
Edad, Peso, tiempo, Precio etc.
Programar Eventos en Access 2007. Página 6 de 49

Para trabajar en Access con variables y constantes, debemos hacerlo con dos palabras reservadas CONS y DIM
Ejemplo
Cons Pi As Double = 3.1416 Constante
Dim Edad as Currency Variable
Dim Nombre as String Variable
Dim Valor as Variant Variable

Ahora si vamos a la ventana Inmediato y colocamos Print pi y damos enter que pasaría ?. Si lo hacemos no sucede
nada debido a que existe algo llamado Ámbito ó alcance. Ambos términos se refieren a que Visual Basic puede conocer si
la variable existe, si retomamos a Pi y esta vez le agregamos la palabra reservada Public podemos tratar nuevamente con
la ventana Inmediato.

Que sucede con las variables que deseamos colocar públicas, estas tienen el mismo tratamiento, excepto que
reemplazamos la palabra Dim por Public
Si en la ventana inmediato intentáramos colocar un nuevo valor a
Pi, resultaría un error debido a que tiene un valor constante que se
puede cambiar solamente donde esta declarado.

Han surgido otros tipos de valores cuando hemos visto como


declarar variables. Currency (Moneda), String (texto) , Variant (Este tipo de variable puede recibir casi cualquier cosa 
Texto, Numeros, boolean

Tenemos bases ya para crear procedimientos y funciones.


Los procedimientos y las funciones son un conjunto de instrucciones que realizan una tarea determinada. El
procedimiento está encerrado entre Sub y End Sub, las funciones entre Function y End Function. Ambos los
procedimientos y las funciones pueden utilizar parámetros que utilizan internamente y que se pasan para una labor
especifica.
Programar Eventos en Access 2007. Página 7 de 49

Hagamos otro procedimiento pero esta vez que nos muestre el resultado de las variables en la ventana
inmediato.

Longitud de la circunferencia 2 * Pi * R
Área del circulo es igual Pi * R^2
Si damos colocamos en la ventana Inmediato
Circunferencia Enter

Nos mostrará estos valores.

Ahora hagamos el mismo ejemplo pero con parámetros.

Al momento de llamarlo en la ventana


Inmediato debemos agregar el valor del
parámetro.

Esto con respecto a los parámetros pero también podemos hacer


funciones. Las funciones se destacan por que siempre devuelven un valor al
momento de terminar su ejecución

La función tiene dos parámetros y devuelve un valor del mismo tipo haciendo el ejemplo en la ventana inmediato nos
podemos dar cuenta.

Hagamos una pequeña calculadora que nos permita sumar dos cifras, para ello creemos otro formulario en vista de
diseño.
1- Crear el formulario
2- Insertar dos cuadros de texto.
3- Coloquemos como nombre al cuadro de texto 1 TxtSuma1 y al cuadro de texto 2 TxtSuma2 (Propiedades  Todas
 Nombre)
4- A las etiquetas de cada cuadro de texto coloquemos Operando 1 y Operando 2 respectivamente
5- Insertamos un botón y coloquemos como nombre cmdSumar y titulo Sumar
6- Es importante tener en cuenta que los nombres de las variables deben tener un sentido para que si alguien revisa
el código incluso uno mismo después de un tiempo, podamos entender que hace cada variable.
7- Coloquemos una etiqueta por encima de TxtSuma1 con texto de color rojo que diga Resultado y el nombre dentro
de las propiedades debe ser LblResultado
Programar Eventos en Access 2007. Página 8 de 49

8- Sobre el botón cmdSumar hagamos un método con el evento Click

Al momento de colocar un valor en operando 1 y operando 2, damos clic en el botón sumar y dentro de
resultado debe aparecer el cálculo.

Haga usted los botones de Multiplicación División, Resta, elevar a una potencia y limpiar resultado colocando
nuevamente la palabra resultado

Entendamos y trabajemos con Variables. Como hemos comentado las constantes se declaran y se asignan y
luego no es posible cambiar su contenido.
Ahora si hablamos de variables esta condición no se aplica. Las variables deben tener tres componentes
primordiales.
- Nombre
- Tipo
- Ambito
Qué condiciones debemos tener en cuenta para crear un nombre. Los nombre de las variables son
alfanuméricos pero:
 No deben tener caracteres que sean de uso especial en Access, como (Paréntesis, Pipe |, Punto, Los
caracteres que se pueden utilizar como caracteres (+,/,-,<>,*)
 Una variable debe empezar por un letra ó por el signo de subrayado Ejemplo.
A123463 _hola Rxyz
 Una variable no puede tener espacios en blanco. Ejemplo Apellidos Nombre, debería ser
Apellidos_Nombre
 Una variable puede terminar con un carácter de declaración de tipo %, &, ¡, #, @, $. Tenga en
cuenta que solo pueden ir al final de la variable. Ejemplo si crea una función Public Function
Nombre$ ()
 No se pueden utilizar palabras reservadas del VBA. Por ejemplo String, Integer, For, If
 El nombre d una variable puede tener hasta 255 caracteres.
Programar Eventos en Access 2007. Página 9 de 49

 No se puede declarar dos variables con el mismo nombre dentro del mismo procedimiento o en
la cabecera de un mismo módulo.

Tipo de datos. Que tipos de datos podemos manejar?


- Numéricos
- Booleanos
- Fecha/Hora
- Texto
- Variant
- Registros definidos por el usuario
- De objeto
Veamos cada uno de ellos. Para el caso de los numéricos, existen dos familias (Número entero y de coma
flotante)
Enteros.
Nombre del Tamaño Valor Inferior Valor Sufijo Prefijo
tipo Superior
Byte 1 Byte 0 255 Byt
Integer 2 Bytes -32.768 32.767 % Int
Long 4 Bytes - 2.147.483.648 & Lng
2.147.483.648

Cuando vemos prefijo quiere decir que podemos iniciar nuestra variable con él para saber a qué tipo pertenece
la variable lngSalario. Si hablamos de Sufijo este se puede colocar para obviar el tipo al que pertenece. Ejemplo
Dim lngSalario& es equivalente a Dim lngSalario as Long.
Hagamos un ejemplo con una constante.

Public Const intMesesAño As Integer = 12  Equivale a Public Const ingMesesAño% = 12

Números de coma flotante. Este tipo de dato admite valore enteros y decimales. Ejemplo
3.141615214111 2.71825182231 2856.1# 4.00!
Veamos cómo se clasifican.
Nombre Tamaño Negativos Positivos Sufijo Prefijo
Single 4 Bytes De -3,402823E38 a - De 1,401298E-45 a ! sng
1,401298E-45 3,402823E38
Double 8 Bytes De - De 4,94065645841247E- # dbl
1.79769313486231E308 324
a -4,94065645841247E-324 a 1,79769313486231E308
Currency 8 Bytes De - De 0 a @
922337203685477,5808 a 0 922337203685477,5808
Decimal 12 Bytes - 79.228.162.514.264.337.59 & dec
79.228.162.514.264.337.59 3.543.950.950.335
3.543.950.950.335

Tipo Date. El tipo para manejar datos de Fecha y hora. El tipo Date es un tipo Double al utilizar 8Bytes y se
puede usar como prefijo dat. Ejemplos.
Programar Eventos en Access 2007. Página 10 de 49

Public Sub fechaAhora()


Dim datFechaActual As Date
Dim datSemanaProxima As Date
Dim datAyer As Date
Dim datMañana As Date

datFechaActual = #1/20/2009 6:15:30 PM#


datSemanaProxima = datFechaActual + 7
datAyer = datFechaActual - 1
datMañana = datFechaActual + 1

Debug.Print "tipo date ", CDbl(datFechaActual)


Debug.Print "Ahora ", datFechaActual
Debug.Print "Prox. Semana ", datSemanaProxima
Debug.Print "Ayer ", datAyer
Debug.Print "Mañana ", datMañana

End Sub
Nota. Tengamos en cuenta que el formato de fecha utilizado es el americano Mes / Día / Año
Si vamos a colocar fechas a una variable todas estas son validas.
#1/20/2009 6:15:30#
#1/20/2009 6:15:30 PM#
#1/20/2009#
#1/20/09#
#01/20/09#
#18:15:30#

Tipo Boolean (boleano).


El tipo boleano es apropiado para evaluar datos de Si /No (True, False).
El prefijo para un boleano es bln. Ejemplo los siguientes valores se pueden utilizar sin problema alguno.
blnDatoBoleano = True
blnDatoBoleano = False
blnDatoBoleano = -1 Verdadero
blnDatoBoleano = 0 Falso

Con lo anterior para definir la variable a falso o verdadero se llenar con False ó 0 y True ó -1; Otra forma de
asignarle seria colocar una expresión que devuelva True ó False. Ejemplo blnDatoBoleano = 8 < 7, el resultado
sería Falso o viceversa blnDatoBoleano = 7 < 8, el resultado sería Verdadero.

Tipo String (Cadena). Especializado para guardar texto, el signo $ pesos actúa como sufijo para declarar en lugar
del tipo y String para determinar su tipo amanera de información. Ejemplo Dim strNombre As String
Dim strNombre$
Programar Eventos en Access 2007. Página 11 de 49

Para declarar una variable de longitud fija se utiliza el asterisco (*) y a continuación el número de caracteres
permitidos.
Dim strCuentaCorriente As String * 20 (De malo tiene que si usted no llena la variable con los caracteres que
establece el sistema los llena con espacios en blanco.)
Ejemplo strCuentaCorriente = “cta12582”. Al colocar 8 caracteres se llenaran 12 con espacios en blanco.
En teoría una cadena podría admitir hasta 2^31  2000 millones de caracteres.

Tipo Variant. Este tipo de dato puede tener prácticamente cualquier tipo de dato. El prefijo es var. Cuando
declaramos una variable o constante sin expresar el tipo, automáticamente queda de tipo Variant

Empty, Null, Cadena vacía. Existen unos valores que no son ni texto ni números. En los casos de tipo Variant si
no se define un valor, por defecto tiene vacio; con IsEmpty(Variable) se puede evaluar el contenido de la
variable, si está vacía devuelve True.

Declaraciones múltiples en una línea. Visual nos permite declarar en una línea varias variables a la vez.
Dim lngSalario As Long, strNombre As String.

Valores por defecto. Las variables se crean y toman un valor inicial antes que asignemos un valor sobre alguna
de ellas. Ejemplo.
Boolean toma el valor False ó 0
String Cadena vacia “”
Variant toma el valor Empty

Ambito ó alcance de una declaración. El alcance lo hemos visto al declarar una variable al decir Dim (visible
dentro del procedimiento ó en la cabecera es visible dentro de los procedimientos del módulo) , Public (Visible
desde cualquier parte de la aplicación), Global(Es muy similiar a Public, generalmente no se ve mucho, en su
lugar se utiliza Public), Private (Declarada en la cabecera es visible en el módulo, se puede decir que Dim y
Private son muy similares, solo que dentro de los procedimientos se utiliza Dim en lugar de Private) , Static,
Friend

Matrices ó Arrays. Es un conjunto de variables del mismo tipo, a las que se puede acceder mediante un índice,
que indica la posición de cada elemento.

Hagamos un ejemplo con los meses del año. Que podríamos hacer con los que sabemos hasta ahora
Public Mes01 As Integer, Mes02 As Integer
Public Mes03 As Integer, Mes04 As Integer
Public Mes05 As Integer, Mes06 As Integer
Public Mes07 As Integer, Mes08 As Integer
Public Mes09 As Integer, Mes10 As Integer
Public Mes11 As Integer, Mes12 As Integer
Programar Eventos en Access 2007. Página 12 de 49

Public Sub CargarMeses ()


Mes01 = 31
Mes02 = 28
Mes03 = 31
Mes04 = 30
Mes05 = 31
Mes06 = 30
Mes07 = 31
Mes08 = 31
Mes09 = 30
Mes10 = 31
Mes11 = 30
Mes12 = 31
End Sub

Esta sería la manera de hacer una declaración con lo visto hasta el momento, pero si estamos hablando de
Arrays podemos optimizar el proceso. Primero declaremos una variable Arrays

Public Mes(12) As integer -- Se optimiza la declaración de variables

Public Sub CargarMeses ()


Mes(1) = 31
Mes(2) = 28
Mes(3) = 31
Mes(4) = 30
Mes(5) = 31
Mes(6) = 30
Mes(7) = 31
Mes)8) = 31
Mes(9) = 30
Mes(10) = 31
Mes(11) = 30
Mes(12) = 31
End Sub

Existe una forma más directa para hacer el mismo proceso

Dim Mes () As Variant Comentario [FGH1]: Por facilidad en


la comprensión del código se colocan los
valores en dos líneas; para hacerlo al
finalizar cada una de ella colocamos un
Public Sub CargarMeses () guion al piso _
Mes = Array (0,31,28,31,30,31,30, _ Si vemos existe un cero al inicio del Array,
31, 31, 30, 31, 30,31) esto debido a que el índice de inicial de un
array es Cero y cuando llamemos el mes de
Enero inicie en el índice 1
Programar Eventos en Access 2007. Página 13 de 49

End Sub

Si colocamos este ejemplo dentro de un modulo general podemos entender mejor.

Public Sub CargarMeses()


Dim Mes() As Variant
Mes = Array(0, 31, 28, 31, 30, 31, 30, _
31, 31, 30, 31, 30, 31)

Debug.Print "Enero tiene " & Mes(1) & " Días"


Debug.Print "Febrero tiene " & Mes(2) & " Días"
Debug.Print "Marzo tiene " & Mes(3) & " Días"
Debug.Print "Abril tiene " & Mes(4) & " Días"
Debug.Print "Mayo tiene " & Mes(5) & " Días"
Debug.Print "Junio tiene " & Mes(6) & " Días"
Debug.Print "Julio tiene " & Mes(7) & " Días"
Debug.Print "Agosto tiene " & Mes(8) & " Días"
Debug.Print "Septiembre tiene " & Mes(9) & " Días"
Debug.Print "Octubre tiene " & Mes(10) & " Días"
Debug.Print "Noviembre tiene " & Mes(11) & " Días"
Debug.Print "Diciembre tiene " & Mes(12) & " Días"

End Sub

Según estos tres casos como podemos acceder a cada mes del año.
1- En la primera declaración, lo hacemos llamando la variable que hemos creado; si necesitáramos el mes
de Julio invocaríamos entonces la variable Mes07
2- Para los dos casos siguientes colocamos la variable Mes(7) y el numero de índice dentro del Array = 7
para Julio 6 para Junio y así.
3- Creeríamos entonces que los dos últimos métodos son mejores y para este caso en particular de los
meses, la declaración final es mucho mas practica.

Veamos Arrays de varias dimensiones ó Matrices. Al hablar de varias dimensiones, estamos hablando de
manejar más de un índice.

Ejemplo. Debemos hacer un programa que maneje tres variables. Nos solicitan que guardemos el número de
personas que viven en un barrio cuya nomenclatura es la siguiente <Etapa, Manzana, Casa> Etapa = esta de la 1
a la 10, Manzana = de 0 a la 15 y Casa = de la 1 a la 20
Si creamos una Matriz que cobije este planteamiento lo debemos plantear así:
Dim ZonaVivienda (1 To 10, 0 To 15, 1 To 20) As Integer
Programar Eventos en Access 2007. Página 14 de 49

Si en la Etapa 2 Manzana 5 Casa 9 la habitan 5 personas, debemos llenar nuestra variable de la siguiente
manera. ZonaVivienda(2,5,9) = 5

Registros. Estructuras de variables definidas por el usuario. Cuando decimos definido por el usuario, queremos
decir que nosotros lo hacemos con nuestros datos. Ejemplo queremos tener un registro de los datos personales
del cliente, debemos entonces crear un registro con estos datos y para ello crearemos las variables necesarias
Public strPrimerNomb As String
Public strSegundoNomb As String
Public strPrimerApell As String
Public strSegundoApell As String
Public datFechaNaci As Date
Public strTelefono As String
Public intEdad As Integer

De esta manera tendríamos 7 variables para llenar los datos necesarios del cliente. La estructura nos dice que
podemos crear una variable que cobije todas bajo un mismo nombre y comportarse como un nuevo tipo de
dato.

Public Type Persona


PrimerNomb As String
SegundoNomb As String
PrimerApell As String
SegundoApell As String
FechaNaci As Date
Telefono As String
Edad As Integer
End Type
‘ Type y End Type : Nos permiten crear estructura y deben ser escritas en la cabecera del modulo
Public Sub PersonaEstructura ()
Dim Cliente As Persona
Dim Vendedor As Persona

Cliente. PrimerNomb = “Jhon”


Cliente. SegundoNomb = “Mario”
Cliente. PrimerApell = “Gimenez”
Cliente. SegundoApell = “Gonzalez”
Cliente.FechaNaci = #01/28/1980#
Cliente.Edad = 29
Cliente.Telefono = 74511282

‘Imprimamos el valor del registro


Programar Eventos en Access 2007. Página 15 de 49

Debug.print “Cliente: Nombre complete “ & cliente.PrimerNomb & “ “ & cliente.SegundoNomb & “ “ &
Cliente.PrimerApell & “ “ & Cliente.SegundoApell
Debug.print “Nacio el “ & Cliente.FechaNaci
Debug.print “Edad “ & Cliente.edad
Debug.print “ Telefono “ & Cliente.Telefono

‘Utilicemos la segunda variable Vendedor y hagamos el mismo llenado pero esta vez utilizando otra ayuda de
visual como es With, el cual nos obvia colocar el nombre de la variable hasta encontrar un End With

With Vendedor
. PrimerNomb = “Pedro”
. SegundoNomb = “Pablo”
. PrimerApell = “Jaramillo”
. SegundoApell = “Perez”
.FechaNaci = #01/28/1975#
.Edad = 34
.Telefono = 73574226

Debug.print “Vendedor : Nombre completo “ & .PrimerNomb & “ “ & .SegundoNomb & “ “ &
.PrimerApell & “ “ & .SegundoApell
Debug.print “Nacio el “ & .FechaNaci
Debug.print “Edad “ & .edad
Debug.print “ Telefono “ & .Telefono
End With
End sub

Estructuras de Control. Son segmentos de código que permiten tomar decisiones en base a unos datos de
entrada ó repetir procesos (bucles) mientras se presenten condiciones determinadas.
- Estructuras de decisión.
 If ….. then
 If ….. tnen …… Else
 If ….. tnen …… Elseif
 Select ..... Case

- Estructuras de Bucle.
 For ... Next
 For Each .. In .. Next
 While ..... Wend
 Do .... Loop

Veamos cada una de ellas. If. Permite ejecutar un grupo de instrucciones de código, en función de
que el valor de una expresión sea Cierta (True) ó Falsa (False)
Programar Eventos en Access 2007. Página 16 de 49

Ejemplo.
If Numero > 0 then
MsgBox “Valor Mayor a cero “
End If
El If ….. Then…… Else, nos permite asumir otra opción en caso que la primera condición sea falsa
If Numero > 0 then
Msgbox “Valor Mayor a Cero “
Else
MsgBox “No hay valor que reportar “
End if

El If ….. then …… Elseif , no ayuda a evaluar varias opciones ciertas si fuera del caso. Ejemplo.
If Numero = 80 then MsgBox “ Ya pagaron y completo “
Elseif Numero > 80 then MsgBox “ Aprobaron el aumento? “
Elseif Numero >= 40 then MsgBox “ Que paso ? y el resto ! “
Elseif Numero > 0 And Numero < 40 then MsgBox “ Y entonces ahora que hacemos ? “
Else MsgBox “ Vaya pregunte “
End If

Ahora Select Case, permite semejar If anidados para dejar el código un tanto más elegante y legible.

Select Case nuResultado ‘El valor que tenga nuResultado es evaluado por cada Case.
Case 0
MsgBox " No hubo cálculo alguno”
Case Is < 10, Is > 0
MsgBox " Se hizo un Cálculo”
Case 11 To 100
MsgBox " Esta dentro del rango”
Case 120, 130, 140
MsgBox " Es 120 ó 130 ó 140”
Case Else
MsgBox "Nada que Evaluar"
End Select

Bucles. For … Next.


For contador = principio To fin [Step increment]
Instrucciones
[ Exit For]
Next Contador
Para entender esta estructura hagamos un ejemplo con el valor factorial.
Programar Eventos en Access 2007. Página 17 de 49

Public Function Factorial (ByVal intVal As Integer) As Double


Dim intVal1 As Integer
Dim ingResul As Double
ingResul = 1
For intVal1 = 1 To intVal
ingResul = ingResul * intVal1
Next intVal1
Factorial = ingResul
ingResul = 0
End Function

Mejoremos el diseño con un Select Case.

Public Function Factorial (ByVal intVal As Integer) As Double


Dim intVal1 As Integer
Select Case intVal
Case Is < 0
MsgBox " El valor debe ser mayor a cero ", vbCritical + vbOKOnly, " Error de Factorial”
Exit Function
Case 0
Factorial = 1
Exit Function
Case Else
Factorial = 1
For intVal1 = 1 To intVal
Factorial = Factorial * intVal1
Next intVal1
Case Else Msgox “No es un valor para sacar Factorial ", vbCritical + vbOKOnly
End Select
End Function

Podemos anidar los For ... Next , colocar uno dentro de los otros. Para ver cómo trabaja, hagamos un
ejemplo.

Public Sub TablasMultiplicar()


Dim n As Integer, m As Integer
Programar Eventos en Access 2007. Página 18 de 49

'El primer For hace un recorrido e ingresa al segundo que hace 10 ciclos
'Tengamos en cuenta que <n> va de 1 en 1 hasta llegar hasta 10, pero cuando <n> es igual a 1
'<m> va de 1 a 10, cuando <n> es igual a 2 <m> va de 1 a 10 y asi
For n = 1 To 10
Debug.Print "---------------"
For m = 1 To 10
Debug.Print n & " x " & m & " = " & n * m
Next m
Next n
End Sub

Veamos While ... Wend.


While condición
[ Instrucciones ]
Wend
La condición nos devuelve un valor Falso o Verdadero para continuar o terminar el proceso. Ejemplo.

' Si cada 4 años es biciesto, este ejemplo inicia desde 1980 hasta el 2012 donde se detiene
Public Sub Biciesto()
Dim intAño As Integer
intAño = 1980
While intAño <= 2012
Debug.Print intAño
intAño = intAño + 4
Wend
End Sub

Se utiliza while ... Wend para leer archives, veamos un ejemplo y creemos un archivo datos.txt en una ruta
específica para utilizar

Public Sub MuestraArchivo(ByVal strArchivo As String)


Dim intArchivo As Integer
Dim strLinea As String

intArchivo = FreeFile
Programar Eventos en Access 2007. Página 19 de 49

Open strArchivo For Input As #intArchivo ‘Lleva el indice de apertura del archivo a la variable
String strArchivo
While Not EOF(intArchivo) ‘Mientras no llegue al final del archivo haga lo siguiente
Line Input #intArchivo, strLinea ‘Pasa el valor que tiene #intArchivo a strLinea
Debug.Print strLinea
Wend
End Sub

Creemos el archivo.
Con el nombre datos.txt y hagamoslo en c:\. Dentro del archivo coloquemos este contenido.
Hola como le fue en estas vacaciones
Muy bien porque todos los míos gozan de bienestar
Doy gracias a Dios por esto y espero que la vida nos siga dando bendiciones
Pero a un mejor que ojala siempre las merezcamos
Para ejecutar el procedimiento, lo hacemos con esta sintaxis.
Muestraarchivo("c:\datos.txt")

Ahora Do… Loop Permite hacer algo adicional a While Wend y es que podemos salir antes que
temine el ciclo. Podemos ver dos formas de utilización.

Do While | Until Condición „Condición al inicio


Instrucciones
Exit Do
Instrucciones
Loop

Do
Instrucciones
Exit Do
Instrucciones
Loop While | Until Condición „Condición al final.

Hagamos un ejemplo averiguando si un número es primo ó no “Un numero es primo si el residuo es


igual a cero (0) al ser divisible solamente por sí mismo y la unidad”. Ejemplo 1, 2, 3, 7, 15, 17,151
'Trabajar con numero primos utilizando Do ... Loop
Public Sub NumeroPrimo(intPrimo As Integer)
Dim intNumero As Integer

Select Case intPrimo


Programar Eventos en Access 2007. Página 20 de 49

Case Is < 1
Debug.Print " Número fuera de Rango”
Case 1, 2, 3
Debug.Print intPrimo & " Es Primo”
Case Else
intNumero = 2
Do While intNumero <= intPrimo
If intPrimo Mod intNumero = 0 And intNumero <> intPrimo Then
Debug.Print intPrimo & " No es primo " & intPrimo Mod intNumero
Exit Sub
ElseIf intPrimo Mod intNumero = 0 Then
Debug.Print intPrimo & " Es Primo " & intPrimo Mod intNumero
Exit Sub
End If
intNumero = intNumero + 1
Loop
End Select
End Sub

Nota: Para tener en cuenta en el código anterior es intPrimo Mod intNumero, está
tomando el valor del residuo al realizar la división Ejemplo.

7 Mod 3 = 1 porque Mod toma la parte entera y deja la parte que daría decimal como residuo. Si
hacemos esta misma división de forma normal, sería 3,5

Hagamos un formulario que nos permita verificar si un número es primo o no.


Ingrese un Cuadro de texto.
 Coloque en la etiqueta Numero a Evaluar y ubíquela
como la ve en la gráfica tomándola del cuadro que aparece en la
parte superior izquierda.
 Al cuadro de texto colóquele el nombre de
txtNumeroPrimo.

 Agreguemos un botón y sobre el coloquemos Clic … Es número Primo ?


 Coloquemos como nombre cmdPrimo
Programar Eventos en Access 2007. Página 21 de 49

 Necesitamos darle la funcionalidad al formulario para conocer si un número es primo o nó.


 El campo txtNumeroPrimo es quien tomara y sobre el cual se evaluará el número con
el cual trabajar.
 Vamos a trabajar con el procedimiento NumeroPrimo solo que vamos a convertirlo en
una función donde nos arroje verdad o falso. Llamemos la función FnumeroPrimo

Public Function FnumeroPrimo(intPrimo As Integer) As Boolean


Dim intNumero As Integer

Select Case intPrimo


Case Is < 1
MsgBox " Número fuera de Rango"
FnumeroPrimo = False
Case 1, 2, 3
FnumeroPrimo = True
Case Else
intNumero = 2
Do While intNumero <= intPrimo
If intPrimo Mod intNumero = 0 And intNumero <> intPrimo Then
FnumeroPrimo = False
Exit Sub
ElseIf intPrimo Mod intNumero = 0 Then
FnumeroPrimo = True
Exit Sub
End If
intNumero = intNumero + 1
Loop
End Select
End Function
Programar Eventos en Access 2007. Página 22 de 49

 Toda función devuelve un valor, en este caso la sintaxis para hacerlo dentro
FnumeroPrimo es colocar FnumeroPrimo = False o True.
 Debemos crear una fracción de código que permita hacer el proceso de verificación
en cmdPrimo, en el evento de hacer clic

Private Sub cmdPrimo_Click()


If IsNull(Me.txtNumeroPrimo) Then ‘Con esta fracción de código, está evaluando que haya un valor
digitado para verificar si es primo o no
MsgBox "No hay valor alguno para evaluar .. "
ElseIf FnumeroPrimo(CInt(Me.txtNumeroPrimo)) Then ‘ En caso de existir un valor a evaluar se
envía a la función para que retorne Falso o verdadero y colocar en la propiedad caption del botón un mensaje
Me.cmdPrimo.Caption = " Es numero Primo "
Else
Me.cmdPrimo.Caption = " No es numero Primo "
End If
End Sub

 Debemos cambiar el mensaje dentro del botón a medida que vamos evaluando otros
números

Para este caso coloquemos dentro del evento lo siguiente.


Private Sub txtNumeroPrimo_Change()
Me.cmdPrimo.Caption = "Clic .. Es número Primo?”
End Sub
Esto quiere decir que si hay algún cambio dentro del número a evaluar se colocará
<Clic .. Es numero Primo? > dentro de cmdPrimo

 Al final debe quedar como se ve en la gráfica.


Programar Eventos en Access 2007. Página 23 de 49

Gestión de errores. Cuando se trabaja en programación, debemos gestionar los errores que se
presentan en el aplicativo, veamos cómo hacerlo.

Vemos como si hay un error de sintaxis la línea de código se pone en rojo .

Si hemos olvidado declarar alguna variable y ejecutamos el código, podemos percibir el error. Estos
tipos de errores son muy comunes, pero son errores como este último a los que más debemos prestar
atención porque se dan en tiempo de ejecución y cada vez que aparecen detienen el proceso que se
esté llevando a cabo y no tiene muy buena presentación si en lugar de aparecer un texto ordenado y
predefinido se ve un error enviado por Access.

Los errores que se dan en tiempo de ejecución, son los que el usuario final se encontrará, resultado de
valores (datos) inesperados que no están siendo evaluados dentro del código. Ejemplos. División por
cero, Valore nullos (Vacios), diferencias de tipo de datos cuando queremos asignar el resultado de una
variable a otra ó abrir un archivo que no existe.
Programar Eventos en Access 2007. Página 24 de 49

--Sintaxis general.

Public Sub Salir()


On Error GoTo Err_Salir

DoCmd.Close

Exit_Salir:
Exit Sub

Err_Salir:
MsgBox Err.Description
Resume Exit_Salir
End Sub

Hagamos un ejemplo con Fprimo. Cuando averiguamos si un número es primo, estamos hablando
exclusivamente de números, por ende si digitáramos una letra el sistema nos debe generar un error de
proceso. Si digitamos la letra <a> y damos clic podemos ver un error similar al que presenta la gráfica.

La pantalla nos presentaría el error; esto no es bueno para el usuario final ver este tipo de
inconsistencias, por ende se debe capturar y generar un mensaje aclaratorio que le permita continuar y
que no detenga el accionar del aplicativo.

Actualmente el código programado trabaja de la siguiente manera para el botón cmdPrimo en el evento
al hacer clic.

Private Sub cmdPrimo_Click()

If IsNull(Me.txtNumeroPrimo) Then 'Con esta fracción de código, está evaluando que haya un valor digitado para verificar
si es primo o no
Programar Eventos en Access 2007. Página 25 de 49

MsgBox "No hay valor alguno para evaluar .. "


ElseIf FnumeroPrimo(CInt(Me.txtNumeroPrimo)) Then ' En caso de existir un valor a evaluar se envía a la función
para que retorne Falso o verdadero y colocar en la propiedad caption del botón un mensaje
Me.cmdPrimo.Caption = " Es número Primo”
Else
Me.cmdPrimo.Caption = " No es número Primo”
End If
End Sub

Capturamos el error que se da cuando digitamos una letra donde debe ir un número. Se debe hacer
de esta manera.

Private Sub cmdPrimo_Click()


On Error GoTo OjoError

If IsNull(Me.txtNumeroPrimo) Then 'Con esta fracción de código, está evaluando que haya un valor digitado para
verificar si es primo o no
MsgBox "No hay valor alguno para evaluar .. "
ElseIf FnumeroPrimo(CInt(Me.txtNumeroPrimo)) Then ' En caso de existir un valor a evaluar se envía a la función
para que retorne Falso o verdadero y colocar en la propiedad caption del botón un mensaje
Me.cmdPrimo.Caption = " Es número Primo”
Else
Me.cmdPrimo.Caption = " No es número Primo”
End If
Que_Sigue:
Exit Sub
OjoError:
MsgBox "Error No " & Err.Number & " --> " & Err.Description & " --> " & Err.Source, vbCritical
+ vbOKOnly, "Verificar Datos”

Resume Que_Sigue
End Sub

Explicación.
Para capturar el error se utiliza la sintaxis que está en color naranja y subrayado; hay cosas allí que
son de nuestra invención como (OjoError, Que_Sigue, Verificar Datos), estas frases las podemos
colocar a nuestro gusto; las demás son palabras claves y utilidades del lenguaje

Utilizamos un elemento básico dentro de la captura del error <Error>, este elemento nos va a permitir
conocer:
- El número de error <Err.Number>,
- Descripción del error <Err.Description>
- Nombre de la aplicación donde se genera el error. <Err.Source>
Programar Eventos en Access 2007. Página 26 de 49

Hay otras palabras reservadas dentro del Msgbox (Colocar mensajes para mostrar al usuario)

vbCritical + vbOKOnly, el primero de ellos coloca el signo y el segundo nos adiciona al cuadro

de dialogo el botón aceptar

Si colocáramos un en lugar de vbCritical a vbInformation, saldría de la siguiente manera.

Si estamos hablando de cómo se presenta el mensaje, queremos decir que al momento de


presentarse el error, el sistema va directamente a OjoError:. Los dos puntos son necesarios porque
visual Access asume que es una etiqueta donde llegar o un nombre que tiene significado; es en ese
momento donde nos genera el cuadro con la descripción del error. Posteriormente va a Resume
Que_Sigue, que se puede entender al final diríjase a; para el ejemplo a la etiqueta Que_Sigue, bajo
Programar Eventos en Access 2007. Página 27 de 49

esta etiqueta podemos colocar otro camino a seguir <procedimiento o función> o como vemos acá
solo nos salimos de la función para que el usuario pueda intentar nuevamente hacer su trabajo,
podríamos colocar Next para que el código continúe con la siguiente línea, pero debe tener coherencia
de tal manera no incurrir en una inconsistencia mayor.

Como generar nuestros propios errores. Con los cuales deseamos hacer notar al usuario que hace
falta un paso para continuar con el proceso.
Supongamos que solo vamos aceptar valores para evaluar como número primo que terminen en 1 y
cualquier otro nos generará error. Es necesario en este caso que coloquemos un generador de errores
que obligue a colocar este tipo de valores y no permita al usuario continuar hasta que haga lo que se
le pide. En este caso debemos hacer una validación del dato que determine si el número termina en 1.

La función original que evaluaba si un número es primo o no, era la siguiente.

Public Function FnumeroPrimo(intPrimo As Integer) As Boolean


Dim intNumero As Integer
Select Case intPrimo
Case Is < 1
MsgBox " Número fuera de Rango"
FnumeroPrimo = False
Case 1, 2, 3
FnumeroPrimo = True
Case Else
intNumero = 2
Do While intNumero <= intPrimo
If intPrimo Mod intNumero = 0 And intNumero <> intPrimo Then
FnumeroPrimo = False
Exit Function
ElseIf intPrimo Mod intNumero = 0 Then
FnumeroPrimo = True
Exit Function
End If
intNumero = intNumero + 1
Loop
End Select
End Function

Vamos a colocar dentro de ella un llamado a la siguiente función que nos permitirá generar un error,
no solamente acá si no de ahora en adelante en cualquier parte del código; basta pasarle los
parámetros necesarios.

Public Function ErrorProceso ( intNumError As Integer, strDescripcion As String ) As Boolean


On Error GoTo OjoError
'La palabra clave que debemos colocar ahora es necesaria para generar nuestro propio error
Err.Raise.
Programar Eventos en Access 2007. Página 28 de 49

Err.Raise intNumError, " ErrorProceso ", strDescripcion


Que_Sigue:
ErrorProceso = False
Exit Function
OjoError:
MsgBox "Error No " & Err.Number & " --> " & Err.Description, vbCritical + vbOKOnly, "VALORES
PERMITIDOS"
Resume Que_Sigue

End Function

La función utiliza Err.Raise intNumError, " ErrorProceso ", strDescripcion. Si vemos bien está
haciendo uso de los dos parámetros que están declarados dentro de los paréntesis cuando se declara
la función ErrorProceso.

Al crear la función que nos permite ahora generar nuestros propios errores, basta con hacer el
llamado dentro de la función original que determina si un número es primo o no.

Public Function FnumeroPrimo(intPrimo As Integer) As Boolean


Dim intNumero As Integer

If Right(CStr(intPrimo), 1) = CInt(1) Then


' Si el numero termina en 1 podemos continuar con el proceso de lo contrario generaremos nuestro
propio error
Select Case intPrimo
Case Is < 1
MsgBox " Número fuera de Rango"
FnumeroPrimo = False
Case 1, 2, 3
FnumeroPrimo = True
Case Else
intNumero = 2
Do While intNumero <= intPrimo
If intPrimo Mod intNumero = 0 And intNumero <> intPrimo Then
FnumeroPrimo = False
Exit Function
ElseIf intPrimo Mod intNumero = 0 Then
FnumeroPrimo = True
Exit Function
End If
intNumero = intNumero + 1
Loop
End Select
Else
FnumeroPrimo = ErrorProceso(514, " EL DATO NO TERMINA EN UNO !")
Programar Eventos en Access 2007. Página 29 de 49

End If
End Function

Podemos ver lo que hemos adicionado está en color Rojo y por demás subrayado. Inicialmente se
comprueba si el valor digitado tiene un uno (1) al final y de ser así continua con el proceso de lo
contrario, la función ErrorProceso es llamada llenando los dos parámetros con los cuales ha sido
declarada y necesario para que haga su trabajo interrumpiendo y aclarando al usuario que el valor
digitado no termina en uno (1).

Nota. El número de código de error que podemos utilizar, va desde el 513 hasta el 65535

Como colocar un botón en Access. El ejemplo lo haremos para cerrar el formulario Fprimo.
(Formulario de números primos)

Cuando hagamos el proceso, veremos que sale un asistente con los botones, seleccionamos
operaciones con formularios; Dentro de las opciones tomemos Cerrar Formulario y damos siguiente.
Programar Eventos en Access 2007. Página 30 de 49

Para este caso elegiremos la imagen por default (Salida), si desea elegir otra puede buscar por
examinar la que usted desee ó marcar texto y colocar algo sobre el botón que lo identifique.

Damos un nombre al botón <cmdSalir>; por último damos Finalizar y debemos ver algo como esto.

Funciones de Visual Basic.


Programar Eventos en Access 2007. Página 31 de 49

1- Convertir un texto de minúsculas a mayúsculas y viceversa


Format(“Cadena a mayúsculas”.”>”) como resultado obtendremos CADENA A MAYUSCÚLAS
Format("CADENA A MINÚSCULAS", "<") como resultado obtenemos cadena a minúsculas
Todo depende que signo utilicemos > ó <
Formato de Fechas
Format(Date, "dd/mm/yyyy")  01/12//2009
Format(Date, "yyyy/mm/dd")  2009/12/01
Format(Date, "mm/dd/yyyy")  12/01/2009
Format(Date, "mm")  12
Format(Date, "yyyy")  2010
Format(Date, "general date")  12/1/2009

Formato de numeros
Format(1044812, "#,###")  1,044,812
Format(1044812.08,”#.###.##”)  1,044,812.08
Format(1044812, "General Number")  1044812
Format(1044812, "Standard")  1,044,812.00

Este procedimiento nos demuestra cómo trabajan los formatos.

Public Sub funcionesVBA()


Debug.Print "Formatos de Texto "
Debug.Print "Funcion Format --> " & Format("Cadena a mayúsculas", ">")
Debug.Print "Funcion Format --> " & Format("CADENA A MINÚSCULAS", "<")
Debug.Print
Debug.Print "Formato de Fechas "
Debug.Print "Fecha --> " & Format(Date, "dd/mm/yyyy hh:nn:ss")
Debug.Print "Fecha --> " & Format(Date, "yyyy/mm/dd")
Debug.Print "Fecha --> " & Format(Date, "mm/dd/yyyy")
Debug.Print "Fecha --> " & Format(Date, "mm")
Debug.Print "Fecha --> " & Format(Date, "yyyy")
Debug.Print "Fecha --> " & Format(Date, "general date")
Debug.Print "Fecha --> " & Format(Date, "medium date")
Debug.Print "Fecha --> " & Format(Date, "Long date")
Debug.Print
Debug.Print "Formato de numeros "
Debug.Print "Formato de Miles --> " & Format(1044812, "#,###")
Debug.Print "Formato de Miles --> " & Format(1044812.08, "#,###.##")
Debug.Print "Formato general --> " & Format(1044812, "General Number")
Debug.Print "Formato general --> " & Format(1044812, "Standard")
End Sub

2- Trabajo con cadenas


Extraer una Subcadena Mid("HOLA COMO ESTAN", 10, 6)  ESTAN
Programar Eventos en Access 2007. Página 32 de 49

Extrae caracteres de la izquierda Left("HOLA COMO ESTAN", 4)  HOLA


Extrae caracteres de la derecha Right("HOLA COMO ESTAN", 6)  ESTAN
Longitud de la cadena Len(“HOLA COMO ESTAS”)  15
Para quitar espacios utilizamos las funciones LTrim  Izquierda, RTrim Derecha, Trim para
ambos lados.
LTrim(" HOLA COMO ESTAS ")  HOLA COMO ESTAS
RTrim(" HOLA COMO ESTAS ")  HOLA COMO ESTAS
Trim(" HOLA COMO ESTAS ")  HOLA COMO ESTAS

Como trabajan los formatos de cadena.

Public Sub funcionesVBA1 ()


Debug.Print "Extraer una Subcadena ' " & Mid("HOLA COMO ESTAN", 10, 6)
Debug.Print "Extraer caracteres de la izquierda --> " & Left("HOLA COMO ESTAN", 4)
Debug.Print "Extraer caracteres de la derecha --> " & Right("HOLA COMO ESTAN", 6)
Debug.Print "Longitud de una cadena --> " & Len("HOLA COMO ESTAS")
Debug.Print "Caracteres en blanco de la izquierda --> " & LTrim(" HOLA COMO ESTAS ")
Debug.Print "Caracteres en blanco de la derecha --> " & RTrim(" HOLA COMO ESTAS ")
Debug.Print "Caracteres en blanco Ambos lados --> " & Trim(" HOLA COMO ESTAS ")
Debug.Print "Código de los caracteres --> " & Asc("H") & "-" & Asc("0") & "-" & Asc("L") & "-" &
Asc("A")
Debug.Print "Caracteres de los códigos --> " & Chr(72) & "-" & Chr(48) & "-" & Chr(76) & "-" &
Chr(65)
End Sub

3- Operadores.
/  División, de dos valores Numerador y / Denominador, devuelve el valor aproximado de
cuantas veces esta,
7 / 3  2.333333333
Mod  División, como el anterior toma el numerador y Mod el denominador pero esta arroja
el residuo y saca exactamente el número de veces que esta el denominador.
7 Mod 3  1

Operadores de comparación
Programar Eventos en Access 2007. Página 33 de 49

Ejemplos.

Hagamos parte de una aplicación que maneje los clientes y nos permita ver varios eventos utilizando
el lenguaje de programación.

- 1 Debemos haber creado el formulario con los campos necesarios del cliente y sus respectivas
relaciones.

Y es sobre esa tabla con la cual se hace el formulario y sobre el programaremos varios de sus eventos.
Programar Eventos en Access 2007. Página 34 de 49

Todo proceso debe llevar un diagrama que le permita al programador crear la aplicación acorde a un
análisis previo. Veamos cómo se vería el proceso para crear un nuevo cliente.

Para implementar este proceso, en primera instancia debemos crear el formulario con el cual vamos
ingresar los datos.

Los eventos que tocaremos para el formulario serán.


 Se adicionan 3 Botones ( Nuevo Registro, Actualizar, Consultar, Salir)
 Antes de actualizar el Formulario
 En todos los campos se tocaran los eventos (Al recibir y al perder el enfoque)
 Los eventos al Salir y al Cambiar, se tocaran en los campos (Identificación Cliente y la
Identificación del representante legal)
Programar Eventos en Access 2007. Página 35 de 49

La manipulación de estos eventos permite valorar si un registro existe y en el caso de relaciones


externas poder crear el registro si el usuario lo requiere.

 Los botones. Creemos los botones. Botón Nuevo


Para que el código trabaje, por favor coloquemos el nombre de cmdNuevoRg
Private Sub cmdNuevoRg_Click()
Nuevo
'Cuando se crea un nuevo registro se hacen dos cosas
'1- Se lleva el cursor al campo Identificacion del cliente
'2- Se llenan los campos Representanten, Tipo de Cliente y El estado
'3- Deshabilitamos el boton de registro nuevo ya que nos encontramos diligenciando uno.
' Se habilitara de nuevo en el momento de grabar el registro.
DoCmd.GoToControl "idCliente"
Forms![FCliente]![idRepresen] = "-1"
Forms![FCliente]![idtpcliente] = "BU"
Forms![FCliente]![idEstado] = "AC"
Forms![FCliente]![NuevoRg].Enabled = False
End Sub

El código en primera instancia el código nos lleva al campo idCliente y luego llena con valores por
defecto varios campos del formulario, en la parte final vemos
Forms![FCliente]![NuevoRg].Enabled = False, que busca dejar el botón nuevo deshabilitado
mientras se ingresa un nuevo registro y no permita ingresar uno nuevo cuando ya se está en el
proceso.

Para los botones restantes solo veremos que en el evento clic colocará la macro necesaria para hacer

la función de Actualizar , consultar y salir

El Orden de tabulación es importante tenerlo en cuenta, por que determina si damos enter en campo
este a donde nos lleva. El orden de desplazamiento lo determina la posición de tabulación. Los
botones no deben tener punto de tabulación, la gráfica nos muestra cómo colocarla o como quitarla.
Programar Eventos en Access 2007. Página 36 de 49

 Al recibir y perder el enfoque.


En formularios donde sea necesario conocer donde se encuentra el cursor, debido a que este
se ve como una línea horizontal en cada campo, es difícil de distinguir; podemos definir las
propiedades de recibir (GotFocus) y perder (LostFocus) el enfoque que es más o menos saber
que campo está activo (Tiene el cursor). Se logra afectando la propiedad de cada campo
BackColor (Color de fondo)
El siguiente código permite tener ese efecto.

Private Sub idCliente_GotFocus()


Forms![FCliente]![idCliente].BackColor = "13619175"
End Sub

Private Sub idCliente_LostFocus()


Forms![FCliente]![idCliente].BackColor = "16777215"
End Sub

Private Sub strNombre_GotFocus()


Forms![FCliente]![strNombre].BackColor = "13619175"
End Sub

Private Sub strNombre_LostFocus()


Forms![FCliente]![strNombre].BackColor = "16777215"
End Sub

Private Sub dtFechaing_GotFocus()


Forms![FCliente]![dtFechaing].BackColor = "13619175"
End Sub

Private Sub dtFechaing_LostFocus()


Forms![FCliente]![dtFechaing].BackColor = "16777215"
End Sub

Private Sub idRepresen_GotFocus()


Programar Eventos en Access 2007. Página 37 de 49

Forms![FCliente]![idRepresen].BackColor = "13619175"
End Sub

Private Sub idRepresen_LostFocus()


Forms![FCliente]![idRepresen].BackColor = "16777215"
End Sub

Private Sub strReNombre_GotFocus()


Forms![FCliente]![strReNombre].BackColor = "13619175"
End Sub

Private Sub strReNombre_LostFocus()


Forms![FCliente]![strReNombre].BackColor = "16777215"
End Sub

Private Sub strTelefono_GotFocus()


Forms![FCliente]![strTelefono].BackColor = "13619175"
End Sub

Private Sub strTelefono_LostFocus()


Forms![FCliente]![strTelefono].BackColor = "16777215"
End Sub

Private Sub idtpcliente_GotFocus()


Forms![FCliente]![idtpcliente].BackColor = "13619175"
End Sub
Private Sub idtpcliente_LostFocus()
Forms![FCliente]![idtpcliente].BackColor = "16777215"
End Sub

Private Sub strEstado_GotFocus()


Forms![FCliente]![strEstado].BackColor = "13619175"
End Sub

Private Sub strEstado_LostFocus()


Forms![FCliente]![strEstado].BackColor = "16777215"
End Sub

Tome cualquier campo del formulario y busque la propiedad recibir o perder el enfoque y sobre
el código generado de forma automática por el aplicativo pegue este.

 A nivel del formulario verifiquemos como cada cambio, ingreso de datos nos preguntara si
deseamos actualizarlo o ignorarlo. Copiemos Private Sub Form_BeforeUpdate(Cancel As
Integer) y coloquemos en la posición que muestra la grafica en el evento <Antes de Actualizar>
Programar Eventos en Access 2007. Página 38 de 49

Private Sub Form_BeforeUpdate(Cancel As Integer)


„Se pregunta si podemos actualizar el registro, responderemos si o no, todo depende
„Habilitamos el boton de Registro nuevo este o no este deshabilitado.
„Se debe habilitar el botón nuevo para que permita ingresar un nuevo registro si estamos
„actualizando el ingreso de un nuevo cliente.
Dim intResponse As Integer
Dim strPrompt As String
strPrompt = "Aceptar los Cambios ?"
intResponse = MsgBox(strPrompt, vbYesNo)

If intResponse = vbNo Then


Cancel = True
Me.Undo
Else
Cancel = False
End If
Forms![FCliente]![NuevoRg].Enabled = True
End Sub

De esta manera cualquier cambio que hagamos se preguntara si deseamos actualizarlo al momento
de intentar cambiar a otro registro o salir del formulario.

 A nivel de campo coloquemos el siguiente código en el evento <al Salir> de idCliente. El código
está evaluando al momento de salir del campo idCliente si estamos ingresando un nuevo
registro, esto se hace para saber que no está ingresando un número de identificación que ya
existe. Si el registro efectivamente ya está dentro de la base de datos, se muestra un mensaje
<El Cliente ya Existe>.
y deshace el proceso Me.Undo, y se define activa el botón de nuevo
registro.
Forms![FCliente]![NuevoRg].Enabled = True
Programar Eventos en Access 2007. Página 39 de 49

Private Sub idCliente_Exit(Cancel As Integer)


'Verificar antes de crear un nuevo cliente si existe en la base de datos.
If Me.NewRecord = -1 Then
Dim dbs As DAO.Database
Dim rsSQL As DAO.Recordset
‘Definir un Select para indagar el dato en la base de datos
Set dbs = CurrentDb
Set rsSQL = dbs.OpenRecordset("SELECT Cliente.idCliente AS Cliente_id " & _
"FROM Cliente " & _
"Where cliente.idCliente = " & "'" & Forms![FCliente]![idCliente] & "'")
If rsSQL.EOF = False Then
MsgBox "El Cliente ya Existe ..!", vbInformation + vbOKOnly, "VERIFIQUE SUS DATOS "
Me.Undo ‘Deshace cualquier dato que se haya intentado crear en el formulario
Forms![FCliente]![NuevoRg].Enabled = True ‘Activa el botón de nuevo registro
Exit Sub
End If
rsSQL.Close
Set rsSQL = Nothing
Set dbs = Nothing
End If 'Valida si es un nuevo registro
End Sub

 También en el campo idRepresen para el evento <al Salir> debemos evaluar si existe un
representante con esta identificación, de no existir en la base de datos, el código llamará el
formulario FRepresentante.
DAO  (Objeto de acceso a datos). DAO dentro del
código es de suma importancia para crear <Select> ó
consulta de registros en la base de datos; DAO nos
va a permitir crear dos variables importantes como
son: Una que guarde nuestra base de datos actual
<dbs> y la otra donde vamos a guardar el conjunto de
registros a consultar <rsSQL>.
Otra punto a tener en cuenta es <DoCmd>, que ejecuta varios comandos propios del lenguaje.
DoCmd lo podemos ver ejecutando dos comandos hasta ahora: Primero ejecuta
<DoCmd.GotControl> que básicamente nos permite llevar el cursor a un campo en particular
del formulario, y lo vemos ahora haciendo la apertura del formulario <FRepresentante>.
<DoCmd.OpenForm "Frepresentante">

Private Sub idRepresen_Exit(Cancel As Integer)


Dim dbs As DAO.Database
Dim rsSQL As DAO.Recordset

Set dbs = CurrentDb

Set rsSQL = dbs.OpenRecordset("SELECT Representante.idRepresen AS idRepr " & _


"FROM Representante " & _
"Where Representante.idRepresen = " & "'" & Forms![FCliente]![idRepresen] & "'")
Programar Eventos en Access 2007. Página 40 de 49

If rsSQL.EOF Then
Dim Respuesta As Integer, MiCadena
Respuesta = MsgBox("Representante no Existe ..! Desea Crearlo ? ", vbYesNo + vbInformation + vbDefaultButton1,
"DECIDA POR FAVOR ")
If Respuesta = vbYes Then ' El usuario eligió el botón Sí.
DoCmd.OpenForm "Frepresentante", , ,
"Forms![Frepresentante]![idRepresen]=Forms![FCliente]![idRepresen]", acFormAdd
Forms![Frepresentante]![idRepresen] = Forms![FCliente]![idRepresen]
End If
End If
rsSQL.Close
Set rsSQL = Nothing
Set dbs = Nothing
End Sub

2 – Veamos ahora el formulario Representante que es más simple pero toma código ya utilizado, solo
que modificado a los campos del nuevo formulario.
Pero como debe trabajar el proceso antes de cualquier cosa.

Para implementar este proceso, en primera instancia debemos crear el formulario con el cual vamos
ingresar los datos.
Programar Eventos en Access 2007. Página 41 de 49

 En primera instancia colocaremos el código que hace seguimiento al cursor dentro del
formulario.

Private Sub idRepresen_GotFocus()


Forms![FRepresentante]![idRepresen].BackColor = "13619175"
End Sub

Private Sub idRepresen_LostFocus()


Forms![FRepresentante]![idRepresen].BackColor = "16777215"
End Sub

Private Sub strReNombre_GotFocus()


Forms![FRepresentante]![strReNombre].BackColor = "13619175"
End Sub

Private Sub strReNombre_LostFocus()


Forms![FRepresentante]![strReNombre].BackColor = "16777215"
End Sub

Private Sub strTelefono_GotFocus()


Forms![FRepresentante]![strTelefono].BackColor = "13619175"
End Sub

Private Sub strTelefono_LostFocus()


Forms![FRepresentante]![strTelefono].BackColor = "16777215"
End Sub

 Verifiquemos cualquier cambio hecho sobre los datos del formulario.

Private Sub Form_BeforeUpdate(Cancel As Integer)


Dim intResponse As Integer
Programar Eventos en Access 2007. Página 42 de 49

Dim strPrompt As String


strPrompt = "Aceptar los Cambios ?"
intResponse = MsgBox(strPrompt, vbYesNo)

If intResponse = vbNo Then


Cancel = True
Me.Undo
Else
Cancel = False
End If
Forms![FRepresentante]![NuevoRg].Enabled = True
End Sub

 Definamos el código para crear un nuevo registro en el formulario.

Private Sub NuevoRg_Click()


Nuevo
DoCmd.GoToControl "idRepresen"
Forms![FRepresentante]![strReNombre] = "-"
Forms![FRepresentante]![strTelefono] = "-1"
Forms![FRepresentante]![NuevoRg].Enabled = False
End Sub

 Por último veamos como verificamos que cualquier registro que estamos creando no se
encuentre ya dentro de la base de datos.

Private Sub idRepresen_Exit(Cancel As Integer)


'Verificar antes de crear un nuevo cliente si existe en la base de datos.
If Me.NewRecord = -1 Then
Dim dbs As DAO.Database
Dim rsSQL As DAO.Recordset
'Definir un Select para indagar el dato en la base de datos
Set dbs = CurrentDb
Set rsSQL = dbs.OpenRecordset("SELECT Representante.idRepresen AS Representante_id " & _
"FROM Representante " & _
"Where Representante.idRepresen = " & "'" & Forms![FRepresentante]![idRepresen] & "'")
If rsSQL.EOF = False Then
MsgBox "El Representante ya Existe ..!", vbInformation + vbOKOnly, "VERIFIQUE SUS
DATOS "
Me.Undo 'Deshace cualquier dato que se haya intentado crear en el formulario
Forms![FRepresentante]![NuevoRg].Enabled = True 'Activa el botón de nuevo registro
Exit Sub
End If
rsSQL.Close
Set rsSQL = Nothing
Programar Eventos en Access 2007. Página 43 de 49

Set dbs = Nothing


End If 'Valida si es un nuevo registro
End Sub

4- En aplicaciones bien desarrolladas, debe haber un medio que me permita hacer cambios y se deje
una huella del procedimiento. Ejemplo. Al momento de crear un cliente hubo un error en la digitación
de los datos, se hace necesario colocar o corregir por el nombre real de la persona afectada en la
base de datos.
Para este caso se hace el procedimiento que permita llevar un consecutivo de los cambios hechos y
en la misma pantalla hacer el cambio respectivo.

Veamos el diagrama a seguir del proceso.

Se crea el formulario, con el cual hacer el procedimiento.


Programar Eventos en Access 2007. Página 44 de 49

Formulario de
Cabecera

Formulario
Detalle

Diagrama de las tablas que intervienen en la


actualización del cliente.

 Coloquemos el código para hacer seguimiento del cursor, en el formulario de cabecera. Para
hacerlo, busquemos el campo <idMovimiento> y en el evento <al recibir el enfoque> y
peguemos este fragmento de código.
Programar Eventos en Access 2007. Página 45 de 49

Private Sub idMovimiento_GotFocus()


Forms![Factualizacli]![idMovimiento].BackColor = "13619175"
End Sub

Private Sub idMovimiento_LostFocus()


Forms![Factualizacli]![idMovimiento].BackColor = "16777215"
End Sub

Private Sub strDescripcionmo_GotFocus()


Forms![Factualizacli]![strDescripcionmo].BackColor = "13619175"
End Sub

Private Sub strDescripcionmo_LostFocus()


Forms![Factualizacli]![strDescripcionmo].BackColor = "16777215"
End Sub

Private Sub TpActualiza_GotFocus()


Forms![Factualizacli]![TpActualiza].BackColor = "13619175"
End Sub

Private Sub TpActualiza_LostFocus()


Forms![Factualizacli]![TpActualiza].BackColor = "16777215"
End Sub

Private Sub idCliente_GotFocus()


Forms![Factualizacli]![idCliente].BackColor = "13619175"
End Sub

Private Sub idCliente_LostFocus()


Forms![Factualizacli]![idCliente].BackColor = "16777215"
End Sub

 Creemos los botones de Nuevo registro, Grabar los cambios,


Buscar y Salir del formulario respectivamente.
Cuando hayamos creado el botón de nuevo registros anexemos el código siguiente en el evento
< al hacer clic >.

Private Sub cmdNuevorg_Click()


Nuevo
DoCmd.GoToControl "strDescripcionmo"
Forms![Factualizacli]![strDescripcionmo] = "-"
Programar Eventos en Access 2007. Página 46 de 49

Forms![Factualizacli]![strEstadoac] = "AC"
Forms![Factualizacli]![cmdNuevorg].Enabled = False
End Sub

Esta parte del código va en primera instancia y coloca el aplicativo en ingresar un nuevo registro,
y posteriormente llenar variables que son conocidas e irrelevantes como el estado y la
descripción. Al final como estamos ingresando un registro deshabilitamos el botón para cerrar el
proceso antes de crear otro movimiento.

 En el formulario de cabecera y en el evento < Antes de actualizar >

Private Sub Form_BeforeUpdate(Cancel As Integer)


„Se pregunta si podemos actualizar el registro, responderemos si o no, todo depende y
„Habilitamos el botón de Registro nuevo este o no este deshabilitado.
Dim intResponse As Integer
Dim strPrompt As String
strPrompt = "Aceptar los Cambios ?"
intResponse = MsgBox(strPrompt, vbYesNo)

If intResponse = vbNo Then


Cancel = True
Me.Undo
Else
Cancel = False
End If
Forms![Factualizacli]![cmdNuevorg].Enabled = True
End Sub

 Para guardar el dato que se va a cambiar dentro de la observación utilizaremos el siguiente


código.

Private Sub idCliente_Exit(Cancel As Integer)


Dim strCadena As String
strCadena = " DATO_ANTERIOR --> "
If Forms![Factualizacli].NewRecord Then
If Len(Forms![Factualizacli]![idCliente]) > 0 Then
Forms![Factualizacli]![SFdetaActCliente]![idMovideta].Value = Forms![Factualizacli]![idMovimiento].Value
Forms![Factualizacli]![SFdetaActCliente]![idCliente].Value = Forms![Factualizacli]![idCliente].Value

Select Case Forms![Factualizacli]![TpActualiza]


Case "Est"
Forms![Factualizacli]![strDescripcionmo].Value = Forms![Factualizacli]![strDescripcionmo].Value & strCadena &
Forms![Factualizacli]![SFdetaActCliente]![idEstado].Value
Case "Nom"
Forms![Factualizacli]![strDescripcionmo].Value = Forms![Factualizacli]![strDescripcionmo].Value & strCadena &
Forms![Factualizacli]![SFdetaActCliente]![strNombre].Value
Case "Tel"
Programar Eventos en Access 2007. Página 47 de 49

Forms![Factualizacli]![strDescripcionmo].Value = Forms![Factualizacli]![strDescripcionmo].Value & strCadena &


Forms![Factualizacli]![SFdetaActCliente]![trTelefono].Values
Case "Tpc"
Forms![Factualizacli]![strDescripcionmo].Value = Forms![Factualizacli]![strDescripcionmo].Value & strCadena &
Forms![Factualizacli]![SFdetaActCliente]![idEstado].Values
Case "Rep"
Forms![Factualizacli]![strDescripcionmo].Value = Forms![Factualizacli]![strDescripcionmo].Value & strCadena &
Forms![Factualizacli]![SFdetaActCliente]![idRepresen]
Case Else
Forms![Factualizacli]![strDescripcionmo].Value = " No hubo cambio alguno "

End Select
End If
End If
End Sub
Podemos ver que estamos utilizando un <Select Case>, que evalúa el tipo de cambio que se va
hacer y eso permite guardar el campo actual antes de generar un cambio en los datos.

 En el formulario Detalle busquemos un campo para colocar el código que nos muestra la
ubicación actual del cursor en el evento <Al recibir el Enfoque>.

Private Sub idMovideta_GotFocus()


Forms![Factualizacli]![SFdetaActCliente]![idMovideta].BackColor = "13619175"
End Sub

Private Sub idMovideta_LostFocus()


Forms![Factualizacli]![SFdetaActCliente]![idMovideta].BackColor = "16777215"
End Sub

Private Sub idCliente_GotFocus()


Forms![Factualizacli]![SFdetaActCliente]![idCliente].BackColor = "13619175"
End Sub

Private Sub idCliente_LostFocus()


Forms![Factualizacli]![SFdetaActCliente]![idCliente].BackColor = "16777215"
End Sub

Private Sub strNombre_GotFocus()


Forms![Factualizacli]![SFdetaActCliente]![strNombre].BackColor = "13619175"
End Sub

Private Sub strNombre_LostFocus()


Forms![Factualizacli]![SFdetaActCliente]![strNombre].BackColor = "16777215"
End Sub

Private Sub dtFechaing_GotFocus()


Forms![Factualizacli]![SFdetaActCliente]![dtFechaing].BackColor = "13619175"
End Sub
Programar Eventos en Access 2007. Página 48 de 49

Private Sub dtFechaing_LostFocus()


Forms![Factualizacli]![SFdetaActCliente]![dtFechaing].BackColor = "16777215"
End Sub

Private Sub idRepresen_GotFocus()


Forms![Factualizacli]![SFdetaActCliente]![idRepresen].BackColor = "13619175"
End Sub

Private Sub idRepresen_LostFocus()


Forms![Factualizacli]![SFdetaActCliente]![idRepresen].BackColor = "16777215"
End Sub

Private Sub strTelefono_GotFocus()


Forms![Factualizacli]![SFdetaActCliente]![strTelefono].BackColor = "13619175"
End Sub

Private Sub strTelefono_LostFocus()


Forms![Factualizacli]![SFdetaActCliente]![strTelefono].BackColor = "16777215"
End Sub

Private Sub idtpcliente_GotFocus()


Forms![Factualizacli]![SFdetaActCliente]![idtpcliente].BackColor = "13619175"
End Sub

Private Sub idtpcliente_LostFocus()


Forms![Factualizacli]![SFdetaActCliente]![idtpcliente].BackColor = "16777215"
End Sub

Private Sub idEstado_GotFocus()


Forms![Factualizacli]![SFdetaActCliente]![idEstado].BackColor = "13619175"
End Sub

Private Sub idEstado_LostFocus()


Forms![Factualizacli]![SFdetaActCliente]![idEstado].BackColor = "16777215"
End Sub

 Y por último verificar los cambios que se den dentro del formulario Detalle

Private Sub Form_BeforeUpdate(Cancel As Integer)


„Se pregunta si podemos actualizar el registro, responderemos si o no, todo depente y
„Habilitamos el botón de Registro nuevo este o no este deshabilitado.
Dim intResponse As Integer
Programar Eventos en Access 2007. Página 49 de 49

Dim strPrompt As String


strPrompt = "Guardar Detalle ?"
intResponse = MsgBox(strPrompt, vbYesNo)

If intResponse = vbNo Then


Cancel = True
Me.Undo
Else
Cancel = False
End If
End Sub

You might also like