当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
答案 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