You are on page 1of 18

CURSO DE VB

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.

Podemos decir que la mayora de eventos son comunes


tanto a los objetos como a los controles, aunque cada uno,
lgicamente, tendr sus propias peculiaridades.

Si estamos en estos momentos viendo los eventos del


formulario F01 vamos a generar una accin asociada a un
evento. Lo que de aqu en adelante llamar generamos el
siguiente cdigo incluye un proceso que explicar a
continuacin, pero que ya no repetir para sucesivas
explicaciones (por eso es importante que lo aprendis
ahora, aunque es muy sencillo). Para ello:
Nos situamos en el evento Al abrir (o, cuando programemos un evento, en cualquiera
de ellos que nos sirva para nuestros propsitos).
Si hacemos click en el espacio en blanco que hay a la derecha del nombre del evento
veremos que nos aparece un pequeo botn de puntos suspensivos.
Hacemos click sobre ese pequeo botn
Nos aparecer una ventana que nos solicitar tres opciones:
Generar macros: si pulsamos aqu podremos crear una macro asociada a ese
evento.
Generador de expresiones: si pulsamos aqu se nos abrir la ventana del
generador de expresiones, y ah podremos especificar la expresin (nunca mejor dicho)
que queramos que se ejecute al suceder el evento.
Generador de cdigo: este es el que nos interesa si queremos utilizar cdigo
VBA.
Seleccionamos pues el generador de cdigo y se nos abrir... nuestro amigo el VBE!

Vamos a analizar qu ha pasado al abrirse el editor de VB:


1.- Se nos ha creado un mdulo de objeto, en nuestro caso relacionado con F01. Si echamos
un vistazo a la ventana de proyecto podremos ver que ah aparece nuestro objeto F01
2.- Se nos han creado dos lneas por defecto: Private Sub... y End Sub. Ya deberamos saber
que Private nos est indicando que el procedimientos va a tener carcter un mbito de
actuacin privado, es decir, restringido dentro del propio proceso, y que no ser accesible
desde otros procedimientos/funciones/mdulos.
3.- Adems, nos ha identificado el evento que hemos seleccionado, que en nuestro caso es Al
abrir Form_Open
4.- Automticamente nos est indicando que este evento tiene la posibilidad de utilizacin de
un argumento por defecto, que es Cancel.
5.- Nos marca dnde est el final del procedimiento, a travs del End Sub

Nuestro espacio de trabajo para cdigo ser, pues, entre estas dos lneas.

Vamos a programar un simple cdigo, que ser el siguiente:


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 crear una tabla, que guardaremos con el nombre


de TPrueba, con dos campos:
[Id] Autonumrico y clave principal
[Dato] Texto

Ahora creamos un formulario basado en esa tabla, que


guardaremos como FPrueba. Lo abrimos en vista diseo.
Veremos que, lgicamente, tenemos ah los dos campos de la tabla. A esos elementos se les
denomina controles.
Si ahora aadimos un cuadro de texto al formulario tendremos un control ms; si aadimos
una etiqueta, un botn de comando, un cuadro combinado y, en definitiva, cualquier elemento
de la cinta de opciones del grupo controles (lo mismo para Access 2003, aunque no
hablemos de cinta de opciones), estaremos aadiendo un control al formulario.
Ahora ya sabemos que cuando hablemos de un control de formulario nos estamos refiriendo
a todo este conjunto de elementos que acabamos de mencionar.
Si, por ejemplo, seleccionamos el campo Dato (no su etiqueta, sino el campo en s) y sacamos
sus propiedades ya sabemos que podremos encontrar una pestaa llamada Eventos, que nos
muestra todos los eventos disponibles sobre los que podemos operar y que hacen referencia a
ese control en concreto.

MIX DE LOS ANTERIORES CONCEPTOS

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:

Private Sub Form_Current()


If IsNull(Me.Dato.Value) Then
MsgBox "El campo <dato> est vaco"
Else
MsgBox "El campo <dato> est lleno"
End If
End Sub

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.

Y si ahora abrimos el VBE veremos que:


