小陸從會議室出來,遠遠看見黴黴和小度站著,比較好奇的就走了過去,原來是小皮在操作電腦,一邊操作好像還在說這著什麼,走近了才知道,原來小皮在用公式對快過生日的員工進行排序,因為我們公司會在員工過生日的時候,派發小禮物。表格的結構如下:
小陸到的時候,小皮已經把出生年月提取完成了,小皮開始編寫統計生日距離多少天的公式,=IF(DATE(YEAR(TODAY()),MONTH(C2),DAY(C2))<TODAY(),"生日已過",DATE(YEAR(TODAY()),MONTH(C2),DAY(C2))-TODAY());
小皮自帶解說:做這個表的關鍵部分就是提取生日中的月日,然後生成今年年份的日期,再與今天的日期比較,大於今天的日期的就說明還麼有過生日,就計算出結果,小於今天的日期的,就說明生日已經過了!
黴黴:這公式我明白,哪你怎麼用ctrl+e提取的身份證中的出生年月日,怎麼用了這個公式=DATE(MID(b2,7,4),MID(b2,11,2),MID(b2,13,2))提取呢?
小皮:今天就是覺得用的順手,我的技巧多啊,我想用哪個哪就是信手拈來啊!
小度笑了,說:是不是你也發現ctrl+e技巧也存在一些問題啊,如果直接提取b2的生日直接輸入1978/07/25,一回車就變成1978/7/25,然後ctrl+e發現有些生日提取的就不對了啊,若先字符串在ctrl+e,再轉日期反而不如公式來的直接乾脆,至於公式嗎?還是挺大師怎麼講吧!
小皮故意提高嗓門說:mid函數是個文本函數,他是用來提取文本中的部分內容,共有三個參數,第1個就是需要提取內容文本結果的表達式或引用單元格,第2參數就是從什麼位置開始截取,第3個就是提取字符的長度,我們知道,身份證中,出生年月的年份從7位開始共四個字符公式為=mid(b2,7,4),月份為11位2個字符=mid(b2,11,2),日期為=mid(b2,13,2),然後用date函數生成日期就好了。
黴黴:哪哥兒,你為什麼不直接生成今年的生日日期呢?還要判斷時候再生成一次,這不繁瑣嗎?
小皮臉滕就紅了:哦,我是為了核查萬一出錯了,好排查,不過你說的也挺對的啊,我幫你改一下啊!說這把公式改成了=date(year(today()),mid(b2,11,2),mid(b2,13,2)),後面的公式改為:=IF(C2<TODAY(),"生日已過",C2-TODAY());
小度也是一笑,還不忘擠兌一下說:看露怯了吧,還沒有人家黴黴思路清楚呢?而且你的公式也不是最簡的啊,還是我來演示一下,公式該怎麼寫吧!然後就把最後的公式改為:=iferror((c2>=today())*(c2-today()),"日期異常")
小皮:呵呵,不就將我的if改成數學乘法表達式了嗎!有什麼料不起的呢?還是換湯沒有換藥,還好意思說自己牛啊,有本事用自己思路來一個!
小度:這是讓你知道,你的公式還可以更漂亮,可以更優雅,不知好人心,你不是想看我的思路,我就來一個,於是將最後一行的公式改為:=iferror((mod(c2,today())<365)*(mod(c2,today()),"日期異常")
黴黴:mod函數之前你好像用過,不過我師父說用在日期會有問題,你這次用的麼有問題嗎?
小度:上次是因為我日期直接當成數字來處理,才導致的進位出現的數字增加數倍,再取餘數據不準的情況,這次不同,我們求的是天數,每個日期都對應一個天數,這些數字都是連續,並沒有日期那樣的規則,就沒有問題。
黴黴:哥兒,哪你具體說一下你這個公式,我有點看不懂啊!
小度得意的說:這要先說數學函數MOD,共2個必須輸入的參數,第1是原數字,第2是函數說明中叫除數,我叫它取數範圍,也就是函數返回的結果必定是0-第2參數-1範圍內,要想取餘法解決這個問題,我們需要知道2點,
1.若要數字重複出現,除非出現整數倍的關係才行,舉個例子:比如mod(9,10)結果為9,如果想重複出現必須是mod(19,10)才行,
2.取餘結果最大值出現在越接近第2參數的時候,比如mod(999,1000)=999.而過了1000反而會從小再遞增。
我們知道這些後,我們所求的日期最大的差距也就365,假如今天的日期為2019年1月1日(對應數字為:43466),返回的結果範圍0-364,已過生日的人取值範圍為:43466,其他人的範圍0-363,3號的時候,已過生日取值範圍變為43466-43467,則其他人的範圍為0-362,以此類推,到最後一天已過生日人範圍43466-43829,其未過的為0。這樣我們可以通過過濾掉>365的人,剩下的就是未過生日的人啦!
黴黴:聽懂了點,如果我想統計30內過生日的人話,是不是將365,改成30就可以啦!
小度:厲害厲害,會舉一反三啊!我這懂數學的,把公式編寫成這樣,還嫩嗎?還有BUG嗎?陸之涵!
黴黴一聽小陸的名字,回頭一看,高興說:師傅,你剛才去哪啦?我沒有找到你!
小陸:我被頭兒叫去開會了,我先殺殺他的銳氣,要不他不知道天高地厚啦!
他倆一口同聲的說:你有多少斤兩,別人不知道,我們可知道,有本事,別用我們的思路寫,哪算你能耐。
黴黴搶聲說:這種問題一共就那幾種思路,還能有什麼思路啊,你們難為人啊!
小度:o(︶︿︶)o 唉,還是人倆關係近,沒有關係,只要陸之涵說:「我不行,我也沒有招!」。
小陸:我還是那句話,數學用的好,得用對地方,今天還算及格,沒有太明顯的BUG,不過這點小事還難不到我,我用的就是別的方法,還不用if函數的那種,其實我用的方法,黴黴你應該能想到啊?
黴黴:是datedif函數嗎?我也覺得合適,就是好像有部分內容會報錯啊,我也正想問你來著,還有沒有別的函數!
小陸:不用別的,就是datedif函數。陸之涵就把最後的公式改為=iferror(datedif(today(),c2,"d"),"生日已過"),然後回車。
黴黴:師傅,真棒,更他們求的結果一樣啊,怎麼報錯也沒有影響正常結果啊!
小陸:為什麼報錯啊,不就是因為第2參數的日期小於第1參數嗎,不正式哪些已經過完生日的人嗎?我們用iferror過濾掉不就行了嗎?哪用什麼取餘法,比較大小啊?
小皮跟小度使個眼色說:我突然想起來,還有事要忙,就不打擾你們師徒聊天啦。
小度:o(︶︿︶)o 唉,差點忘了正事,走了走了!
黴黴正要說什麼的時候,小陸拽了一下她的衣角,等他們走遠了,說:其實方法沒有好壞,他們的方法也挺值得學習的,以後你也多向他們請教,你才能學到更多東西!
黴黴:嗯嗯,師傅,今天挺有收穫的,原來錯誤值也能這麼用啊,我還是第一次見。
小陸:在學的函數的時候,不要忽略錯誤值,因為有了這些錯誤值,我們才能更好的駕馭這些函數!好了,你整理一下發文件吧,我去完成任務啦!
新一輪的技術競技就這樣拉下帷幕,生活還在繼續,今後又會怎麼樣呢?我們一起期待吧!
本故事純屬虛構,如有雷同純屬巧合,
演員/角色:陸之涵/小陸,郭知黴 /黴黴 姜度華/小度 陳曉皮/小皮
我是愛講故事的我愛極客達人-小哥聊經驗,喜歡我的故事關注吧,帶你從另一角度了解學習Excel知識技巧。