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




.

Sobre o Autor

Comentários bacanas...

    1. Douglas Godoy Resposta do Autor

      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

  1. Nelson

    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

  2. José Antonio

    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

  3. Ana

    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.

  4. Roberto

    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.

  5. Geicivan

    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

  6. jhonata

    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 ;

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *