我经常收到原始导出文件,并编写了宏来格式化和操作它。我使用 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
宏之后
我确信您将会明白这个想法并且知道如何适应它。