我的Excel中有几个自定义(VBA)公式。例子是
= isfileExists(c3)
= isReadOnly(c3)
对这些功能有多次调用(200 /列)
这些文件因为涉及繁重的VBA而减慢了文件的速度。我希望上述公式仅在用户打开文件或仅保存文件时运行!
如何在不触及“启用/禁用自动计算”的情况下继续执行此操作'? (请注意我知道如何编写事件函数,但我正在寻找一个可以放在其中/任何地方的想法)
我的示例是,在公式前面添加'
,每当用户打开/保存时,使用宏删除'
(撇号);因此公式将计算。还有其他更容易的建议吗?
非常感谢!
答案 0 :(得分:2)
您可以将公式结果缓存到全局(或函数内部的静态)字典对象中:一旦您可以使用缓存结果而不是重复文件检查,就检查了文件。
Public Function ExpensiveCheck(fpath As String) As Boolean
Static dict As Object, ans As Boolean
'create the dictionary if not already created
If dict Is Nothing Then
Set dict = CreateObject("scripting.dictionary")
End If
If Not dict.exists(fpath) Then
ans = (Dir(fpath, vbNormal) <> "") 'do your checking here
dict.Add fpath, ans
End If
ExpensiveCheck = dict(fpath)
End Function
会话结束时dict会丢失,因此公式应该在打开文件时刷新缓存。
如果您想在检查文件中进行一些更改后更新输出,则可能需要一些机制来清除/刷新缓存。
答案 1 :(得分:1)
如果您不希望UDF与其他工作表单元格一起计算,那么您不需要UDF;将它们Private
设置为Option Private Module
,或将Workbook.Open
粘贴到标准模块的顶部,以使其无法用作自定义工作表函数。
然后处理Workbook.BeforeSave
和Private Sub
个事件,并让这两个处理程序调用一些[COLUMN_NAME]
来负责写入您当前拥有这些UDF的单元格。
这样,只有在工作簿打开时和保存之前才会计算值。
引发磁盘I / O的UDF并不理想:对宏进行处理。