我正在尝试在Excel中进行一些数据验证,但难以递归地使vlookup
工作。
这是一小部分数据
+---------------+-----------------+
| Duration(sec) | Start time(sec) |
+---------------+-----------------+
| 1.428571429 | 96.57142857 |
| 1.888888889 | 95 |
| 1.888888889 | 96.22222222 |
| 2.428571429 | 95.71428571 |
| 2.75 | 96 |
| 2.8 | 95.3 |
| 2.846153846 | 94.30769231 |
| 2.857142857 | 97.42857143 |
| 3 | 94.8 |
| 3 | 97 |
| 3 | 99 |
| 3.111111111 | 95.66666667 |
| 3.2 | 95.5 |
| 3.333333333 | 96.22222222 |
| 3.416666667 | 80.33333333 |
| 3.416666667 | 94.16666667 |
| 3.5 | 94.1 |
| 3.615384615 | 78.92307692 |
+---------------+-----------------+
第一列是事件的持续时间,第二列是起点。我需要找到例如的平均起始点。持续时间最短的5件商品。
我开始是这样的:{=AVERAGE(SMALL(IF(ISNUMBER(B:B),B:B,""),ROW(INDIRECT("1:5"))))}
给了我5个最小持续时间的平均值。到现在为止还挺好。它的工作原理应该如此。
然后尝试将上述内容与vlookup
混合,以便在第一步中返回5个最小的持续时间,然后查找相应的起点,然后计算它们的平均值。
我试过了:{=AVERAGE(VLOOKUP(SMALL(IF(ISNUMBER(B:B),B:B,""),ROW(INDIRECT("1:5"))),B:C,2,FALSE))}
但没有运气。 VLOOKUP
似乎只返回一个值。所以我不能这样使用它。
有什么想法吗?
P.S。我使用ISNUMBER
因为我在数据中有NaN值。
答案 0 :(得分:1)
试试这个:
{=SUMPRODUCT(IF(DurNoErrors<=SMALL(DurNoErrors,5),TRUE,FALSE)*Start_Time)/5}
重要提示:请注意,这是一个数组公式,因此必须使用Ctl + Shift + Enter输入。该公式也可作为非数组论坛使用,但如果正常输入,它将无法提供您期望的结果!因此,请确保将其作为数组公式输入。
DurNoErrors
是一个命名范围,设置为:
=IFERROR(Duration," ")
Duration
是设置为持续时间数据的命名范围。
Start_Time
是设置为开始时间数据的另一个命名范围。
此数组公式的工作原理如下:
IF()
根据每个值是否大于(FALSE)或小于/等于(TRUE)第5个最小值,从Duration数组创建一个TRUE / FALSE值数组(结果数组将包含5个TRUE,其余的将为FALSE)SUMPRODUCT()
添加该数组,并将结果除以5 使用IFERROR()
可以消除数组中的任何错误。
注意:对于您的命名范围,您不应使用,例如A:A
。而是使用A1:A100
之类的内容,因为通常情况下,在公式中使用A:A
会显着减慢工作表的速度。如果您愿意,您当然可以直接在上面的公式中输入数据的地址,而不是使用命名范围(例如:A1:A18
而不是Duration
)。但是,named ranges are a good way to make your formulas more understandable when you come back a year later and are trying to figure out what the heck it is you were doing。