這個需求是一位在當前抗疫一線的朋友提出的,和各位分享一下。
需求情況
因為眾所周知的原因,他每天都需要為照顧的小區居民購買、運送生活物資。小區居民通過表單的形式提交自己每日的需求,最終匯總到一張excel表里,如下圖:
每一行就是一戶居民當日需要采購的物資
物資的價格在另外一張名叫“價格”的表當中如下:
這位朋友需要做的就是把每一戶要采購的物資總金額計算出來,然后再進行后面的工作。
解決思路
大致思索一番,其實這個問題可以有多個辦法來解決。
方法一:excel函數
這個辦法有點繁瑣,但是簡單有效。
以第一戶為例,把總金額計算在I2單元格,公式為:
=IF(E2="/",0,1)*價格!$A$3+IF(F2="/",0,1)*價格!$B$3+IF(G2="/",0,1)*價格!$C$3+IF(H2="/",0,1)*價格!$D$3
公式里的IF函數的作用是,對每項物資進行判斷,等於“/”的就為0,不等的就為1,然后再和價格相乘,最后加總求和。
然后再向下拖即可。
方法二:sumproduct函數
這個方法和上面的思路一樣,但是公式更簡化。
還是以第一戶為例,把總金額計算在K2單元格,公式為
=SUMPRODUCT(--(E2:H2<>"/"),價格!$A$3:價格!$D$3)
SUMPRODUCT()函數的作用就是乘積匯總,–(E2:H2<>”/”)表示篩選不等於“/”的項目,標記為1;等於“/”的項目,標記為0;然后再和對應的價格相乘,最后匯總。
然后再向下拖即可。
方法三:VBA
思路基本一致,使用更加靈活,一鍵完成到位。
為了方便,就直接調用方法二中的SUMPRODUCT()函數。
Sub caijia1()
Range("Q2", "Q10").ClearContents
j = [a2].End(xlDown).Row
For i = 2 To j
Range("M" & i).Value = Evaluate("SUMPRODUCT(--(E" & i & ":H" & i & "<>""/""),價格!$A$3:價格!$D$3)")
Next
End Sub
這樣的好處是不用再手動的輸入函數,然后再往下拖。只需要一鍵即可完成計算,即使是數據有增加、或者減少,VBA都可以自動識別,省心省力。
暫時就想到這么多。如果你也有好的辦法,歡迎告訴我!
相關閱讀:Excel VBA 實例(25) – 班級隨機點名並播放
Excel VBA 實例(24) – 新股(債)中簽一鍵批量查詢
Excel VBA 實例(23) – 一鍵批量提取word表格內容
Excel VBA 實例(22) – 一鍵篩選其他工作表或工作簿的數據
歡迎交流!