ORDENAR ELEMENTOS DE UN LISTBOX UTILIZANDO OBJETO ARRAYLIST

Hola a todos!:

En esta web hay varios post dedicados a los listbox, tanto en formularios como objetos en la hoja. En el post de hoy me gustaría mostrar un código en el que vamos a ver un método para cargar los datos en nuestro listbox y también para ordenarlos.

Imaginad los siguientes datos:

ORDENAR ELEMENTOS DE UN LISTBOX UTILIZANDO OBJETO ARRAYLIST

Por un lado tenemos un listado de nombres y apellidos y por otro de números. Nuestro objetivo es pasar al listbox los datos seleccionados y ordenarlos.

Veamos el código que os propongo:

Sub ORDENAR_LIST()
'Definimos variables
Dim MiMatriz As Object, Celda As Variant, nItem As Variant
'Vaciamos listbox
Call BORRAR
With Sheets("ORDENAR")
'Creamos objeto ArrayList
Set MiMatriz = CreateObject("System.Collections.ArrayList")
'Pasamos los datos seleccionados al ArrayList
'Si la celda está vacía, no la tenemos en cuenta
'Formateamos el contenido de cada celda como texto
For Each Celda In Selection
If Not IsEmpty(Celda) Then MiMatriz.Add CStr((Celda))
Next Celda
'Ordenamos
MiMatriz.Sort
'Pasamos la información al listbox
For Each nItem In MiMatriz
.ListBox1.AddItem (nItem)
Next nItem
End With
End Sub

Sub BORRAR()
With Sheets("ORDENAR")
'Limpiamos combo y listbox
.ListBox1.Clear
End With
End Sub

Como podéis observar, vamos a trabajar con la selección como un rango de datos. Para ello tendremos que crear el objeto arraylist que nos permitirá ordenar la información de menor a mayor con el método .Sort.

Básicamente, con una instrucción For – Each vamos pasando cada elemento de la selección a nuestro arraylist (en este ejemplo no tendremos en cuenta las celdas vacías) y además damos formato texto a cada valor de las celdas seleccionadas (CStr) evitando así errores de tipos y también en el método Sort a la hora de comparar los datos para la ordenación.

Una vez pasados los datos, ordenamos. Si quisiéramos invertir el orden, simplemente tendríamos que incluir una nueva línea debajo del .Sort:

MiMatriz.Reverse

Una vez que lo tenemos, solo tenemos que pasar los datos al listbox mediante otro For-Each.

El resultado es para los nombres:

ORDENAR ELEMENTOS DE UN LISTBOX UTILIZANDO OBJETO ARRAYLIST_1

Y para los números:

ORDENAR ELEMENTOS DE UN LISTBOX UTILIZANDO OBJETO ARRAYLIST_2

Como podéis comprobar, el método funciona perfectamente para ambos casos.

Espero que os haya resultado de interés!.

Descarga el archivo de ejemplo pulsando en: ORDENAR ELEMENTOS DE UN LISTBOX UTILIZANDO OBJETO ARRAYLIST

¿Te ha resultado de interés?, puedes apoyar a Excel Signum con una pequeña donación.

Donate Button with Credit Cards

¡¡Muchas gracias!!

Mediante la suscripción al blog, la realización comentarios o el uso del formulario de contacto estás dando tu consentimiento expreso al tratamiento de los datos personales proporcionados según lo dispuesto en la ley vigente (LOPD). Tienes más información al respecto en esta página del blog: Política de Privacidad y Cookies

Anuncios

MODIFICAR BASE DE DATOS DESDE UN LISTBOX CON UN FILTRO APLICADO

Hola a todos:

En el post de hoy trataré un tema muy específico de los listbox (o cuadros de lista) en los formularios. Se trata de cómo podemos seleccionar desde un listbox CON UN FILTRO APLICADO la información relacionada en un base de datos.

Para comprender el concepto, es necesario explicarlo con un ejemplo:

MODIFICAR BASE DE DATOS DESDE UN LISTBOX CON UN FILTRO APLICADO

En la imagen podemos apreciar como el listbox está filtrado por varios criterios y como en la hoja hemos capturado la fila correspondiente al registro seleccionado en el listbox.

Para poder conseguir esto, debemos siempre crear en nuestra base de datos un indice que vaya desde el 1 hasta el final indicando el número en cada celda: 1, 2, 3 …hasta el final del rango con datos. En mi ejemplo es la primera columna y la nombro como ÍNDICE.

