什麼,函數的易失性?也許很多朋友都沒有聽過這個概念吧。但是應該很多人都有過如下的體會:有時候我們打開一個工作簿不做任何更改就關閉了,Excel還是會提示
"是否保存對文檔的更改?"。或者是另外一種情況,有時當我們的表格數據稍微大點的時候,經常會出現Excel間斷性卡頓的問題。恭喜你,如果你曾經有過以上的經歷,那麼你就是在不知不覺中使用了具有Volatile特性的函數,也就是"易失性函數"。那麼,常見的易失性函數有哪些呢?獲取隨機數的RAND()函數和RANDBETWEEN函數、獲取當前時間的NOW()函數、獲取當前日期的TODAY()函數、返回動態引用的OFFSET函數和INDIRECT函數。大家應該也比較容易理解了,所謂的易失性就是該函數的返回值在工作表數據沒有任何變化的前提下也是會發生變化的,這就會導致這類函數不斷的進行自動重算。如果我們在工作表中大量的使用了此類易失性函數,就會因為該類函數頻繁的計算而佔用大量的系統資源,從而影響運行的速度。
除了這一些顯性的易失性函數外,其他的一些函數在引用區域具有不確定性的時候,每當有單元格被重新編輯,也會引發工作表重新計算,也會變成易失性函數喲。比如請看下面的一個例子。
![Excel工作表太卡頓,也許是Excel函數的易失性在作怪](http://p2.ttnews.xyz/loading.gif)
一、我們要計算所有鋼筆的總價格,可以使用sumif函數,公式如下:
=SUMIF(B2:B18,"鋼筆",D2)
該函數的第三個參數sum_range應該是D2:D18(與第一個參數的區域大小相同),此處簡寫為D2,讓該函數自動擴充。
使用建議:使用這種寫法,雖然能夠使公式得到一定的簡化,但是會在每次打開工作簿的時候都需要重新定位單元格區域,造成易失性,建議不這樣使用。
二、或者我們計算D3:D8的總和,會使用到一種求和方法:
第一種:=SUM(D3:D8)
第一種:=SUM(INDEX(D:D,3):INDEX(D:D,8))
第二種:=SUM(INDEX(D2:D18,2):INDEX(D2:D18,7))
以上三種方法都實現了計算D3:D8的和,但是後兩種方式使用INDEX這種特殊結構對單元格區域進行動態引用,同樣在每次打開工作簿的時候都需要重新定位單元格區域,造成易失性,建議儘量避免使用。
小貼士:易失性函數在以下的場景下不會引發自動重算。
(1) 當將計算選項設置為【手工重新計算】時。
(2) 當手工設置列寬、行高時,但隱藏行或者設置行高值為0除外。
(3) 當設置單元格格式或其他的更改顯示屬性的設置時。
(4) 激活單元格或編輯單元格內容但是按【ESC】鍵取消時。
根據我們以上的描述,我們之後在Excel的公式函數的設計中,要多多注意函數的易失性這個問題,儘量避免使用直接的易失性函數。同時,在對一些函數的參數設置時,在可能的情況下儘量不要大量的使用動態的單元格區域引用,避免出現函數的易失性,造成大量的計算佔用計算機資源,造成電腦卡頓現象。
如果需要獲取本教程的演示文件,請點擊我名字後面的關注,然後私信【函數易失性】獲取。
閱讀更多 Excel函數公式技巧 的文章