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

4 comentarios:

  1. Buenas.
    Es justo lo que necesito!!!, pero tengo un problema. Es que no puedo lograr que este control Listview (ni tampoco el spreadsheet o el datagrid) aparezca en controles adicionales para poder agreagarlo. Hice el paso previo de agregar la Referencia (Herramientas-Referencias) "Microsoft Windows Common Controls 6.0 (SP6)" y tambien lo registré desde el simbolo del sistema, pero nada, no aparece el control en controles adicionales.
    Me podrias ayudar por favor?
    Tengo Office 2016 aca en mi casa, y en mi trabajo 2007 y 2010 (El archivo que ocupo es de mi trabajo y lo uso en casa para programar).
    Desde ya muchas gracias!!!

    ResponderEliminar
    Respuestas
    1. Hola,
      la referencia que tienes que activar, para sacar el ListView, es:
      Microsoft ListView Control, version 6.0
      la otra referencia que comentas es para otros controles...

      Saludos!

      Eliminar
  2. Hola Ismael. Y disculpame, no tengo esa referencia, o por lo menos nose si esta en la carpeta system32 o en syswow64. Me podrias decir como se llama el archivo para buscarlo y agregarlo?
    De todas maneras, a lo que tambien iba mi consulta, es que por ejemplo como te comente en la pregunta principal, ni siquiera agregando esa referencia "Microsoft Windows Common Controls 6.0 (SP6)" no me habilitan los controles que contiene, es decir, vengo intentando con esa y con mscomct2.ocx y con mscomctl.ocx pero no hay caso, no aparecen controles nuevos en la opcion controles adicionales, nose si es porque tengo office 2016 o me estoy pasando por alto alguna otra cosa. Si porfavor me podrias ayudar con eso, Muchas gracias!!!

    ResponderEliminar
    Respuestas
    1. Hola Marcelo,
      ese control se añade desde 'controles adicionales', y como bien dices estaría 'fisicamente' ubicado entre los controles que corresponden a la librería/referencia 'mscomctl.ocx'...

      Es mu raro, pero no creo tenga que ver con la versión, yo trabajo con 2016 y la tengo accesible... En todo caso tendría que ver con la versión de Windows

      Raro... no sabría decirte
      Lo siento

      Eliminar

Nota: solo los miembros de este blog pueden publicar comentarios.