Mostar el resultado de una búsqueda en un listbox

Quería hacer lo siguiente en un formulario vba Excel. Quiero que al introducir un documento de identidad en un textbox me muestre los resultados de la búsqueda en un listbox. Se trata de introducir el documento de identidad de una persona y visualizar en el listbox el numero de solicitudes realizadas por esa persona (pueden ser una o varias …). En la listbox se tendría que mostrar más de 10 columnas...

¿Cómo lo podría hacer?

1 respuesta

Respuesta
1

:)

Hola! Susania

Suponiendo que tienes en el UserForm:

- El TextBox1

- El CommandButton1, y

- El ListBox1

Entonces lo que sigue te puede ayudar:

Private Sub CommandButton1_Click()
Dim Rng As Range, ws As Worksheet
Dim mWidth
'La tercera columna del rango de datos contiene los Nº de documentos:
Const col_Documento% = 3
If TextBox1 = "" Then Exit Sub
Application.ScreenUpdating = False
'Especifico el rango de datos (hoja y celdas):
Set Rng = Sheets("Datos").Range("F1:P148")
With ActiveSheet
'Si la hoja auxiliar no existe entonces la creo:
  On Error Resume Next
    Set ws = Sheets("Auxiliar")
    If Err.Number Then
      Set ws = Worksheets.Add(After:=Worksheets(Worksheets.Count))
      ws.Name = "Auxiliar"
    End If
  On Error GoTo 0
  .Activate
End With
'Apronto el Listbox1:
mWidth = Array(50, 40, 70, 50, 40, 65, 30, 45, 35, 40, 45)
With ListBox1
  .RowSource = ""
  .ListIndex = -1
  .Value = ""
  .ColumnCount = 1 + UBound(mWidth)
  .ColumnHeads = True
  .ColumnWidths = Join(mWidth, ";")
'Ancho del Listbox1:
  .Width = 15 + Application.Sum(mWidth)
  .IntegralHeight = True
  DoEvents
'Ancho del UserForm:
  Me.Width = 10 + 2 * .Left + .Width
End With
'Aplico el filtro avanzado:
With ws
  .[b1] = "CachoR"
  .[b1].CurrentRegion.Delete xlShiftUp
  .[a1] = Rng.Cells(1, col_Documento)
  .[a2] = TextBox1
  Rng.AdvancedFilter 2, .[a1:a2], .[c1], False
  With .[c1].CurrentRegion
    If .Rows.Count > 1 Then
      ListBox1.RowSource = .Offset(1).Resize(.Rows.Count - 1).Address(external:=True)
    End If
  End With
End With
Application.ScreenUpdating = True
End Sub

Nota que el código requiere de tres especificaciones:

- Hoja y rango de datos incluyendo la fila de encabezados.

- Columna del rango de datos en la que buscar el documento.

- Y una hoja a la que he llamado "Auxiliar" en la que se vuelca el resultado del filtro avanzado. Si tal hoja no existe el código la crea.

- Adicionalmente te muestro como formatear al ListBox y -hasta- darle ancho al propio UserForm para que se visualicen todas las columnas.

¿Te sirve la idea?...

Saludos, Mario (Cacho) R.

:)

Hola:

Me da un error en la expresión If Era.Number then (error de compilación. Error de sintaxis)

:)

Es que no es Era sino Err...

:)

Sí lo sé ha sido un error al escribirte el mensaje Lo he puesto como has indicado.... y me da ese error.

He hecho esto que he visto en otras preguntas pero cuando pongo lo pruebo y le pongo un documento que existe en la tabla de solicitudes me sale el mensaje de que no existe solicitudes con ese documento de identidad cuando en realidad si que existe... imagino que falta algo o algo esta mal... Me lo podrías revisar???

Mostrar resultado en ListBox
Private Sub Btnbuscar_Click()
Set h1 = Sheets("SOLICITUDES")
Set h2 = Sheets("Temporal")
If Me.TextBoxnumero.Value = "" Then
MsgBox "Debe introducir un documento de identidad"
Exit Sub
End If
h2.Cells.Clear
ListBox1.RowSource = ""
h1.Rows(1).Copy h2.Rows(1)
n = 2
For i = 2 To Range("a1").CurrentRegion.Rows.Count
If LCase(Cells(i, j)) Like "*" & LCase(TextBoxnumero) & "*" Then
h1.Rows(i).Copy h2.Rows(n)
n = n + 1
End If
Next i
u = Range("A" & Rows.Count).End(xlUp).Row
If u = 1 Then
MsgBox "No existen solicitudes con este documento de identidad", vbExclamation, "FILTRO"
Exit Sub
End If
ListBox1.RowSource = h2.Name & "!A2:Z" & u
End Sub


'Dar formato al ListBox y traer los encabezados de la tabla
Private Sub UserForm_Initialize()
'
For i = 1 To 22
'Me.Controls("Label" & i) = Cells(1, i).Value
Next i
[A1].Select
With Me
.ListBox1.ColumnHeads = True
.ListBox1.ColumnCount = 22
.ListBox1.ColumnWidths = "250 pt;55 pt;80 pt;75 pt;220 pt;50 pt;75 pt;75 pt;80 pt;200 pt;80 pt;90 pt; 80 pt; 75 pt; 80 pt; 70 pt; 60 pt; 60 pt"
End With
End Sub

:)

- No es ése el código que te pasé.

- Me pregunto si ajustaste adecuadamente las tres especificaciones que tenías que considerar para que el código mostrado funcionarse a la perfeción...

¿Comentas?...

:)

Hola de nuevo!!

Siento no haber contestado antes pero no he podido hacerlo antes... Te cuento... efectivamente había un error en lo que yo había hecho y por eso me daba error. Lo he vuelto a hacer tal y como me indicaste y funciona perfectamente.....

Tenía otra consulta respecto a este mismo tema a ver si se puede hacer. Como te comenté, en la tabla de solicitudes había más de 10 columnas (exactamente 20). Existiría alguna forma para que aparezcan unas columnas determinadas y no todas.... sino las que yo quiera....????  Es decir de las 20 me gustaría que aparecieran en el ListBox unas columnas determinadas (también serían más de diez..)??

Espero tu respuesta.... 

Muchas gracias!!

:)

¿Quieres qué te ayuda más?... ¡Con gusto! (Además es sencillo).

Ahora a mí me gustaría que califiques mi respuesta (como se hace usualmente en este Foro): ¿Podría ser?...

:)

¡Gracias! 

.

La propiedad ColumnWidths: ¿Sabés para que se utiliza?...

.

.

Hola!!

Si no tengo mal entendido es para el ancho de la columna??

.

Efectivamente: ¡Es así! Y sobre ello dos comentarios:

a) ¿Viste esos " pt" que tienes puestos en la propiedad ColumnWidths?... Pues no hacen falta (quítalos todos) y sólo deja los números.

b) Como esos números -precisamente- son los anchos de cada columna, tan solo pon 0 (cero) a las columnas que no desees que se vean. Los datos estarán allí pero no se visualizarán.

¿Entendido?...

Saludos, Mario (Cacho) Rodríguez

:)

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas