2014-06-16 237 views
1

我想在Excel中做一些数据验证,但是难以使vlookup以递归方式工作。 这里是数据的一个小样本excel中的递归查找

+---------------+-----------------+ 
| 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

Aahhh,任何提示格式表的外观? – maus

+0

从发布的示例看,您的数据似乎已经按**期限排序。**如果这是真的,那么5个最小的持续时间已经在顶部。如果这是真的,那么只是平均列** B中的前5个项目** –

+0

是的,这是事实,但它并没有帮助我很多,因为我有这样的多列。想想那个发布的是指2014年。我有一个巨大的Excel与这些类型的列并排,如:Dur2010,Start2010,Dur2011,Start2011等。如果我以Dur2010为例,然后确定我可以将前5个Start2010的元素。但剩下的事呢?其他的都会搞砸了。所以我需要找到一个更复杂的方法来做到这一点.. – maus

回答

1

尝试这种情况:

{=SUMPRODUCT(IF(DurNoErrors<=SMALL(DurNoErrors,5),TRUE,FALSE)*Start_Time)/5}

重要:请注意,这是一个数组式所以它必须具有CTL + Shift + Enter键输入。该公式也适用于非数组论坛,但如果输入正常,它不会给你预期的结果!所以只要确保你输入它作为一个数组公式。

DurNoErrors被命名范围设置为:

=IFERROR(Duration," ")

Duration是一个命名的范围设置为你的持续时间数据。

Start_Time是另一个命名范围设置为您的开始时间数据。

这个阵列式的工作原理是:

  1. 查找第五最小持续时间值
  2. 使用IF()使基于每个值是否为大于从所述工作持续时间阵列创建的TRUE/FALSE的值的数组(FALSE)或小于/等于(TRUE)第五小的值(结果数组将包含5个TRUE,其余的将为FALSE)
  3. 将该TRUE/FALSE数组乘以Start_Time数组,所有持续时间大于第五小的Start_Times现在被清零
  4. 添加使用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

+0

除非丢失或NaN值,否则它会诀窍。我需要稍微修改一下以避免考虑缺失值。 – maus

+0

看起来AND不喜欢数组,所以我使用了这种形式: (= SUMPRODUCT(IF((Duration <= SMALL(Duration,10))*(ISNUMBER(Duration)),1 * Start_Time,0))/10}' – maus

+0

这就是我正在建议的 - 今天早上还没有时间摆弄它。现在是中午!如果您有此特权,请随时编辑我的答案。否则我会晚点再做。 –