1

好的,在我拔头发之前我需要一些帮助:P

我最终想要做的是找到第二个 vlookup 值。基本设计是 1. 使用 MATCH 公式查找值行号 2. 然后使用 INDIRECT 公式将表格数组从原始 VLOOKUP 下移一位

听起来很简单。我已经让它在一个工作簿中完美地工作,但我的 VLOOKUP 需要在第二个工作簿中找到值。

在我的脑海中,下面的公式应该有效,但显然不是。

=VLOOKUP(A1,'[InsightsDataExport.xlsx]Lead Profile'!(INDIRECT("AP"&(((MATCH(A1,'[InsightsDataExport.xlsx]Lead Profile'!$AP:$AP,0))+1))):AR10000,2,FALSE)

所以我的虽然是

  1. 查看工作簿 1 A1 单元格
  2. 工作簿 2(又名 InsightsDataExport)中的表数组
  3. INDIRECT 将列“AP”与行号配对。使用 MATCH 公式找到行号以在工作簿 2 AP 列中查找 A1 值表单工作簿 1 的第一次出现,然后加 1(因此表数组在第一次出现之后开始)

我只是在这里转来转去。如果有人能指出我正确的方向,那将不胜感激。

4

1 回答 1

2

我宁愿向您展示一种更清洁的方法,而不是试图修复您的公式。

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)
于 2017-02-01T06:51:53.917 回答