lunes, octubre 02, 2017

Reducción de valores mostrados en lista desplegable con criterio de búsqueda

Como ya hemos mostrado en este blog, hay muchas formas de crear listas desplegables en Excel:
  • con Validación de Datos, Lista;
  • incrustando en la hoja un cuadro combinado (combobox) o un cuadro de lista (listbox) de la colección de formularios;
  • programando un cuadro combinado o un cuadro de lista en un Userform en el editor de Vba (macros).
Todas las técnicas pueden verse en mi e-book "Listas Desplegables - la guía JLD".

Uno de los requerimientos de los usuarios es la posibilidad de reducir los valores que aparecen en la lista de acuerdo a algún criterio. Supongamos que tenemos una lista de varios cientos de productos y queremos ver sólo aquellos que contengan la palabra "aceite" antes de seleccionar los valores deseados.

En este post voy a mostrar cómo hacerlo usando un ListBox para crear la lista desplegable y un cuadro de texto para introducir el texto del criterio de búsqueda. Todo ésto lo armamos en un Userform y, por supuesto, usaremos código de Vb para activar el modelo.

Esta captura de pantalla  muestra como funciona nuestro modelo. Cada vez que ingresamos un valor en la casilla de textos, la lista desplegable se reduce a los valores que contienen ese texto




El origen de los datos de la lista desplegable es una lista de precios que se encuentra en una tabla que llamaremos "tbl_Productos"


No me voy a extender aquí sobre las bondades de usar Tablas para organizar nuestros datos en las hojas de Excel, tema que he tocado varias veces en este blog.

Creamos un Userform con un cuadro de lista (Listbox), un cuadro de texto (Textbox) y dos botones de comando


Cuando incrustamos el cuadro de lista (Listbox) en el formulario, definimos ciertas propiedades en la ventana de propiedades


Como puede apreciarse RowSource (la fuente de los datos de la lista) se refiere directamente a la tabla con su nombre.
Para facilitar el código que mostramos más adelante, creamos también un nombre definido que se refiere a la tabla


Los códigos detrás de los objetos (que van en el módulo del Userform) son los siguientes:

# - un evento Change para el ListBox. Este evento se dispara cada vez que tecleamos algún valor en la casilla de texto; cuando esta vacía vemos todos los valores de la lista de precios


 Private Sub tboxCriterio_Change()  
   Dim v As Variant, i As Long  
   v = Range("lstProductos").Value  
   With Me.lbxProductos  
   If Len(Me.tboxCriterio.Value) = 0 Then  
     .RowSource = "lstProductos"  
   Else  
     .RowSource = ""  
     For i = LBound(v, 1) To UBound(v, 1)  
       If LCase(v(i, 1)) Like "*" & LCase(tboxCriterio.Value) & "*" Then  
         .AddItem v(i, 1)  
         .List(.ListCount - 1, 1) = v(i, 2)  
       End If  
     Next i  
   End If  
   End With  
 End Sub  


# - un evento Click para el botón Cancelar

 Private Sub cbtCancelar_Click()  
   Unload ufProductos  
 End Sub  

Si estuviéramos usando este formulario en un modelo real tendríamos que escribir código para el botón Aceptar. Aquí estamos mostrando solamente cómo crear la lista desplegable así que dejaremos ese código para algún post en el futuro (en caso que algunos de mis lectores quieran ver como aplicar esta técnica a un ejemplo).

Para activar el Userform usamos el botón "Lista de productos" al cua tiene asociado este código

 Sub listaProductos()  
   ufProductos.Show  
 End Sub  


6 comentarios:

  1. Genial don Jorge...! Adelantándome a ese post paa elcódigo de aceptación.... ¿Se podría hacer que al escoger un producto de esa lista; y supongo que oprimiendo algún otro botón, digamos "Introducir", se vaya alimentando una lista con esos datos escogidos...?
    Muy agradecido por todo lo que nos ha enseñado a través de su blog...
    Ronald

    ResponderBorrar
  2. Se puede hacer. De hecho podrías intentar adaptar el código que mostré en este post sobre como ocultar o descubrir hojas de un cuaderno.
    Más adelante publicaré un post sobre tu consulta.

    ResponderBorrar
  3. Creo todas las herramientas son indispensables (VBA, Complementos, etc.), lo esencial es saber qué y cuándo aplicar las herramientas para resolver un problema y en sus manos tenemos esa respuesta maestro.

    ResponderBorrar
  4. Gracias por los conceptos. Mi blog es solamente una de las muchas y buenas herramientas que hay en la Web.

    ResponderBorrar
  5. Como siempre sus aportes son muy valiosos, solo tengo una duda con la siguiente parte del código, ya que me manda un error de compilación "no se encontró el método o el dato del miembro".
    With Me.lbxProductos

    ResponderBorrar
  6. Fijate en la imagen del cuadro de propiedades de la listbox; "lbxProductos" es el nmbre (name) del objeto. Tienes que asegurarte de definirlo.

    ResponderBorrar

Nota: sólo los miembros de este blog pueden publicar comentarios.