2013-05-31 45 views
2

我感覺這幾乎是不可能的,但是在這裏。我有結構化這樣的數據:獲得羣體平均數量不等的羣體

Test Group 1 
pass 
fail 
pass 
fall 

Test Group 2 
pass 
fail 

Test Group 3 

pass 
fail 
fail 
pass 

我希望能夠將其粘貼到Excel和讓Excel彙總每個測試組的百分比。因此,這將最終看起來像這樣:

Test Group 1    Percentage Pass: 50% 
pass 
fail 
pass 
fall 

Test Group 2    Percentage Pass: 50% 
pass 
fail 

Test Group 3    Percentage Pass: 50% 

pass 
fail 
fail 
pass 

但你可以看到測試組的長度沒有設置,它可能會有所不同。我希望的是,我也許能創建遵循這個邏輯公式:

if(A<n> contains "Test") 

count A<n> +1 until A<n> contains "Test" 

好像我問了很多Excel公式。今天我花了一些時間編寫一個小的C#應用​​程序,它將配置分割成單獨的文件,以便我可以將單獨的文件複製並粘貼到Excel中。但擁有更少的步驟將會很棒!

---更新----

有三個很有趣的方法解決這個問題,證明沒有什麼是不可能的:P

我想,讓我複製和粘貼中的結果和查看解答一個百分比的負載彈出,所以我總是尋找公式解決方案,但請花點時間看看pnuts和傑里斯的答案,因爲他們揭示了Excel的一些有用的功能!

chuffs答案是我一直在尋找的,它開箱即用。對於任何想要深入研究它的工作原理和原因的人來說,我將這個公式分解成幾個步驟並填寫一些幫助信息。這些公式的關鍵是結合MATCH,OFFSET和稍微更明顯的SEARCH/FIND/LEFT(我曾經使用IFERROR(找到類型的方法,左看起來比較乾淨:))

看看這些公式的文檔,但看到這一切行動的一些例子中看到的谷歌電子表格創建我詳細chuffs回答:

https://docs.google.com/spreadsheet/ccc?key=0AqODI11eAjtldDhDd2dBcFhpZW9SXzEybGtMUWMwM3c#gid=0

--- PS --- 因爲我沒有真正創建一個C記錄++程序來美化我的數據並將其輸出爲.csv文件。如果我有這個信息,我不會感到困擾,但很高興我嘗試了兩條路線,這是一個有趣的學習冒險。

+0

你想要它在你上面提到的格式還是每個g羣體和右側的百分比好嗎? – Jerry

+0

@Jerry對於遲到的回覆感到抱歉,我最終陷入了寫一個C++程序的困境中:爲我吐出所有這些數據:p 格式非常重要,基本上我爲測試團隊編寫了一些腳本,那裏輸出的東西大致類似於上面的格式(並且不能以任何其他方式輸出),我想通過創建工作表來減少人爲錯誤,他們可以將數據複製並粘貼到數據表中,併爲其完成所有工作: ) – chrispepper1989

+0

不要擔心,這很好^^遲到比從未好;)我很高興你能找到你需要的解決方案。 – Jerry

回答

2

單個數組公式可以解決這個問題。它只需要在數據列底部添加一個停止值「測試」。

假設你的數據的範圍是A2:A18,這裏是將計算在細胞B2平均式:

=IF(LEFT(A1,4)="Test", 
     COUNTIF(OFFSET(A1,1,0,MATCH("Test*",$A2:$A$18,0)-1,1),"pass") 
     /COUNTA(OFFSET(A1,1,0,MATCH("Test*",$A2:$A$18,0)-1,1)), 
     "") 

式的關鍵部件是計算範圍對於兩個計數函數的表達式,COUNTIFCOUNTA

COUNTIF函數 - 用於統計組中的傳遞數 - 包含兩個參數,計數的範圍以及要計數的單元格滿足的條件。

我使用OFFSET函數來提供計數範圍。 OFFSET需要五個參數:

  • 錨小區(如果提供的範圍內,該函數只使用左上角的單元格中的範圍內)。
  • 下面(+)或以上( - )要返回範圍的錨點單元格的行數將開始。
  • 返回範圍開始的錨點單元右側(+)或左側( - )的列數。
  • 要返回的行數。
  • 要返回的列數。

例如,OFFSET(A1,5,2,4,1)將返回範圍C6:D9

在公式中,錨點單元格爲A1,行偏移量爲1,列偏移量爲0,換句話說,返回範圍的開始爲A2

