VBA集合:为什么每次迭代都会替换我的集合

VBA集合:为什么每次迭代都会替换我的集合,vba,function,excel,collections,Vba,Function,Excel,Collections,模块内 'Class ClsUser Public User As String Public Company As String Public Function AddUser(ByVal UserName As String, ByVal CompanyName As String) User = UserName Company = CompanyName End Function 无论何时更新oUser,集合中的每个项目都会更新。最终结果是一组完全相同的项。我做错了什

模块内

'Class ClsUser
Public User As String
Public Company As String

Public Function AddUser(ByVal UserName As String, ByVal CompanyName As String)
    User = UserName
    Company = CompanyName
End Function
无论何时更新oUser,集合中的每个项目都会更新。最终结果是一组完全相同的项。我做错了什么

*注意:我简化了代码,只显示与我的问题最相关的内容

Public User_Collection As New Collection

Function Main()
    Dim User_Data As ClsUser
    Set User_Data = New ClsUser 
    Call Load_Collection(User_Data)
End Function

Function Load_Collection(ByRef ByRef oUser As ClsUser)
    Set oUser = New ClsUser
    Set User_Collection = New Collection

    Dim arr(1) As String
    arr(0) = "Jack"
    arr(1) = "Jill"
    For x = 0 to 1
        oUser.User = arr(x)
        User_Collection.Add oUser, oUser.User
    next
End Function

这里的功能输入是oUser,接下来将oUser设置为
New ClsUser
。在我看来,它没有意义。

因为您使用的是
oUser
的单个实例。 此外,此代码还有其他问题

在VBA中,函数具有返回值。如果它们不返回值,则应使用
Sub
s。这很有效

Function Load_Collection(ByRef ByRef oUser As ClsUser)
Set oUser = New ClsUser

这正是问题所在。显然,每次添加新数据时都必须创建一个新的oUser对象。然后将该新对象添加到集合中
Set-oUser=New-ClsUser-oUser.User=arr(x)
我不明白您将如何处理这段代码,因为这两行是相互排斥的。这段代码是关于测试集合对象的最基本形式;了解它是如何工作的。现在我可以把它合并到更复杂的程序中。@Kahlan Liniel,你是对的,这没有意义。虽然我仍然想知道为什么你的答案“有意义”,根据OP的说法,但我的答案不…lol:-)?我的回答也解决了您提到的问题-但这不是在OPs集合中获得相同实例的原因,这是OPs最初的问题。奇怪的lol:-)+1不管怎样你们都是对的,现在我更仔细地看了你们的答案@Rusan。我丢失的那块是
Set-oUser=new-ClsUser
。我以为它只需要定义一次,但实际上,每次创建新对象时,都必须重新定义它。谢谢你们两位的帮助。这个答案与我刚才问的问题无关。是的,我应该用Sub而不是Function。问题实际上是为什么我收集的数据完全相同。@Kahlan我在第一行回答了你的问题。使用
Sub
是次要的。您的代码还存在其他问题。如果您阅读了我的答案,您会注意到我已将行(这毫无意义)
Set-oUser=New-ClsUser
移动到循环中,因为这将创建一个要添加到集合中的新实例。
Public User_Collection As New Collection

Sub Main()
    Dim User_Data As ClsUser
    Set User_Data = New ClsUser
    Call Load_Collection
End Sub

Sub Load_Collection()
    Dim oUser As ClsUser
    Set User_Collection = New Collection

    Dim arr(1) As String
    arr(0) = "Jack"
    arr(1) = "Jill"
    For x = 0 To 1
      Set oUser = New ClsUser
        oUser.User = arr(x)
        User_Collection.Add oUser, oUser.User
    Next
End Sub