Vba Can UDT';是否以任何方式将其用作方法参数?
多年来,我一直在避免在VBA中使用Vba Can UDT';是否以任何方式将其用作方法参数?,vba,com,vb6,user-defined-types,Vba,Com,Vb6,User Defined Types,多年来,我一直在避免在VBA中使用Public TypeUDT,因为它们很难传递,而且我从来没有真正费心去理解原因。。到目前为止,创建一个类模块并处理实际对象更简单 但最近我尝试了一下,一旦我认为它们必须通过ByRefByRef(就像数组一样),事情开始看起来我可以开始使用它们了 所以我在一个标准模块中定义了一个公共类型,得到了这个编译错误: 因此,我将Public类型移动到一个类模块中,使类publicnotcreatible,然后得到这个编译错误: 下面是一些重现编译错误的代码 类模块
Public Type
UDT,因为它们很难传递,而且我从来没有真正费心去理解原因。。到目前为止,创建一个类模块并处理实际对象更简单
但最近我尝试了一下,一旦我认为它们必须通过ByRefByRef
(就像数组一样),事情开始看起来我可以开始使用它们了
所以我在一个标准模块中定义了一个公共类型
,得到了这个编译错误:
因此,我将Public类型
移动到一个类模块中,使类publicnotcreatible
,然后得到这个编译错误:
下面是一些重现编译错误的代码 类模块“某物”: 如果将
TSomething
的定义移动到标准模块,则会出现另一个编译器错误,告诉您必须在公共对象模块(即类模块)中定义公共UDT。。。这让你回到原点
因此,如果您不能在类模块中定义一个
公共类型
,那么如果这种类型在法律上不存在,编译器为什么会抛出合适的选项,甚至提到“公共对象模块中定义的公共用户定义类型”
它是否在VB6中工作并且编译器消息是该版本的残余?或者原因就在于COM的工作方式?是我还是两条错误信息相互矛盾?还是有些事我不明白
很明显,我滥用了UDT。那么,如果不是将“记录”传递给某个方法,它们应该用于什么呢?从标准模块中,它可以正常工作,没有任何错误。下面的代码没有抛出错误
Public Type TEST_TYPE
Prop1 As String
End Type
Public Function fTest(ByRef param1 As TEST_TYPE) As String
param1.Prop1 = "Hello from function"
End Function
Public Sub sTest(ByRef param1 As TEST_TYPE)
param1.Prop1 = "Hello from Sub"
End Sub
Public Sub caller()
Dim p As TEST_TYPE
'/Call Sub
Call sTest(p)
MsgBox p.Prop1
'/Call Function
Call fTest(p)
MsgBox p.Prop1
End Sub
UDT的一个问题是关于前向引用。因此,这将不会编译,除此之外,它在标准模块中工作得非常好
Public Type TEST_TYPE
Prop1 As String
Prop2 As TEST_TYPE2 '/ Fails due to Forward referencing. TEST_TYPE2 should be declared before this UDT.
End Type
Public Type TEST_TYPE2
Prop3 As String
End Type
编辑:
然而,在课堂上使用UDT的方法是Friend
类的VBA代码
'/ Using UDT in VBA-Class
Private Type TEST_TYPE3
Prop3 As String
End Type
Public Sub caller()
Dim p As TEST_TYPE3
p.Prop3 = "Hello from Class"
Call testClassUDT(p)
End Sub
Friend Sub testClassUDT(p As TEST_TYPE3)
MsgBox p.Prop3
End Sub
这里有一个类型作为参数传递给类方法,并由类方法返回 首先,类
SomeClass
(不需要是PublicNotCreatable)
和模块:
Option Explicit
Public Type TFooBar
foo As String
bar As String
End Type
Sub test()
Dim c As SomeClass
Set c = New SomeClass
Dim t1 As TFooBar
Dim t2 As TFooBar
t1.bar = "bar"
t1.foo = "Foo"
c.test t1
t2 = c.ReturnTFoo
End Sub
因此UDT可以是过程或函数(即标准模块中的过程代码)的参数,但不能是方法(即类模块成员)的参数-为什么?如果“公共对象模块中定义的公共用户定义类型”是完全非法的,那么编译器为什么还要提到它们呢?老实说,我不知道这种行为背后的原因。但是要在classe中使用UDT,您可以为您的子/函数使用
Friend
。查看编辑。我不喜欢Friend
,因为它使factory方法无法用于引用项目,但现在我将使用它运行,因为它可以工作,并且我不需要将此代码公开给其他VBA项目。实际上,如果我公开UDT成员的getter属性,我会收到一个新的编译器错误,该错误是关于将UDT强制为变量的。这是没有希望的。我以为我已经把它编译好了,但是不,它没有。
Option Explicit
Sub test(foo As TFooBar)
Dim s As String
s = foo.foo
End Sub
Function ReturnTFoo() As TFooBar
ReturnTFoo.bar = "bar"
ReturnTFoo.foo = " bar"
End Function
Option Explicit
Public Type TFooBar
foo As String
bar As String
End Type
Sub test()
Dim c As SomeClass
Set c = New SomeClass
Dim t1 As TFooBar
Dim t2 As TFooBar
t1.bar = "bar"
t1.foo = "Foo"
c.test t1
t2 = c.ReturnTFoo
End Sub