我已经用多种语言进行过编程,但我还是第一次测试 VBA。
我需要创建一个类,该类具有另一个类的对象数组作为属性。 让我们举一个 Person 类的例子,它保存有关姓名和地址的信息。还有一个地址类,用于保存有关街道和邮政编码的信息。一个人可以有很多地址,因此 Person 应该有一个地址数组。
class Address
Private pStreet as String
Private pZip as Int
Public Property Let Street(val As String)
pStreet = val
End Property
Public Property Get Street() As String
Street = pStreet
End Property
Public Property Let Zip(val As String)
pZip = val
End Property
Public Property Get Zip() As String
Zip = pZip
End Property
class Person
Private pName as String
Private pSurname as String
Private pAddresses() as Address
Public Property Let Name(val As String)
pName = val
End Property
Public Property Get Name() As String
Name = pName
End Property
Public Property Let Surname(val As String)
pSurname = val
End Property
Public Property Get Surname() As String
Surame = pSurname
End Property
我应该如何管理地址数组?
我尝试使用这样的代码,但如果我尝试在人员对象上调用此方法,我会收到错误“对象不支持此属性或方法”
Public Sub addAddress(val as Address)
ReDim pAddresses(1)
pAddresses(0) = val
End Sub
有什么方法可以做到这一点?我找不到任何教程或展示如何在对象内部使用对象数组的内容
最佳答案
当你使用redim时,它实际上会创建一个指定大小的全新数组,因此所有现有数据都会丢失。要将旧数组中的值复制到新数组,您需要使用“Preserve”关键字,如下所示
ReDim Preserve pAddresses(1)
但这确实效率很低,因为向数组添加另一个元素需要重写整个数组。您可能更适合使用集合。因此,不要像这样声明 pAddress
Private pAddresses() as Address ' delcare as an array
这样做
Private pAddresses as New Collection ' declare as a collection
现在添加地址的方法如下所示:
Public Sub addAddress(val as Address)
pAddresses.Add val
End Sub
集合的索引从 1 开始计数,而不是从零开始计数(就像数组一样),因此下面的行将打印集合中的第一个条目
Debug.Print pAddresses(1)
关于arrays - 包含其他对象数组的类对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71694374/