我正在尝试学习如何创建自定义数据类型,然后将其与集合一起使用。我用另一种方式解决了这个问题,但这开始于我自动化的时间表报告。我原本想要一个具有不同数据类型的二维数组。当我无法做到这一点时,一些研究产生了一系列自定义数据类型的想法。然而,我发现的例子不断推动我创建一个类。我对此并不满意,看起来这应该是可行的。这是我正在寻找的东西(我从我在这个网站上找到的一个例子开始):
Option Explicit
'***** User defined type
Public Type MyType
MyInt As Integer
MyString As String
MyDoubleArr(2) As Double
End Type
Public ColThings As Collection
Sub CollectionTest()
Dim x As Integer
Dim vrecord As MyType
For x = 1 To 4
vrecord.MyInt = x
vrecord.MyString = "Matt"
vrecord.MyDoubleArr(0) = x + 5
vrecord.MyDoubleArr(1) = x + 6
vrecord.MyDoubleArr(2) = x + 7
ColThings.Add vrecord
Next x
For x = 1 To 4
Debug.Assert vrecord.MyInt & " - " & vrecord.MyString & " - " & vrecord.MyDoubleArr(0) & ", " & vrecord.MyDoubleArr(1) & ", " & vrecord.MyDoubleArr(0)
Next x
End Sub
我得到的错误是: 编译错误: “只有公共对象模块中定义的用户定义类型才能被强制转换为变体或传递给后期函数”
我不是VBA的新手,但我正在努力迈出下一步。
提前致谢。
答案 0 :(得分:3)
我对它进行了尝试,最终我不确定这是否是您想要的,但如果您不想创建一个类,那么我能看到的唯一其他选项是将您的类型存储在数组中一个集合。据我所知(如果我错了请纠正我)你不能将一个用户定义的类型添加到集合,你必须将它创建为一个类,实例化该类的一个对象,然后将其添加到集合。
相反,我声明Records()
的数组MyType
并将每个MyType
添加到该数组。
Option Explicit
'***** User defined type
Public Type MyType
MyInt As Integer
MyString As String
MyDoubleArr(2) As Double
End Type
Public ColThings As Collection
Sub CollectionTest()
Dim x As Integer
Dim Records() As MyType
Dim vrecord As MyType
For x = 1 To 4
vrecord.MyInt = x
vrecord.MyString = "Matt"
vrecord.MyDoubleArr(0) = x + 5
vrecord.MyDoubleArr(1) = x + 6
vrecord.MyDoubleArr(2) = x + 7
ReDim Preserve Records(x)
Records(x) = vrecord
Next x
For x = 1 To 4
Debug.Print Records(x).MyInt & " - " & Records(x).MyString & " - " & Records(x).MyDoubleArr(0) & ", " & Records(x).MyDoubleArr(1) & ", " & Records(x).MyDoubleArr(0)
Next x
End Sub
我相信与您想要完成的类似。我还没有尝试过这种方法,因为你说你还没有为此做好准备,但在我的拙见中,这将是一次非常好的练习。