Tenemos dos mdulos asociados a objetos (F01 y FPrueba)
Dentro de FPrueba tenemos dos bloques de cdigo, que se nos delimitan por una lnea
separadora, y que los cdigos que hemos asociado a eventos son, por defecto, siempre
PRIVATE.
Que los cdigos asociados a controles del formulario quedan recogidos dentro del
mdulo asociado al mismo formulario.

6
Vistame en http://siliconproject.com.ar/neckkito/
LA FUNCIN MSGBOX

La funcin MsgBox nos permite dos cosas: la primera, y


ms bsica, lanzar un mensaje al usuario, y la segunda,
ms compleja, lanzar un mensaje a la vez que se solicita
una respuesta del usuario.

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.

Analicemos los argumentos:


[Texto a mostrar]: lgicamente ser el mensaje que queremos que vea el usuario. Lo
deberemos poner entre comillas
[Botn/es a mostrar]: podemos mostrar diversos botones en nuestro cuadro de
mensaje. La llamada a los botones se realiza a travs de constantes de VB. Sin nimo de
exhaustividad, y para este apartado, tenemos los siguientes:
vbOkOnly Slo nos mostrar un botn OK
vbExclamation Nos aparece el icono de exclamacin
vbQuestion Nos aparece el icono de interrogacin
vbCritical Nos aparece el icono de aviso crtico
vbInformation Nos aparece el icono de informacin
[Ttulo de la ventana de mensaje]: es el ttulo que nos aparecer en la parte superior
de la ventana de nuestro mensaje.

Vamos a comprobar lo anterior:

Ponemos nuestro formulario F01 en vista diseo y aadimos un botn de comando. Lo


llamamos cmdLanzaMensaje (os recuerdo: propiedades Otras Nombre). Al evento Al
hacer click le generamos el siguiente cdigo:

Private Sub cmdLanzaMensaje_Click()


MsgBox "Acabas de pulsar un botn", vbInformation, "UN MENSAJE"
End Sub

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

Podemos utilizar una constante de VB para indicar que


queremos un salto de lnea en nuestro mensaje. La
constante que vamos a utilizar es
VBCRLF
S que la palabrita se las trae, pero a m me sirve pensar
en ella (si conocis algo de las mquinas de escribir
antiguas) como: vb (por constante de VB), carro de lnea
final (por CR LF). Es decir, que cuando llegbamos a la
lnea final debamos mover el carro de la mquina de
escribir a la izquierda para poder escribir una nueva lnea.

Y cmo sera la sintaxis con esto? Pues vamos a probarlo empricamente:


En nuestro F01 en vista diseo aadimos un nuevo botn de comando, al que llamaremos
cmdCarroLinea, y en el evento Al hacer click le generamos el siguiente cdigo:

Private Sub cmdCarroLinea_Click()


MsgBox "Esta va a ser la primera lnea de nuestro mensaje" & _
vbCrLf & "Esta va a ser la segunda lnea de mensaje y..." & _
vbCrLf & vbCrLf & "Esta es la tercera, separada por un espacio", _
vbExclamation, "VARIAS LNEAS"
End Sub

Como podemos ver en el cdigo (y aprender):


Para unir todo nuestro mensaje usamos el ampersand (&)
Utilizamos el subguin para hacer el cdigo ms legible, separado en varias lneas (esto
ya lo vimos en una leccin anterior).
La estructura con la constante de VB s: Texto1 & vbCrLf & Texto2
Si queremos dejar lneas en blanco debemos concatenar la constante, como hemos
hecho en la tercera lnea del mensaje. Es decir: Texto1 & vbCrLf & vbCrLf & Texto2

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:

Private Sub cmdVariable_Click()


Dim miTexto As String
Dim miEdad As Integer
miTexto = "Yo soy Neckkito"

8
Vistame en http://siliconproject.com.ar/neckkito/
miEdad = 125
MsgBox miTexto & miEdad, vbCritical, "MI MENSAJE"
End Sub

Si ejecutamos este cdigo vemos que nos sale el mensaje,