Esto lo automatizaremos cada vez que inicialicemos el formulario que carga los datos en el listbox, así:

Private Sub UserForm_Initialize()
Dim i As Long, fin As Long, Mirango() As Integer

'Borramos ID's e inicializamos de nuevo.

'Los ID deben ser consecutivos a partir de 1

fin = Application.CountA(Sheets("BBDD").Range("B:B"))
Sheets("BBDD").Range("A2:A" & fin).Select
Selection.Clear
ReDim Mirango(1 To fin)
For i = 1 To fin:
Mirango(i) = i
Next i
Worksheets("BBDD").Range("A2:A" & UBound(Mirango)).Value = _
Application.WorksheetFunction.Transpose(Mirango)
Worksheets("BBDD").Range("A1").Select
'Indicamos el número de columnas que tendrá el listbox

Me.ListBox1.ColumnCount = 7

'Definimos tamaño de los espacios

Me.ListBox1.ColumnWidths = "30pt;150pt;150pt;50pt;50pt;60pt"

'Cargamos listbox

Me.ListBox1.RowSource = ("A2:G") & Worksheets("BBDD").Range("A" & Rows.Count).End(xlUp).Row

End Sub

En rojo está el código de realiza esto, primero limpia datos de la primera columna excepto encabezados y luego a través de un array iniciamos la numeración del 1 hasta el final. El último paso es transponer los datos en la columna A.

Es importante tener en cuenta que este paso lo hará automáticamente cada vez que mostremos el formulario.

Luego, en el evento ListBox1_Click(), solo tenemos que pasar este código para cada vez que seleccionemos una línea en nuestro cuadro de lista, está se seleccione también en la hoja:

Private Sub ListBox1_Click()
Dim i As Long
Dim dato As Integer
For i = 0 To ListBox1.ListCount - 1
If ListBox1.Selected(i) Then dato = ListBox1.List(i)
Next i
Sheets("BBDD").Cells(dato + 1, 1).Activate
End Sub

Y os estaréis preguntando porqué hacemos todo esto, pues es sencillo, es fundamental por si queremos modificar los datos a través del listbox. De esta forma podremos modificar lo que hayamos seleccionado, aunque se encuentre filtrado, en nuestra base de datos:

MODIFICAR BASE DE DATOS DESDE UN LISTBOX CON UN FILTRO APLICADO_1

He aprovechado la misma base de datos del post: REALIZAR BÚSQUEDAS DEPENDIENTES EN UN LISTBOX y también parte de la programación para poder ilustrar cómo podemos resolver la cuestión presentada.

Simplemente comento dos líneas de código que he agregado para que el formulario de modificación funcione correctamente:

Para cargar los datos seleccionado en el listbox y en la hoja:

Private Sub UserForm_Initialize()
For j = 1 To 6
Me.Controls("TextBox" & j).Value = ActiveCell.Offset(0, j)
Next j
End Sub

Y para modificar:

Private Sub CommandButton1_Click()
'Definimos variables
Dim i As Long, j As Long, fin As Long, Mirango() As Integer
'Pasamos datos modificados a la hoja
For j = 1 To 6
ActiveCell.Offset(0, j).Value = Me.Controls("Textbox" & j).Value
Next j
'Marcamos de nuevo elemento a modificar
For i = 0 To FORMULARIO.ListBox1.ListCount - 1
If FORMULARIO.ListBox1.Selected(i) Then dato = FORMULARIO.ListBox1.List(i)
Next i
Sheets("BBDD").Cells(dato + 1, 1).Activate
'Actualizamos listbox
FORMULARIO.ListBox1.RowSource = ("A2:G") & Worksheets("BBDD").Range("A" & Rows.Count).End(xlUp).Row
Unload Me
End Sub

En este ejemplo solo he implementado un formulario para realizar modificaciones, cualquier otra mejora como realizar un alta o una baja o que los cambios se guarden automáticamente os lo dejo como ejercicio para practicar : )

Y eso es todo, espero que este método os haya resultado de interés : )

Descarga el archivo de ejemplo pulsando en: MODIFICAR BASE DE DATOS DESDE UN LISTBOX CON UN FILTRO APLICADO

¿Te ha resultado de interés?, puedes apoyar a Excel Signum con una pequeña donación.

Donate Button with Credit Cards

¡¡Muchas gracias!!

