2015-10-04 126 views
0

所以我這裏這個功能,通過T2上運行:T:如何將此函數轉換爲數組函數?

=IF($D$29<$N2,"", AVERAGE(INDIRECT("P"&IF($N2<11, 2,$N2-5)&":P"&$N2+5))) 

柱P處於行開始2列N是開始於一個索引(由1每行上升)號的列表第2行結束於P結束+ 14,D29只是一個數字。在我目前的情況下,P在第11行結束,N在第25行結束。我嘗試將其更改爲數組公式,以便在添加新行時自動更新。所以改變它後,我得到了這個:

=ARRAYFORMULA(IF($D$29<$N2:N,"", AVERAGE(INDIRECT("P"&IF($N2:N<11, 2,$N2:N-5)&":P"&$N2:N+5)))) 

但是,它不能正常工作。它仍然佔用相同數量的行,但每行都是相同的值。原來的第一行的值。我該如何解決這個問題?謝謝!

回答

0

這裏的問題是ARRAYFORMULA不適用於AVERAGE。 但你總是可以使用JavaScript。 打開腳本編輯器並粘貼此代碼。

function avg(nums, d) { 
    var r = [], 
     i, j, start, end, avg, count; 
    for(i = 0; i < nums.length; i++) { 
    if(d <= i) r.push([""]); 
    else { 
     if(i < 10) start = 0; 
     else start = i - 5; 
     end = i + 4; 
     avg = 0, count = 0; 
     for(j = start; j <= end; j++) { 
     if(nums[j]) { 
      avg += nums[j][0]; 
      count++; 
     } 
     } 
     r.push([avg/count]); 
    } 
    } 
    return r; 
} 

保存,返回到您的電子表格,並把這個公式中的任意單元格=avg(P2:P11, D29)

+0

謝謝!我沒有想過只是不使用數組公式。我甚至創建了另一個無效的腳本。 – SwissAndOr

+0

我發現你的函數在擴展P時不起作用,但是下面的代碼應該修復它: = avg(INDIRECT(「P2:P」&(COUNTIF(P2:P,「<> 0」)+ 1) ),D29) – SwissAndOr