在論壇很多人都奇怪,為什么老師們一個很簡潔的公式寫出來的效果,我要寫一長串?
在函數(shù)圈有一句話:”思路決定出路”,很多時候你寫的公式長度取決于你知道的函數(shù)數(shù)量和參數(shù)性質(zhì)。
以下是一些典型化簡案例,希望對大家有所幫助。
1,填0占位
把數(shù)字控制成固定位數(shù)的字符串,新手通常使用TEXT的第二參數(shù)添加添加對應(yīng)個數(shù)的0解決,所以總是要在心里默數(shù)0的個數(shù)。
大佬從來不數(shù)0,而是而是用REPT的第二參數(shù)來控制0的個數(shù)。
萌新默默路過,借助BASE函數(shù)的第三參數(shù)來指定0的個數(shù)。
(BASE2參數(shù)為指定的進制數(shù),這個用法下數(shù)據(jù)10進制不變,故2參數(shù)固定為10(進制))。
因為能對數(shù)字位數(shù)處理的函數(shù)不是只有文本函數(shù)的(注意BASE是2013新增的)。
2,定位最后1個”-”的位置
新手一般不了解數(shù)組公式,因此要先用LEN+SUBSTITUTE的思路確認”-”的數(shù)量后作為SUBSTITUTE的4參數(shù)(此時只替換這個”-”),
把最后這個“-”替換為一個字符串內(nèi)不存在的特殊字符(這里用@),利用FIND查找這個特殊字符的位置,即為結(jié)果。
大佬都是熟悉數(shù)組的,利用二分法以大欺小原則下的1,0/結(jié)構(gòu)來比較每個字符是否為”-”,結(jié)果即最后1個”-”的位置。
論壇的萌新熟悉各種函數(shù)的各參數(shù),利用FIND的3參數(shù)性質(zhì)配合能忽略錯誤值的COUNT,計數(shù)結(jié)果就是所求。
3,日期類計算
求本月最后1個周六的對應(yīng)日期:
日期類問題是函數(shù)問題里一類相對比較常見的題目,新手通常處理成下個月第1天后用WEEKDAY的差值(注意此時這函數(shù)2參數(shù))返回上一個周六。
大佬在日期函數(shù)基礎(chǔ)上可以用MOD來簡化公式。
而”萌新”在解決日期類問題時,經(jīng)常直接把函數(shù)題變成數(shù)學(xué)題來大幅簡化公式。
4,日期類計算Ⅱ
計算兩個日期之間,周一/周三/周五的總天數(shù):
新手公式:
=SUMPRODUCT(N(WEEKDAY(ROW(INDIRECT(A2&':'&B2)),2)=1))
+SUMPRODUCT(N(WEEKDAY(ROW(INDIRECT(A2&':'&B2)),2)=3))
+SUMPRODUCT(N(WEEKDAY(ROW(INDIRECT(A2&':'&B2)),2)=5))
這類題純新手很難在不使用輔助列的前提下實現(xiàn),會百度的小伙伴可能會用第1個公式的思路分別求2個日期間周一/周三/周五的分別天數(shù)再求和。
大佬公式:
=SUMPRODUCT(N(WEEKDAY(ROW(INDIRECT(A2&':'&B2)),2)={1,3,5}))
大佬的數(shù)組公式都是很熟練的,可以把3段簡化為1段,利用二維數(shù)組簡化公式。
萌新公式:
=NETWORKDAYS.INTL(A2,B2,'0101011')
”萌新”總是能找到正確的函數(shù)做正確的事情,利用NETWORKDAYS.INTL的3參數(shù)利用1和0的7位數(shù)序列來指定控制計算周幾。
(周末字符串值的長度為七個字符,并且字符串中的每個字符表示一周中的一天(從星期一開始)? 1 表示非工作日,0 表示工作日? 在字符串中僅允許使用字符 1 和 0? 使用 1111111 將始終返回0?
例如,0000011 結(jié)果為星期六和星期日是周末。因此某些不以周六和周日為指定休息日的計算,用NETWORKDAYS.INTL和WORKDAY.INTL這兩個函數(shù)會簡化很多。
5,判斷勝負
新手公式
=IF(--LEFT(B2,FIND('-',B2)-1)>--MID(B2,FIND('-',B2)+1,9),'勝',IF(--LEFT(B2,FIND('-',B2)-1)=--MID(B2,FIND('-',B2)+1,9),'平','負'))
大佬公式
=TEXT(LEFT(B2,FIND('-',B2)-1)-MID(B2,FIND('-',B2)+1,9),'勝;負;平')
萌新公式
=TEXT(IMREAL(IMDIV(B2&'I','1+I')),'勝;負;平')
這類問題新手只會先把兩部分比分,分別提取出來比較或計算差值,用IF分別判斷差值分別為正數(shù),負數(shù)或者0來確認結(jié)果是勝負還是平局。
大佬會使用TEXT來把2次IF簡化為TEXT的正數(shù)位;負數(shù)位;0位來獲取對應(yīng)結(jié)果。
至于”萌新”,能只引用1次的絕不引用2次數(shù)據(jù)源,利用復(fù)數(shù)結(jié)構(gòu)和IMDIV的特殊算法來簡化計算A+B(I)的復(fù)數(shù)結(jié)構(gòu)的A+B的結(jié)果(這里的數(shù)據(jù)結(jié)構(gòu)B是負值)。
(利用對應(yīng)參數(shù)C+DI實現(xiàn)AC+BD 為A-B算法,用IMREAL提取復(fù)數(shù)結(jié)構(gòu)中的實部系數(shù),即為需要的2個數(shù)的差值的正負情況。
6,最大值之和
求各學(xué)科的最大值之和
新手有多少列,就用多少個MAX。
=MAX(B2:B6)+MAX(C2:C6)+MAX(D2:D6)+MAX(E2:E6)+MAX(F2:F6)+MAX(G2:G6)+MAX(H2:H6)+MAX(I2:I6)
大佬都是熟悉多維引用的,利用SUBTOTAL和OFFSET的多維引用效果進行求和
=SUM(SUBTOTAL(4,OFFSET(A2:A6,,COLUMN(A:H))))
(注意數(shù)組三鍵)
而對于”萌新”而言,能用于多維引用的函數(shù)不僅僅是SUBTOTAL和SUMIF這些,數(shù)據(jù)庫函數(shù)也是可以的
=SUM(DMAX(A1:I6,COLUMN(B:I),Z1:Z2))
(注意數(shù)組三鍵,Z1:Z2是任意空白區(qū)域,利用數(shù)據(jù)庫函數(shù)性質(zhì)默認條件為全部)
7,不規(guī)范時間格式處理
很多時候數(shù)據(jù)源是不規(guī)范的,譬如我們要用這種小數(shù)處理成正確的對應(yīng)時間格式。
新手通常分別分別提取小時和分鐘部分后用TIME函數(shù)構(gòu)成對應(yīng)的正確時間(這里INT和MOD*100已經(jīng)是簡潔思路了,如果用LEFT+FIND會更繁瑣)。
大佬級會直接*100處理成整數(shù)后用TEXT進行格式處理,變成正確的時間格式,最后用減負運算變成真數(shù)值(時間)。
“萌新”利用財務(wù)函數(shù)DOLLARDE對小數(shù)部分進行進制換算后直接用時間計算方式(1天是24小時)處理成正確時間。
這個函數(shù)適合處理這種整數(shù)和小數(shù)位的進制換算不同的情況。
人外有人,天外有天,函數(shù)這條路是沒有終點的,簡化公式不僅是為了鍛煉提升,也是為了把正確的函數(shù)拿來做正確的事情?
今天的示例文件在此:
https://pan.baidu.com/s/151v1VF28mDA4GAE37RQsfA
作者:流浪鐵匠