2007年3月19日 星期一

[EXCEL] 誰的出現次數最多?

 
  相關函數陣列公式 / COUNTIF() / MAX() / ROW()

   前一篇文章利用陣列公式在一堆請假清單中列出曾經請過假的人,這次我們來找找,誰是請最多假的「請假大王」?

##CONTINUE##
  要計算次數,當然要利用函數 COUNTIF(),如上圖 C 欄,C2 公式為

=COUNTIF($A$2:$A$11,A2)

  把公式直接往下複製,就可以算出每個人的請假次數。C2:C11 形成一個陣列,我們可以在這個陣列上做變化。

  例如,請假次數的最大值,D5 陣列公式

=MAX(COUNTIF($A$2:$A$11,A2:A11))

  那麼,這個請假次數最多的請假大王,到底是誰呢?D2 陣列公式

=INDIRECT("A"&MAX(
IF
(COUNTIF($A$2:$A$11,A2:A11)=MAX(COUNTIF($A$2:$A$11,A2:A11)),
ROW(A2:A11),
"")))


  我們來好好剖析這個公式。

  • 最內層的 COUNTIF($A$2:$A$11,A2:A11) 就是每個人的請假次數,也就是 C2:C11 這個陣列。
  • MAX(COUNTIF($A$2:$A$11,A2:A11)),就是請假次數的最大值。
  • IF(COUNTIF(...)=MAX(...), ROW(A2:A11),"") 則是說,如果某個人的請假次數等於最大值,就記下它所在的列數 ROW(),否則就記下空白。經過這個步驟,就可以只留下請假大王的所在位置。
  • 最後用外層的 MAX() 把這個列數取出來,再用 INDIRECT() 把位置轉成內容,完成!
  
  這個公式的架構,其實和之前高低標的公式很像,先把陣列公式利用

  IF(條件式,留下想要的值,空白)

  過濾成另一個陣列二,再從陣列二中取出想要的值,這裡是用 MAX(),高低標那裡是用 AVERAGE()。相同的架構,可以應用在各種地方,發揮你的想像力吧!

  實用上,C 欄可以整欄去掉,這裡只是用來說明陣列而已。

1 意見:

Unknown 2012/8/30 中午12:48 提到...

網主你好,請問如果有兩個請假大王,當月請假的天數一樣,上文提供的公式可以挑出兩個人名嗎?若否,該如何處理?

謝謝!