遇到一個看似複雜邏輯過程,將對於excel工資數據進行處理。
現狀:
每個月份產生一個sheet頁的數據,Sheet名稱命名格式格式固定YYYY.MM
需要處理邏輯:
1、每年的1月份不累計以前月份的數據;其它月份累計上個月的歷史數據
1.1 如果在歷史數據中獲取不到數據,則累計值需要返回零。
例如,在某公司的工資表中,如果新員工入職第一個月發的工資,因爲沒有歷史累計個稅扣除,則需要認爲以前累計扣除值爲0。
原來認爲在一個公式裏面,動態根據日期計算sheet名稱,以及前面所要求的基本處理邏輯,很難用一個公式來處理,後來通過研究wps2019提供的公式,發現還是可以搞一搞的。
公式如下:
IFERROR(
if(MONTH(NOW())=1,0, #判斷是否1月份
IFERROR( #vlookup查詢不到則返回零值邏輯處理
VLOOKUP(D8, #本Sheet頁要查的key值,例如某id值
EVALUATE( #根據日期拼湊sheet頁名,再拼湊文本公式引用sheet頁的數據表區域,動態評估文本公式
CONCAT(CONCAT(YEAR(NOW()),".",
IF(MONTH(NOW())>10,MONTH(NOW())-1,CONCAT("0",MONTH(NOW())-1))), #動態判斷時間產生頁名
"!D:AZ")), #數據表區域
2,FALSE)
,0) #vlookup查詢不到則返回零值返回
)
,0) #異常保護
利用if+iferror邏輯公式/concat文本拼湊公式/vlookup查詢公式/evaluate動態執行文本公式,幾個公式組合下來,就可以實現較爲複雜的邏輯。
此公式在wps2019上測試通過,其他excel體系可以參考去寫......
當時測試通過後,令我非常驚訝,原來以爲要寫一個複雜的vba腳本進行處理,但是,幾個公式的組合就可以完成以上的邏輯,也順便體會到Lisp編程的偉力,就是那一層層各種括號函數的嵌套,完成了複雜的邏輯過程,哈哈!