AdvancedFilter的行为不一致吗?

时间:2018-07-10 17:02:08

标签: excel vba

编辑:下面的@Magnetron回答。

我在拍摄一些旧代码时遇到麻烦,我可以解决此问题,但想知道为什么使用Unique:= True的AdvancedFilter的行为不一致。

这是问题所在,已创建数据表,并且在表中分配了客户和钻机位置以及其他参数。

代码尝试查找唯一的客户数量:

'Specialized list of customers for the month
ThisWB.Worksheets("May").Range(("D3:D" & LastDataRow)).AdvancedFilter Action:=xlFilterCopy, CopyToRange:=ThisWB.Worksheets("May").Range("AA1"), Unique:=True

'define a temp last row on the unique row
tempLR = ThisWB.Worksheets("May").Cells(Rows.Count, "AA").End(xlUp).Row

holderCount = Application.WorksheetFunction.CountA(ThisWB.Worksheets("May").Range("AA1:AA" & tempLR)) - 1

当动态创建标题时,此代码在创建“唯一”客户列表时将第一位客户商品加倍。似乎易于管理。然后,该子项在此新“列表”定义的范围内从CountA减去1。通过减去重复的(标题),可以得到正确数量的客户。

先清除范围,然后再清除。 。 。

从字面上看,在4行之后,相同的调用在不同的列上进行,并且没有创建标题,该列表是唯一的,减去1会导致错误的唯一编号,因此我将其删除了,因为它给出的编号比原来少一个计数应该是。

'Specialized list of rigs for the month
ThisWB.Worksheets("May").Range(("F3:F" & LastDataRow)).AdvancedFilter Action:=xlFilterCopy, CopyToRange:=ThisWB.Worksheets("May").Range("AA1"), Unique:=True

'define a temp last row on the unique row
tempLR = ThisWB.Worksheets("May").Cells(Rows.Count, "AA").End(xlUp).Row

holderCount = Application.WorksheetFunction.CountA(ThisWB.Worksheets("May").Range("AA1:AA" & tempLR))

此行为每月发生十二次,在第一次调用中创建标头,在第二次调用中不创建标头。当然,如果存在空白行,则会被表示出来,但在CountA中会被忽略。

除了考虑到这种独特行为外,为什么会发生这种情况? AdvancedFilter函数的行为不应以交替的方式发生变化,例如D列与F列的行为不同。我觉得创建的标头应始终存在或永远不存在。

想分享这个观察。

干杯-WWC

1 个答案:

答案 0 :(得分:1)

高级筛选器功能始终认为数据具有标题。在F列中,第一个单元格中的值是唯一的,因此不会重复。另一方面,在D列范围内,第一个值被设置为标题,但是它多次出现,因此再次以tbale数据的形式出现。

要更正此行为,只需向所有数据添加标头,然后可以减去1来计数值。