【问题标题】:How can I use MATCH for multiple rows in EXCEL?如何在 EXCEL 中对多行使用 MATCH?
【发布时间】:2016-05-07 18:21:46
【问题描述】:

我想在 EXCEL 中使用 MATCH 函数之类的东西,只是我想在包含多行和多列的表中查找一个值。然后该函数应返回找到的值所在的列。

为了便于理解,放一张图:

在单元格 K6 中,值为“鸡”。我想在 A1:G9 范围内的表中查找“鸡”。然后我想将单元格 M6 中的值设置为“Protein Source”,因为这是表 A1:G9 中“Chicken”的关联值。 目前,M6 中存在逻辑值“TRUE”,因为我使用 COUNTIF 来查看“Chicken”是否在 A1:G9 中。但我不知道如何将值“Protein Source”转换为 M6。

如果我不必查找多个行/列,MATCH 至少会找到列/行号。但 MATCH 不接受多行/多列。

【问题讨论】:

  • 您还需要参考表中的唯一数据。你喝了两次豆浆。谢天谢地,它们都在同一列下,但如果它在不同的列中,你如何确定哪一列是正确的答案
  • @Forward Ed:豆浆两次是无意的,是错误的。谢谢,我把第二个豆浆去掉了!
  • @ForwardEd - 由于地狱没有希望,我要重新输入图像中的样本数据,我实际上错过了那个重复!
  • @Jeeped 我知道您的意思以及您通过屏幕截图与示例数据获得的信息。在我重新输入整个内容之前,我只是碰巧抓住了它!想知道有多少其他人重新输入了它?您是否知道是否正在采取行动添加一项允许您将粘贴表复制到问题/答案中的功能?
  • @ForwardEd - 不知道这是否是开玩笑的回应,但将数据直接从 Excel 复制到代码块中非常简单。如果一个问题的 OP 不能把它做对,许多编辑经验丰富的用户(包括我自己)会花时间正确格式化它,以便每个人都有有效的示例数据。

标签: excel match multiple-columns


【解决方案1】:
=INDEX($A$1:$G$1,SUMPRODUCT(COLUMN($A$2:$G$9)*($A$2:$G$9=K3)))

把它放在M3鸡旁边,你应该可以把它复制下来。

很抱歉,但根据您的问题标题,我无法用 MATCH 做您想做的事情。但是我可以返回找到您的项目的列号。这个等式的一个主要警告是,您在 A2:G9 范围内寻找的任何东西都只能出现一次!如果它出现不止一次,即使没有错误,方程式也可能会炸毁您或返回不正确的列。

通常索引和匹配可以很好地协同工作。你试图基本上做:

=Index (header row, MATCH(Item I am looking for, Table of stuff))

所以我所做的就是用 SUMPRODUCT 替换该想法的 Match 部分:

SUMPRODUCT(COLUMN($A$2:$G$9)*($A$2:$G$9=K3))

基本上,COLUMN 将返回我们正在查看的一个计算实例的列号,然后在我们完成计算时给出下一个列号。无论该列号是什么,乘以一个逻辑语句,如果为假,则为 0,如果为真,则为 1。因此,任何没有我们要查找的列号都等于 0,并且只返回具有我们要查找的列号,因为它乘以 1。

陷阱是,如果您不止一次吃鸡肉,您将获得不止一次的列号,它们将被加在一起,这意味着例如您的豆浆在第 6 列中有两次返回值 6+6 = 12. 问题是我们没有 12 列,所以我们得到一个错误。此外,如果您有两次 Banana,您将获得 1+1= 2,并且您将返回蔬菜第 2 列中的标题。

如果您想实现一些潜在的错误检查,您可以在等式中使用一些 IFERROR 和 ERROR.TYPE。它不会捕获列号中的重复项。你会得到如下结果:

=IFERROR(INDEX($A$1:$G$1,SUMPRODUCT(COLUMN($A$2:$G$8)*($A$2:$G$8=K3))),IF(ERROR.TYPE(INDEX($A$1:$G$1,SUMPRODUCT(COLUMN($A$2:$G$8)*($A$2:$G$8=K3))))=3,"NOT FOUND","MULTIPLE ENTRIES"))

然后结果看起来像这样:

旁注

附带说明,如果您的表不在 A 列中,则您需要从列方程中减去一些数字,以便第一列减去幻数会​​得到 1...或者您可以这样做使其更具动态性(这是技术术语吗?):

SUMPRODUCT((COLUMN($A$2:$G$9)-COLUMN($A$2)+1)*($A$2:$G$9=K3))

【讨论】:

  • 显然不是僵尸友好的菜单(尽管我们可能会从“缺乏大脑”中推断出其他含义)..
  • 非常感谢!并感谢您的详细解释,这对理解公式很有帮助:)
【解决方案2】:

如果行数有限,从一系列MATCH functions 接收其列号的INDEX/MATCH 函数对可能适合基于标准公式的解决方案。如果未找到每一行,将使用 IFERROR function 将控制权传递给下一个 MATCH 语句来检查它。

在M6中作为标准公式,

=INDEX(A$2:G$2, IFERROR(MATCH(K6, A$3:G$3, 0), IFERROR(MATCH(K6, A$4:G$4, 0),
                IFERROR(MATCH(K6, A$5:G$5, 0), IFERROR(MATCH(K6, A$6:G$6, 0),
                IFERROR(MATCH(K6, A$7:G$7, 0), IFERROR(MATCH(K6, A$8:G$8, 0),
                IFERROR(MATCH(K6, A$9:G$9, 0), MATCH(K6, A$10:G$10, 0)))))))))

 

这种方法似乎适合您的样本数据,但随着食品数据行数的增加,显然存在局限性。事实上,在某些时候,覆盖 A:G 列而不是 3:9 行可能更合适。

【讨论】:

    【解决方案3】:

    解决此问题的最佳方法之一是使用 Linq 作为一种搜索方法。

    是一个很好的开始链接!

    另一种方法是手动循环遍历行和单元格,这是一个缓慢而讨厌的过程并比较值。

    我知道您可能想直接回答您的问题,但我认为通过使用 LINQ 来完成您想做的事情并保持简单和干净,您会受益更多。

    “使用 LINQ for excel”的简单 Google 搜索为您提供了许多方向。

    示例链接:

    在 Excel 2007 中使用 LINQ https://msdn.microsoft.com/en-us/library/dd920313(v=office.12).aspx

    用于数据搜索的视频 Linq to Excel https://www.youtube.com/watch?v=_4aNwh7pRxo

    【讨论】:

    • SO 上通常不赞成仅链接的答案。提供包含文章内容的叙述,并使用链接指向辅助信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-30
    • 2017-11-24
    相关资源
    最近更新 更多