2014-06-16 191 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

這就是我正在建議的 - 今天早上還沒有時間擺弄它。現在是中午!如果您有此特權,請隨時編輯我的答案。否則我會晚點再做。 –