pero muy feo ;)
Vamos a arreglar el mensaje combinando texto directo y
variables. As pues modificamos la lnea de MsgBox por la
siguiente:
MsgBox miTexto & " y tengo slo " & miEdad & " aos", vbCritical, "MI MENSAJE"

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!

LANZAR MENSAJE Y ESPERAR RESPUESTA DE UN USUARIO

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:

Si <el usuario pulsa YES> Msgbox = 6 Entonces


'Haz esto
End Si

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:

Si <el usuario pulsa YES> Msgbox = vbYes Entonces


'Haz esto
End Si

Es decir, o es igual a 6 o es igual a vbYes (o es igual a 7 o igual a vbNo).

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 ;)

Vamos a operar a travs de un ejemplo. Con nuestro


formulario F01 en vista diseo aadimos un botn de
comando, al que llamaremos cmdSiNo, y le generaremos el
siguiente cdigo:

Private Sub cmdSiNo_Click()


Dim resp As Integer
resp = MsgBox("Pulsa s o no: el que quieras", vbQuestion + vbYesNo, "PETICIN")
If resp = vbYes Then 'o tambin If resp = 6 Then
MsgBox "Has pulsado S. A que s?", vbExclamation, "PULSASTE SI"
Else
MsgBox "Has pulsado NO. No es verdad?", vbExclamation, "PULSASTE NO"
End If
End Sub

Vamos a ver un par de cosillas del cdigo:


Cuando se espera una respuesta del usuario los argumentos del MsgBox deben ir entre
parntesis.
Para mostrar diferentes botones utilizamos el signo ms (+) para unirlos
Utilicemos valores numricos o constantes definimos la variable como Integer.

Y un par de cosillas sobre botones:


Tenemos varios tipos de botones para interactuar con el usuario, por ejemplo:
vbOkCancel
vbAbortRetryIgnore
vbYesNoCancel
vbRetryCancel
Hay otra serie de botones que lo que hacen es situarnos el enfoque sobre una opcin
predeterminada. Es decir, tenemos:
vbDefaultButton1
vbDefaultButton2
etc. hasta el 4
En este caso podramos escribir vbYesNo+vbDefaultButton1, lo que hara el botn S como
opcin predeterminada.

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

El cdigo anterior, si se hubiera programado sin la


utilizacin de variables, quedara de la siguiente manera:

Private Sub cmdSiNo_Click()
If MsgBox("Pulsa s o no: el que quieras", vbQuestion +
vbYesNo + vbDefaultButton2, "PETICIN") = vbYes Then
MsgBox "Has pulsado S. A que s?", vbExclamation, "PULSASTE SI"
Else
MsgBox "Has pulsado NO. No es verdad?", vbExclamation, "PULSASTE NO"
End If
End Sub

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.

La sintaxis de esta funcin es la siguiente:


InputBox ([Texto informativo], [Ttulo de la ventana
de mensaje], [Valor de respuesta por defecto])

Hay ms argumentos que se pueden utilizar, pero no los


explicaremos aqu porque, realmente, yo no los he visto utilizar
demasiado. Si estis interesados en profundizar la ayuda del
propio Access os dir lo que necesitis sobre ellos.

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:

Private Sub cmdInputBox_Click()


Dim miNombre As String
miNombre = InputBox("Introduzca su nombre", "NOMBRE", "XXX")
MsgBox "Su nombre es " & miNombre
End Sub

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:

Private Sub cmdInputBoxNum_Click()


Dim valor1 As Integer, valor2 As Integer
valor1 = InputBox("Introduzca el primer nmero", "#1", 0)
valor2 = InputBox("Introduzca el segundo nmero", "#2", 0)
MsgBox "La suma de " & valor1 & " y " & valor2 & " es " & valor1 + valor2
End Sub

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.

Evidentemente hubiramos podido crear una tercera


variable que nos recogiera el resultado y pasrsela al
Msgbox, con lo que el cdigo hubiera quedado as:

Private Sub cmdInputBoxNum_Click()