Mediante la suscripción al blog, la realización comentarios o el uso del formulario de contacto estás dando tu consentimiento expreso al tratamiento de los datos personales proporcionados según lo dispuesto en la ley vigente (LOPD). Tienes más información al respecto en esta página del blog: Política de Privacidad y Cookies

SINCRONIZAR LA INFORMACIÓN DE VARIOS LISTBOX

Hola a todos!

Qué tal os va?, espero que muy bien!. El post de hoy tratará sobre los listbox y la posibilidad de sincronizar la información entre varios.

Como es habitual, el post surge fruto de una duda, en la que el lector planteaba la siguiente problemática: Tenía varios listbox en los que se mostraban varios campos de un tabla de Excel y lo que necesitaba es que si en el primero seleccionada un determinado ítem, en el segundo se debía mostrar la información relacionada con ese ítem, y así hasta varios.

Como sabéis, cuando cargamos información en varios listbox, aunque provengan de la misma tabla, la selección y el uso del scroll es totalmente independiente el uno del otro. Para hacer lo que el lector solicita, debemos sincronizarlos. Ahora os mostraré el ejemplo.

Vamos a cargar una base de datos en 3 listbox:

SINCRONIZAR LA INFORMACION DE VARIOS LISTBOX

En este ejemplo voy a utilizar ADO para cargar los listbox (no es el tema del post) y ya lo vimos en otras entradas, por ejemplo: CARGAR DATOS EN LISTBOX Y REALIZAR BÚSQUEDAS CON ADO Y CONSULTAS SQL por eso, no voy a publicar aquí el código, os lo dejo en el archivo de prueba.

Pues bien, la información cargada quedaría así:

SINCRONIZAR LA INFORMACION DE VARIOS LISTBOX_1

Como podéis observar he dejado un textbox para realizar búsquedas dado que he reutilizado parte del código de la entrada que os he mencionado al principio.

Y ahora, para sincronizar los listbox, debemos utilizar el evento click en cada uno de ellos y pegar este código en el formulario:

Private Sub ListBox1_Click()
ListBox2.ListIndex = ListBox1.ListIndex
ListBox2.TopIndex = ListBox1.TopIndex
ListBox3.ListIndex = ListBox1.ListIndex
ListBox3.TopIndex = ListBox1.TopIndex
End Sub

Private Sub ListBox2_Click()
ListBox1.ListIndex = ListBox2.ListIndex
ListBox1.TopIndex = ListBox2.TopIndex
ListBox3.ListIndex = ListBox2.ListIndex
ListBox3.TopIndex = ListBox2.TopIndex
End Sub

Private Sub ListBox3_Click()
ListBox1.ListIndex = ListBox3.ListIndex
ListBox1.TopIndex = ListBox3.TopIndex
ListBox2.ListIndex = ListBox3.ListIndex
ListBox2.TopIndex = ListBox3.TopIndex
End Sub

Lo que estamos haciendo es igualar la propiedad .ListIndex para identificar el elemento que tiene el foco y el .TopIndex para detectar el elemento en la parte superior del listbox.

El resultado será que siempre marcaremos la línea de información del ítem seleccionado en todos los listbox:

SINCRONIZAR LA INFORMACION DE VARIOS LISTBOX_2

y eso es todo. Ya está solucionada la consulta : )

Descarga el archivo de ejemplo pulsando en: SINCRONIZAR LA INFORMACIÓN DE VARIOS LISTBOX

¿Te ha resultado de interés?, puedes apoyar a Excel Signum con una pequeña donación.

Donate Button with Credit Cards

¡¡Muchas gracias!!

Mediante la suscripción al blog, la realización comentarios o el uso del formulario de contacto estás dando tu consentimiento expreso al tratamiento de los datos personales proporcionados según lo dispuesto en la ley vigente (LOPD). Tienes más información al respecto en esta página del blog: Política de Privacidad y Cookies

LIMPIAR CONTENIDO DE CONTROLES DE FORMULARIO EN HOJA EXCEL O EN USERFORM

Hola a todos!.

Hoy me gustaría dejaros un par de códigos para borrar el contenido de los controles de formulario, tanto aquellos que se insertan en la hoja excel como aquellos que insertamos en nuestros userform o formularios en el editor de VBA.

Voy a comenzar con los controles insertados en una hoja (controles ActiveX), por ejemplo una en la que tengamos varios: Textbox, ComboBox, ListBox y CheckBox. Para que podamos automatizar el proceso de forma óptima debemos utilizar la instrucción Select Case:

Sub LIMPIAR_CONTROLES()
With ActiveSheet
'Por cada objeto que indiquemos en el select case, borramos contenido
For Each Control In .OLEObjects
Select Case TypeName(Control.Object)
Case "TextBox"
Control.Object.Text = vbNullString
Case "ComboBox"
Control.Object.Clear
Case "ListBox"
Control.Object.Clear
Case "CheckBox"
Control.Object.Value = False
End Select
Next Control
End With
End Sub

Dado que estamos trabajando con controles ActiveX debemos tratar en nuestro código con los objetos OLEObject, que son los que nos van a permitir interactuar con nuestra hoja. A continuación solo tendremos que especificar el tipo de objeto y la forma en la que debemos limpiarlo o vaciarlo en el Select – Case.

Con los Formularios o Userforms resulta más sencillo, dado que haremos referencia a la colección Controls. El resultado del código es similar al anterior:

Private Sub CommandButton1_Click()
'Por cada objeto que indiquemos en el select case, borramos contenido
For Each Control In Me.Controls
Select Case TypeName(Control)
Case "TextBox"
Control.Text = vbNullString
Case "ComboBox"
Control.Clear
Case "ListBox"
Control.Clear
Case "CheckBox"
Control.Value = False
End Select
Next Control
End Sub

Como podéis ver, ambas estructuras son idénticas (salvo por la forma de hacer referencia a los controles de formulario).

Dado que se trata de fragmentos de código bastante específicos y sencillos, considero que no requieren un archivo de ejemplo. Os invito a que los probéis en vuestros proyectos : )

¿Te ha resultado de interés?, puedes apoyar a Excel Signum con una pequeña donación.

Donate Button with Credit Cards

¡¡Muchas gracias!!

Mediante la suscripción al blog, la realización comentarios o el uso del formulario de contacto estás dando tu consentimiento expreso al tratamiento de los datos personales proporcionados según lo dispuesto en la ley vigente (LOPD). Tienes más información al respecto en esta página del blog: Política de Privacidad y Cookies

INTRODUCIR MÚLTIPLES VALORES EN UN INPUTBOX

Hola a todos!.

Qué tal estáis? espero que bien! y supongo que muchos de vosotros ya estáis disfrutando de las vacaciones o esperando a que lleguen.

Hoy voy a comentar una solución que le ofrecí a un lector que me consultaba cómo podría introducir en un inputbox dos o más datos. Normalmente esta tarea se realiza con un formulario o userform, habilitando tantos cuadros de texto como sean necesarios.

Pero en el caso del inputbox solo tenemos un cuadro de texto, sin posibilidad de poder crear más cuadros de texto. Lo que nos obligaría a crear tantos inputbox como datos necesitemos introducir.

Pero existe una solución para poder introducir valores múltiples en un inputbox. Veamos un ejemplo, imaginad que queréis pasar dos fechas (Inicio y Fin) a través del mismo inputbox y mostrar los datos en las siguientes celdas:

INTRODUCIR MÚLTIPLES VALORES EN UN INPUTBOX

Para poder hacerlo, vamos a utilizar el siguiente código que he programado:

Sub INPUT_VARIOS()
'Declaramos las variables
Dim formulario, miarray
'Invocamos inputbox e indicamos las fechas separadas por una coma
formulario = InputBox("INDICA FECHA INICIO Y FECHA FIN SEPARADO POR UNA COMA:" & Chr(13) & Chr(13) & "EJEM: 01/01/2018,01/03/2018", "FECHAS")
'Si no ponemos nada, salimos del proceso
If formulario = Empty Then Exit Sub
'verificamos que los datos introducidos son correctos, si hay errores, los detectamos al final
On Error GoTo etiqueta
'Pasamos las dos fechas a una matriz utilizando la función split
miarray = Split(formulario, ",")
'Pasamos los datos a cada celda igualando los array
With Sheets("Hoja1")
.Cells(2, 1) = CDate(miarray(0))
.Cells(2, 2) = CDate(miarray(1))
End With
Exit Sub
etiqueta:
MsgBox ("Verifica los datos que has introducido e inténtalo de nuevo"), vbExclamation
End Sub

Al ejecutarlo veremos el siguiente inputbox en nuestra hoja:

INTRODUCIR MÚLTIPLES VALORES EN UN INPUTBOX_1

