2013-08-05 63 views
2

這是我的第一個問題,所以如果出現問題請不要殺我。我在這個網站上發現了很多解決方案,但現在還沒有。很遺憾,我目前無法發佈圖片。這並不容易,但我會嘗試。Excel CountifS。標準多列範圍。無序比較測試

給點:

我的數據具有以下標題:

Decision_Id Opponent1 Opponent2 Opponent3 Suitor1 Suitor2 Suitor3 Suitor4

Decision_id是唯一的整數標識符。其餘的是字符串。

每一行代表一個特定的司法裁決。每個決定可以有最多3個對手(辯護方)和最多4個追求者(攻擊方)。一個特定的一方可以在一個決定中成爲追求者,在另一個決定中成爲對手。

我要得到什麼

交叉表,其中行和列標題是完全不同的各方我在表中遇到的問題。 (沒有問題,完成) 其中每個單元格顯示特定對手(由行標題定義)在多少個不同的決定中受到特定求婚者(列標題)的攻擊=>所有對角線單元格均等於零(一方可以「 t攻擊本身)和表不是對稱的。

我試圖

應用到所述第一小區和比擴大:

= COUNTIFS( 「所有對手動範圍:$ B $ 2:$ d $ 6」,「想要的對手價值:$ A2「,」所有追求者的固定範圍:$ E $ 2:$ H $ 6「,」通緝者價值:B $ 1「)

我有一個錯誤。我發現標準範圍必須具有相同的尺寸。好吧,創建虛擬空列=>沒有錯誤,但是,結果顯然被低估了。我認爲只有當對手和求婚者擁有相同的「號碼」時纔有匹配。詳細說明:對於每一行,excel都會測試opponent1和suitor1對應的值,然後是opponent2和suitor2,然後是opponent3和suitor3 ...這實際上解釋了爲什麼範圍必須具有相同的大小。

所以,我需要

是,對於每一行,以使Excel測試所有對手朝想要的對手值,測試所有的追求者朝着想要的求婚值。如果至少一個對手,一個追求者相對應,給它一個匹配和計數這個決定。(即使opponent1和suitor3有想要的值)

備註

我已經作出了VBA代碼,確實這個工作,但它太慢了(整個表格大約需要5個小時),我希望對不同的這種表格和/或修改這個表格。所以我對「純粹的excel」,快速解決方案感興趣。

非常感謝!

+0

您對標準的理解範圍是正確的......您可以通過總結多個這樣做(或定義爲一個名稱,比如正常進入=Total。) COUNTIFS。 – Stobor

回答

2

的困難這裏的部分是分離的多列範圍爲單獨的行 - 做到這一點的一種方法是用內COUNTIFOFFSET,即這個公式

=SUMPRODUCT(COUNTIF(OFFSET($B$2:$D$6,ROW($B$2:$D$6)-ROW($B$2),0,1),$A2),COUNTIF(OFFSET($E$2:$H$6,ROW($E$2:$H$6)-ROW($E$2),0,1),B$1))

這假定所有的追求者在任何一行上都不同,並且所有的對手在任何一行上都不相同(儘管如果不是這種情況,可以修改公式)。

您可以將範圍擴展到任何你想要的大小 - 雖然行的數量必須爲每個部分

相同....或者這是一個使用MMULT功能另一個更模糊的方式

=SUMPRODUCT(MMULT(($B$2:$D$6=$A2)+0,{1;1;1}),MMULT(($E$2:$H$6=B$1)+0,{1;1;1;1}))

{1; 1; 1}和{1; 1; 1; 1}表示在每個部分中的列數,所以如果你有6和8的那些需要相應地

+0

非常感謝。這兩個解決方案都很好,但我會保留第二個(使用MMULT)。由於偏移量是一個易失性函數,因此excel會不斷重新計算一切,這有點煩人。謝謝! ($ B $ 2:$ D $ 6)-ROW($ B $ 2)等於零,因此OFFSET($ B $ 2) :$ D $ 6,ROW($ B $ 2:$ D $ 6)-ROW($ B $ 2),0,1)應該不斷地返回$ B $ 2:$ D $ 6的第一行,並且由於整個公式是有效的不是這樣。任何意見? – Noazerty

+0

ROW($ B $ 2:$ D $ 6)實際上給你這樣一個數組:{2; 3; 4; 5; 6} ...所以ROW($ B $ 2:$ D $ 6)-ROW($ B $ 2 )給你{0; 1; 2; 3; 4}通常總是一個從零開始的數組,其數組與數組中的行數相同。這種技術允許OFFSET輸出一個「範圍範圍」 - 每一行一行,這反過來又允許COUNTIF返回結果數組 - 每行一個 –

0

這應做到:

=  COUNTIFS($B$2:$B$6,$A2, $E$2:$E$6, B$1) 
     + COUNTIFS($C$2:$C$6,$A2, $E$2:$E$6, B$1) 
     + COUNTIFS($D$2:$D$6,$A2, $E$2:$E$6, B$1) 
     + COUNTIFS($B$2:$B$6,$A2, $F$2:$F$6, B$1) 
     + COUNTIFS($C$2:$C$6,$A2, $F$2:$F$6, B$1) 
     + COUNTIFS($D$2:$D$6,$A2, $F$2:$F$6, B$1) 
     + COUNTIFS($B$2:$B$6,$A2, $G$2:$G$6, B$1) 
     + COUNTIFS($C$2:$C$6,$A2, $G$2:$G$6, B$1) 
     + COUNTIFS($D$2:$D$6,$A2, $G$2:$G$6, B$1) 
     + COUNTIFS($B$2:$B$6,$A2, $H$2:$H$6, B$1) 
     + COUNTIFS($C$2:$C$6,$A2, $H$2:$H$6, B$1) 
     + COUNTIFS($D$2:$D$6,$A2, $H$2:$H$6, B$1) 

這些如果你讓你的數據到一個表,或定義一個名爲範圍爲Opponent1,Opponent2,Suitor1列等簡單的看...

+0

非常感謝你這麼快速的回答!我實際上已經考慮過這個解決方案,問題是現實中有6個對手和8個追求者,這使得6次8 = 48 COUNTIFS。我正在尋找更好的解決方案。順便說一句,如果我定義了48 COUNTIFS,這不會使執行時間過長嗎? 其實我的數據是以表格的形式出現的,它是否真的有所作爲? – Noazerty

1

另一種可能性是改變嘗試這個數組公式:

=SUM(MMULT(-TRANSPOSE($B$2:$D$6=$A2),-($E$2:$H$6=B$1))) 

進入使用CTRL + SHIFT + Enter

+0

+1 - 這很不錯lori_m! - 我開始走下這條路,但說服自己,我需要兩個MMULTS ..... :( –

+0

巴里 - 謝謝!這兩種方法的等價性可以從身份證明'(A1)'(B1)= 1'(A 'B'1'(對於適當大小的矩陣'A'和'B'和矢量'1',其中''表示轉置。)矩陣乘以1的向量之前和之後的矩陣相乘與總和要素。 –