我有两个 Excel 表,表 A 和表 B。表 A 包含客户 ID、邮政编码、客户名称等列,这些列具有与表 B 中的列相同的列名。我想要创建一个公式,理想情况下使用结构化引用,以便表 B 中列的顺序无关紧要,查找表 B 中与表 A 中我所在行的客户 ID 以及我所在列的列值匹配的值。
例如,如果我的公式位于表 A 的第三列和客户 ID 为“123”的行中,我希望它检查其自己的列名(客户名称)并查找表 B 中客户 ID =“123”的客户名称的值。
以下公式适用于“客户名称”列:
=INDEX(TableB[Customer Name], MATCH([@[Customer Number]], TableB[Customer Number], 0))
但我希望能够创建一个公式,用我所在的列的名称动态替换 [客户名称] 部分,以便我可以将其复制到所有列中。我尝试使用 #Headers 和间接创建引用,但出现 Ref 错误:
=INDIRECT("INDEX(TableB["&[#Headers]&"], MATCH([@[Customer Number]], TableB[Customer Number], 0))")
答案1
INDEX
MATCH
是正确的方法,你只需要小心构建它。
左边是表 A。右边是表 B。我们将使用 [客户编号] 来查找 [邮政编码]。
这是要写入的公式D2
:
=INDEX(TableB,MATCH([@[Customer Number]],TableB[Customer Number],0),MATCH(D$1,TableB[#Headers],0))
INDEX
,如您所知,返回行和列交叉点处单元格的值。MATCH
返回数组中值的相对位置。
因此,对于 的两个输入,首先我们通过提供要查找的垂直数组INDEX
来找到源表中找到与我们正在使用的查找值(客户编号)匹配的行号(这是 的传统前半部分) ,然后我们通过提供包含源列的标题行的水平数组来找到与我们所在的列的名称匹配的列号。INDEX
MATCH
MATCH
MATCH
您会注意到,如果您向源表添加一个字段,并更改公式表中的标题,则无需更改公式即可获得新结果。
..并且此公式既可横向复制,又可纵向复制。
这里的两个关键是:
- 知道 MATCH 会横向计数,也会纵向计数。
- 手动将 Excel 提供的结构化引用更改为实际的 R1C1 样式单元格引用,这样您就可以使该单元格引用的列索引变得动态而不是固定(即 C$1 与 相对
TableA[[#Headers],[Post Code]]
,它对您所在字段的值进行硬编码,因此不会复制,但如果您手动更改包含查找公式的列的名称,它将起作用,并且您只需要在目标表中有一个查找字段)。
注意:我知道这个问题已经三年多了,但这是一个很好的问题,并且很好地展示了该INDEX
MATCH
技术的多功能性。