如何对 EXCEL 中的多行使用 MATCH?
How can I use MATCH for multiple rows in EXCEL?
我想在 EXCEL 中使用类似 MATCH 函数的东西,只是我想在包含多行和多列的 table 中查找一个值。然后函数应该 return 找到的值的列。
为了更好地理解,这里有一张图片:
单元格 K6 中的值为 "Chicken"。我想在范围从 A1:G9 的 table 中查找 "Chicken"。然后我想将单元格 M6 中的值设置为 "Protein Source",因为这是 table A1:G9 中 "Chicken" 的关联值。
目前,在 M6 中有逻辑值 "TRUE",因为我使用 COUNTIF 来查看 "Chicken" 是否在 A1:G9 中。但是我不知道如何把值"Protein Source"取到M6.
如果我不必查找多个 rows/columns,MATCH 至少会找到 column/row 个数字。但是 MATCH 不接受多个 rows/columns.
解决此问题的最佳方法之一是使用 Linq 作为一种搜索方法。
是一个很好的link开始!
另一种方法是手动遍历行和单元格,这是一个缓慢而讨厌的过程并比较值。
我知道您可能想要一个直接的答案来回答您的问题,但我认为您可以通过使用 LINQ 来完成您想要做的事情并保持简单和干净,从而获益更多。
一个简单的 Google 搜索 "Use LINQ for excel" 为您提供了很多方向。
示例链接:
在 Excel 2007 年使用 LINQ
https://msdn.microsoft.com/en-us/library/dd920313(v=office.12).aspx
Video Linq to Excel 以进行数据搜索
https://www.youtube.com/watch?v=_4aNwh7pRxo
=INDEX($A:$G,SUMPRODUCT(COLUMN($A:$G)*($A:$G=K3)))
将它放在 M3 中的鸡肉旁边,您应该可以将其复制下来。
很抱歉,根据您的问题标题,我无法使用 MATCH 执行您想要的操作。但是我可以 return 找到您的项目所在的列号。这个等式的一个主要警告是,无论您在 A2:G9 范围内寻找什么,都只能出现一次!如果它出现不止一次,方程式可能会在您身上爆炸或 return 一个不正确的列,即使没有错误。
通常情况下,索引和匹配可以很好地协同工作。你基本上想做的是:
=Index (header row, MATCH(Item I am looking for, Table of stuff))
所以我所做的就是用 SUMPRODUCT 替换那个想法的匹配部分:
SUMPRODUCT(COLUMN($A:$G)*($A:$G=K3))
基本上,COLUMN 将 return 我们正在查看的一个计算实例的列号,然后在我们进行计算时给出下一个列号。无论该列号是什么,都乘以一个逻辑语句,如果为假则为 0,如果为真则为 1。因此,任何没有我们正在寻找的列号都等于 0,只有具有我们正在寻找的列号才被 returned 因为它乘以 1.
陷阱是如果你不止一次吃鸡肉,你会不止一次得到列号并且它们会被加在一起意味着例如你的豆浆在第 6 列中有两次 returns a 6+6 = 12 的值。问题是我们没有 12 列,所以我们得到一个错误。此外,如果你有两次香蕉,你会有 1+1= 2 并且你会在 Vegetable returned.
的第 2 列中有 header
如果您想实施一些潜在的错误检查,您可以在等式中使用一些 IFERROR 和 ERROR.TYPE。它不会捕获列号中的重复项。你会得到如下结果:
=IFERROR(INDEX($A:$G,SUMPRODUCT(COLUMN($A:$G)*($A:$G=K3))),IF(ERROR.TYPE(INDEX($A:$G,SUMPRODUCT(COLUMN($A:$G)*($A:$G=K3))))=3,"NOT FOUND","MULTIPLE ENTRIES"))
然后结果看起来像这样:
边注
附带说明一下,如果您的 table 不在 A 列中,您需要从列等式中减去一些数字,这样第一列减去幻数就会得到 1...或者您可以这样做以使其更具动态性(这是技术术语,对吗?):
SUMPRODUCT((COLUMN($A:$G)-COLUMN($A)+1)*($A:$G=K3))
如果未找到,INDEX/MATCH function pair that receives its column number from a series of MATCH functions may be suited to a standard formula based solution providing there are a limited number of rows. Each row would be examined with the IFERROR function 将控制传递给下一个 MATCH 语句。
以M6为标准公式,
=INDEX(A:G, IFERROR(MATCH(K6, A:G, 0), IFERROR(MATCH(K6, A:G, 0),
IFERROR(MATCH(K6, A:G, 0), IFERROR(MATCH(K6, A:G, 0),
IFERROR(MATCH(K6, A:G, 0), IFERROR(MATCH(K6, A:G, 0),
IFERROR(MATCH(K6, A:G, 0), MATCH(K6, A:G, 0)))))))))
这种方法似乎适合您的样本数据,但随着食物数据行数的增加,显然有局限性。事实上,在某些时候覆盖列 A:G 而不是行 3:9.
可能更方便
我想在 EXCEL 中使用类似 MATCH 函数的东西,只是我想在包含多行和多列的 table 中查找一个值。然后函数应该 return 找到的值的列。
为了更好地理解,这里有一张图片:
单元格 K6 中的值为 "Chicken"。我想在范围从 A1:G9 的 table 中查找 "Chicken"。然后我想将单元格 M6 中的值设置为 "Protein Source",因为这是 table A1:G9 中 "Chicken" 的关联值。 目前,在 M6 中有逻辑值 "TRUE",因为我使用 COUNTIF 来查看 "Chicken" 是否在 A1:G9 中。但是我不知道如何把值"Protein Source"取到M6.
如果我不必查找多个 rows/columns,MATCH 至少会找到 column/row 个数字。但是 MATCH 不接受多个 rows/columns.
解决此问题的最佳方法之一是使用 Linq 作为一种搜索方法。
是一个很好的link开始!
另一种方法是手动遍历行和单元格,这是一个缓慢而讨厌的过程并比较值。
我知道您可能想要一个直接的答案来回答您的问题,但我认为您可以通过使用 LINQ 来完成您想要做的事情并保持简单和干净,从而获益更多。
一个简单的 Google 搜索 "Use LINQ for excel" 为您提供了很多方向。
示例链接:
在 Excel 2007 年使用 LINQ https://msdn.microsoft.com/en-us/library/dd920313(v=office.12).aspx
Video Linq to Excel 以进行数据搜索 https://www.youtube.com/watch?v=_4aNwh7pRxo
=INDEX($A:$G,SUMPRODUCT(COLUMN($A:$G)*($A:$G=K3)))
将它放在 M3 中的鸡肉旁边,您应该可以将其复制下来。
很抱歉,根据您的问题标题,我无法使用 MATCH 执行您想要的操作。但是我可以 return 找到您的项目所在的列号。这个等式的一个主要警告是,无论您在 A2:G9 范围内寻找什么,都只能出现一次!如果它出现不止一次,方程式可能会在您身上爆炸或 return 一个不正确的列,即使没有错误。
通常情况下,索引和匹配可以很好地协同工作。你基本上想做的是:
=Index (header row, MATCH(Item I am looking for, Table of stuff))
所以我所做的就是用 SUMPRODUCT 替换那个想法的匹配部分:
SUMPRODUCT(COLUMN($A:$G)*($A:$G=K3))
基本上,COLUMN 将 return 我们正在查看的一个计算实例的列号,然后在我们进行计算时给出下一个列号。无论该列号是什么,都乘以一个逻辑语句,如果为假则为 0,如果为真则为 1。因此,任何没有我们正在寻找的列号都等于 0,只有具有我们正在寻找的列号才被 returned 因为它乘以 1.
陷阱是如果你不止一次吃鸡肉,你会不止一次得到列号并且它们会被加在一起意味着例如你的豆浆在第 6 列中有两次 returns a 6+6 = 12 的值。问题是我们没有 12 列,所以我们得到一个错误。此外,如果你有两次香蕉,你会有 1+1= 2 并且你会在 Vegetable returned.
的第 2 列中有 header如果您想实施一些潜在的错误检查,您可以在等式中使用一些 IFERROR 和 ERROR.TYPE。它不会捕获列号中的重复项。你会得到如下结果:
=IFERROR(INDEX($A:$G,SUMPRODUCT(COLUMN($A:$G)*($A:$G=K3))),IF(ERROR.TYPE(INDEX($A:$G,SUMPRODUCT(COLUMN($A:$G)*($A:$G=K3))))=3,"NOT FOUND","MULTIPLE ENTRIES"))
然后结果看起来像这样:
边注
附带说明一下,如果您的 table 不在 A 列中,您需要从列等式中减去一些数字,这样第一列减去幻数就会得到 1...或者您可以这样做以使其更具动态性(这是技术术语,对吗?):
SUMPRODUCT((COLUMN($A:$G)-COLUMN($A)+1)*($A:$G=K3))
如果未找到,INDEX/MATCH function pair that receives its column number from a series of MATCH functions may be suited to a standard formula based solution providing there are a limited number of rows. Each row would be examined with the IFERROR function 将控制传递给下一个 MATCH 语句。
以M6为标准公式,
=INDEX(A:G, IFERROR(MATCH(K6, A:G, 0), IFERROR(MATCH(K6, A:G, 0),
IFERROR(MATCH(K6, A:G, 0), IFERROR(MATCH(K6, A:G, 0),
IFERROR(MATCH(K6, A:G, 0), IFERROR(MATCH(K6, A:G, 0),
IFERROR(MATCH(K6, A:G, 0), MATCH(K6, A:G, 0)))))))))
这种方法似乎适合您的样本数据,但随着食物数据行数的增加,显然有局限性。事实上,在某些时候覆盖列 A:G 而不是行 3:9.
可能更方便