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() 对象作为另一个类的属性的主要内容,如果未能解决你的问题,请参考以下文章