VBA:评估顺序

时间:2014-02-07 14:10:02

标签: vba operator-precedence

当VBA执行此行时:

GetClass1().Test(GetParam())

GetParam调用之前评估GetClass1()函数。

改变这种行为的好方法是什么?

我想出的唯一的解决方法就是:

With GetClass1
    .Test(GetParam())
End With

这是完整的示例代码,因此您可以轻松地对其进行测试:

的Class1

Option Explicit

Public Function Test(ByVal sText As String) As String
    Debug.Print "Class1.Text: " & sText
    Test = "Class1.Text: " & sText
End Function

模块1     选项明确

Private Function GetClass1() As Class1
    Set GetClass1 = New Class1
    Debug.Print "GetClass1()"
End Function

Private Function GetParam() As String
    GetParam = "Param"
    Debug.Print "GetParam()"
End Function


Private Sub Test()
    Debug.Print "Test=" + GetClass1().Test(GetParam())

    With GetClass1
        Debug.Print "TestWith=" + .Test(GetParam())
    End With
End Sub
运行Test()

时,

输出

GetParam()
GetClass1()
Class1.Text: Param
Test=Class1.Text: Param

GetClass1()
GetParam()
Class1.Text: Param
TestWith=Class1.Text: Param

1 个答案:

答案 0 :(得分:0)

我认为这里的评估顺序是可以的。嵌套函数的调用顺序是从最内层函数到最外层函数的调用顺序,不能区别对待,因为大多数函数需要知道它的参数,并且只有在执行内部函数之后才会对这些参数进行评估。

在你的代码中(第一种方式),在调用函数GetParam()之后创建类型为Class1的对象,这是因为在调用函数GetClass1()时创建了对象。在使用With GetClass1的第二种方式中,对象在使用后立即创建,并且调用堆栈看起来确实不同。

你可以做的是创建另一个类说'Wrap',这个类将负责创建Class1类型的实例。

E.g。像这样:

' Class module Wrap
Private m_class1 As Class1

Public Function GetClass1() As Class1
    Set GetClass1 = m_class1
    Debug.Print "GetClass1()"
End Function

Private Sub Class_Initialize()
    Set m_class1 = New Class1
End Sub  

' Module code
Private Function GetParam() As String
    GetParam = "Param"
    Debug.Print "GetParam()"
End Function

Private Sub Test()
    Dim wp As Wrap
    Set wp = New Wrap

    Debug.Print "Test=" + wp.GetClass1().Test(GetParam())

    Debug.Print "---------------------------------------"

    With New Wrap
        Debug.Print "TestWith=" + .GetClass1.Test(GetParam())
    End With
End Sub

这里类Class1的实例是在您为类Wrap调用New时准确创建的。所以Set wp = New Wrap执行并创建实例,并以同样的方式工作With New Wrap,它也会执行并创建实例。

但不要这样做:

Dim wp As New Wrap

...那么你将拥有与当函数GetClass1()是Module1的一部分时相同的行为,即:'在需要之前不创建实例'所以你无法控制创造的时刻。 HTH