Я регулярно получаю необработанный файл экспорта и пишу макросы для его форматирования и манипулирования. Я использую Excel 2010, и я в меру комфортно чувствую себя в VBA.

Один из входящих столбцов содержит список имен из известного (конечного, но большого) списка, разделенных точками с запятой. Однако, если вы используете автофильтр, он не обрабатывает записи как истинные множественные выборки.

Вопрос: Могу ли я программно сказать Excel, чтобы он видел «яблоко; виноград» как множественный выбор "яблок" и "винограда"?

Пример:

Предположим, что мы знаем, что список содержит только следующие названия: яблоко вишня виноград апельсин персик

Ячейки в столбце (А) могут содержать один, два, ... или пять из этих фруктов в любой комбинации, разделенных знаком «;».

(А1) = яблоко (А2) = яблоко; виноград (A3) = яблоко; персик (А4) = вишня; виноград (A5) = вишня; оранжевый

К счастью для меня, входящие данные всегда экспортируются в алфавитном порядке (поэтому у меня никогда не будет одной ячейки, содержащей «яблоко; виноград», и другой ячейки, содержащей «виноград; яблоко»).

Проблема: Автофильтр предполагает, что каждая возможная комбинация является уникальной опцией «выбрать». В последующих шагах мне нужно объединить / отфильтровать на основе нескольких критериев, которые усложняют использование массива - потому что у меня слишком большой список, чтобы рассматривать все комбинации комбинаций как уникальные возможности.

[Например: я фильтрую, чтобы скопировать группу данных на новую вкладку, и иногда я просто перемещаю что-нибудь с "grape" на новую вкладку, но иногда все, что содержит "grape" ИЛИ "cherry", копируется в та же новая вкладка.]

Существует явная возможность, что я переосмысливаю это и усложняю, чем это должно быть!

Спасибо!

Редактировать: Другими словами, я не вижу, как разумно перебрать Range().Автофильтр Поле ... Критерии 1: =() с экспоненциально большим набором комбинаций. Есть смысл?

1 ответ1

2

Используйте 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

После макроса

Я уверен, что вы поймете идею и как ее адаптировать.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .