Excel 2010: VBA Преобразование входящего текста в раскрывающийся список с множественным выбором

Excel 2010: VBA Преобразование входящего текста в раскрывающийся список с множественным выбором

Я регулярно получаю файл экспорта 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

После макроса
введите описание изображения здесь

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

Связанный контент