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

0

Estou recebendo regularmente um arquivo de exportação bruto e escrevi macros para formatá-lo e manipulá-lo. Eu uso o Excel 2010 e estou moderadamente confortável em VBA.

Uma das colunas de entrada tem uma lista de nomes, de uma lista conhecida (finita mas grande), separados por ponto e vírgula. Se você usa o AutoFiltro, porém, ele não trata as entradas como verdadeiras seleções múltiplas.

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

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) pode 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

Para minha sorte, os dados recebidos são sempre exportados em ordem alfabética (para que eu nunca tenha uma célula contendo "maçã; uva" e outra célula contendo "uva; maçã").

O problema: AutoFiltro assume que cada combinação possível é uma opção 'select' exclusiva. Em etapas posteriores, preciso combinar / filtrar com base em vários critérios que dificultam o uso de um array - porque tenho uma lista grande demais para visualizar todas as permutações de combinação como possibilidades exclusivas.

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

Existe uma possibilidade distinta de eu estar pensando demais nisso e tornando-o mais difícil do que tem que ser!

Obrigado!

Editar: Em outras palavras, não vejo como percorrer razoavelmente o Range (). Campo do Filtro Automático ... Critério1: = () com um conjunto de combinações exponencialmente grande. Faz sentido?

    
por hudsonsedge 09.08.2013 / 18:39

1 resposta

2

Use advancedfilter em vez de autofilter , pois ele pode manipular quantos critérios você quiser.
Aqui está um exemplo de trabalho. Configure sua planilha do Excel como se a primeira captura de tela estivesse mostrando e executando a macro.

Antes da macro

SubAdvancedFilterTest()'clearoldresultsandoldfiltersRange("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

Após macro

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

    
por 09.08.2013 / 21:10