
Я регулярно получаю файл экспорта raw и написал макросы для его форматирования и обработки. Я использую Excel 2010 и достаточно хорошо владею VBA.
Один из входящих столбцов содержит список имен из известного (конечного, но большого) списка, разделенных точкой с запятой. Однако если вы используете Autofilter, он не обрабатывает записи как настоящие множественные выборки.
Вопрос:Можно ли программно указать Excel, чтобы он рассматривал «яблоко; виноград» как множественный выбор из «яблоко» и «виноград»?
Пример:
Предположим, что мы знаем, что список содержит только следующие названия: яблоко вишня виноград апельсин персик
Ячейка(и) в столбце (A) может содержать один, два, ... или пять из этих фруктов в любой комбинации, разделенных знаком «;».
(A1) = яблоко (A2) = яблоко; виноград (A3) = яблоко; персик (A4) = вишня; виноград (A5) = вишня; апельсин
К счастью для меня, входящие данные всегда экспортируются в алфавитном порядке (поэтому у меня никогда не будет одной ячейки, содержащей «яблоко; виноград», а другой ячейки, содержащей «виноград; яблоко»).
Проблема:AutoFilter предполагает, что каждая возможная комбинация — это уникальный вариант «выбрать». На последующих этапах мне нужно будет комбинировать/фильтровать на основе нескольких критериев, что усложнит использованиемножество- потому что у меня слишком большой список, чтобы рассматривать все комбинации перестановок как уникальные возможности.
[Например: я фильтрую, чтобы скопировать группу данных на новую вкладку, и иногда я просто перемещаю что-либо со словом «виноград» на новую вкладку, но иногда все, что содержит «виноград» ИЛИ «вишня», копируется на ту же новую вкладку.]
Есть большая вероятность, что я слишком много об этом думаю и усложняю задачу!
Спасибо!
Редактировать: Другими словами, я не вижу, как разумно выполнить цикл по Range().Autofilter Field... Criteria1:=() с экспоненциально большим набором комбинаций. Имеет смысл?
решение1
Используйте advancedfilter
вместо , autofilter
так как он может обрабатывать столько критериев, сколько вам нужно.
Вот рабочий пример. Настройте свой лист Excel, как показано на первом снимке экрана, и запустите макрос.
Перед макросом
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
После макроса
Я уверен, что вы поймете идею и поймете, как ее адаптировать.