能否让我的自定义函数只计算一次?
能否让我的自定义函数只计算一次?
我在EXCEL中定义了一个自定义的函数。类似如下:
Function myttt(a, b) As Double
'类似哈,但是执行比较慢,要10多秒
myttt = a * b
End Function
由于这个文件定义成了自动计算,结果每次打开的时候,EXCEL都会重新调用这个函数,结果造成EXCEL文件打开很慢(要十多分钟)。
因为有很多个单元格都调用了这个函数。嘿嘿。
我想,能否有种方法,让这个函数每个单元格只执行一次就ok了。
也就是说,在我这个函数里面自己判断调用他的单元格,
如果不等于0,就执行,否则就停止执行。
结果经过版主的指点,我知道函数是可以自己被哪个单元格调用的,
方法是调用Application.Caller。
很接近成功了,是不是。可惜,很可惜,问题出现了。
我的代码改成了:
Function myttt(a, b) As Double
dim t
t= Application.Caller.value
'类似哈,但是执行比较慢,要10多秒
if t <> 0 then
myttt = a * b
else
myttt=t '原值返回,就不慢了
end if
End Function
结果这个函数一执行就报错。EXCEL说发现有一个循环调用的方法。
我调试还发现,Application.Caller.Text不会报错,但是永远=0。
请问诸位有没有什么好方法哈?或者想法也可以,我来实现。拜求了!!!!
-------------
我的其他尝试:
1、把这个EXCEL改成手工计算,打开变快了。
但是用户编辑的时候,需要自动计算环境。结果一旦把EXCEL改回成自动计算,
EXCEL默认会自动把所有单元格都算一遍,结果,又是等待10多分钟才改得回来。
2、尝试把EXCEL文件设成保护。结果发现即使EXCEL文件设置成保护,在自动计算模式下,
一打开的时候,EXCEL还是会把每个单元格计算一遍。盖滋果然心理**啊。
-------------
当然了,我这个问题也很**。希望有高手支招。谢谢!
[解决办法]
用公式就会导致重新计算,看上去没什么好办法
再给你个折中的方案:
在beforesave事件中扫描所有单元格
把公式的值写入单元格
不足之处就是对固化后的数据做修改可能损害数据一致性
再来一个方案:
采用辅助列做标识位
在最后一列可视数据之后增加一列并设为隐藏