2017-06-01 117 views
1

在VBA中,您可以可以对待UDF名称,就像Dim med变量一样。例如,使用函数名称作为变量时的注意事项

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

其中ADD存储中间值以及最终结果。我的问题是;在这是怎么回事幕后而言,有存储号码/件数据的标准可变VS函数名变量之间的任何差别。


我担心,只要变量的变化,如果你使用的函数名,而不是仅在执行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第一个例子。他们acheive同样的事情,在第二个例子中tot表示式的结果,所以我们需要在年底最后ADD = tot线。对于速度,我想,以减少所做的任何写操作,那么有没有在速度方面的任何缺点,没有可读性使用第一种方法,而不是宣布中间体?

NB,澄清,这还不是全部的中间体,我只是意味着代表函数结果,并可以通过在代码的函数名来代替单一的中间。

+0

@CallumDA,为什么标签编辑 - 我不认为这一定是做Excel中,它只是为了吸引正确的类的关注呢? – Greedo

+0

是的,如果你不同意,随时删除它们。 – CallumDA

+0

嗯,我已经找到了一个考虑因素;如果该函数返回一个数组,然后试图设置该数组的一个元素看起来就像试图调用该函数一样! VBA不喜欢那个 – Greedo

回答

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 
+0

通过第一个调试看起来很奇怪 – Greedo

+1

@Greedo - 2.一个抛出错误。 – Vityata

+0

@Greedo - 关于代码的第一部分,它很奇怪/怪异,因为递归函数的结果保存在一个堆栈中,最后它们被用于计算。如果您将代码“翻译”为C#,则在Visual Studio中,这将在“调用堆栈”中可见。 – Vityata