Como podéis observar en la macro, estamos utilizando la función split para pasar la información que hemos indicado en cuadro de texto del inputbox a una matriz. Como necesitamos indicar un elemento o carácter que separe las dos fechas (o cualquier otro dato), he decido utilizar la coma “,”aunque podríamos usar el punto y coma, “;” una arroba “@” etc, sustituyéndolo en la macro:

miarray = Split(formulario, ",")

Una vez que tenemos ambos datos, tan solo tendremos que pasar la información a las celdas de la hoja que necesitamos rellenar y lo hacemos pulsando en el botón aceptar de nuestro inputbox. Como cortesía hacia el lector, he programados varias líneas de código para controlar los datos erróneos o que surjan errores a la hora de ejecutar la macro.

El resultado es que tenemos en las celdas la información indicada en el cuadro de texto:

INTRODUCIR MÚLTIPLES VALORES EN UN INPUTBOX_2

Y eso es todo, como podéis observar sí es posible introducir valores múltiples en un inputbox.

Descarga el archivo de ejemplo pulsando en: INTRODUCIR MÚLTIPLES VALORES EN UN INPUTBOX

¿Te ha resultado de interés?, puedes apoyar a Excel Signum con una pequeña donación.

Donate Button with Credit Cards

¡¡Muchas gracias!!

Mediante la suscripción al blog, la realización comentarios o el uso del formulario de contacto estás dando tu consentimiento expreso al tratamiento de los datos personales proporcionados según lo dispuesto en la ley vigente (LOPD). Tienes más información al respecto en esta página del blog: Política de Privacidad y Cookies

ELIMINAR DUPLICADOS DIRECTAMENTE SOBRE EL CONTENIDO DE UN LISTBOX

Hola a todos:

Ya sabéis que en esta web hay varias entradas que tratan el tema de los duplicados o cómo obtener registros únicos en nuestras informaciones, tanto en formularios como en bases de datos y usando métodos diferentes.

Sin embargo, esta semana un lector me solicitaba lo siguiente:

¿Es posible quitar los duplicados de un listbox mediante un boton
tomando los datos directamente del listbox sin tener que guardar la informacion a una hoja o tabla de calculo y que mantengan el mismo orden en el que fueron encontrados los registros por primera vez?

Es decir, interactuar directamente con el contenido del listbox sin posibilidad de acudir a la fuente de los datos y eliminar los duplicados antes de cargar la información en el listbox.

Aunque soy partidario de tratar la información antes de enviarla a un listbox (o combobox, etc…), lo cierto es que sí es posible hacer lo que el lector solicita. Y ese es el objetivo de este post.

Vamos a tomar un ejemplo en el que tenemos una base de datos con duplicados:

ELIMINAR DUPLICADOS DIRECTAMENTE SOBRE EL CONTENIDO DE UN LISTBOX

Estos datos los pasamos a un listbox en nuestro formulario y el código que utilizaremos para cargar el listbox es el siguiente:

Private Sub UserForm_Initialize()
Dim fin As Long
'Indicamos el número de columnas que tendrá el listbox
Me.ListBox1.ColumnCount = 7
'Definimos tamaño de los espacios
Me.ListBox1.ColumnWidths = "30pt;150pt;150pt;50pt;50pt;60pt"
'Cargamos listbox
With Sheets("BBDD")
fin = Application.CountA(.Range("A:A"))
Me.ListBox1.List = .Range("A2:G" & fin).Value
End With
End Sub

Es importante usar la propiedad listbox.list para cargar la información, dado que nos posibilitará el poder eliminar duplicados directamente en el listbox con el método RemoveItem.

ELIMINAR DUPLICADOS DIRECTAMENTE SOBRE EL CONTENIDO DE UN LISTBOX1

Podéis ver que nuestro listbox muestra todos los duplicados, pues bien, para eliminar los duplicados usaremos esta otra macro, vinculada al botón de comando “ELIMINAR DUPLICADOS”:

Private Sub CommandButton1_Click()
'Declaramos variables
Dim i As Long, j As Long
With ListBox1
'Eliminamos duplicados
For i = 0 To .ListCount - 1
For j = .ListCount - 1 To (i + 1) Step -1
If .List(j) = .List(i) Then .RemoveItem j
Next j
Next i
End With
End Sub

Una vez que hemos pulsado el botón, automáticamente se eliminan los duplicados en nuestro listbox, así:

