Site da Vetorial Treinamentos

Sistema Cadastro de Clientes

ListView VBA – Uso e Aplicação do Controle ListView VBA

Assim como o ListBox, o controle ListView VBA permite a exibição de dados em forma de tabela, porém, com muito mais recursos e opções de personalização.  Note, por exemplo, a quantidade de informações que a tabela abaixo, exibida dentro de um controle ListView VBA, é capaz de fornecer.

ListView VBA

Neste artigo, iremos desenvolver, passo-a-passo, um controle ListView voltado para Controle de estoque de Produtos. Ao final desse tutorial, seguindo todas as etapas que serão apresentadas, você será capaz de criar controles ListView VBA avançados que podem ser aplicados em diferentes áreas e para solução de diferentes problemas envolvendo apresentação de dados em tabelas. Em resumo, iremos abordar os seguintes tópicos:

  • Adicionar o controle ListView ao VBA
  • Criar cabeçalho das colunas do ListView VBA
  • Carregar dados da Planilha para o ListView VBA
  • Pintar linhas do ListView VBA com base em critérios
  • Adicionar imagens ao ListView VBA usando o Controle ImageList
  • Exibir imagens dentro do ListView VBA com base em critérios

Adicionando o controle ListView no VBA

Para começar, abra o Excel e click em salvar como.

Abrir Excel

Click no botão “Tipo” para listar as opções de salvamento.

Salvar Excel

Escolha a opção: “Pasta de Trabalho Habilitada para Macro do Excel“.

Pasta Habilitada

Dê um nome para o arquivo, selecione a pasta de destino e click em salvar.

Renomear ListView

Agora acesse o ambiente de desenvolvimento através da guia Desenvolvedor e depois Visual Basic. Caso a guia Desenvolvedor não esteja aparecendo, entre através do atalho Alt + F11.

Click na guia Inserir e em seguida em UserForm.

O UserForm será ciado conforme imagem abaixo. Você pode redimensioná-lo para o tamanho desejado.

O Controle ListView VBA não faz parte dos controles básicos do Excel VBA, ou seja, aqueles que já vem prontos para uso assim que você instala o Office em sua máquina. Portanto, para adicionar o controle ListView no VBA, você precisa ter o pacote de controles comuns do Windows (MSCOMCTL.OCX) instalado e registrado em seu sistema. Caso o MSCOMCTL.OCX já esteja registrado corretamente em sua máquina, você pode adicionar o controle ListView no Excel VBA usando a caixa de diálogo Controles adicionais. Para isso basta seguir o procedimento da imagem abaixo.

O arquivo MSCOMCTL.OCX é um arquivo executável de 32 bits e deve ser colocado no diretório do sistema SysWoW64 para sistemas 64 bits, e no diretório System32 para sistemas 32 bits.

Em seguida, localize a opção Microsoft ListView Control, version 6.0, marque a caixa de seleção, coforme imagem abaixo e click em OK.

O controle ListView VBA aparecerá dentro da caixa de seleção, conforme imagem abaixo.

Para criar o ListView dentro do UserForm criado, click em cima do controle que você acabou de ativar e araste para o tamanho desejado.

Outra coisa fundamental que você precisa fazer antes de sair escrevendo seu código e declarando variáveis, é adicionar a referência Microsoft Windows Common Controls 6.0 (SP6) à biblioteca MSComctlLib. Isso é essencial para que seu projeto Excel VBA funcione corretamente. Caso essa etapa não seja realizada, o Excel VBA exibirá uma mensagem de erro de compilação dizendo “Tipo não definido pelo usuário” sempre que alguma variável relacionada ao ListView VBA for declarada. Para ativar essa referencia, click na guia Ferramentas e depois em Referencias.

Com a janela de Referencias aberta, procure por Microsoft Windows Common Controls 6.0 (SP6) e marque a caixa de seleção conforme imagem abaixo. Caso essa Referencia não apareça para você, click em procurar e vá até a pasta onde arquivo MSCOMCTL.OCX está instalado. Nesse caso, “C:\Windows\SysWOW64\MSCOMCTL.OCX” para sistemas 64 bits e “C:\Windows\System32\MSCOMCTL.OCX” para sistemas 32 bits.

Feito tudo isso o ListView VBA está pronto para receber dados. Vamos iniciar criando o cabeçalho para as colunas.

Dê duplo click em qualquer parte do UserForm, apague o código gerado. Iremos agora escrever todos os eventos dentro do ambiente de criação de códigos, passo-a-passo. Antes de começar a escrever ou copiar o código abaixo, sugiro que baixar a planilha contendo os dados que serão usados para esse exemplo no final da postagem.

Carregar Cabeçalho das Colunas do ListView VBA

Para criar o cabeçalho das colunas que serão geradas, escrevemos o seguinte código.