要返回的行數由MATCH函數計算得出。對於第一個測試組的平均值的計算,MATCH在範圍A2:A18中查找以單詞'Test'開頭的第一個單元格的行。 A2是啓動測試組的單元格下方的通過/失敗列中的單元格。

該列中的最後一個單元格是A18,它已被添加到數據中幷包含單詞'Test'。這可以防止公式返回最後一個測試組的錯誤。否則,匹配將返回一個錯誤,因爲在最終組的開始之後找不到另一個Test

另請注意,匹配範圍的錨點(即$A2:$A$18)會將行引用延伸到範圍頂部(A2中的2)。這是因爲範圍會向下調整,因爲該公式被複制下來以找到下一個,而不是之前出現的'測試'。

最後,我將返回行數減1,以排除Text找到的MATCH,它屬於下一個組。

COUNTA函數 - 計算傳遞總數並在組中失敗 - 使用相同的OFFSET/MATCH表達式來獲取組的範圍。

這是一個數組公式,因此必須與控制輸入 - - 輸入組合鍵。將公式向下複製到數據的底部(不包括具有「測試」停止值的單元格)以計算每個組的平均值。

爲方便起見,下面是沒有上面顯示的斷點的公式。它可以直接粘貼到工作表中(記住用控制-移位-輸入)確認它。

=IF(LEFT(A1,4)="Test",COUNTIF(OFFSET(A1,1,0,MATCH("Test*",$A2:$A$18,0)-1,1),"pass")/COUNTA(OFFSET(A1,1,0,MATCH("Test*",$A2:$A$18,0)-1,1)),"") 

spreadsheet result

+0

這正是我尋找的東西,我剛剛測試了第一個功能,它的工作原理完全符合我的期望!我現在花時間充分理解解決方案! – chrispepper1989

+0

這很有道理,我希望我知道MATCH和OFFSET!如果我沒有弄錯,它不一定是數組公式?在這種情況下,它的工作沒有CNTR + Shift + Enter – chrispepper1989

+0

對於大家的conviencence我把整個事情到谷歌文檔與breaj公式下來: https://docs.google.com/spreadsheet/ccc?key=0AqODI11eAjtldDhDd2dBcFhpZW9SXzEybGtMUWMwM3c# gid = 0 – chrispepper1989

-1

有很多方法來解決這個 - 一個可能的簡單的解決方案是未來添加一列到您的通過/失敗,說(假設A列)列:如果你這樣做

=IF(A1="pass",100,0)

,那麼這些值的平均值將等於通過百分比。

+1

對不起,我不認爲你正確理解我的問題,它不是關於創建我可以用= COUNTIF(這比隱藏列方法恕我直言)更好的百分比來計算每個「組」的正確行數,這在數量上有所不同 – chrispepper1989

1

基本上小計將滿足要求,提供一些相當乏味佈局調整是可接受的。

製備:
假設Test Group 1A1,插入ROW1和ColumnA,在A2=IF(LEFT(B2,1)="T",B2,"")C2=IFERROR(MATCH(B2,{"fail","pass"},0)-1,"")並根據需要兩個公式複製下來。 (和變化秋天失敗的根源!)

小計:
選擇A:C,數據>大綱 - 小計,在每個變化:(1) Test Group 1,使用功能:Average,添加小計:檢查(C列) ,取消選中數據下面的摘要,確定。

整理一下:
1.移動A3:C3A1A2:C2A3
2.過濾器A:CColumnB,文本過濾器,包含添加Test,確定。
3.在C3="Percentage Pass: "&C4*100&"%"並複製到藍色編號的最後一行(應顯示#DIV/0!)。
4.突出顯示A:C所有以藍色和黃色編號的行。
5.隱藏ColumnA並且可選地隱藏或刪除Rows1:2
6.取消過濾器選擇。

與製劑如左圖結果

希望將類似如右圖所示:

SO16859574 first example


實例重新註釋@傑裏的回答是:

SO16859574 second example

+0

小計是一個有趣的功能,我從來不知道,它沒有工作第一次嘗試,但它是有用的瞭解,謝謝! – chrispepper1989

+0

如果您願意,我很樂意嘗試引導您完成這項工作,或者您是否最終完成了這項工作?小計是「多才多藝」(在'沼澤標準 - 非常奇特'範圍左側),我建議值得加入你的軍械庫。 – pnuts

+1

我得到了它的工作,謝謝,從現在開始,我的軍械庫裏很挑剔:) – chrispepper1989