ELIMINAR DUPLICADOS DIRECTAMENTE SOBRE EL CONTENIDO DE UN LISTBOX2

Pues bien, el utilizar la propiedad .list nos ha permitido solucionar este problema. Ahora ya tenemos nuestro listbox sin duplicados y listo para ser usado en otras tareas.

Espero que os haya resultado interesante y que os pueda ayudar en vuestros trabajos y proyectos.

Como siempre, os dejo el archivo de ejemplo : )

Descarga el archivo de ejemplo pulsando en: ELIMINAR DUPLICADOS DIRECTAMENTE SOBRE EL CONTENIDO DE UN LISTBOX

¿Te ha resultado de interés?, puedes apoyar a Excel Signum con una pequeña donación.

Donate Button with Credit Cards

¡¡Muchas gracias!!

REALIZAR BÚSQUEDAS DEPENDIENTES EN UN LISTBOX

Hola a todos : )

Hace unos días me enviaron una consulta en la que me solicitaban la necesidad de poder realizar consultas dependientes en un listbox.

Sobre el tema de las consultas dependientes, ya había tratado algo en esta entrada: COMBOBOX DEPENDIENTES EN USERFORM CON SQL , solo que esa ocasión estaba utilizando combobox.

En concreto, en esa consulta el filtro debería hacerse sobre un único listbox y utilizando varios textbox para indicar los items por los que realizar el filtrado.

Utilizará la base de datos de empleados de unos grandes almacenes (ya es un clásico en esta web) y pasaré los datos a un listbox:

Esta es la base de datos:

REALIZAR BUSQUEDAS DEPENDIENTES EN UN LISTBOX

Y mediante este código pasamos la información al listbox:

Private Sub UserForm_Initialize()
'Indicamos el número de columnas que tendrá el listbox
Me.ListBox1.ColumnCount = 7
'Definimos tamaño de los espacios
Me.ListBox1.ColumnWidths = "30pt;150pt;150pt;50pt;50pt;60pt"
'Cargamos listbox
Me.ListBox1.RowSource = ("A2:G") & Worksheets("BBDD").Range("A" & Rows.Count).End(xlUp).Row
End Sub

Aquí ya tenemos la información cargada:

REALIZAR BUSQUEDAS DEPENDIENTES EN UN LISTBOX2

Pero ahora debemos filtrar según nuestras necesidades. Para este ejemplo realizaré un secuencia de tres consultas dependientes: Primero filtramos por Sección, una vez tengamos esos datos, filtramos por Estudios y finalmente, filtraremos por Idioma.

Para ello es necesario crear tres textbox, y en cada uno de ellos realizar la programación correspondiente. Os dejo el código de cada textbox:

TextBox1 – Filtrar por Sección:

Private Sub TextBox1_Change()
'Declaramos variables
Dim fin As Long, i As Long, n As Long
Dim sCadena_seccion As String
'Filtramos por sección
With Sheets("BBDD")
fin = Application.CountA(.Range("A:A"))
If TextBox1 = "" Then
Me.ListBox1.RowSource = ("A2:G") & Worksheets("BBDD").Range("A" & Rows.Count).End(xlUp).Row
Exit Sub
End If
Me.TextBox2 = Clear
Me.TextBox3 = Clear
Me.ListBox1.RowSource = Clear
For i = 2 To fin
sCadena_seccion = .Cells(i, 3).Value
If UCase(sCadena_seccion) Like "*" & UCase(TextBox1.Value) & "*" Then
Me.ListBox1.AddItem
Me.ListBox1.List(n, 0) = .Cells(i, 1).Value
Me.ListBox1.List(n, 1) = .Cells(i, 2).Value
Me.ListBox1.List(n, 2) = .Cells(i, 3).Value
Me.ListBox1.List(n, 3) = .Cells(i, 4).Value
Me.ListBox1.List(n, 4) = .Cells(i, 5).Value
Me.ListBox1.List(n, 5) = .Cells(i, 6).Value
Me.ListBox1.List(n, 6) = .Cells(i, 7).Value
n = n + 1
End If
Next
Me.ListBox1.ColumnWidths = "30pt;150pt;150pt;50pt;50pt;60pt"
End With
End Sub

TextBox2 – Filtrar por Estudios:

