在 EXCEL 中将 INDEX MATCH 公式更改为数组公式

Posted

技术标签:

【中文标题】在 EXCEL 中将 INDEX MATCH 公式更改为数组公式【英文标题】:Change INDEX MATCH formula to an array formula in EXCEL 【发布时间】:2016-01-12 15:57:11 【问题描述】:

我正在尝试创建一个INDEX MATCH 公式,该公式搜索包含jpegs 列表的列,并返回所有以特定字符串开头的jpegs 并将它们转换为超链接。

目前我的公式只返回第一个实例,但我希望它返回所有匹配项。

jpeg 列表位于工作簿的 Sheet 2 上的 column F (F1:F1000) 中。搜索中使用的字符串是 column A, sheet 1 中的产品 SKU。

这是我在sheet 1 上的C2 中输入并填写的工作非数组版本:

=IFERROR(
    HYPERLINK(
         CONCATENATE(sku_url,INDEX(Sheet2!$F$1:$F$1000,
             MATCH(A2&"*",Sheet2!$F$1:$F$1000,0),1))),
    "image not found")

这适用于column C,但我怎样才能将这个公式填充到右侧,以便column D 包含每个 sku 的第二个图像,E 包含第三个图像,依此类推。我计划每个 SKU 的图片不超过六张,因此我已将 columns CH 分配给产品图片 URL。如果 SKU 没有六张图片,则这些额外的列应为空。

【问题讨论】:

【参考方案1】:

假设使用 Excel 2010 或更高版本:

=IF(COLUMNS($A:A)>COUNTIF(Sheet2!$F$1:$F$1000,$A2&"*"),"",IFERROR(HYPERLINK(CONCATENATE(sku_url,INDEX(Sheet2!$F:$F,AGGREGATE(15,6,ROW(Sheet2!$F$1:$F$1000)/(LEFT(Sheet2!$F$1:$F$1000,LEN($A2))=$A2),COLUMNS($A:A))))),"imagenotfound"))

作为解释,最初的IF 子句,即:

IF(COLUMNS($A:A)>COUNTIF(Sheet2!$F$1:$F$1000,$A2&"*"),""

很简单:

COUNTIF(Sheet2!$F$1:$F$1000,$A2&"*")

只计算符合条件的总行数,因为:

COLUMNS($A:A)

等于1,向右复制时依次变为:

COLUMNS($A:B)

(等于2)

COLUMNS($A:C)

(等于 3)

等等,等等,这个子句将等价于,在连续的列中:

IF(1>COUNTIF(Sheet2!$F$1:$F$1000,$A2&"*"),""

IF(2>COUNTIF(Sheet2!$F$1:$F$1000,$A2&"*"),""

IF(3>COUNTIF(Sheet2!$F$1:$F$1000,$A2&"*"),""

等等等等,因此在初始子句为TRUE的单元格中将返回一个空白。

唯一需要注意的其他子句是在满足此条件时生成连续行号数组的子句。不幸的是,由于技术原因,上面的COUNTIF 声明不能在我们的AGGREGATE 结构中使用。

幸运的是,我们可以使用 LEFT 的另一个设置来重现 COUNTIF 语句的结果。

暂时将有问题的范围从 F1:F1000 减少到 F1:F10 以帮助解释,这部分:

LEFT(Sheet2!$F$1:$F$10,LEN($A2))=$A2

将简单地为 F1:F10 中的每个条目生成一个布尔数组 TRUE/FALSE 返回该语句的结果。例如,我们可能有:

FALSE;TRUE;FALSE;TRUE;TRUE;FALSE;TRUE;FALSE;TRUE;FALSE

当我们用这个布尔数组对每个条目的等效行号进行交互时,即执行:

ROW(Sheet2!$F$1:$F$10)/(LEFT(Sheet2!$F$1:$F$10,LEN($A2))=$A2)

我们有:

1;2;3;4;5;6;7;8;9;10/FALSE;TRUE;FALSE;TRUE;TRUE;FALSE;TRUE;FALSE;TRUE;FALSE

因为,当被任何合适的数学运算(除法为一)强制转换时,布尔值TRUE/FALSE 会被强制转换为它们的数值等价物(TRUE=1,FALSE=0),以上变为:

#DIV/0!;2;#DIV/0!;4;5;#DIV/0!;7;#DIV/0!;9;#DIV/0!

由于AGGREGATE,第一个参数为 15 被指示查找数组中的最小值,第二个参数为 6 被指示忽略该数组中的任何错误值,剩下的就是设置该函数中的第四个参数,k,用于确定是否应返回第一个最小、第二个最小等值。

再次,通过使用:

COLUMNS($A:A)

对于这个参数,我们知道它会生成一系列连续的整数(1、2、3 等)并复制到右侧,因此我们保证将所需的行号返回给每个版本的公式.

问候

【讨论】:

如果与COUNTIF 核对,您需要IFERROR function 吗? 是的。 OP 专门在 HYPERLINK 函数的结果中包含了 IFERROR。 INDEX 构造的结果可能仍然有效,但在传递给 HYPERLINK 时可能会出错。 谢谢!这很好用。你能解释一下它是如何工作的吗?非常感谢。【参考方案2】:

将AGGREGATE¹ function 与SMALL 子函数一起使用(15)。调整 k 参数以增加COLUMN 的值。

B2 中的标准(非数组)公式是,

=IFERROR(
    HYPERLINK(
        CONCATENATE(sku_url, INDEX(Sheet2!$F:$F,
            AGGREGATE(15, 6, ROW($1:$999)/(LEFT(Sheet2!$F$1:$F$999, LEN($A2))=$A2), COLUMN(A:A))))),
    "image not found")

根据需要填写。

      


¹ AGGREGATE function 是在 Excel 2010 中引入的。它在早期版本中不可用。

【讨论】:

感谢您的详细回复。我来看看 AGGREGATE 和 SMALL 函数。 我突然想到您可能想填写。我已将绝对 $ 锁添加到 ROW($1:$999)

以上是关于在 EXCEL 中将 INDEX MATCH 公式更改为数组公式的主要内容,如果未能解决你的问题,请参考以下文章

如何在表2中设置Excel公式,可以直接引用到表1的对应数据

Excel 技术篇 - 利用Match公式返回匹配的最后一个数据的索引

excel里三组数值交集 公式

MATCH 和 INDEX 返回索引号 2 Excel

在EXCEL如何在同一表格多列名称中查找数据相对应的名称

Excel公式笔记