在文章 “查找重复数据的几种使用方法(1)(FILTER函数)”中,我们介绍了利用FILTER函数来查找重复数据,制作明细表的基本方法,这个函数使用很简单,查找重复数据也非常方便。
如果你的Excel没有FILTER函数呢?我们可以联合使用MATCH函数与INDIRECT函数,来建立滚动查找。
下图是一个销售清单,现在要求制作一个对账单表格,把某个指定客户的所有销售明细查找出来。


明细表的制作,本质上就是查找重复数据。但是单独使用VLOOKUP函数或者MATCH都无法实现,因为这两个函数都只能查找第一个出现的数据。
不过,我们可以这样来考虑:第一次用MATCH函数定位出指定数据的第一次出现的行,比如数据在20行,那么第二次定位时,从21行(=20+1,往下移一行)开始往下定位,就可以定位出该数据第二次出现的行,比如数据在35行。第三次定位就从36(=35+1,往下移一行)行开始往下定位,依此类推,直至把指定数据的所有出现的位置都查找出来,再利用INDEX就可以把各个位置的数据取出。
这种查找又称循环查找,其关键点是如何构建一个动态的、不断往下移动的查找区域,这个问题由INDIRECT函数来解决是最容易不过了。下面是这个查询表的具体制作过程。
步骤1:设计一个辅助列,这里是K列,保存每次查找到指定客户的行号,如下图所示。

步骤2:在单元格K5输入查找指定客户第一次出现位置的公式:
=MATCH(B2,销售清单!B:B,0)
注意:这里从单元格K5开始做公式,是为了与查询表一致,这样便于创建简便的公式。
步骤3:在单元格K6输入第2次查找公式:
=MATCH($B$2,INDIRECT("销售清单!B"&K5+1&":B2000"),0)+K5
这个公式的含义是:
先构建一个动态的查找区域“"销售清单!B"&K5+1&":B2000"”,这个区域的起始单元格就是上一次找到的位置往下移一行(即K5+1),再利用INDIRECT函数将这个手工连接的字符串转换为新查找区域的引用。
需要注意的是,第二次找到的位置是当前单元格区域的相对位置,因此还需要在此结果上加上上一次的位置行号,转换成工作表的行号,这就是在MATCH结果上加K5的原因。
步骤4:将单元格K6的公式往下复制到一定的行(视源数据区域的大小,多复制点),就得到每次查找的位置行号。如果从某个单元格开始出现错误值了,就表明下面没有要查找的客户了。
步骤5:在查询表的第5行的各单元格输入下面的公式,然后往下复制到一定的行,就得到指定部门所有的明细数据。
单元格A5:
=IFERROR(INDEX(销售清单!A:A,$K5),"")
单元格B5:
=IF(AND(A5="",A4<>""),"合计",IFERROR(INDEX(销售清单!B:B,$K5),""))
这个公式是在明细表的最底部自动插入合计行。
单元格C5:
=IFERROR(INDEX(销售清单!C:C,$K5),"")
单元格D5:
=IFERROR(INDEX(销售清单!D:D,$K5),"")
单元格E5:
=IFERROR(INDEX(销售清单!E:E,$K5),"")
单元格F5:
=IFERROR(INDEX(销售清单!F:F,$K5),"")
单元格G5:
=IFERROR(INDEX(销售清单!G:G,$K5),"")
单元格H5:
=IF(B5="合计",SUM($H$4:H4),IFERROR(INDEX(销售清单!H:H,$K5),""))
这个公式是在明细表的底部,自动计算所有明细的合计金额。
单元格I5:
=IFERROR(INDEX(销售清单!I:I,$K5),"")
步骤6:选择单元格区域A5:I2000,设置两个条件格式:
(1)当A列里有数据时,自动加边框;
(2)当B列的数据是“合计”两个字时,自动加边框、加颜色,如图下图。

步骤7:最后把K列隐藏起来。
这样,就制作完成了动态的客户对账单的模版。只要在单元格B2选择输入任意客户名称,就自动得到该客户的明细数据。


