Mensaje tipo MsgBox("XXXXX") si después de dar click en Botón Cmd el ListBox está vacío.

Tengo este código y con el busco información de una tabla, esa información se carga en un ListBox y lo que deseo es que me muestre primero, todos los datos que coincidan con el criterio de búsqueda y segundo, dado el caso en que no haya una coincidencia, me genere un MsgBox diciéndome que no se encontró nada con base en lo ingresado en el txtFiltro1.

'
'Mostrar resultado en ListBox
Private Sub CommandButton5_Click()
ActiveSheet.Unprotect "Pass123"
On Error GoTo Errores
If Me.txtFiltro1.Value = "" Then Exit Sub
Me.ListBox1.Clear
j = 1
Filas = Range("A1").CurrentRegion.Rows.Count
For i = 2 To Filas
    If LCase(Cells(i, j).Offset(0, 6).Value) Like "*" & LCase(Me.txtFiltro1.Value) & "*" Then
        Me.ListBox1.AddItem Cells(i, j)
        Me.ListBox1.List(Me.ListBox1.ListCount - 1, 1) = Cells(i, j).Offset(0, 1)
        Me.ListBox1.List(Me.ListBox1.ListCount - 1, 2) = Cells(i, j).Offset(0, 2)
        Me.ListBox1.List(Me.ListBox1.ListCount - 1, 3) = Cells(i, j).Offset(0, 3)
        Me.ListBox1.List(Me.ListBox1.ListCount - 1, 4) = Cells(i, j).Offset(0, 4)
        Me.ListBox1.List(Me.ListBox1.ListCount - 1, 5) = Cells(i, j).Offset(0, 5)
        Me.ListBox1.List(Me.ListBox1.ListCount - 1, 6) = Cells(i, j).Offset(0, 6)
        Me.ListBox1.List(Me.ListBox1.ListCount - 1, 7) = Cells(i, j).Offset(0, 7)
        Me.ListBox1.List(Me.ListBox1.ListCount - 1, 8) = Cells(i, j).Offset(0, 8)
        Me.ListBox1.List(Me.ListBox1.ListCount - 1, 9) = Cells(i, j).Offset(0, 9)
        Me.ListBox1.List(Me.ListBox1.ListCount - 1, 10) = Cells(i, j).Offset(0, 10)
        Me.ListBox1.List(Me.ListBox1.ListCount - 1, 11) = Cells(i, j).Offset(0, 11)
        Me.ListBox1.List(Me.ListBox1.ListCount - 1, 12) = Cells(i, j).Offset(0, 12)
        Me.ListBox1.List(Me.ListBox1.ListCount - 1, 13) = Cells(i, j).Offset(0, 13)
        Me.ListBox1.List(Me.ListBox1.ListCount - 1, 14) = Cells(i, j).Offset(0, 14)
        Me.ListBox1.List(Me.ListBox1.ListCount - 1, 15) = Cells(i, j).Offset(0, 15)
        Me.ListBox1.List(Me.ListBox1.ListCount - 1, 16) = Cells(i, j).Offset(0, 16)
        Me.ListBox1.List(Me.ListBox1.ListCount - 1, 17) = Cells(i, j).Offset(0, 17)
        Me.ListBox1.List(Me.ListBox1.ListCount - 1, 18) = Cells(i, j).Offset(0, 18)
        Me.ListBox1.List(Me.ListBox1.ListCount - 1, 19) = Cells(i, j).Offset(0, 19)
    Else
    End If
Next i
Exit Sub
Errores:
MsgBox "No se encuentra.", vbExclamation, "Aplication"
ActiveSheet.Protect "Pass123"
End Sub

También Si pueden ayudarme a resumir el código.

1 respuesta

Respuesta
2

El cmd que muestras aquí lo que hace es llenar el listbox.

¿Qué necesitas entonces? ¿El mensaje en otro cmd o en éste antes de llenarlo?

No me queda claro pero te dejo las instrucciones :

If ListBox1.ListCount = 0 Then 

     MsgBox "La lista está vacía"

End If

Al código le quitaría la palabra ME. Generalmente se asume el UF activo.

También es posible asignar todo el rango sin necesidad de ir fila x fila, pero no es posible en este caso.

Sdos y comentame si esto resuelve tu consulta.

Hola Elsa. Buenos días. Gracias por tomarte el tiempo de ayudarme.

Si, mira, lo que deseo, es que se genere un MsgBox antes de llenar el ListBox, dado el caso en que no hayan coincidencias con el criterio de búsqueda.

Por favor no olvides tambien la parte de lograr que en el ListBox, aparezcan todas las coincidencias con los caracteres ingresados en el TxtFiltro1.

Espero haber tenido la fortuna de hacerme entender y de nuevo, muchas gracias por tu valiosa colaboración.

Hay varios detalles a tener en cuenta:

1- Tenés más de 10 columnas y según las características de los Listbox no te será posible llenar los datos de tu hoja en 1 solo control lista.

Sí podrás hacerlo asignandole la propiedad RowSource... pero en ese caso no podrás recorrer la tabla.

Entonces tus opciones son:

a-Usar 2 listbox para 'recorrer' la hoja e ir llenándolos al mismo tiempo.

b- Primero filtrar la hoja en un rango auxiliar y asignarle luego el rango completo con rowsource, por ej:

finfila = 10
ListBox1.RowSource = "HOJAFILTRO!A1:M" & finfila

