
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 advancedfilter
em vez de, autofilter
pois 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
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
Tenho certeza que você entenderá a ideia e como adaptá-la.