Dim valor1 As Integer, valor2 As Integer, result As Integer
valor1 = InputBox("Introduzca el primer nmero", "#1", 0)
valor2 = InputBox("Introduzca el segundo nmero", "#2", 0)
result = valor1 + valor2
MsgBox "La suma de " & valor1 & " y " & valor2 & " es " & result
End Sub

DETECTAR LA PULSACIN DEL BOTN <CANCELAR>

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:

Private Sub cmdInputBoxCancelar_Click()


Dim miNombre As String
miNombre = InputBox("Introduzca su nombre", "NOMBRE", "XXX")
If StrPtr(miNombre) = 0 Then Exit Sub
MsgBox "Su nombre es " & miNombre
End Sub

13
Vistame en http://siliconproject.com.ar/neckkito/

Y eso es todo. No hay ms secreto.

OTROS CONTROLES PARA QUE NO NOS


FALLE EL INPUTBOX

Como los usuarios son extremadamente variables puede


sucedernos que les solicitemos un nombre y no escriban nada
(dejen el valor en blanco), o que introduzcan un valor numrico, o
cualquier otra salvajada que no podamos prever. Vamos a ver
cmo cubrirnos de estas manipulaciones de nuestro InputBox.

DETECTAR VALORES VACOS

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:

Private Sub cmdInputBoxVacios_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
MsgBox "Su nombre es " & miNombre
End Sub

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 ;) )

DETECTAR VALORES DE DIFERENTE TIPO

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

Como podemos comprobar la sintaxis es <IsNumeric(variable)>. Si ahora el usuario introduce


un nmero nuestro cdigo se dar cuenta y saldr del proceso.

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:

Private Sub cmdInputBoxEdad_Click()


Dim miEdad As Variant
miEdad = InputBox("Introduzca su edad", "AITOS")
If Not IsNumeric(miEdad) Then
MsgBox "El valor introducido no es vlido", vbCritical, "MAL"
Exit Sub
Else
MsgBox "Vaya... qu 'joven' eres!", vbExclamation, "CARAMBA!!!!!!!"
End If
End Sub

Un par de comentarios sobre el cdigo:


No nos ha quedado ms remedio que definir la variable miEdad como Variant. Si la
hubiramos definido como Integer, y el usuario hubiera introducido letras, se hubiera producido

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.

Quiz alguien pueda pensar: por qu aqu declaramos la


variable como Variant, y en el ejemplo anterior la hemos
declarado como String y no pasaba nada? Os recuerdo que:
Si se ha definido la variable como Integer y escribimos una
letra, una letra nunca puede ser un nmero. Aqu no hay equvoco.
Si se ha definido la variable como String y escribimos un nmero, s podemos entender
que, en primera instancia, ese nmero no es tal, sino que queremos que sea un carcter. Es
decir:
123 es un nmero, pero
123 son tres caracteres
Es por ello por lo que, en principio, nuestro cdigo no detecta nada anmalo y por ello no nos
salta error de cdigo.

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

Para los controles utilizo ms o menos el sistema que el


resto de mortales suele utilizar. Es decir:
txt Para cuadros de texto
lbl Para etiqueta (de label)
cbo Para un cuadro combinado
cmd Para un botn de comando (de command)
lst Para un cuadro de lista
img Para un cuadro de imagen
opc Para un botn de opcin
mrc Para un marco de opciones
chk Para una casilla de verificacin (de check)
tab Para control de ficha

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

Y POR QU LOS PREFIJOS?

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()

intMax = Dlookup([Edad], TAlumnos)

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

Otra utilidad de nombrar, en este caso, los controles, es que


para revisiones de cdigo nos ahorramos una gran cantidad
de tiempo. Es decir, supongamos que estamos en el VBE, en
un mdulo de objeto formulario, repasando el cdigo, y
vemos lo siguiente:

Private Sub Comando0_Click()


' Cdigo
End Sub
Private Sub Comando1_Click()
' Cdigo
End Sub
Private Sub Cuadro_Combinado34_AfterUpdate()
' Cdigo
End Sub

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.

MS INFORMACIN SOBRE NORMALIZACIN

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/

You might also like