Excel 2010:VBA 将传入文本转换为多选下拉列表

Excel 2010:VBA 将传入文本转换为多选下拉列表

我经常收到原始导出文件,并编写了宏来格式化和操作它。我使用 Excel 2010,并且对 VBA 相当熟悉。

传入的列之一包含一个名称列表,这些名称来自一个已知(有限但很大)的列表,以分号分隔。但是,如果您使用自动筛选,它不会将条目视为真正的多选。

问题:我可以通过编程告诉 Excel 将“苹果;葡萄”视为“苹果”和“葡萄”的多选吗?

例子:

假设我们知道列表仅包含以下名称:苹果、樱桃、葡萄、橙子、桃子

(A) 列中的单元格可能包含 1 个、2 个、...或 5 个这样的水果,以任意组合形式,以“;”分隔。

(A1) = 苹果 (A2) = 苹果;葡萄 (A3) = 苹果;桃子 (A4) = 樱桃;葡萄 (A5) = 樱桃;橙子

对我来说幸运的是,传入的数据总是按字母顺序导出(因此我永远不会有一个单元格包含“苹果;葡萄”,而另一个单元格包含“葡萄;苹果”)。

问题:自动筛选假设每个可能的组合都是一个独特的“选择”选项。在后面的步骤中,我需要根据多个条件进行组合/筛选,这使得使用大批- 因为我的列表太大,无法将所有组合排列视为唯一的可能性。

[例如:我正在过滤将一组数据复制到新选项卡,有时我只是将任何带有“grape”的内容移动到新选项卡,但有时任何包含“grape”或“cherry”的内容都会被复制到同一个新选项卡中。]

很有可能是我过度思考了,让事情变得比实际更难!

谢谢!

编辑:换句话说,我不知道如何合理地循环 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

宏之后
在此处输入图片描述

我确信您将会明白这个想法并且知道如何适应它。

相关内容