在D列(结果)中,我想具有以下公式。
对于C列中的每个单元格,请在B列中找到比C列的单元格的值高的第一个值(从同一行开始),并给出在A列中找到的值之间的差(计数)作为输出
示例:
C2中的值是40。B的第一个单元格的值大于40是B6。因此D2需要A6.value - A2.value = 5 - 1 = 4
。
可以在不使用VBA的情况下完成吗?
答案 0 :(得分:4)
可以很容易地通过数组公式来完成(因此您必须使用 Ctrl + Shift + Enter 输入公式):< br />
{=MATCH(TRUE;IF(B2:$B$7>C2;TRUE;FALSE);0)-1}
将此公式放在单元格D2中,然后向下拖动。您只需更改数据集的末尾(将$ B $ 7更改为包含数据的列的最后一个单元格)
公式的工作原理如下:
IF
语句将生成一个具有满足您的条件的TRUE / FALSE值的数组:{FALSE;FALSE;FALSE;FALSE;TRUE;FALSE}
MATCH
(使用0开关)在数组中搜索第一个匹配项的索引,在本例中为 5 因此,尽管您必须将其作为数组公式输入(如果没有ctrl + shift + enter,将出现N/A
错误),但结果只是一个数字。
另外,根据您的数据集,如果未找到匹配项,您可能需要添加一些错误处理,例如仅使用问题中的示例数据集,单元格D5中的结果将为N/A
,因此您必须确定在这种情况下希望结果为什么值。
最后,我没有使用列A中的值,因为我认为这只是一个顺序的递增计数器。如果不是这种情况,并且您特别想查找该列中相应值之间的差异,则可以在其他答案之一中使用Foxfire ...提到的变体:=MIN(IF(B2:$B$6>C2;A2:$A$6))-A2
答案 1 :(得分:1)
对彼得·K(Peter K.)的建议进行了稍微调整和缩短的答案 在D2中:
^(=.*){2}.$
使用ctrl + shift + enter输入公式
答案 2 :(得分:0)
类似的事情应该对您有用。首先将您的范围转换为表格。
=IFERROR(AGGREGATE(15,6,--([@Second]<[First])*(ROW([@Second])<=ROW([First]))/--([@Second]<[First]*(ROW([@Second])<=ROW([First])))*[Count],1) - [@Count],"")
在此公式中,[second]和[First]之间的比较从同一行开始。这意味着D5中的值为0而不是1。(如注释中所述的@Foxfire And Burns And Burnslike)。
答案 3 :(得分:0)
好的,我没有等到OP回答D5
是1而不是0的原因后才发布答案,但是我的公式也是数组公式。会是:
=MIN(IF(B2:$B$6>C2;A2:$A$6))-A2
要在数组模式下键入此公式,您需要像往常一样键入它,但是无需按 ENTER ,而是需要按 CTRL + SHIFT < / kbd> + ENTER