在集合中存储多个对象 - 来自excel工作表的数据

时间:2015-03-19 11:38:44

标签: vba excel-vba excel

我的问题涉及在集合中存储从类创建的多个对象。为了创建类的每个实例,我遍历一个多维数组;数组是从excel中的工作表内的可变范围填充的。

我想知道这是否是创建集合的最有效方法,当您希望从excel中的数据填充它时?有更有效的方法吗?我刚开始使用课程,所以我仍然在努力寻找与他们合作的最佳方式。

首先,我从excel填充数组:

arrCars() = ws.Range(Cells(10, 1), Cells(mrow, 3)).Value

然后使用数组创建一个类对象,并将该对象存储在集合中。

For i = LBound(arrCars) To UBound(arrCars)
    Set iCar = New CCarData
    iCar.carModel = arrCars(i, 1)
    iCar.carYr = arrCars(i,2)
    iCar.carColour = arrCars(i,3)
    clctCars.Add iCar
Next i

任何建议都表示赞赏。我找不到另一个帖子 - 如果有一个我一直无法找到的话道歉。

2 个答案:

答案 0 :(得分:1)

很大程度上取决于课堂设计,问题的处理方法,程序的灵活性以及愚蠢的抵抗能力。

您可以尝试创建一个带参数的构造函数。也许它不会更快,但更清洁。您经常在类中包含构造函数,以便能够测试初始参数值并使代码更整洁。

看看: Pass arguments to Constructor in VBA

如果您不想使用参数创建构造函数,请尝试在刚刚创建的对象上使用WITH,例如

WITH iCar
  .carModel  = arrCars(i, 1)
  .carYr     = arrCars(i, 2)
  .carColour = arrCars(i, 3)
END WITH

另一种方法是循环遍历数组。通常使用 LBound UBound 可能比使用 FOR EACH 慢,请参阅msdn了解语法。

还要记住:早期绑定 - 并非所有内容都是 AS Object ;定义特定和显式数据类型 - 并非所有内容都是作为Variant ;在转换类型时也会进行转换,这样vba就不会浪费时间来确定数据类型是什么,或者将内存存储为变体。

如果有任何人对速度有所帮助,请告诉我。

答案 1 :(得分:0)

我发现这是在寻找其他问题的答案。 一种更简单的方法:

For Each R in ws.Range(Cells(10, 1), Cells(mrow, 3)).Rows
    Set iCar = New CCarData
    iCar.carModel = R.cells(1)
    iCar.carYr = R.Cells(2)
    iCar.carColour = R.Cells(3)
    clctCars.Add iCar
Next`

(我很惊讶地发现,在测试时R.cells(0)将单元格的内容返回到所选范围的左侧,而R.Cells(-1)则是该区域的左侧)< / p>