Sub CriaCabecalho()

    With ListView1
        .View = lvwReport
        .FullRowSelect = True
        
        With .ColumnHeaders
            .Clear
            .Add , , "Id", 60
            .Add , , "C.Barras", 140, 2
            .Add , , "Descrição", 280
            .Add , , "Est.Mín", 50, 2
            .Add , , "Est.Máx", 50, 2
            .Add , , "Est.Atual", 80, 2
            .Add , , "Entradas", 80, 2
            .Add , , "Saídas", 80, 2
            .Add , , "Fabricação", 0
            .Add , , "Vencimento", 100
            .Add , , "Dias", 100, 2
        End With
        
    End With
    
End Sub

Em seguida, devemos “chamar” a Sub criada para ser executada sempre que o UserForm for inicializado. Para isso escrevemos: Call CriaCabecalho debro do evento “Initialize” do UserForm da seguinte forma.

Private Sub UserForm_Initialize()
Call CriaCabecalho
End Sub

Feito isso, ao iniciar o UserForm seu ListView VBA aparecerá da seguinte forma.

Carregar dados da Planilha para o ListView VBA

Vamos agora trazer os dados de dentro da Planilha para dentro do ListView VBA. Para isso escrevemos o seguinte código.

Sub TrazDadosDaPlanilha()

Dim lvItem      As ListItem
Dim Wplan       As Worksheet
Dim dias        As Integer
Dim lin         As Integer

Set Wplan = Planilha1
lin = 2

Wplan.Activate

ListView1.ListItems.Clear

With Wplan

        While .Cells(lin, 1).Value <> ""
        
                With ListView1
                    
                        Set lvItem = ListView1.ListItems.Add(, , Format(Wplan.Cells(lin, "A").Value, "0000"))
                            
                            dtVenc = Wplan.Cells(lin, "J").Value
                            dias = dtVenc - Date
                            
                            lvItem.ListSubItems.Add , , Wplan.Cells(lin, "B").Value
                            lvItem.ListSubItems.Add , , Wplan.Cells(lin, "C").Value
                            lvItem.ListSubItems.Add , , Wplan.Cells(lin, "D").Value
                            lvItem.ListSubItems.Add , , Wplan.Cells(lin, "E").Value
                            lvItem.ListSubItems.Add , , Wplan.Cells(lin, "F").Value
                            lvItem.ListSubItems.Add , , Wplan.Cells(lin, "G").Value
                            lvItem.ListSubItems.Add , , Wplan.Cells(lin, "H").Value
                            lvItem.ListSubItems.Add , , Wplan.Cells(lin, "I").Value
                            lvItem.ListSubItems.Add , , Wplan.Cells(lin, "J").Value
                            lvItem.ListSubItems.Add , , dias
                End With

            lin = lin + 1
        
        Wend
End With

End Sub

Novamente, para chamar a Sub que acaba de ser criada, escrevemos.

Private Sub UserForm_Initialize()
Call CriaCabecalho
Call TrazDadosDaPlanilha
End Sub

Ao inicializar o UserForm novamente veremos a ListView, agora com os dados que foram carregados da tabela, da seguinte forma.

Pintar linhas do ListView com base em critérios

Para pintar as linhas do ListView com base me critérios, declaramos algumas variáveis, e então montamos uma sub com o seguinte código.

Sub PintaLinhasComBaseEmCriterios()

Dim est         As Long
Dim EstMin      As Long
Dim dias        As Integer
Dim lin         As Integer
Dim xCol        As Integer
Dim xLin        As Integer

Dim Cor1 As Variant
Dim Cor2 As Variant
Dim Cor3 As Variant
Dim Cor4 As Variant

Cor1 = RGB(8, 10, 28)       'azul escuro
Cor2 = RGB(255, 0, 0)       'vermelho
Cor3 = RGB(255, 255, 0)     'amarelo

ListView1.BackColor = Cor1  'pinta fundo do listview
UserForm1.BackColor = Cor1  'pinta fundo do userform

For xLin = 1 To Me.ListView1.ListItems.Count
        For xCol = 1 To 10
        
        est = Me.ListView1.ListItems.Item(xLin).ListSubItems(5).Text
        EstMin = Me.ListView1.ListItems.Item(xLin).ListSubItems(3).Text
                
            If est <= 0 Then
                Me.ListView1.ListItems.Item(xLin).ListSubItems(xCol).ForeColor = Cor2
                Me.ListView1.ListItems.Item(xLin).ForeColor = Cor2
            ElseIf est <= EstMin Then
                Me.ListView1.ListItems.Item(xLin).ListSubItems(xCol).ForeColor = Cor3
                Me.ListView1.ListItems.Item(xLin).ForeColor = Cor3
            End If

        Next xCol
Next xLin

End Sub

Novamente devemos “chamar” essa sub dentro do evento Inicialize do UserForm, da seguinte forma.

Private Sub UserForm_Initialize()

    Call CriaCabecalho
    Call TrazDadosDaPlanilha
    Call PintaLinhasComBaseEmCriterios
    
End Sub

Ao inicializar o UserForm, o ListView apresentará os dados da seguinte forma. Dessa vez com as linhas do Controle ListView pintadas de acordo com os critérios definidos dentro do código.

ListView VBA Control

Para encerrar esse tutorial sobre o ListView VBA, iremos agora adicionar imagens dentro das colunas do Controle ListView usando o Controle ImageList. O Controle ImageList nos permite carregar várias imagens presentes em alguma pasta do nosso computador e então listar essas imagens dentro do Controle ListView.

Adicionar imagens ao ListView usando o Controle ImageList

Para inserir imagens dentro do ListView precisamos primeiro ativar o controle ImageList. Nesse caso, seguimos o seguinte passo-a-passo. Click com o botão direito do mouse e depois em controles adicionais.

Localize a opção Microsoft ImageList Control, version 6.0, selecione esse controle e click no botão OK.

O Controle ImageList será exibido da seguinte forma dentro da Caixa de Ferramentas.

Por fim, Click no Controle ImageList e arraste-o para dentro do UserForm.

Podemos agora escrever o código que irá carregar as imagens para dentro do ListView. O código que você ver a seguir, é responsável por identificar e carregar as imagens da pasta presente dentro do computador para o ImageList.

Sub CarregaControleImageList()

Dim wbk As Workbook

Set wbk = Workbooks("ControleListview.xlsm")

ListView1.BackColor = RGB(8, 10, 28)

With Me.ImageList1.ListImages
    
    .Clear
    .Add , "img1", LoadPicture(wbk.Path & "\lv01\amarelo.jpg")      '1
    .Add , "img2", LoadPicture(wbk.Path & "\lv01\verde.jpg")        '2
    .Add , "img3", LoadPicture(wbk.Path & "\lv01\vermelho.jpg")     '3
    .Add , "img4", LoadPicture(wbk.Path & "\lv01\azul.jpg")         '4
    .Add , "img5", LoadPicture(wbk.Path & "\lv01\entrada.jpg")      '5
    .Add , "img6", LoadPicture(wbk.Path & "\lv01\saida.jpg")        '6
    .Add , "img7", LoadPicture(wbk.Path & "\lv01\baixo.jpg")        '7
    .Add , "img8", LoadPicture(wbk.Path & "\lv01\zerado.jpg")       '8
    .Add , "img9", LoadPicture(wbk.Path & "\lv01\vencido.jpg")      '9
    
End With

End Sub

Agora que já carregamos o controle ImageList com as imagens do computador, precisamos fazer uma pequena alteração dentro da Sub CriaCabecalho. Nesse caso, iremos adicionar o recurso SmallIcons. observe o código a seguir.

Sub CriaCabecalho()

    With ListView1
        .View = lvwReport
        .FullRowSelect = True
        .SmallIcons = ImageList1
        With .ColumnHeaders
            .Clear
            .Add , , "Id", 60
            .Add , , "C.Barras", 140, 2
            .Add , , "Descrição", 280
            .Add , , "Est.Mín", 50, 2
            .Add , , "Est.Máx", 50, 2
            .Add , , "Est.Atual", 80, 2
            .Add , , "Entradas", 80, 2
            .Add , , "Saídas", 80, 2
            .Add , , "Fabricação", 0
            .Add , , "Vencimento", 100
            .Add , , "Dias", 100, 2
        End With
        
    End With
    
End Sub

Feito isso, podemos agora listar as imagens dentro do ListView VBA. Para isso, vamos agora alterar a Sub TrazDadosDaPlanilha(). Vamos nesse exemplo, listar a imagem 1 na coluna de código de barras e a imagem 2 na coluna de Descrição do produto. Nesse caso, o código fica da seguinte forma.

Sub TrazDadosDaPlanilha()

Dim lvItem      As ListItem
Dim Wplan       As Worksheet
Dim dias        As Integer
Dim lin         As Integer

Set Wplan = Planilha1
lin = 2

Wplan.Activate

ListView1.ListItems.Clear

