Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何仅使用一个Excell单元格有效地找到一个值与一个表相比的最小正差值?_Excel - Fatal编程技术网

如何仅使用一个Excell单元格有效地找到一个值与一个表相比的最小正差值?

如何仅使用一个Excell单元格有效地找到一个值与一个表相比的最小正差值?,excel,Excel,我希望尽可能避免VBA,并尝试在单个单元格中找到解决方案——如果可能的话。我一直在想办法,但我不知道怎么做 下图总结了逻辑。换句话说,条件是: 在右表的名称列中查找搜索名称 搜索日期必须大于右表中的日期 搜索日期减去日期必须是最小正值 返回与标准匹配的Pay——示例中为500 您可以使用以下数组公式(即,您需要使用Ctrl+Shift+enter输入,如果成功,您将在公式栏中看到大括号): 如果没有早于搜索日期的日期,则公式将返回#N/A 注意:日期必须按升序排序才能生效 编辑:更健壮一点,

我希望尽可能避免VBA,并尝试在单个单元格中找到解决方案——如果可能的话。我一直在想办法,但我不知道怎么做

下图总结了逻辑。换句话说,条件是:

  • 在右表的
    名称
    列中查找
    搜索名称
  • 搜索日期
    必须大于右表中的
    日期
  • 搜索日期
    减去
    日期
    必须是最小正值
  • 返回与标准匹配的
    Pay
    ——示例中为500

  • 您可以使用以下数组公式(即,您需要使用Ctrl+Shift+enter输入,如果成功,您将在公式栏中看到大括号):

    如果没有早于搜索日期的日期,则公式将返回
    #N/A

    注意:日期必须按升序排序才能生效


    编辑:更健壮一点,不需要排序:

    =INDEX(G:G,MATCH(MAX(IF((F:F=B2)*(E:E<A2),E:E)-A2),IF((F:F=B2)*(E:E<A2),E:E)-A2,0))
    

    您可以使用以下数组公式(即,您需要使用Ctrl+Shift+enter输入,如果成功,您将在公式栏中看到大括号):

    如果没有早于搜索日期的日期,则公式将返回
    #N/A

    注意:日期必须按升序排序才能生效


    编辑:更健壮一点,不需要排序:

    =INDEX(G:G,MATCH(MAX(IF((F:F=B2)*(E:E<A2),E:E)-A2),IF((F:F=B2)*(E:E<A2),E:E)-A2,0))
    

    这可以通过SumProduct完成,它不需要Ctrl-Shift-Enter

    =SUMPRODUCT($G$2:$G$9,(A2>$E$2:$E$9)*(MONTH(A2)=MONTH($E$2:$E$9)*($F$2:$F$9=B2)))
    
    逻辑命令搜索日期与日期列在同一个月内

    如果您有新的动态数组函数(当前在Excel 365的Insider Fast build预览版中),则可以使用

    =FILTER($G$2:$G$9,(A2>$E$2:$E$9)*(MONTH(A2)=MONTH($E$2:$E$9)*($F$2:$F$9=B2)))
    

    这可以通过SumProduct完成,它不需要Ctrl-Shift-Enter键

    =SUMPRODUCT($G$2:$G$9,(A2>$E$2:$E$9)*(MONTH(A2)=MONTH($E$2:$E$9)*($F$2:$F$9=B2)))
    
    逻辑命令搜索日期与日期列在同一个月内

    如果您有新的动态数组函数(当前在Excel 365的Insider Fast build预览版中),则可以使用

    =FILTER($G$2:$G$9,(A2>$E$2:$E$9)*(MONTH(A2)=MONTH($E$2:$E$9)*($F$2:$F$9=B2)))
    

    如果我没有弄错
    Match
    ,则返回在表中找到的第一个大于或等于
    A2
    ——这就是为什么需要按升序排序?如果为真,应用程序的问题是它不够灵活,可能会导致错误。它将被用于一个巨大的应用程序中,因此更健壮的东西是首选。有没有办法避免对日期进行排序?@Pherdindy这是正确的(对于
    MATCH
    的非精确匹配)。我添加了一个不需要排序的替代方案(我只是在屏幕截图中对表进行了排序)。嗯,我忘了提到,如果有两行具有相同的名称和日期,那么第一次支付将是结果。这应该不是问题,对吧?因为我确实希望日期和名称都有唯一的行。谢谢,这太好了。从来都不知道数组公式能做多少,所以我们必须阅读它们。是的,我想不出任何两行具有相同名称和日期的实例。对数组公式使用整列引用是一个非常非常糟糕的主意,因为每个整列引用将包含超过一百万行,并且其中许多行会影响电子表格的性能。最好将范围限定为只包含数据的行。是的,数据集越小,速度就越快。幸运的是,编辑范围并不太难。如果我没有弄错的话,
    Match
    ,返回在表中找到的第一个大于或等于
    A2
    ——这就是为什么需要按升序排序?如果为真,应用程序的问题是它不够灵活,可能会导致错误。它将被用于一个巨大的应用程序中,因此更健壮的东西是首选。有没有办法避免对日期进行排序?@Pherdindy这是正确的(对于
    MATCH
    的非精确匹配)。我添加了一个不需要排序的替代方案(我只是在屏幕截图中对表进行了排序)。嗯,我忘了提到,如果有两行具有相同的名称和日期,那么第一次支付将是结果。这应该不是问题,对吧?因为我确实希望日期和名称都有唯一的行。谢谢,这太好了。从来都不知道数组公式能做多少,所以我们必须阅读它们。是的,我想不出任何两行具有相同名称和日期的实例。对数组公式使用整列引用是一个非常非常糟糕的主意,因为每个整列引用将包含超过一百万行,并且其中许多行会影响电子表格的性能。最好将范围限定为只包含数据的行。是的,数据集越小,速度就越快。幸运的是,编辑范围并不难。第三个条件有点奇怪,很难用公式来处理。也许你能换一种说法吗?任何公式都将始终考虑列中的所有值。您的屏幕截图突出显示了找到的值的路径,但第三个条件在第一个条件(即Name=John)的上下文中显示,而公式将比较列中的所有值,因此最小正值也将包括Michael的行,整个过程将结束。搜索日期的月份可以用来限制查找日期吗?@teylyn我不太确定我是否理解,但我得到的是第三个条件,以公式形式,将不关心第一个条件,仍然包括Michael的数字?我认为,如果公式是以嵌套循环的方式创建的,那么应该考虑它。至于搜索d