VBA Class() 对象作为另一个类的属性

Posted

技术标签:

【中文标题】VBA Class() 对象作为另一个类的属性【英文标题】:VBA Class() object as property of another class 【发布时间】:2013-07-03 09:35:04 【问题描述】:

我正在尝试创建一个类来保存可变数量的项目(它们本身就是另一个类对象)。

所以,我有第 2 课:

' 第 2 类包含每个单独的报价元素(OTC 和 MRC) 私人 pOTC 作为字符串 私有 pMRC 作为字符串 公共属性获取 OTC() 作为字符串 场外交易 = 场外交易 结束属性 公共属性 Let OTC(Value As String) pOTC = 价值 结束属性 公共属性获取 MRC() 作为字符串 MRC = pMRC 结束属性 公共属性 Let MRC(Value As String) pMRC = 值 结束属性

那么 Class 1 包含 Class 2 的数组:

私有 pCurr 作为字符串 私有 pQuote(20) 作为 Class2 公共属性获取 Curr() 作为字符串 电流 = pCurr 结束属性 公共属性 Let Curr(Value As String) pCurr = 值 结束属性 公共属性集 Quote(Index As Integer, cQuote As Class2) 设置 pQuote(Index) = cQuote 结束属性 公共属性获取报价(索引为整数)作为 Class2 报价= pQuote(索引) 结束属性

而我想做的是:

将 myQuotes 调暗为 Class1 设置 myQuotes = 新 Class1 myQuotes.Curr = "英镑" myQuotes.Quote(3).OTC = "1200"

第一行设置 myQuotes.Curr 没有问题,但是当我尝试在数组中设置一个值时,下一行错误 Run-time 91 Object variable 或 With block variable not set em>

关于我做错了什么以及如何设置类数组中元素的值的任何指针?

提前致谢!

【问题讨论】:

除了感谢 Alex K. 解决您的问题之外,我可以问一下(出于好奇)您为什么要按现在的方式做而不是使用引号集合?跨度> 【参考方案1】:

当您 myQuotes.Quote(3) 时,您拨打 Property Get Quote 时会遇到问题。

Class2 的内部数组未实例化,因此pQuote(Index) 指的是Nothing 的数组元素,当您尝试将myQuotes.Quote(3).OTC = 分配给Nothing 时会失败。

您需要确保 pQuote(Index) 被实例化;您可以按需执行此操作:

Public Property Get Quote(Index As Integer) As Class2
   If (pQuote(Index) Is Nothing) Then Set pQuote(Index) = New Class2
   Set Quote = pQuote(Index)
End Property

(注意必填Set

或者通过向Class1添加一个初始化例程:

Private Sub Class_Initialize()
    Dim Index As Long
    For Index = 0 To UBound(pQuote)
         Set pQuote(Index) = New Class2
    Next
End Sub

【讨论】:

谢谢!那行得通!我还在 Class1 中发现了另一个错误,因为它应该是 Set Quote = pQuote(Index): Public Property Get Quote(Index As Integer) As Class2 Set Quote = pQuote(Index) End Property 【参考方案2】:

您需要在 Class1 中将它们设置为 New Class2:

For intI = LBOUND(pQuote) to UBOUND(pQuote)
    Set pQuote(intI) =  New Class2
Next IntI

就像您在最终脚本中使用 Class1 一样。

【讨论】:

【参考方案3】:

应该是这样的

Public Property Let Quote(Index As Integer, cQuote As Class2)
    Set pQuote(Index) = cQuote
End Property

【讨论】:

以上是关于VBA Class() 对象作为另一个类的属性的主要内容,如果未能解决你的问题,请参考以下文章

python_面向对象_组合

python_面向对象_组合

day24继承

Class的使用,构造方法,实例属性和实例方法,静态属性和静态方法,this和super关键字,类的继承

day27 反射

访问同一类的另一个对象的受保护属性的方法