【问题标题】:MATCH and LOOKUP returning unexpected valuesMATCH 和 LOOKUP 返回意外值
【发布时间】:2014-03-26 14:19:22
【问题描述】:

有答案的更新

我误解了MATCHLOOKUP的操作;他们显然不会自动选择最后一个值。

更新后的公式如下:

=IF(
    ISNUMBER( MATCH(2,INDEX(1/($D2=$D$1:$D1),0)) ), 
    ($A2+$B2) - (LOOKUP(2,1/($D2=$D$1:$D1),$A$1:$A1)+LOOKUP(2,1/($D2=$D$1:$D1),$B$1:$B1))
    ,0 )

主要区别在于 MATCH 现在是 MATCH(2,INDEX(1/($D2=$D$1:$D1),0))LOOKUP 现在是 LOOKUP(2,1/($D2=$D$1:$D1),$A$1:$A1)

感谢 barry houdini 和 Nanashi 的帮助!


我正在处理本应是一个简单的电子表格,但我的一个公式给了我意想不到的结果。我的数据截图如下:

![电子表格截图][1]

在C列中,我试图获取具有相同类型的前一个数据点与当前数据点之间的时间差。我的公式(格式为便于阅读,取自 C11 单元格)如下:

=IF(
    NOT( ISNA( MATCH($D11,$D$1:$D10,1) ) ),
    ($A11+$B11)-(
        LOOKUP($D11,$D$1:$D10,$A$1:$A10)+LOOKUP($D11,$D$1:$D10,$B$1:$B10)
    ),FALSE)

相应单元格的单元格编号发生变化——例如,C10 引用 $D10 和范围 $D$1:$D9 等。

  • 条件 (NOT( ISNA( MATCH($D11,$D$1:$D10,1) ) ) 检查以确保在 C 列中存在与当前值相等的先前值;否则返回 FALSE,就像在第 1 行和第 12 行中一样。
  • ($A11+$B11)-(LOOKUP($D11,$D$1:$D10,$A$1:$A10)+LOOKUP($D11,$D$1:$D10,$B$1:$B10) 的计算采用当前行日期和时间,并减去与上一个相同类型实例对应的行中的日期和时间(LOOKUP 函数应该返回最后一次出现的值一个数组,根据文档)。

我的问题是:在第 12 行之后,MATCHLOOKUP 函数都将第 11 行作为 C 列值为 1 的最后一行。我'我试过分别测试它们,两个函数都从第 11 行返回相应的值。例如,将以下公式放入 E16:=MATCH(1,$D$1:$D16,1) 返回 11,而我预计值为 16。

我做错了什么?

【问题讨论】:

  • D11 指的是这个电子表格中的值,在这个电子表格中是 1——我正在 D1:D10 范围内搜索最后一个等于 1 的值。我不相信这是我使用的问题经常使用类似的技术,如果我明确输入 1 而不是 D11,差异仍然存在。
  • 是的,注意到了很多,这就是我的评论不适用的原因。嗯。它看起来在公式上是正确的。我将尝试重新创建您的数据集。 Type 是硬编码的还是有方法的?
  • 您现在的预期输出是什么?例如,在 C17 中,应该显示什么?

标签: excel excel-formula worksheet-function


【解决方案1】:

这里的问题是MATCH 没有编程为返回最新匹配值的索引。也就是说,一个为我们得到这个的公式将解决这个问题。

C2中输入以下公式并向下拖动:

=MOD((B2)-INDEX(B:B,SUMPRODUCT(MAX(($D$1:$D1=D2)*ROW($D$1:$D1)))),1)

分解,这是每个部分的作用:

=SUMPRODUCT(MAX(($D$1:$D1=D2)*ROW($D$1:$D1))) 'Returns the row of the latest match.
=INDEX(B:B, SUMPRODUCT...) 'Returns the matching cell in Column B.
=MOD(B2 - INDEX(...),1) 'Gets the absolute difference, no need to add A and B.

结果:

如果这有帮助,请告诉我们。

编辑:根据 Barry 的更正更改了公式。

【讨论】:

  • 这很有帮助 - 谢谢!我看到的唯一问题是 PM 到 AM 增量计算不正确(我已经用今天早上收集的更多数据更新了上面的图像) - 我想有条件地从 1 中减去计算会起作用;但我会玩它的。
  • 如果您觉得有帮助,请将答案标记为已接受。我认为绝对值无论如何都会正确计算,但如果不是,请调整公式。 :)
  • @Lee - 看看我的答案,第二天会起作用
  • 啊,我明白了。在我的预编辑答案中,我也做了一个A1+B1 之类的答案,但决定改用ABS。哦,好吧。
  • @Nanashi - 很好的答案!....但是 ABS 不起作用,因为例如=ABS("3:00"-"22:00") 在答案需要为 5:00 时给出 19:00 - 你可以通过 =MOD("3:00"-"22:00",1) 得到答案
【解决方案2】:

MATCHLOOKUP 都不会按照您对未排序数据的要求找到“最后一次出现”。为最后一行/匹配尝试这些版本:

=MATCH(2,INDEX(1/($D11=$D$1:$D10),0))

=LOOKUP(2,1/($D11=$D$1:$D10),$B$1:$B10)

....对于您的特定要求,您可以在一个LOOKUP 中同时获取日期和时间,例如

=$A11+$B11-LOOKUP(2,1/($D11=$D$1:$D10),$A$1:$A10+$B$1:$B10)

明确使用 A 列中的日期 - 如果您每天都有数据,因此您始终可以假设日期的变化是到 下一个 天,那么您可以省略日期参考并像这样使用MOD

=MOD($B11-LOOKUP(2,1/($D11=$D$1:$D10),$B$1:$B10),1)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-21
    • 2022-08-13
    • 2020-12-08
    • 2020-06-24
    • 1970-01-01
    • 1970-01-01
    • 2018-07-26
    相关资源
    最近更新 更多