函数作为参数传递以获得其值

时间:2019-11-28 09:32:42

标签: excel vba

我最近在VBA中发现了这种方法,您可以通过将一个函数值作为另一个函数的参数传递来填充该函数值,然后在填充另一个函数的参数时将其链接到第一个函数值。 / p>

澄清说明:老师解释的这个想法是,有时您的功能很复杂,然后我们可以从结果中提取一些信息。而且这些功能是要在excel中使用的,因此,您不必创建复杂的功能,而要让人们调用复杂的功能,例如result1 et和result2,它将被我们想要的值填充。

以下是代码(已编辑,抱歉,我忘记了):

Function f(* a lot of parameters *, Optional result1 As Variant, Optional result2 as Variant) as Boolean
    raw_result = * a lot of calculus *
    result1 = raw_result
    result2 = -raw_result
    f = True
End Function

Function result1(* same parameters than f *) as Double
    ' I will give result1
    Call f(* same parameters than f *, result1)
End Function

Function result2(* same parameters than f *) as Double
    'Two coma on purpose to access the second optional parameters
    Call f(* same parameters than f *,, result2)
End Function

在这里,如果我做result1(* same parameter than f*),它将为我带来raw_result的价值。

这个概念背后的理论是什么,它是如何工作的,并且仅仅是VBA的事情?

3 个答案:

答案 0 :(得分:2)

我将其更改为可以运行的示例:

Option Explicit

Sub Test()
    Debug.Print result1(1, 2, 3)
    Debug.Print result2(1, 2, 3)
End Sub


Function f(a, b, c, Optional result1 As Variant, Optional result2 As Variant) As Boolean
    Dim raw_result
    raw_result = a + b + c
    result1 = raw_result
    result2 = -raw_result
    f = True
End Function

Function result1(a, b, c) As Double
    ' I will give result1
     Call f(a, b, c, result1)
End Function

Function result2(a, b, c) As Double
    'Two coma on purpose to access the second optional parameters
    Call f(a, b, c, , result2)
End Function

在这种情况下,result1result2都提交了ByRef(这是VBA中的默认设置),而不是ByVal

此行

Function f(a, b, c, Optional result1 As Variant, Optional result2 As Variant) As Boolean

(默认情况下)与

完全相同
Function f(a, b, c, Optional ByRef result1 As Variant, Optional ByRef result2 As Variant) As Boolean

如果将其更改为ByVal

Function f(a, b, c, Optional ByVal result1 As Variant, Optional ByVal result2 As Variant) As Boolean

然后Test()的结果将是0,因为在result1result2中什么都不能返回(无引用)。

这是另一个示例

Sub TestIt()
    Dim VarA As Long
    VarA = 1

    Dim VarB As Long
    VarB = 2

    MyProcedure VarA, VarB '≙ 1, 2

    Debug.Print VarA, VarB 'output is 10, 2
End Sub

Sub MyProcedure(ByRef ParamA As Long, ByVal ParamB As Long)
    ParamA = 10 'will be returned to VarA because it is referenced (ByRef)
    ParamB = 20 'will NOT be returned to VarB because it is NOT referenced.
End Sub

不同之处在于……

  • 如果您提交像ByRef这样的变量ParamA,则您的过程(或函数)会将ParamA的所有更改返回到变量VarA

  • 如果提交变量ByVal,则不会提交变量,而只会提交其值。因此,您的过程(或函数)无法返回任何更改。

答案 1 :(得分:1)

我不确定您在这里做什么的意思,但是该函数不过是一个不必要的嵌套函数。第二个函数中的g不会在执行时使用,b也不是可选参数。

例如,对于g(3)会发生什么:将a替换为“ 3”

Function g("3" as integer)
    g = f("3", "blank")
End Function
Function f("3" As Integer, Optional "Blank" As Variant)
    b = "3" * 2
    f = b (=6)
End Function

表示返回第一个功能时,您的答案是6。

为澄清起见:g将不具有任何值,除非评估=之后的所有内容。然后,在对此求值后,g将保留一个值,但是由于该函数仅运行一次,因此不会重新求值。

尽管如此,即使您例如将g传递为6,它也会被第二个函数(在这里被称为b)丢弃,因为它的第一个动作是分配新值到b,覆盖它拥有的任何值。

编辑:随着问题的改变,我的答案也必须改变。您正在做的事情的问题是无论您叫什么(result1result2),都不会得出不同的结果。无论调用函数f的方式是什么,以及在函数内部进行的任何操作,返回的唯一内容就是将f设置为True。因此,您可以在result1result2中进行大量计算,调用其中任何一个的唯一收益就是“ True”。

这种嵌套函数的方法不是从函数中获得不同结果的正确方法。但是,可以通过在result1函数中将result2f声明为公共,然后稍后再访问它们来实现。

答案 2 :(得分:0)

在VBA中,您可以在函数内access/assign为函数名称指定一个值,并且不能像在C#Func<T1, T2, TResult>中那样传递实际函数

Function g(a as integer)
    'Here you are allowed do read or write values to the function name g.

    'g = 10 ' assigning a return value

    'debug.print g 'Now reading the value


    g = f(a,g) ' here you are not passing a function as parameter. You are passing the return value of g as a parameter. Which in your case g would be empty like. g = f(3, empty) 
End Function