Excel 2010: VBA converte texto recebido em lista suspensa de seleção múltipla

Excel 2010: VBA converte texto recebido em lista suspensa de seleção múltipla

Recebo regularmente um arquivo de exportação bruto e escrevi macros para formatá-lo e manipulá-lo. Eu uso o Excel 2010 e me sinto moderadamente confortável com VBA.

Uma das colunas recebidas possui uma lista de nomes, de uma lista conhecida (finita, mas grande), separados por ponto e vírgula. Porém, se você usar o Filtro Automático, ele não tratará as entradas como verdadeiras seleções múltiplas.

Pergunta:Posso dizer programaticamente ao Excel para ver "maçã; uva" como uma seleção múltipla de "maçã" e "uva"?

Exemplo:

Suponha que sabemos que a lista contém apenas os seguintes nomes: maçã cereja uva laranja pêssego

A(s) célula(s) na Coluna (A) podem conter uma, duas, ...ou cinco dessas frutas em qualquer combinação, separadas por ";".

(A1) = maçã (A2) = maçã; uva (A3) = maçã; pêssego (A4) = cereja; uva (A5) = cereja; laranja

Felizmente para mim, os dados recebidos são sempre exportados em ordem alfabética (portanto, nunca terei uma célula contendo "maçã; uva" e outra célula contendo "uva; maçã").

O problema:O AutoFiltro assume que cada combinação possível é uma opção de 'seleção' exclusiva. Em etapas posteriores, preciso combinar/filtrar com base em vários critérios que tornam complicado o uso de umvariedade- porque tenho uma lista muito grande para ver todas as permutações de combinações como possibilidades únicas.

[Por exemplo: estou filtrando para copiar um grupo de dados para uma nova guia e, às vezes, apenas movo qualquer coisa com "uva" para uma nova guia, mas às vezes qualquer coisa que contenha "uva" OU "cereja" é copiada para a mesma nova guia.]

Há uma possibilidade distinta de que eu esteja pensando demais nisso e tornando tudo mais difícil do que deveria ser!

Obrigado!

Editar: Em outras palavras, não vejo como fazer um loop razoável através de Range().Autofilter Field... Criteria1:=() com um conjunto exponencialmente grande de combinações. Faz sentido?

Responder1

Use advancedfilterem vez de, autofilterpois ele pode lidar com quantos critérios você desejar.
Aqui está um exemplo prático. Configure sua planilha Excel como a primeira captura de tela mostra e execute a macro.

Antes da macro
insira a descrição da imagem aqui

Sub AdvancedFilterTest()

    'clear old results and old filters
    Range("C:C").Clear
    Range("D:D").Clear

    'criteria header name and data header name needs to be the same
    [C1] = [B1]

    'Split multiple criterias by semicolon and save them as array
    Criterias = Split([A2], ";")

    'write the array to cells since advancedfilter needs a range as criteria
    For i = 0 To UBound(Criterias)
        Cells(i + 2, 3) = Criterias(i)
    Next i

    'Set the cells as a range so advancedfilter can use them
    Set critrange = Range(Cells(1, 3), Cells(UBound(Criterias) + 2, 3))

    'advanced filter will filter and copy your data to a new target range
    Range("B:B").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=critrange, CopyToRange:=Sheets(1).[D1]

End Sub

Depois da macro
insira a descrição da imagem aqui

Tenho certeza que você entenderá a ideia e como adaptá-la.

informação relacionada