上次寫了篇《
excel陣列公式從入門到精通之入門篇》,不覺已十多天過去了,今天補上「精通篇」。當然說「精通」可能有點過了,但是希望大家通過這兩篇博文能夠真正認識「陣列公式」,並且在工作中使用陣列公式幫我們解決實際問題。
excel陣列公式從入門到精通之精通篇
一、課程回憶
什麼是陣列公式呢?顧名思義就是公式中包含陣列的了,詳細含義請參看前文。但這裡重點提醒的一點就是,如果要使用陣列公式,在編輯欄輸入完公式以後一定要按下「ctrl+shift+enter」組合鍵,使編輯欄的公式處在「{}」之中。
二、陣列公式繼續深入
印象中是好幾年前了,當時看過的一篇掃盲貼中,作者舉的例子真是太實用了。具體細節記不太清楚了,大致意思就是使用函式計算1到100的和。這裡同樣以此為例。
1.求1到100的和
在往下看之前,大家想一下,如果讓你來處理該如何來處理呢?只用乙個函式解決1到100的和,當然也可以是1000、10000甚至更多。討論具體的數值沒有太大意義,此處只是希望通過此例讓大家更進一步的了解陣列公式的用法。
解答:
問題分析:求1到100的和,答案是5050(小學生都知道^-^),但excel必須是你告訴了它正確的方法,它才能知道。計算從1到100的和,實際上就是計算1+2+3+4+……+98+99+100,好了,答案出來了,在編輯欄中輸入「=sum(1+2+3+4+……+98+99+100)」。相信聰明的一定對此答案不滿意,雖然能得到正確的結果,但很明顯是「錯誤」的方法。
要得到1到100的正確數列,最簡單的方法就是使用row()或是column()函式,由於個人習慣,我比較習慣於row(),所以這裡以row()函式為例。
熟悉row()函式:在a1單元格中輸入「=row()」,使用填充柄填充至a5,看到什麼結果?是不是每乙個單元格中值就是其對應的行數。
驚喜:row()表示單前行,如果使用row(1:100)就表示乙個陣列,其中包含的便是第一到第一百行的行號,即1、2、3、……、98、99、100這些數值,現在我們就把這個陣列應用到公式中。
在工作表的任意乙個單元格中輸入「=sum(row(1:100))」,然後按ctrl+shift+enter組合鍵,你會驚喜的發現,我們要的結果出現了。
2.在excel2003中享受「sumifs」
sumif函式應該很多人都用過,非常好用。但如果遇到多條件判斷的怎麼辦呢?從office 2007開始,引入了sumifs函式,可以解決這種多條件求和問題。但如果仍然使用office 2003怎麼辦呢?其實使用sum、if再結合陣列公式即可實現sumifs的效果。
如下圖所示,某教師有一張任教的幾個班級的學生成績表。
任務:統計出「一班」、「二班」共計多少人?
此題要如何解決?sumif用兩次?或是count用兩次?這裡還是演示陣列公式的用法,所以先用sum和if組合的形式。
在任一單元格中輸入「=sum(if((a2:a12="一班")+(a2:a12="二班"),1,0))」公式按下回車鍵,是不是發現結果是「#value!」,再次進入編輯欄然後按下「ctrl+shift+enter」快捷鍵,是不是發現正確的結果出來了?
這裡再次解釋一下這個公式「」,外側sum沒什麼好用的了,就是求()內各數的和。中間的「if((a2:a12="一班")+(a2:a12="二班"),1,0))」的運算過程是這樣的,判斷a2:a12區域內單元格的值是否是「一班」,如果是則結果為1,則此公式計算的結果依次是「1、0、0、1、0、0、1、0、0、1、0」,因為第乙個條件為真,第二個條件肯定就不為真了,因為乙個單元格不可能同時等於「一班」和「二班」,所以第乙個陣列就是「1、0、0、1、0、0、1、0、0、1、0」。這時再判斷a2:a12區域內單元格的值是否是「二班」,如果是結果則為1,否則為0,所以這個陣列條件計算的結果就是「0、1、0、0、0、1、0、1、0、0、0」,中間的加號就是將這兩個陣列相加,也就是說最終的陣列為「1、1、0、1、0、1、1、1、0、1、0」,然後使用sum求和,結果就為7了。
從上面的圖中標註可以看出,所以的公式我全部使用了陣列(a2:a12這就是乙個陣列),並且上圖上的沒有使用陣列公式的公式中的陣列全部可以使用單個單元格替代,之所以全部列出,還是希望大家更好的理解一下陣列。
在excel中,陣列如果不放在陣列公式中使用,通常陣列在特定單元格中只代表與其特定單元格所對應的乙個值(陣列中的乙個元素),放在陣列公式中使用時,通常整個陣列元素都會參與運算。
三、陣列公式精通
這裡是乙個實際工作中的例子,只是我稍微變化了一下,還是sum應用的例子。
需求:如下圖所示,現在要統計員工張三在1號加工所有機器的「實績」,也就是說在右側的資料中先過濾日期為1,然後再過濾人員為張三的資料,最後統計實績的結果。如果使用乙個公式完成這一需求,你能想到嗎?當然sumifs是除外的,因為sumifs是office 2007以後的產物。
答案:在上圖所示的c2單元格中輸入「=sum((e2:e21=a2)*(g2:g21=b2)*(h2:h21))」公式,然後按下「ctrl+shift+enter」組合鍵,你會發現想要的結果已經出現了。陣列公式就是這麼簡單,解決問題也是這麼簡單。
這次用的公式可以看出,比之前用的公式還要簡單,連if都不要了,實際上這裡的「=」符號就是起到了乙個類似if的效果。
這裡再說明一下公式的執行過程,公式中e2:e21表示陣列區域,這個相信已經不需要再說明了,放到陣列公式中就是依次取陣列中的各個數值,也就是依次取日期中的值。e2:e21=a2,實際上就是拿日期中的每乙個值依次與a2中的日期進行比對,如果相等則結果為true,即1,如果不相等則為false即為0。到了這裡也許你有一點明白了,如果第一不相等,則後面的無需再繼續下去了,因為公式裡用的全部是「*」乘積符號,任何數乘0等於0。如果此項符合再繼續判斷g2:g21區域,也就是用姓名依次比對,如果和b2中的姓名相同,則為ture,即1,如果為false,即0,繼續下乙個回合。如果此項也為ture,很明顯前面兩項的結果為1*1=1,再乘以h2:h21陣列中對應的數字,即符合條件的「實績」,以第乙個符合條件的第一條記錄為例,在陣列公式執行的第乙個回合為sum(1*1*234),結果當然為234了,然後再依次完成整個陣列的運算,我們最終的目的就達到了。
陣列公式非常有用,效率也高,但真正的理解、熟練掌握也不是一件很容易的事。但大家記住陣列中的資料是一一對應的,放到陣列公式中使用時,陣列中的資料會按順序依次參與相應的運算。
希望大家能夠慢慢的理解、貫通。
Nginx從入門到精通
1 nginx配置檔案載入機制 採用nginx s reload命令載入nginx的配置檔案,master程序讀取配置檔案,建立新的worker程序,向老的worker程序傳送shutdown命令。老的worker程序不再接受新的請求,待老的請求處理完成後,就會停掉。2 location匹配機制 當...
scrot 從入門到精通
無論是撰寫技術教程,還是展示桌面或應用,恐怕 scrot 都是必不可少的工具。scrot 是螢幕抓圖工具中的 皎皎 佼佼者,它小巧而不失為強大,精練而不缺少靈活。scrot 主要用在命令列下,它使用 imlib2 庫來抓取並儲存影象。在 ubuntu 中,可以使用sudo apt get insta...
mysql從入門到精通
在sql語言中,用join實現表與表的關聯,用on指定聯合表的查詢條件,如 實現三表聯查,可以用table1.table2.來排列 顯示資訊的先後順序 select from user left join address on user id address.user id left join us...