Autofiltros con formularios

Hola:
Tengo una hoja Excel de contactos, dónde tengo "Nombre Completo" (Nombre y apellidos) "Ciudad", "Referencia" (hijo, amigo, sobrino...). Quiero hacer búsquedas con formularios y no se me ocurre la manera. Tal vez se pueda trabajar como con la opción autofiltros de las hojas Excel pero en formularios. Cuando pulso un botón llamado "buscar" que me salte un formulario con las etiquetas "Nombre Completo", "Ciudad", "Referencia" y cada una con un combobox cargado con los datos de la tabla (registros únicos). ¿Además insertar una tabla (estilo hoja de Excel) en la parte de abajo del formulario (no se si se puede hacer esto) que me vaya mostrando los datos según vaya filtrando en los comboboxes?
¿Cómo podría hacer este Userform?
Un saludo

1 Respuesta

Respuesta
1
Antes de empezar con la creación del Userform, una pregunta, sabes crearlo poner todos los controles, y solo necesitas el código de los controles.
Aclarame esto
>Un saludo
>Julio
Hola:
Si, ya tengo varios creados. Llevo un par de meses peleándome con los macros, leyendo tutoriales, metiéndome en foros...
Hace un momento se me ocurrió que tal vez un Userform con un listbox con varias columnas (tantas como elementos tenga el contacto, "nombre", "referencia", "ciudad", "calle" valdría. Dentro del listbox se le pueden poner diferentes columnas, ¿no?
En el Userform tendría 3 comboboxs "Nombre", "Referencia" y "Ciudad" (en realidad serían muchos más pero para resumir...) y el listbox.
Nada más abrir el formulario los tres combobox estarían cargados y el listbox estaría vacío. Cuando seleccionas uno de los valores de un combobox el listbox y los otros dos comboboxs se deberían actualizar. Si aún se quiere restringir más la búsqueda vas a otro combobox y seleccionas (de los valores que ya hay) y automáticamente listbox y el tercer combobox se actualiza.
A medida que vas seleccionando de los comboboxs el listbox también se va actualizando.
¿Cómo lo ves?
¿Cómo actualizarías automáticamente un combobox en función de los datos de los otros dos?
¿No se si me explico bien? ¿Si quieres te paso la hoja excel que estoy haciendo para que lo veas más claro?
Un saludo
Para lo que quieres seguro que te sirven los formularios de excel, crea tu cabeceras las seleccionas y pulsas en Datos Formularios, acepta la ventana y ya puedes introducir datos, si quieres buscar puedes poner los criterios que quieras y te selecciona automáticamente lo que busques, te desplazas con busca anterior y busca siguiente.
Prueba y te ahorras un montón de código y trabajo.
>Un saludo
>Julio
Hola:
Si, casi es eso lo que busco pero con Comboboxs que se actualicen con las restricciones de los otros. De la misma manera que el listbox se vaya actualizando también.
No lo puedo hacer con la fórmula que me indicas (datos / formulario) porque necesito saber los valores que tengo y sobre los que escoger.
El paso en el que estoy es en cargar los combobox. He copiado la lista de la hoja principal a una que uso para hacer búsquedas. Tengo que ordenar las columnas de forma alfabética de la B hasta la O y que en cada columna sólo queden registros únicos.
Este es el código que estoy haciendo. Se podrían ordenar las columnas de la B hasta la O con un for (como no me salía el for las hice una por una, pero es una pérdida de tiempo así). ¿Y para eliminar registros duplicados en cada columna también se con un for no?
Sub ordenar_las_columnas_y_quedarme_con_registros_únicos()
Sheets("Resultados de búsquedas").Select
    Range("b1").Select 'vamos a la celda b1
    ActiveSheet.Paste 'pegamos lo copiado
    Columns("B").Select 'ordenamos las columnas
    Selection.Sort key1:=Range("b1"), order1:=xlAscending
    Columns("F").Select
    Selection.Sort key1:=Range("f1"), order1:=xlAscending
    Columns("o").Select
    Selection.Sort key1:=Range("o1"), order1:=xlAscending
'ahora falta eliminar registros duplicados.
Un saludo
Para borrar duplicados pones esta macro (primero haces una prueba) cambiando el nombre de la hoja:
Sub Mia()
'Sub DelDups_OneList()
Dim iListCount As Integer
Dim iCtr As Integer
Application.ScreenUpdating = False
iListCount = Sheets("hoja1").Range("A1:A100").Rows.Count
Sheets("hoja1").Range("A1").Select
Do Until ActiveCell = ""
For iCtr = 1 To iListCount
If ActiveCell.Row <> Sheets("hoja1").Cells(iCtr, 1).Row Then
If ActiveCell.Value = Sheets("hoja1").Cells(iCtr, 1).Value Then
Sheets("hoja1").Cells(iCtr, 1).Delete xlShiftUp
iCtr = iCtr + 1
End If
End If
Next iCtr
ActiveCell.Offset(1, 0).Select
Loop
Application.ScreenUpdating = True
MsgBox "Trabajo Terminado!"
End Sub
>Un saludo
>Julio
Hola:
He estado unos días fuera pero ya vuelvo von el tema. Gracias, con esa idea hice un Do while que me cambia de columna también.
Ya tengo los combobox cargados. Ahora faltaría el último paso. Con esto si que no se por dónde empezar. Te recuerdo lo que quería. Tengo una hoja excel de contactos con 3 columnas (para resumir). Estoy haciendo un Userform con un combobox por columna y un listbox.
Nada más abrir el formulario los tres combobox estarían cargados (ya está conseguido) y el listbox estaría vacío. Cuando seleccionas uno de los valores de un combobox el listbox y los otros dos comboboxs se deberían actualizar. Si aún se quiere restringir más la búsqueda vas a otro combobox y seleccionas (de los valores que ya hay) y automáticamente listbox y el tercer combobox se actualiza.
A medida que vas seleccionando de los comboboxs el listbox también se va actualizando.
Sería como trabajar con un Autofiltro pero un poco más visual.
Un saludo
Esta bien dejame que lo piense te haré el ejemplo con solo 3 Combobox y tu haces el resto. El Listbox tendrá solo 3 columnas.
Mañana tengo obligaciones en 2 días podré darte alguna contestancion. Vete poniendo un correo para que pueda remitirte el trabajo.
>Un saludo
>Julio
Hola Julio:
Ok gracias, mi correo es [email protected]. Yo le seguiré dando vueltas. Ayer se me ocurrió que copiando la hoja principal en otra hoja auxiliar y que cuando eligieras del combobox dieras a un botón situado junto al combo borrara las filas dónde no estuviera el valor elegido y automáticamente limpiara y cargara el resto de los combobox. Tendría que añadir un botón de nueva búsqueda que restablezca todos los datos de nuevo.
Al final funcionaría, pero lo veo poco práctico ya que pasarías más tiempo pulsando botones que buscando y en caso de que te confundieras tendrías que volver a rellenar todos los comboboxs uno por uno.
Un saludo,
Por fin ya esta terminado, he estado de pruebas medicas y me ha sido imposible ponerme antes con tu consulta, ya te lo he enviado al correo.
Si era lo que necesitabas puntúa, finaliza y comenta la consulta. Gracias.
>Un Saludo
>Julio
Muchas gracias Julio.
Me ha sido de gran ayuda.
Dejo el código aquí por si a alguien le puede servir de algo. No termina de funcionar como los autofiltros de excel, pero funciona bien y tiene muchas cosas para sacarle. Valoro mucho el tiempo y la dedicación.
Un saludo Julio,
Public i As Integer
Private Sub ComboBox1_Enter()
Dim celda As String
Range("A1").End(xlDown).Select
celda = ActiveCell.Address
ComboBox1.RowSource = "A1:" & celda & ""
End Sub
Private Sub ComboBox1_Change()
If ComboBox1.Value <> "" Then
ListBox1.ColumnCount = 3
ListBox1.ColumnWidths = "40;40;40"
ListBox1.RowSource = ""
If ComboBox2.Value = "" Then
Range("B1").Select
i = 0
Do While ActiveCell.Value <> ""
If ActiveCell.Offset(0, -1).Value = ComboBox1.Text Then
ListBox1.AddItem ActiveCell.Offset(0, -1)
ListBox1.List(i, 1) = ActiveCell
ListBox1.List(i, 2) = ActiveCell.Offset(0, 1)
i = i + 1
End If
ActiveCell.Offset(1, 0).Select
Loop
End If
End If
End Sub
Private Sub ComboBox2_Enter()
ComboBox2.RowSource = "B1:B10"
If ComboBox1.Value <> "" Then
ComboBox2.RowSource = ""
Range("A1").Select
Do While ActiveCell.Value <> ""
If ActiveCell.Text = ComboBox1.Value Then
celda = ActiveCell.Address
ActiveCell.Offset(0, 1).Select
ComboBox2.AddItem ActiveCell.Value
Range(celda).Select
End If
ActiveCell.Offset(1, 0).Select
Loop
End If
End Sub
Private Sub ComboBox2_Change()
If ComboBox2.Value <> "" Then
ListBox1.ColumnCount = 3
ListBox1.ColumnWidths = "40;40;40"
ListBox1.RowSource = ""
If ComboBox3.Value = "" Then
Range("C1").Select
i = 0
Do While ActiveCell.Value <> ""
If ActiveCell.Offset(0, -2).Value = ComboBox1.Text And _
ActiveCell.Offset(0, -1).Value = ComboBox2.Text Then
ListBox1.AddItem ActiveCell.Offset(0, -2)
ListBox1.List(i, 1) = ActiveCell.Offset(0, -1)
ListBox1.List(i, 2) = ActiveCell
i = i + 1
End If
ActiveCell.Offset(1, 0).Select
Loop
End If
End If
End Sub
Private Sub ComboBox3_Enter()
ComboBox3.RowSource = "C1:C10"
If ComboBox1.Value <> "" And ComboBox2.Value = "" Then
ComboBox3.RowSource = ""
Range("A1").Select
Do While ActiveCell.Value <> ""
If ActiveCell.Text = ComboBox1.Value Then
ComboBox3.AddItem ActiveCell.Offset(0, 2).Value
End If
ActiveCell.Offset(1, 0).Select
Loop
End If
If ComboBox1.Value <> "" And ComboBox2.Value <> "" Then
ComboBox3.RowSource = ""
Range("C1").Select
Do While ActiveCell.Value <> ""
If ActiveCell.Offset(0, -2).Text = ComboBox1.Value And _
ActiveCell.Offset(0, -1).Text = ComboBox2.Value Then
ComboBox3.AddItem ActiveCell.Value
End If
ActiveCell.Offset(1, 0).Select
Loop
End If
End Sub
Private Sub ComboBox3_Change()
If ComboBox3.Value <> "" Then
ListBox1.ColumnCount = 3
ListBox1.ColumnWidths = "40;40;40"
ListBox1.RowSource = ""
Range("C1").Select
i = 0
Do While ActiveCell.Value <> ""
If ActiveCell.Offset(0, -2).Value = ComboBox1.Text And _
ActiveCell.Offset(0, -1).Value = ComboBox2.Text And _
ActiveCell.Value = ComboBox3.Text Then
ListBox1.AddItem ActiveCell.Offset(0, -2)
ListBox1.List(i, 1) = ActiveCell.Offset(0, -1)
ListBox1.List(i, 2) = ActiveCell
i = i + 1
End If
ActiveCell.Offset(1, 0).Select
Loop
End If
End Sub
Private Sub CommandButton1_Click()
Worksheets("Hoja1").Select
Unload Me
End Sub
Private Sub CommandButton2_Click()
ComboBox1.Value = Empty
ComboBox2.Value = Empty
ComboBox3.Value = Empty
ListBox1.RowSource = "A1:C10"
End Sub
Private Sub Label3_Click()
End Sub
Private Sub UserForm_Initialize()
ListBox1.ColumnCount = 3
ListBox1.ColumnWidths = "40;40;40"
If ComboBox1.Text = "" And ComboBox2.Text = "" And ComboBox3.Text = "" Then
ListBox1.RowSource = "A1:C10"
End If
End Sub

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas