怎么工作表中的数据老是自已在变?——这是易失性函数在作怪

怎么工作表中的数据老是自已在变?——这是易失性函数在作怪!请仔细看下图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)语句 。

    推荐阅读