今天和大家來分享高級篇,高級篇嘛,當然是以燒腦為主,介紹一些在論壇和QQ群困擾了很多人的公式錯誤原因。
1,EDATE和EOMONTH到底能不能返回數組?
有些時候需要引用數據源返回相關的數組結果,但很多小盆友引用了區域后發現EOMONTH這些函數結果是報錯的。
因此得出一個結論,這批函數在引用區域后是不能返回數組的。
但是,這只是因為這批函數性質特殊而已,稍微加點料就可以返回數組了。
數據源區域只要*1,- -等把直接引用轉化為內存數組,就可以使這批函數在引用區域后成功返回數組結果。
這是個很偏門的性質,具有這種性質的函數有EDATE,EOMONTH,WEEKNUM,QUOTIENT/DELTA等等。共同點是,這批函數在2003版需要加載工具庫才能使用,這或許就是這批函數具有這個奇葩性質的原因。
2)高精度浮點
這個性質也是坑過無數老司機的:
這個性質在于,這種浮點數在目前函數階段,F9,公式求值,格式小數位數,等號比較等等多種方法都無法檢測出來,但就是會造成MATCH,VLOOKUP,RANK,MODE,FREQUENCY等函數的結果異常。
因為這種浮點超過了Excel的15位精度,所以無法顯示,但部分函數還是會識別這種差異,重點是影響上面幾個函數的結果(這種精度差異可以使用DELTA函數檢查)。
解決方法是使用ROUND等修正這類數值的實際精度,或者換成不識別這種精度的函數或判斷式(等號比較不識別這種差異)。
3)真偽內存數組和365動態數組性質差異
365前的版本VLOOKUP和INDEX等函數有一類性質。如果VLOOKUP的第1參數和INDEX的第2/3參數,直接使用數組,并不能使整個VLOOKUP或INDEX返回內存數組。
雖然可以以區域數組方式錄入多個單元格返回對應的多個結果,但并不能作為真內存數組用于后續計算,因此這個性質被稱為偽內存數組。
如果要把INDEX的結果變成真內存數組,必須加N/T+IF結構來進行轉化。
而自從出現了365版本,真偽內存數組性質發生了變化:
即365下部分公式使用三鍵和不使用三鍵,結果是會有區別的,
即通常在不使用三鍵環境下,365版本會把早期版本的偽內存結構直接形成真內存數組,但如果使用三鍵,還是早期版本的偽內存數組性質,這個性質主要在早期版本的偽內存數組和多維引用兩種公式結構下存在。
4) 1和{1}的區別
這類性質,通常出現在涉及INDIRECT或OFFSET的動態引用問題內,INDIRECT或OFFSET函數配合ROW或COLUMN函數時容易出現。
很多人會被這個錯誤困擾不知道如何解決,其實這個公式之所以錯誤,根源在于ROW函數,因為ROW(A1)的結果為{1},注意這是1個單元素的數組。
而INDIRECT和OFFSET都是容易構造多維引用的,所以目前的觀點上面公式錯誤和這兩個函數的多維引用下的降維理論有關。
解決方法也很簡單,1是在ROW外面套個聚合函數,SUM/MAX/MIN等等均可,目的是把{1}變成常量1,就不會出現類似錯誤了。
5)時間精度
Excel里的時間精度到千分之一毫秒,即YYYY/MM/DDHH:MM:SS.000
到了時間階段,Excel里的日期函數會出現兩大陣營。部分日期函數對日期的識別僅到日期部分,不考慮時間范圍。
但還有部分日期函數,對日期的識別精度達到了這個毫秒級,時間不大于23:59:59.499的日期識別為當天,但23:59:59.500-23:59:59.999的范圍會被識別為第2天。
測試表明DAY、WEEKDAY、YEAR、MONTH、HOUR、MINUTE、SECOND、DAYS360與TEXT的日期時間格式處理,對日期時間的識別不完全按照日期部分,
這幾個函數對日期的識別范圍至少到毫秒的精度,23:59:59.499(含)前識別為當日日期,23:59:59.500開始識別為第2天。
而DAYS、EDATE、EOMONTH、WEEKNUM、ISOWEEKNUM、WORKDAY(.INTL)、NETWORKDAYS(.INTL)、YEARFRAC這10個函數對日期時間的識別僅識別日期部分,嚴格取整,與時間范疇無關。
因此如果你們的軟件導出數據時間精度達到毫秒級,請注意這個精度差異對結果的影響。
6)參數上限
有些函數具有內置上限,這個上限會限制這些函數的使用,其中大部分函數在超過上限后是會報錯的,例如MOD函數:
但是,少數函數在超過上限后不會報錯而是返回特殊結果,這類性質比較隱蔽,會影響函數運算結果,例如DATE函數:
這個函數的優勢是例如第3參數大于本月天數時,會自動把函數結果轉化為對應的有效日期。但這個函數有內置參數,第3參數有效的最大值只有32767,超過32767的數值都會縮減到32767進行日期換算,故需要注意這個性質避免轉化的日期結果異常。
7)數組和引用
曾經寫過一篇文章介紹AGGREGATE函數,這個函數堪稱函數小霸王,因為這個函數是19個函數的集合體,然而有些新手在沒看完攻略的前提下想用這個函數對某個內存數組忽略錯誤值求和。
9是對應求和SUM,6是忽略錯誤值,然而發現結果還是錯的,
AGGREGATE是個神奇的函數,有兩種形式:向量型和數組型。
Excel里具有2種形式的函數不多,除了AGGREGATE外常見的還有INDEX和LOOKUP,這其中AGGREGATE由于某些性質是最特殊的。
注意AGGREGATE的參數,數組型里的第4參數為K值,而AGGREGATE的第1參數對應的19個函數里,只有14-19的6個函數是具有K值的。
所以關于AGGREGATE的最大局限就是,只有在替代LARGE,SMALL,PERCENTILE,QUARTILE這幾個函數時,第3參數才支持數組,否則只支持引用,這是這個函數的最大局限。
因此上面用AGGREGATE針對數據源存在錯誤值時的求和,3參數只能使用引用,不支持數組。
8)你不知道的性質
Excel有大量簡寫模式和特殊識別的字符串規則:
0-12的整數+空格+A / P 為整點時間的縮寫表達式,可以被Excel直接識別為時間的(12 A 為12:00 AM實際為0:00故結果為0)。
這些特殊規則很多,都可能影響你的計算結果:
(小編測試過很多最特殊的,大概是下面這個從2013版本開始出現的以空格+冒號開頭的特殊表達式)
很多時候,你自認為公式是正確的,但結果異常,很多時候就是因為你并沒有了解Excel的這些特殊規則和機制造成的。
因此,學習函數不是一朝一夕的事情,只有多練習,多看別人的文章和公式,才能隨心所欲,否則就可能出現各式各樣的問題。
好了,今天的內容就是這些吧,我是流浪鐵匠,點個贊,咱們一起走天涯。