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:
- Insira um novo formulário em seu projeto VBA.
- Neste novo formulário insira um ComboBox (Caixa de combinação).
- Altere o nome do ComboBox para: cbo_teste ou o nome que preferir.
- 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
Parabéns, conteúdo de profundo conhecimento técnico, e muito bem explicado.
Olá Alexandre,
Muito obrigado pelo feedback!
Grande abraço!
Douglas
Parabens pela iniciativa.
Agradeço! Abraços!
Tem como evitar a duplicidade no .additem do cbo? Valeu
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
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
Olá Nelson!
Muito Obrigado pelo comentário!
Um Abraço!
Passando aqui em 2017. Vlw mto!!!! 🙂
Obrigado pela sua visita e comentário Josi! 🙂
Quero que Combo Box mostre o valor de uma label caption.
Alguém poderia ajudar?
zeca1456@gamil.com
Zeca,
Não sei se é o que precisa… Mas seria assim.
Private Sub UserForm_Initialize()
Me.TextBox1.Value = Me.Label1.Caption
End Sub
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
Precisamente o que eu estava procurando: add automaticamente e sem duplicidade. Muito obrigado!
Obrigado pelo comentário Alekos, fico feliz em ter ajudado!
no caso o ultimo codigo, como faz pra seleção aparecer no listbox?
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.
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.
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
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 ;
Obrigado