Excel VBA - 类模块逻辑

问题描述:

我刚刚学习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://*.com/questions/42656468/whats-the-difference-between-dim-as-new-vs-dim-set。还有其他一些可以搜索的文章。 –

在第二个版本中,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语句放在过程的开始处。” –