
Este guia mostra como habilitar seleção múltipla em uma coluna do Excel usando validação de dados e um macro VBA simples. A fonte da lista será dinâmica (cresce sozinha quando você adiciona itens), e o macro evita duplicatas e permite “desmarcar” um item ao selecioná-lo novamente.
1) Estrutura da planilha
- Crie um arquivo do Excel e salve como .xlsm (pasta de trabalho habilitada para macro).
- Crie duas áreas/abas:
- Listas: Coluna A com as opções (ex.: LLM, IA, ML, Sucesso, BNP) a partir da linha 2. Deixe A1 como título (“Opção”).
- Dados: Onde você usará a lista (vamos aplicar em
B2:B1000
).

2) Validação de dados com fonte dinâmica
- No Excel, vá em Fórmulas → Gerenciador de Nomes → Novo.
- Nome: Lista_Opcoes
- Refere-se a (escolha a variante que combina com o separador do seu Excel):
- =Listas!$A$2:INDEX(Listas!$A:$A, COUNTA(Listas!$A:$A)+1)
- Se seu Excel usa ponto-e-vírgula, use: =Listas!$A$2:ÍNDICE(Listas!$A:$A; CONT.VALORES(Listas!$A:$A)+1)
- Selecione Dados!B2:B1000 → Dados > Validação de Dados → Tipo: Lista → Origem: =Lista_Opcoes.
3) Macro VBA de multi-select (anti-duplicação + toggle)
Abra o Editor do VBA (Alt+F11), no painel à esquerda dê duplo clique na planilha Dados e cole o código abaixo. Ao reabrir o arquivo, clique em Habilitar Conteúdo.
' === COLE ESTE CÓDIGO NO MÓDULO DA PLANILHA "Dados" (não em Módulo Padrão) ===
' Multi-select em B2:B1000 com concatenação por vírgula, prevenindo duplicatas
' e com "toggle" (selecionar novamente remove o item).
Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo exitHandler
If Target Is Nothing Then Exit Sub
Dim alvo As Range
Set alvo = Intersect(Target, Me.Range("B2:B1000"))
If alvo Is Nothing Then Exit Sub
Application.EnableEvents = False
Dim c As Range
For Each c In alvo
' Garante que a célula usa validação de lista
On Error Resume Next
If c.Validation.Type <> xlValidateList Then
On Error GoTo exitHandler
GoTo nextCell
End If
On Error GoTo exitHandler
Dim newVal As String, oldVal As String
newVal = CStr(c.Value)
' Recupera valor anterior
Application.Undo
oldVal = CStr(c.Value)
If Len(Trim$(oldVal)) = 0 Then
' Não havia nada: escreve a primeira seleção
c.Value = newVal
Else
Dim arr() As String, exists As Boolean
Dim i As Long, tmp As String
arr = Split(oldVal, ", ")
exists = False
For i = LBound(arr) To UBound(arr)
If StrComp(Trim$(arr(i)), Trim$(newVal), vbTextCompare) = 0 Then
exists = True
Exit For
End If
Next i
If Not exists Then
' Adiciona novo item
c.Value = oldVal & ", " & newVal
Else
' Toggle: remove o item já existente
tmp = Replace(oldVal, ", " & newVal, "", , , vbTextCompare)
tmp = Replace(tmp, newVal & ", ", "", , , vbTextCompare)
tmp = Replace(tmp, newVal, "", , , vbTextCompare)
c.Value = Trim$(tmp)
End If
End If
nextCell:
Next c
exitHandler:
Application.EnableEvents = True
End Sub
4) (Opcional) Automatizando a base com Python

Se preferir gerar a planilha base por script (guia Listas + validação em B2:B1000):
from openpyxl import Workbook
from openpyxl.worksheet.datavalidation import DataValidation
wb = Workbook()
ws = wb.active
ws.title = "Dados"
ws["A1"] = "Coluna A"
ws["B1"] = "Coluna B (multi-select)"
items = ["LLM", "IA", "ML", "Sucesso", "BNP"]
ws_list = wb.create_sheet("Listas")
ws_list["A1"] = "Opção"
for i, val in enumerate(items, start=2):
ws_list[f"A{i}"] = val
dv = DataValidation(type="list", formula1="=Listas!$A$2:$A$6", allow_blank=True, showDropDown=True)
ws.add_data_validation(dv)
dv.add("B2:B1000")
wb.save("Planilha_MultiSelect.xlsx") # depois salve como .xlsm e cole o macro no módulo da planilha "Dados"
Conclusão
Com a lista dinâmica alimentando a validação de dados e o macro no evento Worksheet_Change
, você habilita seleção múltipla com prevenção de duplicatas e remoção por “toggle”. A manutenção das opções fica centralizada em Listas, e o processo funciona no Windows e no Mac (com macros habilitadas).
FAQ
Como desmarcar um item?
Selecione novamente o mesmo item no menu da célula: o macro remove o texto correspondente.
Minha lista não atualiza quando adiciono itens novos.
Confirme se a validação usa =Lista_Opcoes
e se o Nome foi criado com a fórmula correta para o seu separador (vírgula ou ponto-e-vírgula). Alternativa: use uma Tabela e um nome que referencie a coluna (ex.: =TblLista[Opção]
).
Funciona sem macro?
Sem macro, a validação de dados é sempre de seleção única. O multi-select requer VBA.
Seja o primeiro a comentar