【问题标题】:How to set an array of custom objects?如何设置自定义对象数组?
【发布时间】:2013-12-11 18:05:02
【问题描述】:

如何设置另一个自定义对象内部的自定义对象数组?像下面这样:

这是合法的类:

'Class Licit

Private LObj() As Obj

Sub RedimObj(index As Integer)
    ReDim Preserve LObj(index)
End Sub

Public Property Let SetObjConlicit(ByVal index As Integer, ByVal ObjConlicit As Double)
    LObj(index).ObConlicita = ObjConlicit
End Property

Public Property Get GetObjConlicit(index As Integer) As Double
    GetObjConlicit = LObj(index).ObConlicita
End Property

这是 Class Obj(尚未创建 set/let 属性):

'Class Obj
Public ObConlicita As Double
Public Obgrupo As Integer
Public ObitemNum As Integer
Public Obdescr As String
Public ObvalMax As Double
Public Obobs As String

这是我的日常调用:

Public Licita As Licit

sub run()
Set Licita = New Licit

NumObjetos = 3
Licita.RedimObj (NumObjetos)
For i = 0 To NumObjetos - 1
    Licita.SetObjConlicit(i) = i
Next i

end sub

但是我在这一行得到一个错误 LObj(index).ObConlicita = ObjConlicit 尝试设置值时。

我得到的错误是:

'运行时错误 91 未设置对象变量或 With Block 变量'

任何人都可以帮助我做错了什么?

谢谢!

【问题讨论】:

  • 这是什么语言,VB.net?
  • VBA for Excel。抱歉,我以为我在 VBA 主题中。
  • np,我给它加了一个标签。

标签: arrays class object excel vba


【解决方案1】:

问题在于RedimObj 方法仅调整数组大小,但不会为每个元素创建Obj 的新实例。 因此,当您调用SetObjConlicit 属性时,LObj(index) 指向的元素的值为Nothing,您会收到该错误。

因此,您必须确保在访问其ObConlicita 属性之前已经构造了对象。

为了做到这一点,你可以,例如(看看它是否对你的情况有意义),检查元素是否首先被初始化,如果没有,初始化它。示例:

Public Property Let SetObjConlicit(ByVal index As Integer, ByVal ObjConlicit As Double)
    ' Check is element is initialized
    If LObj(index) Is Nothing Then
        ' and initialize it if it is not.
        Set LObj(index) = New Obj
    End If
    LObj(index).ObConlicita = ObjConlicit
End Property

【讨论】:

    猜你喜欢
    • 2012-09-15
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 2016-05-10
    • 2020-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多