打开或保存Excel时要触发的公式

时间:2016-10-06 18:08:28

标签: excel vba excel-vba

我的Excel中有几个自定义(VBA)公式。例子是

    = isfileExists(c3)
    = isReadOnly(c3)

对这些功能有多次调用(200 /列)

这些文件因为涉及繁重的VBA而减慢了文件的速度。我希望上述公式仅在用户打开文件或仅保存文件时运行!

如何在不触及“启用/禁用自动计算”的情况下继续执行此操作'? (请注意我知道如何编写事件函数,但我正在寻找一个可以放在其中/任何地方的想法)

我的示例是,在公式前面添加',每当用户打开/保存时,使用宏删除'(撇号);因此公式将计算。还有其他更容易的建议吗?

非常感谢!

2 个答案:

答案 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.BeforeSavePrivate Sub个事件,并让这两个处理程序调用一些[COLUMN_NAME]来负责写入您当前拥有这些UDF的单元格。

这样,只有在工作簿打开时和保存之前才会计算值。

引发磁盘I / O的UDF并不理想:对宏进行处理。