2- Atención que si utilizas el rango filtrado, luego no podrás seleccionar algún elemento por ej para quitarlo, etc... por lo tanto evalúa qué harás o para qué lo necesitas al ListBox. Si solo es de consulta estará bien utilizar un rango filtrado.

3- Para filtrar por el texto completo, no parcial, quita los *

Sería en tu ejemplo:

If LCase(Cells(i, j).Offset(0, 6).Value) = LCase(Me.txtFiltro1.Value) Then

4- Solo podrás saber si se encontró algún dato luego de recorrer la tabla. Entonces debes colocar el mensaje a continuación de Next i y antes del Exit sub

Otro modo de encontrar datos es utilizando SET... con FindNext

Set busco = ActiveSheet.Range("G:G").Find(txtFiltro1, LookIn:=xlValues, LookAt:=xlWhole)
'si no encontró ningún registro avisa y cancela
If busco Is Nothing Then
    msgbox "No se encuentra el dato solicitado."
    Exit sub
End If
'y aquí llena la lista según alguno de los métodos comentados

Como verás son muchos los detalles a evaluar. Cuando lo tengas decidido podés dejarme una nueva consulta luego de valorar/finalizar ésta.

Sdos!

Bueno Elsa, voy a ir haciendo las correcciones en mi macro.

Mira, la idea, es que una vez esté en el ListBox1 el criterio buscado, lo pueda seleccionar y mediante un Cmdbooton, cargue esa información, en un UserForm para editarla, actualizarla y dejarla en la misma base de datos.

No se, dime tu, que eres la experta, por favor recomiéndame y miramos haber como me puede quedar mejor.

La idea general es que existe una tabla, con información que supera los mil registros (más de 1000 filas con ifnormacion), mediante un formulario para no manipular directamente la tabla y forzar a usar un formulario para actualizar esa información.

Con un txtFiltro1, buscamos y lo que aparezca, debe ser cargado en el listbox para seleccionar el dato de interés, con un botón, cargar la información de la celda activa y que corresponde a lo seleccionado en el listbox en un formulario que me permitirá modificar la información y guardarla, en la misma ubicación.

En términos generales, eso es lo que necesito hacer.

Elsa, cambié la línea de código en mi macro por la que me indicas para lograr filtrar todas las coincidencias, pero te cuento que no me funciona, asií no me muestra nada.

Enviame por favor la hoja con el formulario, porque desde el momento que tenes 1 Listbox de + de 10 col sin varios los cambios propuestos y no puedo asegurarme de como te esta quedando.

Copia el correo que aparece en la portada de mi sitio.

Sdos!

Gracias Elsa, muy amable por tu valiso interés, ya te envié el archivo a tu correo, incluyendo la información que necesito manejar, para que sepas de que se trata y así me puedas ayudar mejor.

Quedo atento a tus recomendaciones y sugrencias.

Te acabo de enviar el libro. Cancelé provisoriamente el evento BeforeSave, cuando termines quitale la instrucción Exit Sub.

Sdos!

Gracias Elsa, muy gentil, me parece fantástico lo que hiciste con el código para la busqueda.

Sin embargo, como te dije, aún no he logrado que cuando hago la búsqueda, si no se encuentra nada, que me genere el MsgBox("XXXX") donde me diga que no se encontró.

Gracias por ayudarme a corregir muchos errores, pero aún sigo con la pregunta inicial sin solucionar.

Ja ja, había tanto para mirar y corregir que dejamos de lado el motivo principal.

Esto iría en el botón de Buscar por cédula. La misma idea pero cambiando el texto y el nombre del txtfiltro será para el resto

Se coloca luego del Next i 

Private Sub CommandButton7_Click()    'filtro3 (cédulas)
ActiveSheet.Unprotect "Pass123"
On Error GoTo Errores
If Me.txtFiltro3.Value = "" Then Exit Sub
Me.ListBox1.Clear
j = 1
Filas = Range("A1").CurrentRegion.Rows.Count
For i = 2 To Filas
    If LCase(Cells(i, j).Offset(0, 8).Value) Like "*" & LCase(Me.txtFiltro3.Value) & "*" Then Call LlenaLista
Next i
If ListBox1.ListCount = 0 Then
    MsgBox "No se encontraron registros para la Cédula " & txtFiltro3, , "ATENCIÓN"
    'SI LO NECESITAS MOSTRAR EN EL LABEL SERÍA:
    LblMensaje.Caption = "No se encontraron registros para la Cédula " & txtFiltro3
    'OPCIONAL: VOLVER A PROTEGER LA HOJA-... a revisar
     ActiveSheet.Protect "Pass123"
End If
Exit Sub
Errores:
ActiveSheet. Protect "Pass123"
End Sub

Te recuerdo que podrías utilizar 1 solo botón BUSCAR.

Sdos

Elsa

Genial!. Eso era exactamente lo que estaba buscando.

Y en cuanto a lo que me dices de utilizar solo un textbox y 1 commandbooton para realizar las búsquedas, comopodria implementarlo, ¿si las búsquedas se hacen por difeirentes columnas?.

Parece ser que tengo un grave error y redundancias en mi proyecto. Te agradezco la orientación.

De todas formas, la consulta principal, ya quedó ampliamente respondida, muchas gracias Elsa por tu valiosa colaboración.

Doy por terminada esta consulta. Muchas gracias!!.

A continuación de mi saludo verás un botón .. eligiendo alguna valoración de las allí presentadas recién se da por terminada la consulta.

Sdos!

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas