花葉草木深,工作要認真,我還是我,那個愛聊Excel胖小夥-廖晨。
在Excel中,說到批量求和,就繞不過3個函數:SUM,SUMIF,SUMIFS;
SUM語義,無條件求和;SUMIF:有條件求和,SUMIFS:多條件求和;不過它們都有一個共性:忽略空白或文本單元格。
SUMIF我在之前文中簡單介紹過,預想詳細了解,可以翻看文章《SUMIF函數的用法技巧,真的都會用?初級用法,了解一下!》。
今天我們要聊的是多條件求和SUMIFS,最早出現在2007版Excel中,在2000-2003的版本中可以用DSUM函數代替。
01函數結構
語法結構:SUMIFS(求和區域,條件區域1,條件表達式1......條件區域N,條件表達式N);
求和區域:多數為多單元格引用範圍,常見形式有:名稱,單元格引用區域;條件區域:條件表達式對應區域,必須跟求和區域相同的列數和行數,否則報錯#VALUE!條件表達式:由雙引號包裹,與比較運算符:=,>=,>,<,<=與數字,文本,邏輯值組合而成,為=時,可省略,單純為數字,可以省略雙引號;支持通配符(*?~)N:最多支持127對條件組合;由於求和區域和條件區域必須保證一樣的列數和行數,我們通常將整列作為求和或條件區域的參數,下面就通過例子來近距離了解一下SUMIFS函數的用法有哪些吧!
02初級用法
現有一個公司4月份中期的報銷數據表Sheet1,數據結構如下:(註:員工的報銷項目有:通信費,交通費,場地租賃,器材費,委託費)
要求匯總每個員工的報銷情況?
分析:匯總每個員工的每個報銷項目金額情況,需要篩選兩個條件:員工姓名,項目名稱,來匹配金額並求和;員工姓名在Sheet1的B列,報銷項目名稱在C列,金額在E列,公式的初型就有了:
=SUMIFS(E列,B列,條件表達式1,C列,條件表達式2)在公式中,由於E列,C列,B列位置不論出現匯總的什麼單元格,位置不能發生變化,所以在編寫公式時,注意要絕對引用,而條件表達式1和2都需指定姓名或項目名稱,而項目名稱是已知條件,員工人數不定,若想匯總,需要對員工姓名去重,篩選出唯一的員工名單,這樣匯總的條件就湊齊了,剩下就是步驟了:
操作步驟:
1.新建工作表:匯總,B1:G1錄入,通信費,交通費,場地租賃,器材費,委託費,總計
2.複製Sheet1中B列的內容,然後在匯總表中A1粘貼,點擊【數據】下【刪除重複項】;
3.B2錄入公式=SUMIFS(Sheet1!$E:$E,Sheet1!$B:$B,$A2,Sheet1!$C:$C,B$1),拖至F2,滑鼠移至F2右下角,滑鼠變實心+時,雙擊;
4.選中B2:G7,Alt+等號組合,填充總計列的公式。
03中級用法
下面介紹的用法,就是在參數條件表達式上變化,它除了單個表達式外,實際還可以是表達式集合,返回的結果也是集合;匯總表B2的公式可以通過這種寫法改為通用公式:
1.報銷項目在匯總表的B1:F1且位置不變,所以在公式中需要絕對引用,原來的B2公式變為:
=SUMIFS(Sheet1!$E:$E,Sheet1!$B:$B,$A2,Sheet1!$C:$C,$B$1:$F$1);
2.員工的姓名的引用範圍:A2:A7,B2的公式需要向下向右拖拽填充,所以姓名的引用也許絕對引用,
代入B2公式:
=SUMIFS(Sheet1!$E:$E,Sheet1!$B:$B,$A$2:$A7,Sheet1!$C:$C,$B$1:$F$1)
直接執行公式返回結果為0,實際它已匯總成一個行高為6,列寬為5的數組集合:
而讀取每個結果就需要INDEX函數加持,用之前先來回一下函數用法:
INDEX(數組,行數/列數,[列數])
由於本例不涉及INDEX函數第二形態,這裡只簡介常用的形態,它包含兩種情況:
當讀取的數組為單行或單列時,第二參數會根據數組自動識別對應的行數或列數;當數組同時包含行和列時,則第二參數即為行數,第三參數為列數本例中,公式生成的數組行列都包含,需要採用3個參數的形式,
而函數生成的數組的位置和表格中的相對位置行數和列數都相差1,最終B2的公式調整為:
=INDEX(SUMIFS(Sheet1!$E:$E,Sheet1!$B:$B,$A$2:$A$7,Sheet1!$C:$C,$B$1:$F$1),ROW()-1,COLUMN()-1)
最後記得要做容錯處理,即=IFERROR(通用公式)
通用公式的操作方法跟上面的做法不同在於公式的填充上:
名稱框輸入B2:F7,回車或滑鼠拖拽選中,單擊編輯欄,錄入通用公式,ctrl+enter,其他操作同上。
如果在工作中,時間緊的話,做到這就可以了,如果時間富裕,一定記得優化啊!千萬別手懶,因為做的越完善就越能體現你的價值。
04高級用法
上面的通用公式並不是最終版,它存在的缺陷就是當員工出現增加時,並不能通過拖拽填充公式來對新增員工的數據匯總,哪問題來了,有什麼方法可以解決這個問題嗎?
當然,就需要用到編程思想中的:配置大於邏輯,對公式中的員工引用範圍加以配置,使得公式中的引用範圍可以根據員工多少自動變化,這種處理方式有個官稱:動態引用。
創建動態引用的方法主要有兩種:
1.開啟智能表格,優點:操作簡單,只需基礎操作就能完成,缺點:數據刪減時,無法自動刪減。2.自定義名稱,優點:數據增刪都會自動實時更新引用範圍,缺點:需要有公式方面的知識加持,相對難度有點大。這裡重點介紹第二種實現方法:字符串拼接+自定義名稱
引用字符串:員工姓名在A列,最后姓名的引用位置為:A列&A列的非空單元格個數,用公式表示為:「A」&COUNTA(A:A),因是通用公式,需要絕對引用A列,姓名開始單元格是A2,所以動態引用範圍的字符串為:」A2:A「&COUNTA($A:$A);再用INDIRECT函數轉化引用範圍即可。
操作如下:
1.點擊【公式】下的【自定義名稱】按鈕,錄入名稱:names,引用位置:=indirect("A2:A"&COUNTA(匯總!$A:$A)),點擊確定;2.名稱框錄入:B2:F23回車,將B2公式中$A$2:$A$7替換成names,ctrl+enter(回車);3.名稱框錄入:B2:G23,回車,alt+等號,
從圖中可以看出,當合計單元格金額為0時,會保留中文的貨幣符號和-,如果列印的話,就太費紙了,需要處理一下。不過導致合計為0的原因並不單一,共有2種原因:
1.因為容錯處理,遇到錯誤返回空,到這合計為零;2.員工對應的所有的報銷項目都為0;因為第2種情況,若員工沒有報銷金額也不會出現數據表中,所以我們只需處理第一種情況出現的原因,初步判斷是因為沒有員工姓名導致的,進一步的確認問題的根源,就必須藉助調試工具:公式求值。
具體操作如下:
選中姓名為空的報銷項目中的任一單元格,點擊【公式】下的【公式求值】按鈕,一直點擊求值,直到錯誤#REF!;
#REF!的語義:單元格引用範圍不存在或刪除導致的;
如果想明白為什麼會出現這種錯誤?就需要了解Excel的數組實則分為兩種:數組和引用數組,當INDEX參數為引用數組,在讀取不存在引用地址時,會返回#REF!,這方面的內容,我會在講解數組時詳細介紹,這裡不再贅述了。
其實說白了就是員工姓名為空導致的,知道原因,問題就解決一半了,就當員工姓名為空時,對應的合計單元格不顯示數字0就行了,具體操作步驟如下:
1.選中G1:G23,點擊【開始】下的【條件格式】按鈕,彈出菜單,點擊新建規則,彈出新建規則窗口
2.選則使用「使用公式確定要設置格式的單元格「,公式錄入=$A1="",點擊格式,彈出自定格式窗口;
3.選自定義,格式編碼輸入;點擊確定
想了解條件格式的詳細用法請翻看《小白講Excel 條件格式中高級用法,你值得擁有!》
文章的最後,需要解釋一下,高級用法並不是有多複雜,有多難理解,而是將編程思想,設計思想用在你製作的項目中,使你的項目更加易維護,只需通過簡單的修改就能代替沒有必要的重複操作,都算高級用法。
好了,今天的文章就到這,希望你能從文中有所收穫,喜歡我就關注,點讚加轉發吧。我還是我,一個愛聊Excel的宅小夥廖晨。