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)
任何想法为什么?
谢谢!
在第二个版本中,Dim newCarBrand As New clsCarBrand
创建该类的单个实例。后续遍历该循环只需更改其BrandName
属性,然后将另一个对该对象的引用添加到集合中。如果您将Dim
语句移到循环之前,这将更清楚。 Dim
语句不是可重复运行的可执行语句。
在第一种情况下,Set
语句会创建对象的新实例,每个实例都会添加到集合中。
谢谢约翰。所以如果我正确理解你,这两种情况下的Dim语句实际上只运行一次(即不是每个循环)? –
@PhilTeare我从不认为“昏暗”就是“运行”。它的使用是在编译时而不是运行时分配存储并将变量名称与该存储相关联。 'New'首先使用*创建对象。在VBA中,惯例是将所有'Dim'语句放在一个过程的开始处(至少根据https://msdn.microsoft.com/en-us/vba/language-reference-vba/articles/dim-声明):“注意当您在过程中使用Dim语句时,通常将Dim语句放在过程的开始处。” –
也许看看:https://*.com/questions/42656468/whats-the-difference-between-dim-as-new-vs-dim-set。还有其他一些可以搜索的文章。 –