Contar datos en un lisbox por criterio y mostrarlo en una etiqueta con macros

Quisiera salir de dudas si es posible hacer esto, asumamos que tenga un lisbox con estos elementos cargados.

Item Condición

 1.      Bueno

 2.      Malo

 3.      Bueno

 4.      Bueno

 5.      Malo

Y en dos etiquetas me muestre la cuenta por esa condición Bueno:3 y Malo:2, espero me aclaren si es posible yo solo lo he logrado con select osea seleccionando los datos en lisbox y me va contando los valores pero no así como lo quiero al momento de ir ingresando datos y se vayan cargando los datos en lisbox incremente o disminuya dichas condiciones, espero me lo puedan aclarar si se puede hacer eso con un lisbox.

1 respuesta

Respuesta
1

En programación, casi todo es posible.

Hay varias formas de hacer esto, cada una depende de como estés cargando el combobox.

Si lo estas cargando desde un rango, digamos de A1 a A7. Puedes usar la siguiente instrucción:

Me.Label1.Caption = WorksheetFunction.CountIf(Range("A1:A7"), "Bueno")
Me.Label2.Caption = WorksheetFunction.CountIf(Range("A1:A7"), "Malo")

Por otro lado, si no hay rangos involucrados y lo estas llenando, digamos que, con .Additem, se me ocurre que se puede hacer un Loop por cada item, así:

Dim Bueno As Integer: Bueno = 0: Me.Label1.Caption = Bueno
Dim Malo As Integer: Malo = 0: Me.Label2.Caption = Malo
Dim strFind As String
Dim i As Integer
For i = 0 To Me.ListBox1.ListCount - 1
    strFind = Me.ListBox1.List(i)
    If strFind = "Bueno" Then
        Me.Label1.Caption = Me.Label1.Caption + 1
    Else
        Me.Label2.Caption = Me.Label2.Caption + 1
    End If
Next i

Andy M.

Muy amable por responder y sacar mis dudas que tenia, probé tu código experto Andy Machin pero por que solo me sale en conteo total de registro y no por condición tengo los 2 etiquetas para que me muestren los resultados, pero solo sale el total no se que estaré haciendo mal.

y el código lo puse en el evento Initialize del UserForm

Private Sub UserForm_Initialize()
Dim Bueno As Integer: Bueno = 0: Me.LblRegistros.Caption = Bueno
Dim Malo As Integer: Malo = 0: Me.LblRegistros2.Caption = Malo
Dim strFind As String
Dim i As Integer
For i = 0 To Me.LCondicion.ListCount - 1
    strFind = Me.LCondicion.List(i)
    If strFind = "BUENO" Then
        Me.LblRegistros.Caption = Me.LblRegistros.Caption + 1
    Else
        Me.LblRegistros2.Caption = Me.LblRegistros2.Caption + 1
    End If
Next i
End Sub

Ah claro, la razón por la que no te funciona es porque yo hice el código de manera general para mostrarte como se hace, entonces mi código busca en la primera columna del ListBox, que en tu caso es una lista de números. Para indicarle que busque en la segunda columna, solo tienes que agregar ", 1" en esta linea:

strFind = Me.LCondicion.List(i, 1)

En programación los indices suelen empezar en 0, así que 1 se refiere a la columna 2. Como estaba omitido, el código asume que te refieres a la columna por defecto, la 0.

Muy bien que lo hayas puesto en el evento Initialize.

Ahora, si el listbox lo estas cargando de un rango de celdas, creo que seria mejor que uses la primera opción que te dí.

Así:

Dim uF As Long
uF = Range("B" & Rows.Count).End(xlUp).Row
Me.LblRegistros.Caption = WorksheetFunction.CountIf(Range("B1:B" & uF), "BUENO")
Me.LblRegistros2.Caption = WorksheetFunction.CountIf(Range("B1:B" & uF), "MALO")

Es mas corto y con mejor rendimiento, ya que no hay que hacer un bucle. En VBA siempre que se pueda evitar los bucles, lo evitas.

Andy M.

¡Gracias! 

Andy Machin, muchísimas gracias por tus grandes apreciaciones que brindas y enseñas, ahora ya funciona excelente.

Saludos.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas