segunda-feira, 27 de março de 2017

Preenchendo uma ListBox via VBA

Preenchendo uma ListBox
Muitas vezes quando trabalhamos com programação se faz necessário criar interfaces mais agradáveis ao usuário final a fim de facilitar a utilização das ferramentas criadas. Com isso muitas vezes é necessário que criar listas de seleção, carregar dados, fazer filtros, entre outros a fim de levar ao usuário uma escolha dentre uma lista de opções.

As ListBox, também conhecidas como caixa de listagem, são itens usados especialmente para essa função, através delas o usuário pode listar itens dentro de um critério determinado por ele. Na Figura 1 temos um exemplo de ListBox.

Figura 1: Exemplo de ListBox

Mas como fazer uso dessas caixas de listagem, bom não é um bicho de sete cabeças e você vai aprender agora como preenche-las.

Nas fases abaixo vamos aprender como preencher essas ListBox para serem usadas de acordo com a sua necessidade. Vamos a ela:

1º Fase:
Abra o Visual Vasic for Applications do seu Excel e crie uma UserForm, em seguida insira uma ListBox, uma ComboBox, um CommandButoon e uma Label conforme figura acima. As dimensões e nomes a serem dados aos botões fica a critério do usuário, no nosso caso não houve nenhuma alteração nestes itens na ListBox informar no campo ColumnCount em propriedades da ListBox que ela deve ter 5 colunas.

2º Fase:
Para aprendermos como preencher essa listagem vamos usar o critério de Uf do cliente em um pequeno banco de dados de clientes. Com isso a primeira coisa a se fazer é determinar onde estará o critério para seleção, que no nosso caso vai se uma Combobox com as Uf dos clientes.
Para isso iremos criar um código na form na ação inicialize da UserForm de acordo com os passos abaixo:

Na ação inicialize da UserForm digitaremos o código da seguinte forma: primeiro digita-se o nome da ComboBox seguido de “.RowSourse =” depois entre aspas digita-se o nome da planilha onde esta as informações que devem estar listadas na ComboBox seguido do código para achar a última linha preenchida da coluna conforme exemplo abaixo.

ComboBox1.RowSource = "Plan2!A1:A" & Sheets("planilha").Range("A1").End(xlDown).Row

Nesse código irá preencher a ComboBox com os dados da planilha até a última linha preenchida da coluna selecionada da planilha informada.

3º Fase:
Chegou a hora de preencher a ListBox, para isso nós vamos usar uma estrutura de repetição, a saber a estrutura Do While... Loop, e uma estrutura de decisão, a saber a estrutura If...Else... End If, afim de preencher a ListBox apenas com os dados requeridos. Vamos a o nosso código:

A primeira coisa a se fazer é criar a estrutura de repetição. Para isso iremos usar a estrutura Do While... Loop para que o nosso código possa percorrer todo nosso banco de dados.
Nesse comando nós estamos informando para estrutura que ela deve repetir o código enquanto a linha verificada da planilha “Bco_Dados” for diferente de vazio.

Sub GerarRelatório()

Dim linha as Integer

linha = 2

Do While Sheets("Bco_Dados").Cells(linha, 1) <> ""

   linha = linha + 1
Loop

End Sub

Note que criamos também uma variável chamada “linha” do tipo inteira para que possa informar a nossa estrutura de repetição qual a linha que ela está verificando, para isso também é necessário que nós incrementemos essa variável, ou seja, somemos mais 1 a cada vez que ela passar pelo Loop, fazendo com que na primeira vez a variável “linha” seja 2, depois 3, depois 4 e assim por diante até que a linha verificada esteja vazia, a fim de não gerar um Loop infinito, pois ele nunca sairia da linha 2, e com isso travar o sistema.

Note que demos um valor inicial de 2 para variável linha, isso foi feito porque nosso banco de dados começa a seu preenchimento a partir da linha 2.

4º Fase
Chegou a hora de adicionarmos nossa estrutura de decisão, a estrutura If...Else...End If, com ela nós vamos verificar se a linha atende nosso critério ou não, onde caso atenda o código exibe as informações na nossa ListBox caso não atenda e não mostra.
Na nossa comparação estamos pesquisando na aba “Bco_Dados” por Uf do cliente onde sé exibirá o cliente que for da Uf selecionada.

Note que ele está fazendo a comparação na célula referente a variável linha da coluna 4 que é a coluna de Uf.

Sub GerarRelatório()

Dim linha as Integer

linha = 2

Do While Sheets("Bco_Dados").Cells(linha, 1) <> ""
If Sheets("Bco_Dados").Cells(linha, 4) = ComboBox1 Then

Else

End if
   linha = linha + 1
Loop

End Sub

5º Fase
Chegou a hora de informar o que fazer caso a linha pesquisada atenda nosso critério do relatório, no nosso caso se atender o critério queremos que as informações sejam exibidas na ListBox.

Vimos que nosso banco de dados é composto de 5 colunas, com isso precisaremos escrever 5 linhas de comando para podermos levar as 5 colunas para nosso ListBox, uma para cada coluna. Para isso iremos usar o seguinte código:

Sub Relatório()

Dim linha as Integer

linha = 2

'Limpar ListBox
ListBox1.Clear

'Preencher ListBox
Do While Sheets("Bco_Dados").Cells(linha, 1) <> ""
If Sheets("Bco_Dados").Cells(linha, 4) = ComboBox1 Then
    With ListBox1
        .AddItem
        .List(linhalistbox, 0) = Sheets("Bco_Dados").Cells(linha, 1)
        .List(linhalistbox, 1) = Sheets("Bco_Dados").Cells(linha, 2)
        .List(linhalistbox, 2) = Sheets("Bco_Dados").Cells(linha, 3)
        .List(linhalistbox, 3) = Sheets("Bco_Dados").Cells(linha, 4)
        .List(linhalistbox, 4) = Sheets("Bco_Dados").Cells(linha, 5)
    End With
    linhalistbox = linhalistbox + 1
End If
linha = linha + 1
Loop

End Sub

No código acima estamos informando que caso atenda nosso critério de seleção nosso código deve exibir na ListBox na linhalistbox coluna 0 os dados que estão na aba “Bco_Dados” célula linha coluna 1 e assim sucessivamente, uma para cada coluna, lembrando de mudar a coluna a cada uma das 5 linha de código digitada.

Nós usamos, também, o comando With com a propriedade AddItem, informando que ele deve escrever na ListBox os dados da linha de comando abaixo atpe o End With.

Note que aqui nós criamos uma outra variável inteira de nome “linhalistbox”, isso foi feito para que nossa ListBox não tenha linhas em branco, por isso criamos outra variável de nome “linhalistbox” para representar as linhas da ListBox, porque nem sempre os dados que queremos vão estar um debaixo do outro, com isso caso usássemos a variável “linha” teriam espações em branco dentro da nosso ListBox, lembrando que essa variável também tem que ser incrementada com 1 a cada vez que nosso critério for atendido afim de que o código não subscreva por cima de um item já levado para a ListBox.

Nenhum comentário:

Postar um comentário