jueves, 13 de abril de 2017

VBA: El control ListView en Excel

Un usuario preguntaba por la posibilidad de asignar un color a un elemento de un ListBox de acuerdo a un criterio.
Y aunque esto no parece posible, rebuscando entre la documentación de MSDN encontré el control ListView que sí lo permitirá.

El comentario del usuario:
[...]Tengo un LISTBOX en un FORM con una data de 4 columnas que obtengo de una hoja de calculo, hasta ahí todo bien. 

Lo que deseo es resaltar ciertos registros según el valor de la cuarta columna, algo así como formato condicional, si en la cuarta columna dice "SI" que se resalte toda la linea del LISTBOX. 

Esto es posible o de que manera podría lograrlo?? 
[...]


Lo primero es activar el control adicional entre los controles disponibles del UserForm:
Microsoft ListView Control, version 6.0

VBA: El control ListView en Excel



Así pues ya podemos incorporar a un UserForm nuestro control ListView:

VBA: El control ListView en Excel



Abrimos la ventana de código de nuestro formulario 'UserForm1' y añadimos el siguiente código asociado al evento UserForm_Initialize:

Private Sub UserForm_Initialize()
Dim FilaIni As Long
Dim UFila As Long
Dim pos As Long
Dim lv_item As Long 'número del item en el ListView
Dim fila As Long

Dim Item As ListItem
'damos valores al inicio y fin de los datos
FilaIni = 2: UFila = 11

pos = 2
lv_item = 1
With ListView1
     'esta propiedad indica que tendremos encabezados
    .View = lvwReport
     'definimos cuáles serán los encabezados
    With .ColumnHeaders
        .Clear  'primero limpiamos..
        'y leugo añadimos Nombre del campo y su ancho
        '.Add(index, key, text, width, alignment, icon)
        .Add Text:="Fecha", Width:=60
        .Add Text:="Región", Width:=60
        .Add Text:="Unidades", Width:=60
        .Add Text:="Control", Width:=40
    End With
    'dejamos a la vista los encabezados
    .HideColumnHeaders = False
    'damos aspecto 3d
    .Appearance = cc3D
    'habilitamos que al marcar un elemento se selecciona la fila entera
    .FullRowSelect = True
    
    'recorremos la hoja de cálculo
    'donde están los datos.. y los cargamos al ListView
    For fila = FilaIni To UFila
        If Cells(pos, "D").Value = "Sí" Then
            Set Item = .ListItems.Add(Text:=Cells(pos, "A").Value)
            Item.ListSubItems.Add Text:=Cells(pos, "B").Value
            Item.ListSubItems.Add Text:=Cells(pos, "C").Value
            Item.ListSubItems.Add Text:=Cells(pos, "D").Value
            'damos color a la fila
            Item.ForeColor = vbBlue
            For x = 1 To Item.ListSubItems.Count
                Item.ListSubItems.Item(x).ForeColor = vbBlue
            Next x
        Else
            Set Item = .ListItems.Add(Text:=Cells(pos, "A").Value)
            Item.ListSubItems.Add Text:=Cells(pos, "B").Value
            Item.ListSubItems.Add Text:=Cells(pos, "C").Value
            Item.ListSubItems.Add Text:=Cells(pos, "D").Value
        End If
        lv_item = lv_item + 1
        pos = pos + 1
    Next fila
End With
End Sub



A partir de los datos volcados en el rango A1:D11 de nuestra hoja de trabajo, si lanzamos nuestro formulario podemos comprobar el éxito de nuestro procedimiento

VBA: El control ListView en Excel

No hay comentarios:

Publicar un comentario