带有 INDIRECT/MATCH 数组的外部工作簿 VLOOKUP

External workbook VLOOKUP with an INDIRECT/MATCH array

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

我最终想做的是找到第二个vlookup 值。基本设计是 1. 使用 MATCH 公式查找值行号 2.然后使用INDIRECT公式将table数组从原来的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. Table 工作簿 2 中的数组(又名 InsightsDataExport)
  3. INDIRECT 将列 "AP" 与行号配对。使用 MATCH 公式找到行号,以查找工作簿 2 AP 列中工作簿 1 中 A1 值的第一次出现,然后加 1(因此 table 数组在第一次出现后开始)

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

与其尝试修改您的公式,不如向您展示一种更简洁的方法。

INDIRECT 是一个功能强大但不稳定的函数,它总是会随着工作簿中的每次更改而重新计算。如果您在整个专栏中使用它,它会极大地降低您的工作簿的速度。您还需要搜索一个任意大的区域,该区域有其自身的风险和性能问题。

您可以使用 array-entered 函数找到值的第二个实例的行号。双击单元格,进入编辑模式,粘贴此公式,然后使用 CRTL-SHIFT-ENTER:

确认
=SMALL(IF('[InsightsDataExport.xlsx]Lead Profile'!$AP1:$AP10000=A1,ROW($A:$A000),FALSE),2)

此公式的内部部分执行以下操作:

'[InsightsDataExport.xlsx]Lead Profile'!$AP1:$AP10000=A1

根据 AP1:AP10000 中的每个单元格是否与本地 A1

中的值匹配,创建一个 TRUE 和 FALSE 值数组
ROW($A:$A000)

创建一个从 1 到 10000 的数字数组,如果单元格匹配 A1,则使用该数组,否则使用 FALSE。因此,如果您要搜索的值在单元格 2 和 5 中找到,则公式的内部部分有一个数组,如:

{错误,2,错误,错误,5,错误....}

然后,SMALL(array,2) 表示取第二个最小的数值,这将是第二个匹配项的行号,在本例中为 5.

要以慢动作查看它,请在小范围内对其进行测试,然后使用“公式”选项卡中的“评估函数”工具。

现在您有了行号,您可以在实际搜索的列上使用索引:

=INDEX('[InsightsDataExport.xlsx]Lead Profile'!$AR1:$AR10000,rownumber)

但是,这仍然在任意大的范围内运行,以确保它包含所有值。由于多种原因,这是一种糟糕的做法。主要是,它从不保证您包含所有数据;特别是,如果行被删除,范围将不断缩小。

如果您改用 tables,它会更整洁、更容易阅读。

如果您在数据中插入 table,则可以改为引用列名。然后,函数将仅搜索 table.

中的行数

在您的数据上,使用插入 > Table。然后当你创建公式时,如果你select所有数据行中的一列在table,excel会自动插入列名。因此,如果 AP 列的标题名为 "ID",则用于标识具有第二个匹配 ID 的行的公式变为:

=SMALL(IF(InsightsDataExport.xlsx!Table1[Id]=A1,ROW(InsightsDataExport.xlsx!Table1[Id]),FALSE),2)

然后您还可以在包含您想要的数据的列上使用 INDEX return。请注意,如果您只 select 不包括列标题的数据行,那么第 2 行实际上是要搜索的索引的第一行,因此您需要从行号中减去 1。如果数据位于标题为 "Amount" 的列中,您将使用如下公式:

=INDEX(InsightsDataExport.xlsx!Table1[Amount],rownumber - 1)