Está en la página 1de 7

FORMULARIO BUSCADOR AL TECLEO1

Una vez más debo hacer público mi agradecimiento a


Sveinbjorn por compartir este ejemplo con nosotros. Y una
vez más debo recalcar que mi “misión” en este ejemplo
únicamente ha sido escribir este documento explicativo;
todo el mérito del ejemplo corresponde a Sveinbjorn.

¿Y qué conseguimos a través de este ejemplo? Pues conseguimos


dos cosas: la primera es que, a través de un cuadro de lista, a
medida que vamos escribiendo en un textbox la lista nos va
“depurando” los elementos coincidentes con lo que vamos
escribiendo.

La segunda es que el cuadro de lista nos permite seleccionar varios valores de los encontrados,
mostrándonos, tras un click de botón, la información referente a aquello que hayamos
seleccionado.

El ejemplo se basa en una agenda de contactos: buscamos el nombre de (o de los)


contacto(s), los seleccionamos y vemos la información.

Veamos cómo “montar” el sistema.

CREANDO NUESTRA TABLA


Para empezar por alguna parte nos montaremos una tabla que guardará los datos de nuestra
agenda. La guardaremos como TAgenda. Algo tan sencillo como esto:

Hasta aquí no hay dificultad. Prosigamos.

CREANDO NUESTRO FORMULARIO FAGENDA


Vamos a crearnos un formulario sobre TAgenda y lo guardaremos como FAgenda. Veréis que
hay unos botones para moverse entre los registros, un botón para añadir registros, así como
un botón para cerrar el formulario.

El botón para añadir registros lo vamos a llamar cmdAñadir 2 porque veremos que tiene un
tratamiento especial en los códigos.

Los botones para trabajar con registros han sido creados usando el asistente, por lo que no

1 La BD de ejemplo os la podéis bajar aquí


2 Para asignar un nombre a un control lo que debemos hacer es sacar las propiedades de ese control e irnos a la Pestaña Otras →
Nombre. Ahí escribimos el nombre que queramos.

1
Visítame en http://neckkito.siliconproject.com.ar
cabe destacar nada de ellos. El botón para cerrar el formulario, que se llama cmdCerrar, tiene
el siguiente código3 en el evento “Al hacer click”:


Private Sub cmdCerrar_Click()
DoCmd.OpenForm "FMenu"
DoCmd.Close acForm, Me.Name
End Sub

Como veis, el código cierra el formulario actual y abre otro que


llamamos FMenu. Hablaremos de este formulario un poco más
adelante.

El formulario podría quedarnos algo así:

CREANDO NUESTRO FORMULARIO FMENU


A modo de “panel de control” vamos a crearnos un formulario en blanco, que llamaremos
FMenu. En dicho formulario insertaremos lo siguiente:

- Un botón de comando para añadir un nuevo registro en la agenda. Lo llamaremos


cmdNuevaR.

- Un botón de comando para buscar nombres de la agenda. Lo llamaremos cmdBuscar.

- Un botón de comando para cerrar la aplicación. Lo llamaremos cmdCerrar.

En el botón cmdNuevaR, en el evento “Al hacer click”, generaremos el siguiente código:


Private Sub cmdNuevaR_Click()
AbreFormAgenda 1
DoCmd.Close acForm, Me.Name
End Sub

3 Para generar código debemos sacar las propiedades del control → Pestaña Eventos, y nos situamos en la parte “blanca” a la
derecha del evento que queremos programar. Veremos un pequeño botón de puntos suspensivos. Si hacemos click sobre él nos
aparecerá una ventana que nos pedirá qué operación deseamos realizar. Le indicamos que queremos “generar código”.

2
Visítame en http://neckkito.siliconproject.com.ar

Si os fijáis la primera línea de código llama al procedimiento


AbreFormAgenda, y le pasamos como argumento un 1
(uno). Cuando veamos el código del módulo entenderemos
el sentido de escribir ese 1.

El código, en el mismo evento, para cmdBuscar, será:


Private Sub cmdBuscar_Click()
DoCmd.OpenForm "FBuscador"
DoCmd.Close acForm, Me.Name
End Sub

Como vemos se abrirá un formulario llamado FBuscador, que comentaremos más adelante.

Finalmente, para cmdCerrar, en el mismo evento, el código será, simplemente:


Private Sub cmdSalir_Click()
DoCmd.Quit
End Sub

