我宁愿向您展示一种更清洁的方法,而不是试图修复您的公式。
INDIRECT 是一个强大但易变的函数,它总是会随着工作簿中的每次更改而重新计算。如果您在整个列中使用它,它会极大地降低您的工作簿的速度。您还被困在一个任意大的区域中,该区域具有自身的风险和性能问题。
您可以使用输入数组的函数找到值的第二个实例的行号。双击单元格,使您处于编辑模式,粘贴此公式,然后使用 CRTL-SHIFT-ENTER 确认:
=SMALL(IF('[InsightsDataExport.xlsx]Lead Profile'!$AP1:$AP10000=A1,ROW($A$1:$A$10000),FALSE),2)
此公式的内部部分执行以下操作:
'[InsightsDataExport.xlsx]Lead Profile'!$AP1:$AP10000=A1
根据 AP1:AP10000 中的每个单元格是否与本地 A1 中的值匹配,创建一个 TRUE 和 FALSE 值的数组
ROW($A$1:$A$10000)
创建一个从 1 到 10000 的数字数组,如果单元格匹配 A1,则使用该数组,否则使用 FALSE。因此,如果您要搜索的值在单元格 2 和 5 中找到,则公式的内部部分具有如下数组:
{假,2,假,假,5,假....}
然后,SMALL(array,2) 表示取第二小的数值,这将是第二次匹配的行号,在本例中为 5。
要以慢动作查看它,请在小范围内对其进行测试,然后使用“公式”选项卡中的“评估函数”工具。
现在您有了行号,您可以在实际搜索的列上使用 INDEX:
=INDEX('[InsightsDataExport.xlsx]Lead Profile'!$AR1:$AR10000,rownumber)
然而,这仍然在一个任意大的范围内运行,以确保它包含所有值。由于几个原因,这是一种不好的做法。主要是,它从不保证您包含所有数据;特别是,如果正在删除行,则范围将不断缩小。
如果您使用表格代替,它会更整洁且更易于阅读。
如果您在数据中插入表,则可以改为引用列名。然后,这些函数将仅搜索表中的行数。
在您的数据上,使用插入 > 表格。那么当你创建公式时,如果你选择了表格中某一列的所有数据行,excel会自动插入列名。因此,如果 AP 列有一个名为“ID”的标题,则识别具有第二个匹配 ID 的行的公式变为:
=SMALL(IF(InsightsDataExport.xlsx!Table1[Id]=A1,ROW(InsightsDataExport.xlsx!Table1[Id]),FALSE),2)
然后,您还可以在包含要返回的数据的列上使用 INDEX。请注意,如果您只选择不包括列标题的数据行,那么第 2 行实际上是正在搜索的索引的第一行,因此您需要从行号中减去 1。如果数据位于标题为“金额”的列中,您将使用如下公式:
=INDEX(InsightsDataExport.xlsx!Table1[Amount],rownumber - 1)