2015-01-09 77 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

相關問題