能否让我的自定义函数只计算一次?

cooler 2007-03-02 02:43:53
能否让我的自定义函数只计算一次?
我在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还是会把每个单元格计算一遍。盖滋果然心理**啊。

-------------

当然了,我这个问题也很**。希望有高手支招。谢谢!

...全文
485 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
cooler 2007-03-07
  • 打赏
  • 举报
回复
搞定了。
方法比较简单。

把计算结果放到EXCEL中,重新计算的时候,判断有没有这个结果的变量,存在就取值,否则就重新计算。呵呵。

EXCEL中存变量的方法:
'设定EXCEL文档参数值
' msoPropertyTypeNumber = 1,
' msoPropertyTypeBoolean = 2,
' msoPropertyTypeDate = 3,
' msoPropertyTypeString = 4,
' msoPropertyTypeFloat = 5
Private Sub setP(name As String, value, Optional valuetype As Integer = 4)
On Error Resume Next
If name = "" Or name = Null Then
Exit Sub
End If

'MsgBox name & "|" & value

Dim p
Set p = ExcelWorkbook.CustomDocumentProperties(name)
If p Is Nothing Then
Set p = ExcelWorkbook.CustomDocumentProperties.Add(name:=name, LinkToContent:=False, _
Type:=valuetype, value:=value)
p.value = value
Else
p.value = value
End If
Set p = Nothing
End Sub
'获得EXCEL文档参数值
Private Function getP(name As String)
On Error Resume Next
Dim p
Set p = ExcelWorkbook.CustomDocumentProperties(name)
If p Is Nothing Then
getP = ""
Else
getP = p.value
End If
Set p = Nothing
End Function
DawnPine 2007-03-05
  • 打赏
  • 举报
回复
用公式就会导致重新计算,看上去没什么好办法

再给你个折中的方案:
在beforesave事件中扫描所有单元格
把公式的值写入单元格
不足之处就是对固化后的数据做修改可能损害数据一致性

再来一个方案:
采用辅助列做标识位
在最后一列可视数据之后增加一列并设为隐藏
cooler 2007-03-05
  • 打赏
  • 举报
回复
谢谢。不过这等于是完全抛弃了EXECL的所长啊。


我还在找一种用户性更号的方法。不过感谢支招
DawnPine 2007-03-02
  • 打赏
  • 举报
回复
不要用自定义函数
改用事件
假设你的公式是A=B+C
一旦发现B或C有变化则重算 并把计算结果写入A

建议使用
Private Sub Worksheet_SelectionChange(ByVal Target As Range)

End Sub

2,506

社区成员

发帖
与我相关
我的任务
社区描述
VBA(Visual Basic for Applications)是Visual Basic的一种宏语言,是在其桌面应用程序中执行通用的自动化(OLE)任务的编程语言。
社区管理员
  • VBA
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