【问题标题】:Is there a 2 Value Look up function in MS Excel that can perform the following?MS Excel 中是否有可以执行以下操作的 2 值查找功能?
【发布时间】:2015-11-02 10:08:47
【问题描述】:

我为此发疯了。这似乎很简单,但我无法弄清楚。我有两个工作表。第一个工作表是我的数据。其次就像一个答案键。经检查,Sheet 1 中的 A1:B1 与 SHEET 2 中第 52 行的条件匹配,因此 C 列中的值为“MGC”。执行此功能的公式是什么?没有数据真的很难解释,所以我粘贴了示例电子表格的链接。非常感谢您。

此处的电子表格示例。 https://docs.google.com/spreadsheets/d/1_AjuNfCdGfEM-XkqPa6W4hSIxQg4NM2Vg4c2C1pQ_vQ/edit?usp=sharing

截图在这里。 (不让我发帖,我没有名声)

【问题讨论】:

  • 你知道在第 16 行,你也有“delctchy”作为“reported”?有没有可能让你失望?
  • 如果您上传的是电子表格的图片而不是电子表格本身,可能会有更多人查看它。即使是 imgur.com 等图像共享网站的链接也可以使用。
  • 您好,很遗憾,该网站不允许我上传图片。抱歉,我是新来的。
  • 嗨@DaveRGP,第 16 行中的值是错误的并且报告了,而正在查找的值是错误的并且未报告,因此它应该返回第 52 行中的 C 列值。谢谢...跨度>
  • 另外,欢迎来到 SO,请参阅本指南以提出问题:stackoverflow.com/help/how-to-ask 如果我的回答有效,请记住“接受”它!

标签: excel match formula


【解决方案1】:

index(match()) 怎么样?如果我理解正确,您需要匹配第一张表中的 A 和 B 列,检查表 2 上 B 和 C 中的相关值,以将工作表 2 列 a 重新运行到工作表 1 列 c。

第三版试试:

=INDEX(Sheet2!$C$1:$C$360,MATCH(Sheet1!A1&Sheet1!B1,Sheet2!$B$1:$B$360&Sheet2!$C$1:$C$360,0))

基本上这样做是使用连接,& 运算符,指定您在工作表 1 中查找“Criteria A”和“Criteria B”,这使得提供的字符串“Criteria A Criteria B”在 match 函数的第一部分。 在第二个中,它说将它与我在工作表 2 中的所有变量进行匹配,方法与连接方式相同。 匹配函数 (0) 的最后一部分指定您想要一个“精确”匹配

然后它提供 this 作为对 index 函数的引用,然后找到与所需值相交的行并返回。

https://support.microsoft.com/en-us/kb/59482 此处所述,这是一个数组公式,因此它的行为不同,并且必须以不同的方式输入。 https://support.office.com/en-za/article/Guidelines-and-examples-of-array-formulas-7d94a64e-3ff3-4686-9372-ecfd5caa57c7

【讨论】:

  • 一个简单的索引/匹配组合在这里不起作用,因为要检查 2 个变量。
  • 两个变量是很有可能的,这里记录了:support.microsoft.com/en-us/kb/59482
  • @VeeEss,您可能不得不在此处修改确切的引用。我基本上是通过逻辑完成的,但实际上并没有在你的工作表中实现它。确保您理解 ! 表示不同的工作表和 $ 以确保公式在您复制时不会在某些地方发生变化。
  • 谢谢@DaveRGP,我更正了范围值并得到#VALUE!错误。
  • 首先,我意识到我在从记忆中操作如何引用表格时犯了一个错误,其次,请用您正在使用的excel版本更新问题:)
【解决方案2】:

在没有 VBA 的情况下,有(至少)两种方法可以做到这一点。

使用排序列表

第一个假设是您的数据可以重新排序,因此“未报告”的所有内容都在顶部,而“报告”的所有内容都在其下方(反之亦然)。假设是这种情况(并且似乎已经像这样排序),我们将使用函数 OFFSET 创建一个新范围,该范围仅显示与“未报告”或“已报告”一致的值。

Offset 将给定的引用指向工作表上的某个点,然后向下/向上和向左/向右移动以查看要返回的引用。然后,它返回给定高度和给定宽度的一系列单元格。在这里,我们将要从左上角的 Sheet2 开始,向下移动直到找到“未报告”或“已报告”一词。一旦找到该术语,我们将要向右移动一列(从工作表 2 中拉出 B 列),然后将“高度”设置为与“未报告”或“报告”单元格一样多的行。这将在第 1 页的 A1 中如下所示,复制下来:

=OFFSET(Sheet2!$A$1,MATCH(A1,Sheet2!A:A,0)-1,1,COUNTIF(Sheet2!A:A,A1),1)

这表示:首先,从 sheet2 上的单元格 A1 开始。然后在 A1 中找到该术语(“未报告”或“报告”,在 sheet2!A:A 上(我们减去 1,因为偏移量从 A1 开始 - 所以如果您的数据从 A1 开始,我们实际上需要保持在“0”。如果您在 sheet2 上有标题,您将不需要这个 -1)。然后,向右移动 1 列。向下行的次数与 Sheet2 A 列在 Sheet1 A1 中找到的术语一样多。保持 1 列宽。一起,这将在 sheet2 上留下一个范围,显示 B 列的整个长度,A 列与 sheet1 A1 中的术语匹配。

现在我们需要获取该偏移量,并使用它来找出 Sheet1 B1 中的术语何时与 Sheet2 列 B 匹配。这将按如下方式工作:

=MATCH(B1,[FORMULA ABOVE],0)

这显示了向下的行数,从上面创建的特殊 OFFSET 数组开始,B1 中的术语与 sheet2 中的 B 列匹配。要使用此信息从工作表 2 的 C 列中提取结果,我们可以使用 INDEX 函数,如下所示:

=INDEX([FORMULA ABOVE],MATCH(B1,[FORMULA ABOVE],0))

因为这在单个单元格中会相当复杂,我们可以通过使用 VLOOKUP 来简化它,它只需要一次输入 OFFSET 函数。这将按如下方式工作:

=VLOOKUP(B1,[FORMULA ABOVE],2,0)

这采用上面的 OFFSET 公式,在 B1 中找到匹配项,然后移动到第 2 列以获取 sheet2 中 C 列的值。因为我们要使用 VLOOKUP,所以需要调整上面的偏移量公式以提供 2 列数据而不是 1 列。加起来如下所示:

表格 1、C1 和复制下来的最终公式

=VLOOKUP(B1,OFFSET(Sheet2!$A$1,MATCH(A1,Sheet2!A:A,0)-1,1,COUNTIF(Sheet2!A:A,A1),2),2,0)

使用数组公式的选项

仅当您的数据已排序以便 REPORTED 和 UNREPORTED 行组合在一起时,上述方法才有效。如果它们无法排序,您可以使用 ARRAY FORMULA,它本质上采用通常适用于单个单元格的公式,并在整个单元格范围内运行它。它返回一个结果数组,必须将其缩减为单个值。一个基本的数组公式如下所示[假设此示例 A1 = 1, A2 = 2...A5 = 5]:

=IF(A1:A5>3,A1:A5,"")

按 CTRL + SHIFT + ENTER 确认此(以及所有数组函数),而不仅仅是 ENTER。这会查看 A1:A5 中的每个单元格,如果值大于 3,则给出该单元格中的数字 - 否则,它返回“”。在这种情况下,结果将是数组 {"";"";"";4;5}。要获得单个总数 9,请将其包装在 SUM 函数中:

=SUM(IF(A1:A5>3,A1:A5,""))

在您的情况下,我们需要使用数组公式来查看 Sheet2 中的哪一行与 Sheet1 中的 A1 和 Sheet1 中的 B1 匹配。这将如下所示:

=IF(Sheet2!$A$1:A$100=A1,IF(Sheet2!$B$1:$B$100,ROW($B$1:$B$100),""),"")

这会检查工作表 2 中 A 列中的哪些行与 A1 匹配。对于那些这样做的,它然后检查表 2 中 B 列中的哪些行与 B1 匹配。对于那些,它从该匹配中提取行号。其他一切都返回“”。假设没有重复,应该只返回 1 个行号。要从结果数组中提取该数字,请将整个内容包装在 MATCH 函数中。现在您有了行号,您可以使用 INDEX 函数将 C 列中的结果与该行一起提取,如下所示:

最终数组公式方法

=INDEX($C$1:$C$100,MAX(IF(Sheet2!$A$1:A$100=A1,IF(Sheet2!$B$1:$B$100,ROW(Sheet2!$B$1:$B$100),""),"")))

当您键入此公式时,请记住使用 CTRL + SHIFT + ENTER 而不是 ENTER 来确认。请注意,我没有引用所有 Sheet2!A:A,因为数组公式在大范围内运行非常缓慢。

【讨论】:

    【解决方案3】:

    在 Sheet2 中,在 A 列前面插入一列,并将公式放入 A2 =C2&D2。 然后在 Sheet1 中,单元格 C2 中公式=vlookup(A2&B2,Sheet2!A:B,2,0)

    第一个创建要查找的连接键,然后第二个查找该键。

    【讨论】:

    • @VeeEss 老实说,这可能是您最好的方法,因为它最简单。如果您不熟悉数组公式/VBA,可以使用辅助列。
    • 是的。但是,请记住,vlookup 并不可靠。如果您的专栏组织发生变化,这将会中断,因此我更喜欢index(match())
    • @Grade'Eh'Bacon 这确实有效。我还不熟悉数组。我一直在寻找“自动化”的东西,但执行起来似乎太复杂了。当您知道自己想做什么但无法将其放入代码中时,这会令人沮丧。感谢您的所有帮助。
    • @DaveRGP 也谢谢你。我现在真的需要一个快速的解决方案,因为我需要提交这个项目......谢谢你的想法。
    • @VeeEss 老实说,对于工作场所项目,使用这样的辅助列更容易解释/查看,并且使用数组公式有很多缺点,比如如果有人编辑你的公式并按 TAB/ENTER,它将消除“阵列”的影响。正如 Dave 提到的,您可以通过说 =INDEX(Sheet2!D:D,MATCH(C2&D2,Sheet2!A:A,0)) 将其替换为 Index/Match
    【解决方案4】:

    以下公式无需对数据表进行任何更改即可工作。

    =INDEX(Sheet2!$A$1:$A$360,MATCH(Sheet1!A1,IF(Sheet2!$C$1:$C$360=Sheet1!B1,Sheet2!$B$1:$B$360),0))
    

    请记住将此公式保存为带有CTRL+SHIFT+ENTER的数组

    有关如何针对多个条件使用INDEXMATCH 的文档可在Microsoft Support 上找到。

    【讨论】:

    • 谢谢。我复制并粘贴了这个,它起作用了!我仍然不理解数组,所以如果这搞砸了,我将无法修复它。哈哈
    • 嗯,数组函数通常在一个范围内运行,而不是在单个单元格上运行。您在这里注意到的是,IF 语句正在检查将其与值匹配的可能性范围。
    【解决方案5】:

    不清楚你想对没有对应匹配的倍数做什么。 txed 在 Sheet1 中两次被列为未报告; kntyctap 三次被列为未报告。 Sheet2 上只有一个对应的匹配项。

    多个条件匹配的非数组标准公式

    对于 Excel 2010 及更高版本,请在 Sheet1!C1 中使用此标准公式:

    =IFERROR(INDEX(Sheet2!$A$1:$A$999,AGGREGATE(15,6,ROW(1:999)/((Sheet2!$B$1:$B$999=A2)*(Sheet2!$C$1:$C$999=B1)), COUNTIFS(A$1:A1, A1, B$1:B1, B1))), "")
    

    对于 2010 之前的 Excel 版本,请在 Sheet1!C1 中使用此标准公式:

    =IFERROR(INDEX(Sheet2!$A$1:$A$999, SMALL(INDEX(ROW($1:$999)+((Sheet2!$B$1:$B$999<>A1)+(Sheet2!$C$1:$C$999<>B1))*1E+99, , ), COUNTIFS(A$1:A1, A1, B$1:B1, B1))), "")
    

    我已经在后一个公式中处理了 IFERROR function 的错误。 Excel 2003 及更早版本可能必须使用IF(ISERROR(..., ...)) 组合。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多