Private Sub TextBox2_Change()
Dim fin As Long, i As Long, n As Long
Dim sCadena_seccion As String, sCadena_estudios As String
'Una vez filtrados los datos por sección, filtramos por estudios
With Sheets("BBDD")
fin = Application.CountA(.Range("A:A"))
If TextBox2 = "" Then
Me.ListBox1.RowSource = ("A2:G") & Worksheets("BBDD").Range("A" & Rows.Count).End(xlUp).Row
Exit Sub
End If
Me.ListBox1 = Clear
Me.ListBox1.RowSource = Clear
For i = 2 To fin
sCadena_seccion = .Cells(i, 3).Value
sCadena_estudios = .Cells(i, 7).Value
If UCase(sCadena_seccion) Like "*" & UCase(TextBox1.Value) & "*" And _
UCase(sCadena_estudios) Like "*" & UCase(TextBox2.Value) & "*" Then
Me.ListBox1.AddItem
Me.ListBox1.List(n, 0) = .Cells(i, 1).Value
Me.ListBox1.List(n, 1) = .Cells(i, 2).Value
Me.ListBox1.List(n, 2) = .Cells(i, 3).Value
Me.ListBox1.List(n, 3) = .Cells(i, 4).Value
Me.ListBox1.List(n, 4) = .Cells(i, 5).Value
Me.ListBox1.List(n, 5) = .Cells(i, 6).Value
Me.ListBox1.List(n, 6) = .Cells(i, 7).Value
n = n + 1
End If
Next
Me.ListBox1.ColumnWidths = "30pt;150pt;150pt;50pt;50pt;60pt"
End With
End Sub

TextBox3 – Filtrar por Idiomas:

Private Sub TextBox3_Change()
Dim fin As Long, i As Long, n As Long
Dim sCadena_seccion As String, sCadena_estudios As String, sCadena_idioma As String
'una vez filtrada la información por sección y estudios, filtramos por idioma

With Sheets("BBDD")

fin = Application.CountA(.Range("A:A"))
If TextBox3 = "" Then
Me.ListBox1.RowSource = ("A2:G") & Worksheets("BBDD").Range("A" & Rows.Count).End(xlUp).Row
Exit Sub
End If
Me.ListBox1 = Clear
Me.ListBox1.RowSource = Clear
For i = 2 To fin
sCadena_seccion = .Cells(i, 3).Value
sCadena_estudios = .Cells(i, 7).Value
sCadena_idioma = .Cells(i, 6).Value
If UCase(sCadena_seccion) Like "*" & UCase(TextBox1.Value) & "*" And _
UCase(sCadena_estudios) Like "*" & UCase(TextBox2.Value) & "*" And _
UCase(sCadena_idioma) Like "*" & UCase(TextBox3.Value) & "*" Then
Me.ListBox1.AddItem
Me.ListBox1.List(n, 0) = .Cells(i, 1).Value
Me.ListBox1.List(n, 1) = .Cells(i, 2).Value
Me.ListBox1.List(n, 2) = .Cells(i, 3).Value
Me.ListBox1.List(n, 3) = .Cells(i, 4).Value
Me.ListBox1.List(n, 4) = .Cells(i, 5).Value
Me.ListBox1.List(n, 5) = .Cells(i, 6).Value
Me.ListBox1.List(n, 6) = .Cells(i, 7).Value
n = n + 1
End If
Next
Me.ListBox1.ColumnWidths = "30pt;150pt;150pt;50pt;50pt;60pt"
End With
End Sub

Una vez te tenemos el código incluido en todos los controles, ya podemos proceder a probar la herramienta. Probaremos con la siguiente consulta: todos los empleados que pertenezcan a la sección de “Bricolaje“, que en sus estudios sean “Diplomados” y que sepan “Chino“.

El resultado es el siguiente:

REALIZAR BUSQUEDAS DEPENDIENTES EN UN LISTBOX3

Como podéis observar, el filtro funciona perfectamente y no es necesario escribir la palabra completa en los textbox, basta con ir escribiendo y la información se irá mostrando. En este caso tenemos a dos personas, perfecto!.

Y eso es todo, creo que es un método muy sencillo, donde trabajamos con un loop, un buscador y cargamos información si los parámetros de la consulta coinciden.

Espero que os resulte de interés : )

Descarga el archivo de ejemplo pulsando en: REALIZAR BÚSQUEDAS DEPENDIENTES EN UN LISTBOX

¿Te ha resultado de interés?, puedes apoyar a Excel Signum con una pequeña donación.

Donate Button with Credit Cards

¡¡Muchas gracias!!