2017-09-18 61 views
2

我剛剛學習Excel VBA,我在這裏想到了一些概念。Excel VBA - 類模塊邏輯

比方說,我有一個5個汽車品牌的表格。我想將這些閱讀到我自己的汽車品牌課程模塊中,然後列出他們的名字。

我有兩種方法可以做到這一點,只有一種方法可行。我想知道是否有人可以解釋爲什麼?

工作版本:

dim colCarBrands as new collection 

For i = 1 To 5 

    Dim newCarBrand As clsCarBrand 
    Set clsCarBrand = New clsCarBrand 

    newCarBrand.BrandName chaletsSheet.Cells(i, 1) 

    colCarBrands.Add newCarBrand , newChalet.nameTechnical 


Next 

Dim b As clsCarBrand 
For Each b In colCarBrands 
    ' Print items 
    Debug.Print b.BrandName 
Next 

不工作版本:

dim colCarBrands as new collection 

For i = 1 To 5 

    Dim newCarBrand As New clsCarBrand 

    newCarBrand.BrandName chaletsSheet.Cells(i, 1) 

    colCarBrands.Add newCarBrand , newChalet.nameTechnical 


Next 

Dim b As clsCarBrand 
For Each b In colCarBrands 
    ' Print items 
    Debug.Print b.BrandName 
Next 

在這個版本中,所有汽車品牌的集合中是相同的一個(這是從最後一個sheet)

任何想法爲什麼?

謝謝!

+0

也許看看:https://stackoverflow.com/questions/42656468/whats-the-difference-between-dim-as-new-vs-dim-set。還有其他一些可以搜索的文章。 –

回答

1

在第二個版本中,Dim newCarBrand As New clsCarBrand創建該類的單個實例。後續遍歷該循環只需更改其BrandName屬性,然後將另一個對該對象的引用添加到集合中。如果您將Dim語句移到循環之前,這將更清楚。 Dim語句不是可重複運行的可執行語句。

在第一種情況下,Set語句會創建對象的新實例,每個實例都會添加到集合中。

+0

謝謝約翰。所以如果我正確理解你,這兩種情況下的Dim語句實際上只運行一次(即不是每個循環)? –

+1

@PhilTeare我從不認爲「昏暗」就是「運行」。它的使用是在編譯時而不是運行時分配存儲並將變量名稱與該存儲相關聯。 'New'首先使用*創建對象。在VBA中,慣例是將所有'Dim'語句放在一個過程的開始處(至少根據https://msdn.microsoft.com/en-us/vba/language-reference-vba/articles/dim-聲明):「注意當您在過程中使用Dim語句時,通常將Dim語句放在過程的開始處。」 –