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.
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.
Click no botão “Tipo” para listar as opções de salvamento.
Escolha a opção: “Pasta de Trabalho Habilitada para Macro do Excel“.
Dê um nome para o arquivo, selecione a pasta de destino e click em salvar.
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.
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.
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.
Pingback: Editable ListView VBA - Criando uma ListView Editável Excel VBA
Pingback: ListView com Gráfico de Barras usando Excel VBA - Projeto Aberto
Pingback: Sistema de agendamento de visitas com Excel VBA - Projeto Aberto
Após inserir todos os códigos apareceu a seguinte mensagem ao executar “ImageList must be initialized before it can be used” e não deu certo.
É possivel adicionar Icons aos ColumnHeaders, sendo que esses icons estão numa planilha ou como Label /Picture na userform?