With Wplan

        While .Cells(lin, 1).Value <> ""
        
                With ListView1
                    
                        Set lvItem = ListView1.ListItems.Add(, , Format(Wplan.Cells(lin, "A").Value, "0000"))
                            
                            dtVenc = Wplan.Cells(lin, "J").Value
                            dias = dtVenc - Date
                            
                            lvItem.ListSubItems.Add , , Wplan.Cells(lin, "B").Value, 1
                            lvItem.ListSubItems.Add , , Wplan.Cells(lin, "C").Value, 2
                            lvItem.ListSubItems.Add , , Wplan.Cells(lin, "D").Value
                            lvItem.ListSubItems.Add , , Wplan.Cells(lin, "E").Value
                            lvItem.ListSubItems.Add , , Wplan.Cells(lin, "F").Value
                            lvItem.ListSubItems.Add , , Wplan.Cells(lin, "G").Value
                            lvItem.ListSubItems.Add , , Wplan.Cells(lin, "H").Value
                            lvItem.ListSubItems.Add , , Wplan.Cells(lin, "I").Value
                            lvItem.ListSubItems.Add , , Wplan.Cells(lin, "J").Value
                            lvItem.ListSubItems.Add , , dias
                End With

            lin = lin + 1
        
        Wend
End With

End Sub
Private Sub UserForm_Initialize()
    
    Call CarregaControleImageList
    Call CriaCabecalho
    Call TrazDadosDaPlanilha
    Call PintaLinhasComBaseEmCriterios

End Sub

Observe o resultado. Note que a segunda coluna, exibiu a imagem 1 de cor amarelo, e terceira coluna, exibiu a imagem 2, de cor verde. O mesmo pode ser feito para qualquer outra coluna.

ListView and ImageList Control VBA

Exibir imagens dentro do ListView seguindo critérios

Para o exemplo em questão, iremos definir como critérios, o nível de estoque dos produtos e a data de vencimento dos produtos. Em outras palavras, sempre que o estoque estiver baixo ou zerado o sistema irá me alertar exibindo uma imagem específica. A mesma coisa para os produtos que estivem vencidos, sempre que isso acontecer ele exibir uma imagem de acordo com o critério definido. Para isso, nosso código ficará da seguinte maneira.

Sub TrazDadosDaPlanilha()

Dim lvItem      As ListItem
Dim Wplan       As Worksheet
Dim dias        As Integer
Dim lin         As Integer

Set Wplan = Planilha1
lin = 2

Wplan.Activate

ListView1.ListItems.Clear

With Wplan

        While .Cells(lin, 1).Value <> ""
        
                With ListView1
                
                    Set lvItem = ListView1.ListItems.Add(, , Format(Wplan.Cells(lin, "A").Value, "0000"))
                        
                        est = Wplan.Cells(lin, "F").Value
                        EstMin = Wplan.Cells(lin, "D").Value
                        dtVenc = Wplan.Cells(lin, "J").Value
                        dias = dtVenc - Date
                        
                        If Wplan.Cells(lin, "B").Value = "SEM GTIN" Then
                            lvItem.ListSubItems.Add , , Wplan.Cells(lin, "B").Value, 3
                        Else
                            lvItem.ListSubItems.Add , , Wplan.Cells(lin, "B").Value, 2
                        End If
                        
                        lvItem.ListSubItems.Add , , Wplan.Cells(lin, "C").Value, 4
                        lvItem.ListSubItems.Add , , Wplan.Cells(lin, "D").Value
                        lvItem.ListSubItems.Add , , Wplan.Cells(lin, "E").Value
                        
                        If est <= 0 Then
                            lvItem.ListSubItems.Add , , Wplan.Cells(lin, "F").Value, 8, "Estoque Zerado"
                        ElseIf est <= EstMin Then
                            lvItem.ListSubItems.Add , , Wplan.Cells(lin, "F").Value, 7, "Estoque Baixo"
                        Else
                            lvItem.ListSubItems.Add , , Wplan.Cells(lin, "F").Value
                        End If
                        
                        lvItem.ListSubItems.Add , , Wplan.Cells(lin, "G").Value, 5
                        lvItem.ListSubItems.Add , , Wplan.Cells(lin, "H").Value, 6
                        lvItem.ListSubItems.Add , , Wplan.Cells(lin, "I").Value
                        lvItem.ListSubItems.Add , , Wplan.Cells(lin, "J").Value
                        
                        If dias <= 0 Then
                            lvItem.ListSubItems.Add , , dias, 9, "Produto Vencido"
                        Else
                            lvItem.ListSubItems.Add , , dias, 4
                        End If
                End With

            lin = lin + 1
        
        Wend
End With

End Sub

Note o resultado na imagem abaixo.

Controle ListView com imagens

5 thoughts on “ListView VBA – Uso e Aplicação do Controle ListView VBA”

  1. Pingback: Editable ListView VBA - Criando uma ListView Editável Excel VBA

  2. Pingback: ListView com Gráfico de Barras usando Excel VBA - Projeto Aberto

  3. Pingback: Sistema de agendamento de visitas com Excel VBA - Projeto Aberto

  4. É possivel adicionar Icons aos ColumnHeaders, sendo que esses icons estão numa planilha ou como Label /Picture na userform?

Leave a Comment

O seu endereço de email não será publicado. Campos obrigatórios marcados com *