Seleção múltipla no Excel com VBA: mantenha sua lista sempre atualizada

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

  1. Crie um arquivo do Excel e salve como .xlsm (pasta de trabalho habilitada para macro).
  2. 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

  1. No Excel, vá em Fórmulas → Gerenciador de Nomes → Novo.
  2. Nome: Lista_Opcoes
  3. Refere-se a (escolha a variante que combina com o separador do seu Excel):
  4. =Listas!$A$2:INDEX(Listas!$A:$A, COUNTA(Listas!$A:$A)+1)
  5. Se seu Excel usa ponto-e-vírgula, use: =Listas!$A$2:ÍNDICE(Listas!$A:$A; CONT.VALORES(Listas!$A:$A)+1)
  6. 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.

Sobre José Ícaro Bezerra Clemente 84 Artigos
Head AI/ML Squad BNP, Microsoft for Startups, Google for Startups, Amazon for Startups, OpenAI Partners.

Seja o primeiro a comentar

Faça um comentário

Seu e-mail não será divulgado.


*