Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 类模块中的集合_Excel_Vba_Collections - Fatal编程技术网

Excel 类模块中的集合

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

我第一次使用VBA类模块。我已经找了好几个小时了,但找不到解决问题的有效方法。VBA不允许我将对象添加到另一个对象的集合中

我有三个类,creeferencelist包含一个creeference集合,每个creeference包含一个cpacking对象集合。实现如下所示:

引用列表

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