gpt4 book ai didi

vba - UDT 能否以任何方式用作方法参数?

转载 作者:行者123 更新时间:2023-12-01 12:27:02 30 4
gpt4 key购买 nike

多年来,我一直避免在 VBA 中使用 Public Type UDT,因为它们很难传递,而且我从来没有真正费心去理解为什么……直到现在 - 它是只需创建一个类模块并改为使用实际对象就更容易了。

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

所以我在标准模块中定义了一个Public Type,得到了这个编译错误:

Only public UDT's defined in a public object module can be used as a parameter for public procedures of class modules

所以我将 Public Type 移动到一个类模块中,使类成为 PublicNotCreatable,然后得到了这个编译错误:

Cannot define a public UDT in a class module


下面是一些重现编译错误的代码。

类模块“Something”:

Option Explicit
' cannot define a public user-defined type within an object module
Public Type TSomething
Foo As Integer
End Type

Public Function Create(ByRef info As TSomething) As Something
End Function

如果将 TSomething 的定义移动到标准模块,您将得到另一个编译器错误,告诉您必须在公共(public)对象模块(即类模块)中定义公共(public) UDT )... 这让您回到原点。


因此,如果您不能在类模块中定义公共(public)类型,为什么编译器会抛出一个问题,甚至提及“在公共(public)对象模块中定义的公共(public)用户定义类型"如果这样的东西不能合法存在呢?

它是否在 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

关于vba - UDT 能否以任何方式用作方法参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38361276/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com