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 .

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.

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

  • Gui
    Responder

    Tem como evitar a duplicidade no .additem do cbo? Valeu

    • Douglas Godoy

      Gui,

      No post eu descrevo como carregar dados sem duplicidades, segue abaixo o código:

      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

      Abs
      Douglas

  • Nelson
    Responder

    Muito bom! Funcionou e evitou o Array e o AddItem. Eu já estava utilizando um papel metro colado no monitor para colocar todas as cidades. Abraço

    • Douglas Godoy

      Olá Nelson!

      Muito Obrigado pelo comentário!

      Um Abraço!

  • Josiane
    Responder

    Passando aqui em 2017. Vlw mto!!!! 🙂

    • Douglas Godoy

      Obrigado pela sua visita e comentário Josi! 🙂

  • Ze Ferreira
    Responder

    Quero que Combo Box mostre o valor de uma label caption.
    Alguém poderia ajudar?

    zeca1456@gamil.com

    • Douglas Godoy

      Zeca,

      Não sei se é o que precisa… Mas seria assim.

      Private Sub UserForm_Initialize()
      Me.TextBox1.Value = Me.Label1.Caption
      End Sub

  • José Antonio
    Responder

    Olá Douglas! Estive procurando na web, sobre lista em Combobox e encontrei teu artigo que achei show de bola e pelo que entendi o “For Each” é exatamente o que preciso.
    Copiei o código colei no Userform certinho, porem as duas linhas de comando que seguem ficam em vermelho e nao consigo decifrar o erro; o restante ficou td certo.
    Podes me ajudar? Desde já fico grato!

    ultimaLin = Sheets(“Plan1”).Range(“A” & Rows.Count).End(xlUp).Row

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

  • 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