Excel 类模块中的集合
我第一次使用VBA类模块。我已经找了好几个小时了,但找不到解决问题的有效方法。VBA不允许我将对象添加到另一个对象的集合中 我有三个类,creeferencelist包含一个creeference集合,每个creeference包含一个cpacking对象集合。实现如下所示: 引用列表Excel 类模块中的集合,excel,vba,collections,Excel,Vba,Collections,我第一次使用VBA类模块。我已经找了好几个小时了,但找不到解决问题的有效方法。VBA不允许我将对象添加到另一个对象的集合中 我有三个类,creeferencelist包含一个creeference集合,每个creeference包含一个cpacking对象集合。实现如下所示: 引用列表 Option Explicit Private AllReferences As New Collection Public Sub Add(ref As cReference) AllReferen
Option Explicit
Private AllReferences As New Collection
Public Sub Add(ref As cReference)
AllReferences.Add (ref)
End Sub
Public Sub Remove(myItem As Variant)
AllReferences.Remove (myItem)
End Sub
Public Property Get Count() As Long
Count = AllReferences.Count
End Property
Public Property Get getAllReferences() As Collection
Set getAllReferences = AllReferences
End Property
Public Property Get getSingleReference(myItem As Variant) As cReference
Set getSingleReference = AllReferences(myItem)
End Property
误差
Option Explicit
Private Packvorschriften As New Collection
Private strName As String
Public Property Let setName(newName As String)
strName = newName
End Property
Public Property Get getName() As String
getName = strName
End Property
Public Sub Add(ByVal pkg As cPackaging)
Packvorschriften.Add pkg, pkg.getName()
End Sub
Public Sub Remove(myItem As Variant)
Packvorschriften.Remove (myItem)
End Sub
Public Property Get Count() As Long
Count = Packvorschriften.Count
End Property
Public Property Get getAllPackagings() As Collection
Set getAllPackagings = Packvorschriften
End Property
Public Property Get getSinglePackaging(myItem As Variant) As cPackaging
Set getSinglePackaging = Packvorschriften(myItem)
End Property
cpacking
Option Explicit
Private strName As String
Private intMinMenge As Integer
Private intMaxMenge As Integer
Public Property Let setName(newName As String)
strName = newName
End Property
Public Property Get getName() As String
getName = strName
End Property
Public Property Let setMinMenge(MinMenge As Integer)
intMinMenge = MinMenge
End Property
Public Property Get MinMenge() As Integer
MinMenge = intMinMenge
End Property
Public Property Let setMaxMenge(MaxMenge As Integer)
intMaxMenge = MaxMenge
End Property
Public Property Get MaxMenge() As Integer
MaxMenge = intMaxMenge
End Property
当我尝试将CPacking添加到引用时,问题就出现了
Option Explicit
Function GetExistingReferences() As cReferenceList
Dim refList As cReferenceList, newRef As cReference, newPackaging As cPackaging
Set refList = New cReferenceList
'other variables
For i = 1 To intLastRow
Set newRef = New cReference
newRef.setName = wksReferenzliste.Cells(i + 6, 1).text
…. find data for new packaging
Set newPackaging = New cPackaging
With newPackaging
.setName = wksReferenzliste.Cells(...).text
.setMinMenge = CInt(wksReferenzliste.Cells(...).Value)
.setMaxMenge = CInt(wksReferenzliste.Cells(...).Value)
End With
newRef.Add (newPackaging)
refList.Add (newRef)
Set newRef = Nothing
Next i
GetExistingReferences = refList
End Function
行newRef.Add(newPackaging)
导致错误消息“对象不支持此属性或方法”
我在这里遗漏了什么?删除括号。
否则,您将尝试向集合中添加
creefence
实例的默认属性的值,但您没有该值。有关属性Get/Set/Let的简要说明
例如,在您的代码中
Public Property Let setName(newName As String)
strName = newName
End Property
Public Property Get getName() As String
getName = strName
End Property
您正在使用它来管理StrName的内容。这实际上是对VBA中属性结构的错误使用
在VBA中,属性结构的目的是允许在Get和Set/Let操作中使用相同的名称。否则,我们将只使用您与函数和子函数一起使用的命名约定类型
因此,您的代码将更为传统地编写为
Public Property Let Name(byval Value As String)
strName = Value
End Property
Public Property Get Name() As String
Name = strName
End Property
然后,可以使用与使用普通变量完全相同的方式使用属性名称。谢谢您的建议,我非常感谢。
Public Property Let Name(byval Value As String)
strName = Value
End Property
Public Property Get Name() As String
Name = strName
End Property