CREANDO NUESTRO FORMULARIO FBUSCADOR


Como último formulario del ejemplo vamos a crearnos un formulario en blanco que
guardaremos como FBuscador.

En el encabezado añadimos un botón que nos servirá para cerrar el formulario, que
llamaremos cmdcerrar.

Vamos a crearnos, en la sección Detalle:

Un cuadro de texto, que llamaremos txtBuscar.

A continuación nos creamos un cuadro de lista que llamaremos lstPersonas. Cuando nos
aparezca el asistente lo configuramos de la siguiente manera:

• Deseo buscar los valores en una tabla


• Seleccionamos TAgenda
• Añadimos el campo [Nombre]
• Ordenamos ascendente por [Nombre]
• Redimensionamos a nuestro gusto
• Como etiqueta podemos ponerle cualquier valor, puesto que eliminaremos esa etiqueta.

Sacamos las propiedades de lstPersonas y nos vamos a Pestaña Otras → Selección múltiple, y
fijamos su valor en “Extendida”.

Para acabar, en el pie del formulario, añadimos un botón de comando, que llamaremos cmdVer.

Nuestro formulario podría habernos quedado así:

3
Visítame en http://neckkito.siliconproject.com.ar
Vamos a por los códigos de los controles.

En el evento “Al hacer click” de cmdCerrar el código sería:


Private Sub cmdCerrar_Click()
DoCmd.OpenForm "FMenu"
DoCmd.Close acForm, Me.Name
End Sub

En el mismo evento del botón cmdVer asignamos el siguiente código:


Private Sub cmdVer_Click()
'Declaramos las variables
Dim ctlList As Control
Dim Opcion As Variant
Dim miSeleccion As String
'Iniciamos la estructura del filtro
miSeleccion = "[ID] IN ("

Set ctlList = Me.lstPersonas


'Cogemos los valores seleccionados en el cuadro de lista, y los añadimos al filtro
For Each Opcion In ctlList.ItemsSelected
miSeleccion = miSeleccion & ctlList.ItemData(Opcion) & ","
Next Opcion
'Si la longitud del filtro es 9, es que no seleccionamos ninguna opcion
If Len(miSeleccion) = 9 Then
MsgBox "No has seleccionado ninguna persona", vbInformation, "AVISO"
Exit Sub
End If
'Quitamos la última coma (,) del filtro
miSeleccion = Left(miSeleccion, Len(miSeleccion) - 1) & ")"
'Abrimos el mensaje en Modo COnsulta y cerramos el Buscador
Call AbreFormAgenda(3, miSeleccion)
DoCmd.Close acForm, Me.Name
End Sub

Veamos este código:

4
Visítame en http://neckkito.siliconproject.com.ar
Debemos crearnos un filtro para abrir nuestro formulario
FAgenda filtrado. Como el filtro va a depender de la
selección que hagamos en el cuadro de lista inicializamos el
filtro con algo que no va depender de dicha selección. Ese
“algo” es

miSeleccion = "[ID] IN ("

Sigamos. Hemos seleccionado, hipotéticamente, un o unos valores


en el cuadro de lista. Para saber qué valores son los que se han
seleccionado debemos recorrer todos los elementos de la lista.
Para ello creamos el bucle FOR EACH...NEXT:

For Each Opcion In ctlList.ItemsSelected


miSeleccion = miSeleccion & ctlList.ItemData(Opcion) & ","
Next Opcion

Si os fijáis, la variable miSeleccion lo que hace aquí es ir añadiendo los elementos


seleccionados uno tras otro, separándolos con una coma.

Una vez examinados los elementos seleccionados, ¿cómo sabemos que el usuario no ha
seleccionado ninguno? Pues para comprobarlo contamos los caracteres del filtro miSelección.
Si recordamos, inicializábamos el filtro con <miSeleccion = "[ID] IN (">, y esa expresión lleva
9 caracteres. Si no ha “crecido” es porque no se ha seleccionado ningún valor del cuadro de
lista. Ese control nos lo proporciona la línea:

If Len(miSeleccion) = 9 Then

Si el proceso ha sido correcto la variable miSelección contendrá una serie de valores, pero
como al construirla íbamos añadiendo una coma al final ahora debemos eliminar esa última
coma para evitar que el código nos dé errores, ya que contendría un error de sintaxis. Además,
debemos cerrar el paréntesis de la lista. Eso es lo que hace la línea:

