CAPTULO 31
ndice de contenido
MDULOS DE OBJETO, CONTROLES Y EVENTOS....................................................................2
MDULOS DE OBJETO...............................................................................................................2
EVENTOS.......................................................................................................................................2
CONTROLES..................................................................................................................................5
MIX DE LOS ANTERIORES CONCEPTOS.............................................................................5
LA FUNCIN MSGBOX....................................................................................................................7
LANZAR UN MENSAJE...............................................................................................................7
SALTOS DE LNEA EN MENSAJE..............................................................................................8
LANZAR MENSAJE Y ESPERAR RESPUESTA DE UN USUARIO.........................................9
LA FUNCIN INPUTBOX...............................................................................................................11
DETECTAR LA PULSACIN DEL BOTN <CANCELAR>...................................................13
OTROS CONTROLES PARA QUE NO NOS FALLE EL INPUTBOX..................................14
DETECTAR VALORES VACOS............................................................................................14
DETECTAR VALORES DE DIFERENTE TIPO....................................................................14
NORMALIZACIN..........................................................................................................................16
NOMBRES DE OBJETOS............................................................................................................16
NOMBRES DE CONTROLES.....................................................................................................17
NOMBRES DE VARIABLES.......................................................................................................17
Y POR QU LOS PREFIJOS?....................................................................................................17
MS INFORMACIN SOBRE NORMALIZACIN.................................................................18
1 Los ejemplos propuestos en este captulo estn en una BD que os podis bajar aqu
1
Vistame en http://siliconproject.com.ar/neckkito/
MDULOS DE OBJETO, CONTROLES Y EVENTOS
MDULOS DE OBJETO
Quiz lo lgico en un curso de VBA sera empezar a explicar,
llegados a este punto, lo que se denominan bloques de
decisin. Sin embargo, nos vamos a separar de lo
ortodoxo para entrar en unas explicaciones que nos
proporcionaran una base experimental para posteriores
contenidos. De hecho, si este curso est enfocado a Access,
es entendible, creo yo, que lo hagamos as.
Como apuntamos en el captulo en el que hablbamos de tipos de mdulos, vamos a tratar
ahora esos mdulos que se hallan asociados a un objeto de Access, en concreto mdulos
asociados a formularios e informes.
Para poder ir entendiendo lo que se va a explicar vamos a ir vindolo al mismo tiempo que lo
leemos. Lo que vamos a hacer es crear una base de datos. Una vez creada vamos a crear
(valga la redundancia) un objeto formulario. Es decir, creamos un nuevo formulario en blanco.
Guardamos ese formulario con el nombre de F01.
Una vez creado lo situamos en vista diseo.
Si ahora abrimos el editor de VB (a travs de la combinacin de teclas ALT+F11) podremos
comprobar que no existe ningn mdulo de objeto. Y cmo? Porque si nos fijamos en la
ventana proyecto slo podremos ver ah el nombre de nuestra BD, pero ningn otro elemento.
Volvamos a situarnos frente a F01 en vista diseo.
Antes de seguir necesitamos explicar alguna cosita ms...
EVENTOS
Cojamos algo comn que todo el mundo conozca (o al menos le suene), como podra ser el
mando de una Wii... Generalizando podemos decir que si pulsamos uno de los botones
confirmamos la opcin que tenemos en pantalla; si movemos el mando a la izquierda se
produce un movimiento hacia la izquierda, y lo mismo para la derecha. Si agitamos el mando
de arriba a abajo pues obtenemos otro resultado...
Si lo transformamos en lo que nos interesa podemos hablar de eventos, que en caso de la
tele podramos decir que...
Evento al pulsar el botn
Evento al mover el mando a la derecha
Evento al mover el mando a la izquierda
Evento al agitar el mando
Y, a cada uno de estos eventos, le corresponde la ejecucin de una accin.
Asimilado lo anterior, nuestro formulario F01 es nuestro mando, que posee una serie de
eventos a los cuales les podemos asignar una accin, que vendra programada por nuestro
cdigo VBA.
Y cules son esos eventos?
Pues si volvemos a nuestro F01, que tenamos situado en vista diseo, no tenemos ms que
sacar sus propiedades y nos desplazamos a la pestaa Eventos. Ah podremos ver una lista de
todas los eventos a los cuales podemos asignarles una accin a travs de cdigo. Algunos, al
leerlos, nos van a resultar ms que evidentes; otros, sin embargo, no lo son tanto. No os
2
Vistame en http://siliconproject.com.ar/neckkito/
preocupis porque ya los iremos viendo con calma a travs de este curso.
Nuestro espacio de trabajo para cdigo ser, pues, entre estas dos lneas.
3
Vistame en http://siliconproject.com.ar/neckkito/
Private Sub Form_Open(Cancel As Integer)
MsgBox "Hola, mundo!"
End Sub
Lo que estamos haciendo es simplemente decirle al
formulario que cuando se abra nos lance un mensaje.
Si ahora cerramos (guardando los cambios) nuestro F01 y lo
abrimos en vista formulario veremos los efectos de nuestra
programacin.
Vamos a ir un poco ms all. Con nuestro F01 en vista diseo vamos a a mostrar el
encabezado y el pie del formulario. Ahora, en teora, deberamos tener tres secciones:
Encabezado
Detalle
Pie
Truco: por si no lo sabamos podemos seleccionar lo que es el formulario en marcando el
pequeo cuadrado que hay en la esquina superior izquierda del mismo. Si despus marcamos
otro elemento, y tenemos la ventana de propiedades abierta, esta ir cambiando las
propiedades en funcin del elemento que tengamos seleccionado.
La idea que os quiero transmitir es que el formulario tiene unos eventos asociados, pero la
seccin encabezado, la seccin detalle y la seccin pie tambin tienen sus propios eventos.
4
Vistame en http://siliconproject.com.ar/neckkito/
CONTROLES
Vamos a ver cmo se refleja una mezcla de los anteriores conceptos en nuestro editor de VB.
Operaremos sobre FPrueba.
As pues, con FPrueba en vista diseo, sacamos las propiedades del formulario y nos vamos al
evento Al activar registro.
Este evento se produce cada vez que nos aparece un registro en pantalla; es decir, se
activar al abrir el formulario (porque nos aparece el primer registro o un registro nuevo,
dependiendo cmo tengamos configurado el formulario) y tambin se activar cada vez que
cambiemos de registro, ya sea porque nos desplacemos por los registros o porque vayamos a
aadir uno nuevo.
A este evento le generamos el siguiente cdigo:
5
Vistame en http://siliconproject.com.ar/neckkito/
Ahora sacamos las propiedades del campo [Dato] y programaremos el evento llamado Al
recibir el enfoque. Le generamos el siguiente cdigo:
Private Sub Dato_GotFocus()
If IsNull(Me.Dato.Value) Then
Me.Dato.Value = "Estoy vacio!"
End If
End Sub
Qu hemos aprendido con estos dos simples cdigos?
Que para examinar SI hay valor o NO hay valor utilizamos el bloque IF... END IF (que
estudiaremos un poco ms adelante)
Que para saber si un dato no contiene ningn valor debemos utilizar ISNULL(valor)
Hemos recordado que si queremos especificar un texto debemos situarlo entre comillas.
Que para lanzar un mensaje al usuario utilizamos la funcin MsgBox (que tambin
veremos ms adelante)
Como podris intuir, lo que hace el cdigo asociado al formulario es mirar si el campo [Dato]
tiene valor o no, y en funcin de ello nos lanza un mensaje de advertencia.
Lo que hace el cdigo asociado al campo [Dato] es mirar, cada vez que este campo recibe el
foco, si tiene valor o no, y si no lo tiene nos escribe una cadena de texto dentro del mismo.
Vamos a probarlo. Situamos FPrueba en vista formulario y... sorpresa! Y si ahora pulsamos
Enter o tabulacin, para saltar al campo [Dato], automticamente se nos escribe el texto que
habamos especificado.
Aadamos dos registros ms, de manera que acabemos en el registro nmero 3.
Ahora, a travs de los botones de desplazamiento, volvamos al registro 2 (registro anterior).
Veremos que el cdigo de formulario detecta que ya hay valor en [Dato] y nos da el mensaje
correcto, a la vez que en ese campo, al contener ya un valor, su cdigo no permite que se
escriba nuestro valor por defecto.
6
Vistame en http://siliconproject.com.ar/neckkito/
LA FUNCIN MSGBOX
LANZAR UN MENSAJE
Aunque lo hemos visto ya varias veces durante este curso ahora vamos a ver la sintaxis casi
completa de esta funcin. Esta sintaxis es la siguiente:
MsgBox [Texto a mostrar], [Botn/es a mostrar], [Ttulo de la ventana de mensaje]
Hay dos argumentos ms, pero no los vamos a ver. Simplemente comentar que corresponden
a la manipulacin de un archivo de ayuda que hayamos podido crear.
Os animo a que vayis cambiando la constante del botn a fin de ver el tipo de icono que os
aparece.
7
Vistame en http://siliconproject.com.ar/neckkito/
SALTOS DE LNEA EN MENSAJE
Aprovecho este espacio para comentaros que podemos crear una variable y pasarla como
mensaje. En este caso no deberamos utilizar comillas, ya que no le pasamos el texto
directamente, sino el texto almacenado en la variable. Si queris hacemos la prueba:
Aadimos un nuevo botn en F01 y lo llamamos cmdVariable, y le generamos el siguiente
cdigo:
8
Vistame en http://siliconproject.com.ar/neckkito/
miEdad = 125
MsgBox miTexto & miEdad, vbCritical, "MI MENSAJE"
End Sub
Como podremos comprobar ahora s que nos sale un texto guapo. Fijaos simplemente,
adems de cmo hemos ido concatenando el texto, que debemos ir con cuidado con los
espacios en blanco al principio y final de las cadenas de texto intermedias. Los espacios
tambin cuentan!
Antes de meternos de lleno en el tema debemos saber una cosa: las constantes de VB
devuelven un valor entero (integer). Ese valor podemos utilizarlo para realizar acciones. De
hecho, podemos hacer referencia al valor devuelto a travs de otra constante de VB. A que
suena divertido?
Un ejemplo nos sacar de dudas. Podemos pedirle al usuario que nos responda S o No a
travs de sendos botones. Para ello utilizaramos los botones vbYesNo.
Si el usuario pulsa el botn YES el valor que se devuelve es el 6, mientras que si pulsa en NO
el valor devuelto es 7. Entonces aprovecharemos este espacio para introducir el bloque IF...
ELSE... END IF (lo veremos con ms detalle en la prxima seccin), con lo que podramos
generar un cdigo que dijera:
En este caso operaramos con el nmero. Pero tambin tenemos una constante VB que
equivaldra, en este caso, al 6 ( al 7). Esa constante es vbYes (vbNo). Luego tambin
podramos programar el cdigo as:
9
Vistame en http://siliconproject.com.ar/neckkito/
Aunque veris cdigos que hacen la programacin directa sobre todo el MsgBox a m,
personalmente, me gusta almacenar el valor el cdigo en una variable y operar sobre ella.
Desde mi punto de vista eso hace el cdigo menos farragoso. As pues os explicar cmo lo
hago yo, aunque despus os pondr lo mismo pero con programacin directa para
que podis ver la diferencia. A partir de ah... a elegir lo que ms guste ;)
10
Vistame en http://siliconproject.com.ar/neckkito/
Hay otra serie de botones que operan, digamos, sobre el comportamiento de la ventana en
s. Estos no los veremos (pero os dir dnde encontrarlos, un poco ms abajo).
Los botones del MsgBox, como hemos insinuado un poco antes, no slo devuelven un valor
numrico, sino que pueden ser representados por un valor numrico. Es decir, y a modo de
ejemplo:
El botn vbYesNo viene representado por el valor 4
El botn vbExclamation viene representado por el valor 48
Escribir: <MsgBox (Texto, vbYesNo)> podra haber sido escrito de la siguiente manera:
<Msgbox (Texto, 4)>
Si queremos mostrar los dos botones (SiNo + Exclamacin) a travs de sus valores numricos
simplemente tenemos que sumarlos: 4 + 48 = 52, y escribir <MsgBox (Texto,52)>
Evidentemente esto lo dejo para quien tenga una buena memoria y sea un fenmeno en
matemticas... je, je...
Y como lo prometido es deuda, si en nuestro cdigo (en el VBE) nos situamos sobre la palabra
MsgBox y pulsamos la tecla F1 podremos ver toda la lista de botones que acepta la funcin,
con sus valores representativos, y todos los valores de respuesta (constantes de VB o entero
correspondiente), con una explicacin de cada uno de ellos.
LA FUNCIN INPUTBOX
Con la funcin MsgBox hemos visto que podemos lanzar un mensaje al usuario, e incluso
esperar una respuesta del mismo limitada a la pulsacin de unas pocas opciones a travs de
botones.
11
Vistame en http://siliconproject.com.ar/neckkito/
La funcin InputBox nos permite solicitar informacin al usuario para que este la introduzca en
un cuadro de dilogo, informacin que no estar tan limitada como en el caso de MsgBox.
Vamos a plantear unj ejercicio sobre esta funcin. Imaginemos que queremos pedir el nombre
de usuario al usuario (nunca mejor dicho). Utilizaremos pues un InputBox. Para ello:
Con F01 en vista diseo aadimos un botn de comando, al que llamaremos
cmdInputBox, y le generaremos el siguiente cdigo en el evento Al hacer click:
Fijaos que:
Como pedimos la introduccin de una cadena de texto hemos definido una variable
(miNombre) como String
El valor de esa variable nos la proporciona la funcin InputBox
Por si no lo habis intuido, no es necesario utilizar todos los argumentos del InputBox.
Si hubiramos escrito: <InputBox (Nombre)> hubiera bastado.
Vamos a realizar otro ejercicio prctico, pero en este caso realizaremos unos clculos con los
datos que nos proporcione el usuario.
Aadimos otro botn de comando en F01 y le ponemos de nombre cmdInputBoxNum. Le
generamos el siguiente cdigo en el evento Al hacer click:
12
Vistame en http://siliconproject.com.ar/neckkito/
Como podemos ver en este ejemplo:
Hemos definido las variables como Integer porque esperamos nmeros
Hemos practicado cmo concatenar el mensaje de MsgBox
Hemos visto que podemos realizar clculos
directamente sobre el mensaje devuelto por MsgBox.
Si hemos seguido los ejemplos hemos visto como el InputBox nos muestra dos botones:
aceptar y cancelar. Y si hemos intentado cancelar hemos visto que nos salta un error de
cdigo.
Vamos a ver cmo programar el InputBox de manera que si el usuario cancela la accin
podamos salir del procedimiento. Para ello necesitamos utilizar la funcin StrPtr.
Cuando el usuario pulsa <Cancelar> la funcin StrPtr devuelve el valor 0 (cero). Eso nos
permite la deteccin de un valor para poder tomar una decisin.
Si la variable que recoge la respuesta del InputBox es miNombre, la sintaxis sera tan simple
como StrPtr(miNombre).
Vamos a modificar el primer cdigo que nos solicitaba el nombre de usuario para aadir ese
control de pulsacin de cancelar. Aadimos un nuevo botn de comando en F01 y lo
guardamos como cmdInputBoxCancelar. El nuevo cdigo del evento Al hacer click debera
quedarnos as:
13
Vistame en http://siliconproject.com.ar/neckkito/
Y eso es todo. No hay ms secreto.
Para detectar valores vacos o cadenas de texto vacas podemos utilizar un bloque IF. El cdigo
para ello sera:
Si <el valor es nulo> O <es una cadena vaca> entonces
Por ejemplo, y siguiendo con el ejemplo anterior (yo he programado un nuevo botn de
comando en F01), podramos escribir el cdigo como sigue:
Como vemos volvemos a encontrarnos que para saber si un valor es nulo debemos utilizar
<IsNull(variable)>. Y para ver si est vaco simplemente lo indicamos con dos comillas dobles
seguidas ()
Tambin podemos ver que para unir condiciones hemos utilizado OR
En este ejemplo, si se produce la condicin, se sale del proceso, pero podramos haber hecho
que saltara un mensaje al usuario indicndole que el valor introducido no es correcto (si lo
queris probar, os lo dejo como deberes ;) )
14
Vistame en http://siliconproject.com.ar/neckkito/
Para pillar que el usuario est introduciendo un valor numrico en lugar de una cadena de
texto podemos utilizar la funcin IsNumeric. A partir del valor devuelto por esta funcin
(True/False) podremos tomar una decisin, como siempre, a travs de nuestro amigo IF.
Veamos un ejemplo (que yo he programado en otro botn
de comando):
Private Sub cmdInputBoxIsNumeric_Click()
Dim miNombre As String
miNombre = InputBox("Introduzca su nombre", "NOMBRE",
"XXX")
If StrPtr(miNombre) = 0 Then Exit Sub
If IsNull(miNombre) Or miNombre = "" Then Exit Sub
If IsNumeric(miNombre) Then Exit Sub
MsgBox "Su nombre es " & miNombre
End Sub
Y qu pasa si lo que queremos es precisamente que el dato sea numrico? Pues muy fcil:
negamos que sea numrico. Je, je... me encantan estas frases ambiguas...
Lo que quiero decir es que si situamos un NOT delante de IsNumeric podemos conseguir el
efecto deseado. Pongamos un ejemplo:
Creamos un nuevo botn de comando en F01, al que llamaremos cmdInputBoxEdad. En el
evento Al hacer click le generamos el siguiente cdigo:
15
Vistame en http://siliconproject.com.ar/neckkito/
un conflicto de tipos y nuestro cdigo nos hubiera dado un error (os animo a probarlo para ver
lo listo que es Access).
Las decisiones de accin se han tomado dentro del
bloque IF. Esto lo veremos con ms detalle en el prximo
captulo.
NORMALIZACIN
Y como punto final a este captulo vamos a hablar de normalizacin de nombres, para despejar
un poco nuestro cerebro.
No existe una norma fija para la nomenclatura de los elementos, tanto de Access. Por lo
tanto os voy a comentar lo que yo utilizo y lo que he visto que utilizan otras personas. Slo
dar unas pinceladas porque la idea se va a coger muy rpido. S voy a dar un par de ideas
para aquellos que quieran profundizar en el tema.
NOMBRES DE OBJETOS
A los objetos de Access (tablas, formularios, etc.) yo tengo por costumbre aadir la inicial del
nombre genrico del objeto. Por ejemplo, si es una tabla aado una T al nombre de la tabla;
si es un formulario aado una F, informe una R (por Report), una C para consulta, una
macro M... La nica excepcin la hago en los subformularios, para lo que empleo subFrm, y
para los mdulos, en los cuales sigo la nomenclatura que os explico en el siguiente prrafo.
Lo que otras personas hacen es utilizar tres letras identificativas del objeto. As, tendramos:
tbl Para tablas
frm Para formularios
qry Para consultas (de query)
mcr Para macros
rpt Para informes
mdl Para mdulos estndar
cls Para mdulos de clase
16
Vistame en http://siliconproject.com.ar/neckkito/
NOMBRES DE CONTROLES
NOMBRES DE VARIABLES
Debo reconocer que yo no utilizo este sistema ms que en ocasiones puntuales, en las cuales
pueden darse ambigedades. Sin embargo os comento los prefijos ms comunes para las
variables, que son:
str Para un String
int Para un Integer
lng Para un Long
bln Para un Boolean
dtm Para un Date
La idea de poner prefijos a los elementos de Access y VBA es simplemente para facilitar el
reconocimiento de los mismos. Evidentemente un prefijo aporta una informacin
complementaria extremadamente til para una lectura rpida de cdigo, o para un
reconocimiento inmediato del elemento de que estamos hablando.
Por ejemplo, y an sin saberlo, si vemos esto:
---
Private Sub lstNombres_Click()
End Sub
---
17
Vistame en http://siliconproject.com.ar/neckkito/
Con todo lo anterior ya sabemos que:
Estamos en el evento Al hacer click de un cuadro de lista
Que la variable intMax es de tipo Integer
Que se busca en la tabla TAlumnos, y no en la
consulta CAlumnos, por ejemplo
Imaginaos eso, pero con 30 controles en el formulario. Vamos a arreglar el botn que nos
imprime un informe... Qu ComandoX es? Tendramos que poner el formulario en vista
diseo y mirar su nombre para despus volver a VBE y encontrar el nmero de botn de
comando que es, lo cual (os lo aseguro) es muy engorroso y molesto.
Lgicamente, si yo busco: Private Sub cmdImprimeInforme_Click() la deteccin ser muy
rpida.
El sistema que tiene una utilizacin mayoritaria es el que se denomina sistema Leszynski. Os
dejo un par de enlaces por si queris profundizar sobre este tema:
http://accessdemo.web.officelive.com/idiomas/esp/articulos/leszynski.htm
http://en.wikipedia.org/wiki/Leszynski_naming_convention
18
Vistame en http://siliconproject.com.ar/neckkito/