Excel INDEX MATCH检查多列


6

我本质上试图解决的问题是一个VLOOKUP,它检查列A:E的值,并返回列F中保存的值,如果在任何这些中找到它。

由于VLOOKUP没有完成任务,我已经研究了INDEX-MATCH语法,但是我很难理解如何为一个值数组完成此操作,而不是单个列。我在下面构建了一个示例数据集来尝试解释这个:

A------B------C------D------E------F

1------2------3------4------5------Apple

12-----13--------------------------Banana

14---------------------------------Carrot

如果被检查的单元格包含1,2,3,4或5,则公式的结果应该是Apple。如果它是12或13,它应该返回香蕉,最后如果它包含14,它应该返回胡萝卜。

对此的后半部分来自这样一个事实,即被引用的单元格不是单个值,而是一个完整的表本身。因此,该搜索将根据不同的值完成很多次。

因此,为了演示,在其他地方(如下所示)中有另一个表具有这些值。我试图让系统识别哪一行,以及哪个“Apple,Banana,Carrot”值与每列相关联。该表如下所示

^ h ------我------------

1 ------(苹果)----

2 ------(苹果)----

12 -----(香蕉) -

等等。 - - - - - - - - -

括号中的值是公式计算这些值的位置。

Answers:


4

你有很多不同的案例。让我们考虑一个案例:

列中的某个地方 一个 通过 Ë 有一个且只有一个包含13的单元格,在列中返回单元格的内容 F 在同一行。

我们将使用“帮助”列。在 G1 输入:

=COUNTIF(A1:E1,13)

并复制下来。这允许我们识别行:

enter image description here
现在我们可以使用了 MATCH()/ INDEX()

选择一个单元格并输入:

=INDEX(F:F,MATCH(1,G:G,0))

enter image description here

如果“规则”发生变化并且连续可能有多个13或包含13的多行,我们将修改辅助列。

编辑#1:

