arrays - 包含其他对象数组的类对象

标签 arrays excel vba object oop

我已经用多种语言进行过编程,但我还是第一次测试 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/

相关文章:

php - 如何限制 PHP While 循环的输出?

java - 除法不使用数组长度 JAVA

python - 无法按 Pandas 数据框中的时间戳编制索引

python - 如何在excel外执行vba宏

excel - 多个工作表更改公式 - 在下拉列表中选择某些条件时的多个操作

python - 获取调用脚本的工作簿的位置

ruby - 根据值将数组拆分为子数组

c++ - 在 Tic Tac Toe 程序中使用数组

R - 将多行并排连接成一行

Excel VBA : importing CSV with dates as dd/mm/yyyy