2015-01-09 31 views
-1
'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 

替换在模块VBA宝典:为什么我收集得到,每次重复

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被更新,所以是集合中的每一个项目。最终结果是一组完全相同的项目。我究竟做错了什么?

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

回答

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

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

+0

这正是问题所在。显然,每次添加新数据时都必须创建一个新的oUser对象。那个新对象然后被添加到集合中。 'Set oUser = New ClsUser oUser.User = arr(x)' – Kahlan 2015-01-09 22:38:56

+1

我不明白你将如何处理这段代码,因为这两行是互相排斥的。 – Liniel 2015-01-09 22:45:16

+0

这段代码是关于以最基本的形式测试集合对象的;了解它是如何工作的。现在我可以将它融入到我的程序中,这个程序要复杂得多。 – Kahlan 2015-01-09 22:57:45

2

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

在VBA函数中有一个返回值。如果它们不返回值,则应使用Sub s。这工作...

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 
+0

这个答案对我所问的问题非常重要。是的,我应该使用Sub而不是Function。问题实际上是关于为什么我的数据收集完全一样。 – Kahlan 2015-01-09 22:54:08

+1

@Kahlan我在第一行回答了你的问题。 Sub的使用是次要的。它来自您的代码*的其他问题。如果您阅读我的答案,您会注意到我已将该行(无意义)'Set oUser = New ClsUser'移到循环中,因为这会创建一个新实例以添加到集合中。 – 2015-01-09 23:15:20

相关问题