【问题标题】:Excel VBA - Class Module LogicExcel VBA - 类模块逻辑
【发布时间】:2018-02-26 21:11:45
【问题描述】:

我只是在学习 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

在这个版本中,集合中的所有汽车品牌都是同一个(它是表格中的最后一个)

有什么想法吗?

谢谢!

【问题讨论】:

标签: excel class vba


【解决方案1】:

在第二个版本中,Dim newCarBrand As New clsCarBrand 创建了该类的单个实例。随后通过该循环只需更改其BrandName 属性,然后将对该同一对象的另一个引用添加到集合中。如果将Dim 语句移到循环之前,这会更清楚。 Dim 语句不是重复运行的可执行语句。

在第一种情况下,Set 语句创建对象的新实例,每个实例依次添加到集合中。

【讨论】:

  • 谢谢约翰。因此,如果我对您的理解正确,那么两种情况下的 Dim 语句实际上只运行一次(即不是每个循环)?
  • @PhilTeare 我从不认为Dim 是“运行”的。它的用途是在编译时而不是运行时分配存储并将变量名称与该存储相关联。 New第一次使用时创建对象。在 VBA 中,约定是将所有 Dim 语句放在一个过程的开头(至少按照 msdn.microsoft.com/en-us/vba/language-reference-vba/articles/… ):“注意当您在过程中使用 Dim 语句时,通常将 Dim 语句放在开头程序。”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 2018-12-05
相关资源
最近更新 更多