根据您的更新,第一步是拉硬编码 13 在“帮助者”列中的公式中,并将其放在自己的单元格中, (说 H1 。然后,您只需更改单个单元格即可运行不同的案例。

如果表中有大量案例,则可以创建一个宏来设置每个案例 (更新 H1 并记录结果。


谢谢你的建议。现在我看到了你的回答,我觉得我原来的问题对于我想要解决的具体情况不够详细。我将编辑原始帖子以更准确地表示现在的问题。
Richard Allan

@RichardAllan 好。 ...............我们可以 “增长” 答案
Gary's Student

我自己一直在努力工作,没有运气 - 所以在底部添加了一个简短的段落。如果我能找到一种上传文件的方法,我可以更准确地证明问题......
Richard Allan

我只想到每条线都有5个隐藏的“MATCH”公式,每个公式都找到一个INDEX的行参考来拉出正确的值。
Richard Allan

@RichardAllan好主意! ................也看到我的 编辑#1
Gary's Student

2

基于我自己的研究和与@ Gary'sStudent的讨论,我使用的解决方案是为每个可能包含的值的列创建一个MATCH公式,以及一个Blank catch“IFERROR”语句。

I1 =IFERROR(MATCH($H1,A$1:A$3,0),"")     
J1 =IFERROR(MATCH($H1,B$1:B$3,0),"")     
K1 =IFERROR(MATCH($H1,C$1:C$3,0),"")    
L1 =IFERROR(MATCH($H1,D$1:D$3,0),"")    
M1 =IFERROR(MATCH($H1,E$1:E$3,0),"")
etc.

现在可以隐藏这些列以防止用户混淆/交互。

然后,我创建了一个索引,将这些索引累积为单个值,该值应与所讨论的ROW匹配。同样,如果在表中找不到该值,则会有一个检查(第一个SUM)将其作为空值输入。

N1 =IF(SUM(I1:M1)=0,"",INDEX($A$1:$F$3,SUM(I1:M1),6))

INDEX-MATCH ARRAY 最后,我输入了一些条件格式公式,以确保用户识别并替换/删除任何重复数据。

A1:E3 Cell contains a blank value                [Formatting None Set, Stop if True]
A1:E3 =COUNTIF($A$1:$E$3,A1)>1                   [Formatting Text:White, Background:Red]

H1:N1 =COUNTIF($A$1:$E$3,H1)>1       [Formatting Text:Red, Background:Red]

这仅仅是用户删除此重复数据的提示。

enter image description here


尝试这个非数组公式,它将你的组合成一个公式,并通过查找具有该数字的第一行来处理重复项; =IFERROR(INDEX($F$1:$F$3,MIN(IFERROR(MATCH($H1,A$1:A$3,0),9999),IFERROR(MATCH($H1,B$1:B$3,0),9999),IFERROR(MATCH($H1,C$1:C$3,0),9999),IFERROR(MATCH($H1,D$1:D$3,0),9999),IFERROR(MATCH($H1,E$1:E$3,0),9999))),"")
Scott Craner

如果你曾经超过9999行,那么你需要增加这个数字,我只是不想输入 1050000 5次,但如果你这样做,那将允许你使用完整的列引用。
Scott Craner

1
以下是完整的列参考公式: =IFERROR(INDEX(F:F,MIN(IFERROR(MATCH($H1,A:A,0),1050000),IFERROR(MATCH($H1,B:B,0),1050000),IFERROR(MATCH($H1,C:C,0),1050000),IFERROR(MATCH($H1,D:D,0),1050000),IFERROR(MATCH($H1,E:E,0),1050000))),"")
Scott Craner

我编辑了我的答案。
Scott Craner

看起来你的公式很好地将这些组合在一起 - 很难判断它加速的程度,因为它在这个阶段似乎大致相当。但是,不需要我的数组值。
Richard Allan

1

对于H1中的单个公式:

=INDEX($F$1:INDEX(F:F,MATCH("ZZZ",F:F)),AGGREGATE(15,6,ROW($A$1:INDEX(E:E,MATCH("ZZZ",F:F)))/($A$1:INDEX(E:E,MATCH("ZZZ",F:F))=H1),1))

这是一个数组公式,因此我们需要将引用限制在数据集的大小。一切 INDEX(E:E,MATCH("ZZZ",F:F)) 去做。这将返回F列中包含文本的最后一行。然后它将其设置为要迭代的最后一行。

@ Gary'sStudent方法避免了Array公式,可能是所需的方法。随着数据集和公式数量的增加,计算时间也会增加。甚至在某些时候,Excel崩溃了。通常这需要几千,但我想发出警告。

enter image description here


编辑

要避免使用数组公式,仍然是一个公式:

=IFERROR(INDEX(F:F,MIN(IFERROR(MATCH($H1,A:A,0),1050000),IFERROR(MATCH($H1,B:B,‌​0),1050000),IFERROR(MATCH($H1,C:C,0),1050000),IFERROR(MATCH($H1,D:D,0),1050000),I‌​FERROR(MATCH($H1,E:E,0),1050000))),"")

这是基于OP的答案,只是将该方法合并到一个公式中。

此公式将忽略重复的条目并返回找到该数字的第一行。

并且因为它是非数组的完整列引用对计算时间没有不利影响。

![enter image description here


好点子!在........... “帮手” 列方法避免了volatile函数和数组公式,但是要获取所有列 H 值,我需要8个辅助列! ................您的方法适用于列中的情况 F 不是太长和列 H 长。
Gary's Student

虽然我刚刚用我正在使用的内容更新了这个问题,但它对图表的效率产生了影响 - 我不得不将其作为我的两个数据集(A1:A3& H1:I7等价物)转移到单独的工作簿中在你的答案)目前确实进入成千上万。处理后你的回答会更有效吗?
Richard Allan

1
@RichardAllan尝试看看,我会测试两者,看看哪个更快。老实说,我相信,如果超过10,000,你的答案会更快。但我不知道。
Scott Craner

好的 - 尝试了两次,看起来你是对的 - 记录的数量少于3,000,看来我的例子在我的情况下效果更好。但是,使用较大的数据集可能会更好地工作
Richard Allan

0

一种不同的方法将基于一个辅助表,它代表了这个“应该”首先如何构建的方式。这样可以避免后来调试和更改烦人的怪物方程式,并且能够干净地解决不同数量的列,这与拥有5个查找列的想法不同。

如果以上是在Sheet1中,添加Sheet2。在那个地方有四列;行,列,ID,名称

公式 Row 应该是(在psuedo代码中,“Last”表示“对于sheet2中的上一行”)

=IF(Column = 1, Last row + 1 , Last row)

公式 Column

=IF(OR(Last Column = 5; INDEX(StartTable, last row, last column + 1) = ""), 1, Last column+1)

公式 IDName

=INDEX(StartTable, Row, Column)    
=INDEX(NameColumn, Row, 1)

然后你把它填满(基本上直到 row >原始表中的行数)。

最后,您将新表与普通的vlookup或索引/匹配一起使用。

PRO:更简单的公式,更易于使用和理解。

缺点:需要额外的表,必须保持表的长度。性能方面存在风险,因为这几乎需要单个线程来处理整个“字符串”值。

此外,如果有几个错误行是可以的,代码可以稍微简单并且可能更高效,我们可以假设列数总是5,同时给出行和列。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.