创建具有多个索引属性的类

时间:2018-12-14 18:35:56

标签: excel vba excel-vba

我正在尝试创建一个具有多个属性的类,这些属性由传递给该属性的相同数字索引。我尝试了几种代码配置,我最近的失败是:

'dataTypeClass class module
Private ap() As String
Private dt() As String

Public Property Get apos(index As Long) As Variant
Set apos = ap(index)
End Property

Public Property Get dataType(index As Long) As Variant
Set dataType = dt(index)
End Property

Public Property Let apos(index As Long, apVal As String)
ap(index) = apVal
End Property

Public Property Let dataType(index As Long, dtVal As String)
dt(index) = dtVal
End Property

我主要得到此错误代码:

enter image description here

期望在下面的子项中使用第一项的“ INT”和“”。

Sub classTest()

Dim d As New dataTypeClass
d(1).dataType = "INT"
d(1).apos = ""
Debug.Print d(1).dataType & d(1).apos
End Sub

我做错了几件事?

编辑: 采取以下建议(例如,编辑问题而不是发表评论),我将变体设置为字符串,并使用let代替set。由于确实确实超出了下标范围,因此需要初始化该类,但是是否需要redim index?如果每次运行脚本时索引的最大值都不同,该怎么办?

2 个答案:

答案 0 :(得分:5)

apos属性 1 在指定的Variant处获得index;该实现建议封装的ap(index)Object,因此返回类型可能应该是Object而不是Variant

Public Property Get apos(index As Long) As Variant
Set apos = ap(index)
End Property

设置器使用Let分配,该分配有点杂乱,但鉴于值为Variant是允许的-哦,不,它是String

Public Property Let apos(index As Long, apVal As String)
ap(index) = apVal
End Property

您收到此错误是因为,如错误所述,属性定义不一致。如果ap(index)String,则吸气剂应如下所示:

Public Property Get apos(index As Long) As String
apos = ap(index)
End Property

如果ap(index)Object,则设置者应该看起来像这样:

Public Property Set apos(index As Long, apVal As Object)
Set ap(index) = apVal
End Property

...和这样的吸气剂:

Public Property Get apos(index As Long) As Object
Set apos = ap(index)
End Property

或者这样:

Public Property Get apos(index As Long) As Variant
Set apos = ap(index)
End Property

Public Property Set apos(index As Long, apVal As Variant)
Set ap(index) = apVal
End Property

换句话说:

  • Property Let / Property Set的RHS / value参数必须与同名Property Get成员的返回类型相同。
  • 如果类型是对象类型,请使用Property Set进行分配。
  • 如果类型是值类型,请使用Property Let进行赋值。
  • 尽可能避免使用Variant
  • 请勿使用Set分配对象引用以外的任何内容。

1 dataType属性的所有情况也是如此。

答案 1 :(得分:4)

对于Get的返回类型,您有一个变体,但Let的其他参数正在使用字符串。也许您需要dtVal As Variant?如评论和其他答案中所述,还有其他需要考虑的事项;有些将针对具体实现。

Quote:

  

Property Get,Property Let和Property的参数   相同属性的Setprocedures必须完全匹配,除了   属性Let具有一个额外的参数,其类型必须与return匹配   相应的属性Get的类型,并且属性集有一个   参数比相应的属性Get多,其类型为   Variant,Object,类名或对象库类型   在对象库中指定。此错误有以下原因   和解决方案:

     

Property Get过程的参数数量不少于   比匹配的属性Let或   属性设置过程。向Property Let或Property添加参数   视情况从Property Get中设置或删除参数。

     

Property Get的参数类型必须与   Property Let或Property Set的相应参数,除了   额外的属性集参数。修改中的参数声明   相应的过程定义,因此它们是适当的   匹配。

     

属性Let的附加参数的参数类型必须   与相应的Property Get过程的返回类型匹配。   修改“ Property Let”中的额外参数声明或   相应属性Get的返回类型,因此它们是   适当匹配。

     

属性集的额外参数的参数类型可以   与相应的属性Get的返回类型不同,但是   必须是Variant,Object,类名或有效的对象库   类型。

     

确保“属性设置”过程的额外参数为   变量,对象,类名或对象库类型。

     

您使用Optional或ParamArray定义了Property过程   参数。不允许在其中使用ParamArray和Optional参数   财产程序。重新定义过程,无需使用   这些关键字。