Vba Can UDT';是否以任何方式将其用作方法参数?

Vba Can UDT';是否以任何方式将其用作方法参数?,vba,com,vb6,user-defined-types,Vba,Com,Vb6,User Defined Types,多年来,我一直在避免在VBA中使用Public TypeUDT,因为它们很难传递,而且我从来没有真正费心去理解原因。。到目前为止,创建一个类模块并处理实际对象更简单 但最近我尝试了一下,一旦我认为它们必须通过ByRefByRef(就像数组一样),事情开始看起来我可以开始使用它们了 所以我在一个标准模块中定义了一个公共类型,得到了这个编译错误: 因此,我将Public类型移动到一个类模块中,使类publicnotcreatible,然后得到这个编译错误: 下面是一些重现编译错误的代码 类模块

多年来,我一直在避免在VBA中使用
Public Type
UDT,因为它们很难传递,而且我从来没有真正费心去理解原因。。到目前为止,创建一个类模块并处理实际对象更简单

但最近我尝试了一下,一旦我认为它们必须通过ByRef
ByRef
(就像数组一样),事情开始看起来我可以开始使用它们了

所以我在一个标准模块中定义了一个
公共类型
,得到了这个编译错误:

因此,我将
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