怎么工作表中的數據老是自已在變?——這是易失性函數在作怪!請仔細看下圖1中的工作表。
圖1
當我們在工作表單元格中輸入數據時,單元格B3和B5中的值都會自動發生變化。首先聲明,我沒有在工作表事件中編寫VBA代碼來實現這個自動變化的功能,而是在單元格B3中輸入了公式:
=NOW()
在單元格B5中輸入了公式:
=RAND()
那么,它們為什么會自動變化呢?
有時候,我們打開一個工作簿,并沒有作任何修改或輸入,在關閉該工作簿時,Excel卻提示要保存修改,這又是為什么呢?
其實,這都是Excel的“易失性”函數在作怪。
在Excel中,存在著一些函數,每當Excel需要計算(包括重新計算、打開工作表或編輯工作表中的單元格)工作表的任意部分時,包含著這些函數的單元格也會同時進行重新計算,其值也會發生變化,這些函數稱為“易失性函數”。
Excel的易失性函數有哪些?
一些Excel函數明顯是易失性函數,包括:RAND函數、NOW函數、TODAY函數。
一些Excel函數看不出是易失性函數,包括:OFFSET函數、CELL函數、INDIRECT函數、INFO函數。
一些函數在有些Excel版本中是易失的但在另外的Excel版本中不是,例如在Excel 97中INDEX函數變成了非易失性函數。
一些函數在Microsoft的文檔中描述是易失的,但在實際測試時似乎是非易失的,包括:INDEX函數、ROWS函數、COLUMNS函數、AREAS函數和CELL函數。
SUMIF的一個特殊語法在Excel 2002及后續版本中是易失的:
=SUMIF(A1:A5,”>0”,B1)是易失的,而=SUMIF(A1:A5,”>0”,B1:B5)是非易失的。
如何使一個用戶自定義函數(UDF)成為易失的?
在創建用戶自定義函數時,在第一行編寫語句:
Application.Volatile True
可以讓自定義函數為易失性函數。這樣,一旦重新計算工作表,都會強制計算這個函數。
記住,該語句必須在用戶自定義函數的第一行。
例如,下面的自定義函數模仿Excel內置的RAND函數:
Function InitateRand()
Application.Volatile True
InitateRand = Rnd()
End Function
在工作表單元格中輸入公式:
=InitateRand()
將與RAND函數一樣,在每次工作表重新計算時其值都會發生變化。
將’Application.Volatile(False)’應用于易失性函數能夠使其成為不易失的嗎?
無論什么情形,都不能將Application.Volatile(False)應用于內置的Excel函數,除非重新編寫一個與內置函數作用相同的用戶自定函數(UDF)并應用了Application.Volatile(False)語句。