将函数名称用作变量时的注意事项

时间:2017-06-01 13:52:54

标签: vba

在VBA中,可以处理UDF名称,就像Dim med变量一样。例如

Function ADD(a, b) As Long
ADD = a
ADD = ADD + b
End Function

ADD存储中间值以及最终结果。我的问题是;就幕后情况而言,在标准变量和函数名变量中存储数字/数据之间是否有任何区别。

我担心,如果使用函数名,变量更改时,调用函数的例程可能会更新,而不是仅在执行End Function时。 IE浏览器。如果你有一些代码

answer = ADD(1, 2)

然后在内存中answer被写入两次,一次是ADD = a,一次是ADD = ADD + b。当然我们没有看到这一点,因为答案留给了最终的ADD

我问,因为我经常发现我使用中间变量分阶段建立函数答案,然后将其传递给函数名本身,而我可以直接写入函数名。

E.g。

Function ADD(a, b) As Long
Dim tot As Long
tot = a
tot = tot + b
ADD = tot
End Function

vs第一个例子。它们实现同样的效果,在第二个示例中,tot表示公式结果,因此我们需要最后的ADD = tot行。为了速度,我想减少所做的任何写入,因此在使用第一种方法而不是声明中间体时,在速度方面是否有任何缺点,而不是可读性

注意,澄清一下,并非所有中间体,我只是指代表示函数结果的单个中间体,可以用代码中的函数名替换。

1 个答案:

答案 0 :(得分:2)

在速度方面,第一种方法应该稍快一些 - 你会减少一个变量(但我怀疑有人会注意到它)。

一般情况下,如果你不小心(或者如果你是VBA初学者),使用第一种方法可以带你进行递归:

Option Explicit

Dim lng10 As Long

Public Sub Test()

    lng10 = 0
    Debug.Print ADD2(1, 1)

End Sub

Function ADD2(a As Long, b As Long) As Long

    lng10 = lng10 + 1
    ADD2 = a + b

    If lng10 < 10 Then
        ADD2 = ADD2 + ADD2(1, 1)
    End If

End Function

如果递归没有底部,则会出现溢出错误。 换句话说,这将是一个运行时错误:

Option Explicit

Dim lng10 As Long

Public Sub Test()

    lng10 = 0
    Debug.Print ADD2(1, 1)

End Sub

Function ADD2(a As Long, b As Long) As Long

    lng10 = lng10 + 1
    ADD2 = ADD2(a, b)

End Function