2016-09-06 32 views
1

我有一個奇怪的問題,試圖填充我的對象集合。當我爲PromptsRange.Rows做每個循環時,一切都很完美。您可以逐步瀏覽NewPrompt區域,並觀看每一行通過,最終將最終添加到PromptsCollection。我有這個問題。如果您嘗試爲PromptsCollection上的每個循環執行一次,則每個對象(36)都完全相同,並且是可查找的最後一個值。我難倒了。也許其中一位學者可以幫助我。Excel VBA集合保持重複最後一個對象

這裏是我的LookupTable中 enter image description here

下面的代碼是一個窗體模塊內。 顯式的選項

Private pPromptsCollection As New Collection 
Private pProductPromptMapping As New clsOrderPromptRow 
Private pOrderPrompts As New clsOrderPromptRow 
Private pTarget As Range 
Private pSKU As String 

Public Property Get PromptsCollection() As Collection 
    Set PromptsCollection = pPromptsCollection 
End Property 

Public Property Let PromptsCollection(Value As Collection) 
    Set pPromptsCollection = Value 
End Property 

Private Sub SetPromptControls() 
Dim PromptsRange As Range 
Dim PromptRow As Range 

Set PromptsRange = Range("LookUpTablePrompts") 

For Each PromptRow In PromptsRange.Rows 
    Dim NewPrompt As New clsPrompt 
    NewPrompt.Name = PromptRow.Cells(1, 1) 
    NewPrompt.ControlType = PromptRow.Cells(1, 2) 
    NewPrompt.ComboboxValues = PromptRow.Cells(1, 3) 
    NewPrompt.HelpText = PromptRow.Cells(1, 4) 
    NewPrompt.TabIndex = PromptRow.Cells(1, 5) 
    NewPrompt.ColumnIndex = PromptRow.Cells(1, 6) 
    NewPrompt.TableIndex = PromptRow.Cells(1, 7) 
    NewPrompt.ControlName = PromptRow.Cells(1, 8) 

    PromptsCollection.Add NewPrompt, CStr(NewPrompt.Name) 
Next 
PromptsCollection.Count 
End Sub 

所以,現在這裏是我得到的問題。這將導致36個對象完全相同。

Dim Prompt As New clsPrompt 

For Each Prompt In PromptsCollection 
    MsgBox (Prompt.Name) 

Next 

我甚至把它推到觀察窗口,以驗證所有的對象是在面對相同的。它始終與表底部抽屜前部高度的最後一行結果。

希望這已經夠清楚了。提前致謝。

回答

6

當使用As New時,VBA將在首次使用時創建對象的新實例。您應該避免使用As New和使用這個模式來代替:

Dim NewPrompt As clsPrompt 

For Each PromptRow In PromptsRange.Rows 
    Set NewPrompt = New clsPrompt 
+0

「作爲新」不是真正的問題。真正的問題是循環的每次迭代都寫入相同的對象實例。每個迭代都需要創建一個新的對象實例,就像您的示例代碼正確執行的那樣。您仍然可以將變量聲明爲「新建」,並在每次循環迭代開始時創建一個新實例。但最好做一個或另一個,所以在這種情況下,您的示例代碼將是我的首選解決方案。 –

+1

@JoeBourne說得好。 –

3

通過簡單的圖像,我想解釋爲什麼聲明As New不收集工作。 HTH

enter image description here

4

的問題是,它的對象的同一個實例被多次添加到集合中。 每個循環基本上都會更新同一個對象的值,因此每個元素都已經在集合中,因爲它們都引用同一個對象。 最後,集合中的所有元素將具有來自最後一行數據的值。

正如人們所說的,明確地在每個循環

For Each PromptRow In PromptsRange.Rows 
    Set NewPrompt = New clsPrompt 

開始創建新對象或破壞的對象,一旦它被添加:

.... 
     set NewPrompt = Nothing 
    Next 

雙方將保證一個新的對象是爲每行數據創建的。

調試,這些行添加到您的類:

Private Sub Class_Initialize() 
    Debug.Print "Init" 
End Sub 

Private Sub Class_Terminate() 
    Debug.Print "Term" & Me.Name 
End Sub 

這將讓你看到越來越創建/終止在調試窗口中的對象的實例。