仅在触发器打开时计算Excel函数

xcitsw88  于 2023-06-25  发布在  其他
关注(0)|答案(1)|浏览(104)

我有一个自定义Excel函数,运行时间很长。我想在工作簿中保持自动公式计算打开,但只有在将单元格切换为TRUE时才计算此特定公式(如果可以通过VBA以某种方式切换公式也可以)。我看到的一个建议是将函数调用 Package 在IF()语句中。例如,假设公式位于单元格A1中,公式的参数位于单元格A2中,TRUE/FALSE触发器位于单元格A3中。那么A1中的公式如下所示
=IF(A3, MYFUNC(A2), A1)
如果A3==TRUE,则计算MYFUNC(A2),否则将返回单元格的现有值。然而,我发现这样做的问题是,如果我将A3从TRUE切换到FALSE,然后再切换回TRUE,那么MYFUNC()总是会重新求值,即使它的输入A2没有改变。我在工作簿的不同部分对MYFUNC()进行了多次调用,由于执行该函数非常耗时,因此我只希望在其中一个输入发生更改时执行该函数。请注意,虽然这里MYFUNC()接受单个标量输入,但实际上它可能会变得更复杂,并接受多个范围作为输入。

bvpmtnay

bvpmtnay1#

实际上,我认为这是出乎意料的,你并不真的想要一个自定义函数,但是

  • Function切换到VBA Public Sub MyFunc(..
  • 添加一个按钮和“分配宏”来调用你的逻辑

这可能会表现得更像用户期望的方式
如果您 * 必须 * 拥有Function,请考虑通过添加专用检查在内部将其短路
使用一些默认参数来使其更易于使用(我建议将触发器设置为必需的,但还是更喜欢使用纯VBA和宏来触发它)

Function MYFUNC(Target as Range, _
    Optional Trigger As Range = A2, _
    Optional UnTriggeredDefault As Variant = 0) As Variant

    ' Bonus Features
    '   logic to detect improper Trigger range
    '   logic to allow UnTriggeredDefault to be a Cell/Range
    '   make Default an Error like xlErrNA ?
    '   accept other values or detect False for Trigger.Value

    If Trigger.Value != True Then
        MYFUNC = UnTriggeredDefault
        Exit Function
    End If

    ' rest of your logic

End Function

这样做的一个优点是,您可以添加一个额外的列(或Range,它专用于一些更大或更小的Range?)来触发单独的计算,同时还防止重新计算MYFUNC()的每个示例(如果A2设置为False,则撤消已经完成的工作)
对不起,我没有Excel的副本来测试这一点,但我愿意改进!

相关问题