jueves, 23 de marzo de 2017

VBA: Suma Selectiva con un ListBox

Un usuario, a partir de este post (ver), preguntaba la manera de acumular/sumar importes correspondientes a una selección de 'clientes':
[...]me gustaría saber como hacer lo mismo pero que me sume la cantidades seleccionadas; por ejemplo, si seleccionara el campo importe[...]


El objetivo es obtener la suma de los importes de aquellos clientes que hubiéramos seleccionado previamente:



Nuestro procedimiento la creamos en la ventana de código de la hoja que contenga los controles ActiveX insertados.

Private Sub CommandButton1_Click()
Dim seleccionados As Integer, lItem As Long
Dim Suma As Double, stClientes As String

Dim MisImportes() As Variant
'recorremos cada elemento del ListBox
For i = 0 To ListBox1.ListCount - 1
    'verificamos si está o no seleccionado
    'en caso afirmativo, acumulamos el contador
    If ListBox1.Selected(i) = True Then
        seleccionados = seleccionados + 1
    End If
Next i
'comprobamos que hay algún elemento seleccionado
If seleccionados = 0 Then
    MsgBox "Debes marcar al menos un cliente"
    Exit Sub
End If
'redimensionamos nuestra Matriz (Array) al tamaño necesario...
'tantas filas como clientes marcados y dos columnas
ReDim MisImportes(1 To seleccionados, 1 To 2) As Variant

x = 0
'recorremos todos los elementos del Listbox
For lItem = 0 To ListBox1.ListCount - 1
    'en caso de que el elemento esté seleccionado
    'lo añadimos a una matriz
    If ListBox1.Selected(lItem) = True Then
        x = x + 1
        'para idetificar listad de clientes
        MisImportes(x, 1) = ListBox1.List(lItem, 0)
        stClientes = stClientes & " " & MisImportes(x, 1)
        
        'para acumlar los importes
        MisImportes(x, 2) = ListBox1.List(lItem, 1)
        Suma = Suma + CDbl(MisImportes(x, 2))
        'dejamos el Listbox sin selección
        ListBox1.Selected(lItem) = False
    End If
Next lItem
'mostramos el resultado final...
MsgBox "Número de clientes seleccionados: " & seleccionados & vbCrLf & _
    "que son: " & stClientes & vbCrLf & _
    "Suma de importes:= " & Suma

End Sub



Para probarlo bastará seleccionar en el ListBox de la hoja los clientes necesarios y presionar el botón 'Ejecutar'.
La respuesta será la esperada, un MsgBox que devuelve el listado de clientes marcados y el importe acumulado de dichos clientes.

No hay comentarios:

Publicar un comentario