Aprendendo VBA – 4 formas de preencher um ComboBox



Olá amigos,

Quando estamos trabalhando em um projeto como o desenvolvimento de um sistema que  contenha formulários temos várias opções de controles, uma destas opções é o ComboBox (Caixa de combinação).

Em um formulário de usuário do Excel , você pode criar listas suspensas usando o controle ComboBox. A caixa de combinação pode ter uma única coluna, ou mais de uma coluna apresentando os dados.

Mostrarei abaixo algumas formas de preencher uma ComboBox:

Utilizando: .RowSource

A maneira mais simples é utilizarmos a propriedade .RowSource, siga os passos abaixo:

  1. Insira um novo formulário em seu projeto VBA.
  2. Neste novo formulário insira um ComboBox (Caixa de combinação).
  3. Altere o nome do ComboBox para: cbo_teste ou o nome que preferir.
  4. Clique duas vezes em seu formulário e insira o código abaixo.

 

Private Sub UserForm_Initialize()

Me.cbo_teste.RowSource = "Plan1!A1:A10";

End Sub

 

Incluimos o código em UserForm_Initialize para que ao inicializar o formulário os dados do combo box sejam carregados através de .RowSource.

IMPORTANTE: O exemplo acima pode ser utilizado em casos onde os itens que irão compor o ComboBox serão sempre os mesmos, no caso itens fixos sem a necessidade de inclusão ou exclusão de itens da lista, tendo em vista que .RowSource refere-se a um intevalo de uma das planilhas da pasta de trabalho.

Utilizando: Do Until

No mesmo ComboBox e formulário podemos inserir o código abaixo com a aplicação:

Private Sub UserForm_Initialize()

lin = 2

Do Until Sheets("Plan1").Cells(lin, 1) = "";

cbo_teste.AddItem Sheets("Plan1").Cells(lin, 5)
lin = lin + 1

Loop

End Sub

IMPORTANTE: O código acima lista todos os itens de uma determinada planilha e de determinada coluna, o mesmo traz todos os itens até a última linha, independente se hajam ou não duplicidades de itens, este exemplo pode ser utilizado em sistemas que inserimos itens através de formulários na lista.

Entendendo o código acima: Utilizamos Do Until , essa estrutura irá repetir um trecho de código enquanto uma determinada condição for verdadeira, no caso enquanto a linha do loop não estiver vazia.

Podemos aplicar o código também até que uma determinada condição torne-se verdadeira. Podemos usar dois operadores condicionais diferentes, que podem aparecer no início ou no final do trecho de código, são eles: While e Until. Neste caso utilizamos Until.

Utilizando: For Next

Carregando dados com duplicidades.

Private Sub UserForm_Initialize()

Dim i, j As Long
Dim temp, area As Variant

ultimaLin = Sheets("Plan1").Cells(Rows.Count, "A").End(xlUp).Row

'A linha abaixo refere-se a coluna que contém os dados da lista.
'Temos linha 2, coluna 5 até a última linha da coluna 5.
'Altere o número da coluna conforme a necessidade do seu projeto.

area = Range(Cells(2, 5), Cells(ultimaLin, 5)).Value

For i = 1 To UBound(area, 1)
For j = i + 1 To UBound(area, 1)
If area(i, 1) > area(j, 1) Then
temp = area(i, 1)
area(i, 1) = area(j, 1)
area(j, 1) = temp
End If
Next
Next

Me.cbo_teste.List = area

End Sub

 

IMPORTANTE: O código acima lista todos os itens de uma determinada planilha e de determinada coluna, o mesmo traz todos os itens até a última linha, independente se hajam ou não duplicidades de itens.

Você pode usar UBound para determinar o total número de elementos em uma matriz. O exemplo a seguir calcula a dimensão total do array a no exemplo anterior onde definimos a última linha e a linha inicial.

Utilizando: For Each

Carregando dados sem duplicidades.

Private Sub UserForm_Initialize()

Dim ultimaLin As Long, area As New Collection
Dim Value As Variant, temp() As Variant

On Error Resume Next
'A linha abaixo identifica a última linha
ultimaLin = Sheets("Plan1").Range("A" & Rows.Count).End(xlUp).Row

'A linha abaixo refere-se a coluna que contém os dados da lista
temp = Sheets("Plan1").Range("E2:E" & ultimaLin).Value

For Each Value In temp
If Len(Value) > 0 Then area.Add Value, CStr(Value)
Next Value

For Each Value In area
'Adicionando item ao ComboBox
cbo_teste.AddItem Value 
Next Value

Set area = Nothing

End Sub

 

IMPORTANTE: Esta é a maneira que podemos considerar como a que oferece a melhor prática relacionada a manutenção, pois conforme os novos itens forem sendo inseridos na coluna que contém os dados os mesmos serão listados no ComboBox(Caixa de Combinação), esta maneira ignora as duplicidades e lista apenas itens como únicos .

[ok]Temos neste artigo 4 formas de preencher uma ComboBox (Caixa de combinação), estas são apenas propostas pois sei que o desenvolvimento via VBA não possui limites e podemos encontrar diversas formas de fazermos uma única coisa. [/ok]

Caso conheça mais alguma forma de alimentarmos um ComboBox com dados da planilha peço que compartilhe conosco.

Agradeço pela leitura e fico no aguardo de seus comentários e sugestões.

Um abraço. DG



Comentários

  • Alekos Mazzolotti
    Responder

    Precisamente o que eu estava procurando: add automaticamente e sem duplicidade. Muito obrigado!

    • Douglas Godoy

      Obrigado pelo comentário Alekos, fico feliz em ter ajudado!

  • Jean
    Responder

    no caso o ultimo codigo, como faz pra seleção aparecer no listbox?

  • Ana
    Responder

    Não sei muito, sou iniciante, alguém pode me ajudar?
    Gostaria de saber como faço pra ordenar uma segunda combobox a partir de outra.
    Primeiro eu filtro por empresas utilizando o For each, e na segunda combo gostaria de filtrar para cada empresa uma determinada área, mas usando o mesmo comando ele pega tudo.

  • Roberto
    Responder

    Douglas,

    Muito obrigado pelo artigo, porém fiquei com uma dúvida e ainda não consegui resolver.
    Veja nas quatros formas de alimentar a combobox, os códigos VBAs são usados para ler a informação na mesma planilha ou em outra planilha, porém na mesma pasta de trabalho, minha dúvida é: como faço para alientar a combobox com dados de uma planilha em outra pasta de trabalho?

    Grato,

    Roberto.

  • Geicivan
    Responder

    Muito bom, seu artigo me ajudou muito, gostaria apenas de fazer um observação relacionado ao “For Each”, quanto temos apenas E2 “” e as demais linha ainda não estão preenchidas o “For Each Value” retorna Vazio. Por isso adicionais a seguinte fase após o

    “temp = Sheets(“Plan1″).Range(“E2:E” & ultimaLin).Value”

    If Sheets(“Plan1”).Range(“E3”).Value = “” Then
    With cbo_teste
    .AddItem Sheets(“Plan1”).Range(“E2”)
    End With

    Else

    ‘……CONTINUO O CÓDIGO colocando um End if no final do comando…..’

    Um abraço

  • jhonata
    Responder

    Me.cbo_teste.RowSource = “Plan1!A1:A10″; e se no caso eu quiser puxar o B:1:B10 no mesmo combobox? sabe me dizer pq no excel ficaria “A1:A10;B1:B10” porém no vba vai dar erro por conta do ;

  • claudio florencio
    Responder

    Obrigado