miSeleccion = Left(miSeleccion, Len(miSeleccion) - 1) & ")"

Ya tenemos el filtro preparado. Para ello llamamos a la función AbreFormAgenda() de la


siguiente manera:

Call AbreFormAgenda(3, miSeleccion)

De nuevo vemos que le pasamos unos argumentos, en este caso un 3 y el contenido de la


variable miSeleccion. Cuando veamos el código del módulo entenderemos el por qué.

Únicamente nos queda ahora el código que nos va a ir filtrando según escribamos en el textbox
txtBuscar. Para ello, en dicho control, en el evento “Al cambiar” le generamos el siguiente
código:


Private Sub txtBuscar_Change()
Me.lstPersonas.RowSource = "SELECT TAgenda.ID, TAgenda.Nombre FROM TAgenda" _
& " WHERE TAgenda.Nombre " _
& "LIKE '*" & Me.txtBuscar.Text & "*' ORDER BY Nombre"
Me.lstPersonas.Requery
End Sub

5
Visítame en http://neckkito.siliconproject.com.ar
Lo que hace este código es ir modificando, a medida que se
escribe, el origen del registro de lstPersonas. Para ello, va
creando una SQL que busca por aproximación en función de
lo que estemos escribiendo. Al final de cada pulsación de
teclado, además de realizar la SQL de filtro, va refrescando
la información de la lista.

CREANDO NUESTRO MÓDULO


Vamos a añadir un módulo que guardaremos con el nombre de
mdlCodigos4. En él vamos a escribir el procedimiento que hemos
estado mencionando a lo largo de toda explicación. El
procedimiento sería el siguiente:


'------------------------------------------------------------------------------------------------
' Procedimiento para abrir el formulario "Agenda" en distintos modos
' Modos: 1=Añadir, 2=Editar, 3=Consultar
'------------------------------------------------------------------------------------------------

Public Sub AbreFormAgenda(Modo As Byte, Optional Filtro As String)


DoCmd.OpenForm "FAgenda", acDesign, , , , acHidden
If Modo = 1 Then
Forms("FAgenda").cmdAñadir.Visible = True
Else
Forms("FAgenda").cmdAñadir.Visible = False
End If
DoCmd.Close acForm, "FAgenda", acSaveYes
Select Case Modo
Case 1
DoCmd.OpenForm "FAgenda", , , , acFormAdd
Case 2
DoCmd.OpenForm "FAgenda"
Case 3
DoCmd.OpenForm "FAgenda", , , Filtro, acFormReadOnly
End Select
End Sub

Como vemos el procedimiento admite dos parámetros, uno obligatorio (Modo) y otro Opcional
(Filtro).

Los parámetros que le podemos pasar son los números 1, 2 o 3. Con el 1 abriríamos el
formulario para poder añadir registros, con el 2 para editarlos y el 3 para consultarlos.

Lo que hacemos en la primera línea de código es abrir FAgenda en modo diseño y de manera
oculta, para que el usuario no vea que estamos manipulando el formulario.

Si lo abrimos en modo 1 para añadir lógicamente debe verse el botón para añadir registros,
pero si lo abrimos en modo 2 o 3 no debe abrirse. Esto es lo que hace el bloque IF...END IF,
situando la propiedad VISIBLE del botón en TRUE o FALSE según el modo.

Una vez cambiada la propiedad VISIBLE se cierra FAgenda guardando los cambios.

El bloque siguiente, el SELECT CASE, lo que hace es abrir el formulario FAgenda en vista
formulario en el modo que hemos seleccionado. Si el modo es 1 para añadir añadimos, a la
orden de apertura, el argumento acFormAdd; si el modo es 2 para modificar no le pasamos
argumento alguno; si el modo es 3 para consultar le pasamos el argumento acFormReadOnly.

4 Para insertar un módulo estándar podemos abrir el editor de VB (ALT+F11) y nos vamos a Menú → Insertar → Módulo

6
Visítame en http://neckkito.siliconproject.com.ar
¿Fácil, verdad? ;-)

PARA FINALIZAR EL EJEMPLO


Aunque lo he comentado al principio, agradezco de nuevo a
Sveinbjorn que me haya permitido colgar este ejemplo en la
web.

Espero que el ejemplo os sea útil. Un saludo, y...

¡suerte!

7
Visítame en http://neckkito.siliconproject.com.ar

También podría gustarte