使用数组与AutoFilter筛选表格异常:所有数据显示在一行
解决VBA AutoFilter循环筛选后数据挤在同一行的问题
嘿,我懂你的困扰——你想通过判断单元格是否包含数组里的任意姓名来筛选表格,但用For循环执行AutoFilter后,所有数据都挤到同一行里了。先看看你给出的代码片段:
Dim tab(3) as string 'tab(0) = "*valerie dupond*"' 'tab(1) = "*emanuel babri*"' 'tab(2) = "*raphael gerand*"' For i = 0 To 2 'Worksheets("Feuil1").Range("A1").AutoFilter field:=2, Criteria1:=tab , 'Operator:=xlFilterValues' 'Next
问题出在哪?
- 首先,
tab是VBA的关键字,用它当变量名容易触发不必要的错误,建议换成更清晰的名字(比如nameFilters)。 - 更关键的是:你根本不需要用For循环!AutoFilter的
xlFilterValues操作符本来就支持直接传入一个数组作为筛选条件,循环调用AutoFilter反而会每次重置之前的筛选规则,反复的筛选操作还可能导致Excel的单元格格式、行高错乱,让数据看起来挤在同一行。
修正后的代码
直接一次性应用多值筛选就搞定了,代码如下:
Sub FilterTargetNames() ' 重命名变量避免关键字冲突 Dim nameFilters(2) As String nameFilters(0) = "*valerie dupond*" nameFilters(1) = "*emanuel babri*" nameFilters(2) = "*raphael gerand*" ' 先清除工作表已有的筛选(如果存在) With Worksheets("Feuil1") If .AutoFilterMode Then .AutoFilterMode = False ' 一次性应用数组中的所有筛选条件 .Range("A1").AutoFilter _ Field:=2, _ Criteria1:=nameFilters, _ Operator:=xlFilterValues End With End Sub
为什么这样管用?
xlFilterValues专门用来处理多值筛选,直接把包含通配符的姓名数组传给Criteria1,Excel会自动筛选出第二列中包含数组任意姓名的行——既不会反复重置筛选,也不会导致格式错乱。
内容的提问来源于stack exchange,提问作者Aya Lahrichi
相关产品推荐
相关产品推荐

