Excel 循环通过数组时向每个对象传递新UDT的对象集合
我的Excel 循环通过数组时向每个对象传递新UDT的对象集合,excel,object,collections,user-defined-types,vba,Excel,Object,Collections,User Defined Types,Vba,我的aMRecon数组是2500行x 65列。我需要在每一行中计算多达10多个列,因此我相信我需要创建一个表示每一行的对象。我已经创建了一个UDT,在下面的一个基本过程中,我试图为每一行创建一个对象,每个对象都有一个.EntityID属性(这是列B或列2中每一行的单元格值) 我是否需要以某种方式创建对象集合?有人能给我举个例子来帮助我吗。到目前为止,我想我只有一个对象,.EntityID属性一直被覆盖。多谢各位 事实上,至少每行只有一个属性,基本上每个属性都是一个列标题。我这样做是最有效的方式吗
aMRecon
数组是2500行x 65列。我需要在每一行中计算多达10多个列,因此我相信我需要创建一个表示每一行的对象。我已经创建了一个UDT
,在下面的一个基本过程中,我试图为每一行创建一个对象,每个对象都有一个.EntityID
属性(这是列B
或列2
中每一行的单元格值)
我是否需要以某种方式创建对象集合?有人能给我举个例子来帮助我吗。到目前为止,我想我只有一个对象,.EntityID
属性一直被覆盖。多谢各位
事实上,至少每行只有一个属性,基本上每个属性都是一个列标题。我这样做是最有效的方式吗?最终,我需要评估对象中的每个属性并对其进行分类。
插入了一个ClassModule标题BreakInfo
'Public EntityID As String
Public EntityID As Variant
Public IssueName As String
Public ValDate As Date
Public LedgerAMT As Long
Public NetAMTL As Long
Public PriceDiff As Long
这就是类中的全部内容。您需要首先创建(插入)一个类模块,将其命名为BreakInfo,并向其提供如下公共成员:
Option Explicit
Public EntityID As String
Public IssueName As String
Public ValDate As Date
Public LedgerAMT As Long
Public NetAMTL As Long
Public PriceDiff As Long
Sub Fill_Objects()
Dim aMrow As Integer, aMcol As Integer
Dim BI As BreakInfo
Dim ObjLSL As Collection
Dim key As Long
'Create the Collection instance.
Set ObjLSL = New Collection
For aMcol = LBound(aMRecon, 2) To UBound(aMRecon, 2)
For aMrow = LBound(aMRecon, 1) To UBound(aMRecon, 1)
If aMcol = 2 Then
'Instantiate a BreakInfo.
Set BI = New BreakInfo
BI.EntityID = aMRecon(aMrow, aMcol)
'...
key = key + 1
ObjLSL.Add BI, CStr(key)
End If
Next aMrow
Next aMcol
End Sub
然后,您可以使用如下内容:
Option Explicit
Public EntityID As String
Public IssueName As String
Public ValDate As Date
Public LedgerAMT As Long
Public NetAMTL As Long
Public PriceDiff As Long
Sub Fill_Objects()
Dim aMrow As Integer, aMcol As Integer
Dim BI As BreakInfo
Dim ObjLSL As Collection
Dim key As Long
'Create the Collection instance.
Set ObjLSL = New Collection
For aMcol = LBound(aMRecon, 2) To UBound(aMRecon, 2)
For aMrow = LBound(aMRecon, 1) To UBound(aMRecon, 1)
If aMcol = 2 Then
'Instantiate a BreakInfo.
Set BI = New BreakInfo
BI.EntityID = aMRecon(aMrow, aMcol)
'...
key = key + 1
ObjLSL.Add BI, CStr(key)
End If
Next aMrow
Next aMcol
End Sub
请注意,集合在循环之前实例化一次。集合不能接受用户定义类型的变量,但它会欣然吞并对象实例
编辑
问题变了。如果您担心效率,您可以硬编码aMcol=2
,而不使用外部For
和If aMcol=2
。除此之外,我不明白你想用你的价值观做什么。为什么是类而不是公共类型?单行ObjLSL.Add BI,key
我收到一个类型不匹配错误?我认为这是由于字符串数据类型不匹配造成的,并使用Public EntityID作为变量进行测试
,并更改为BI.EntityID=CStr(aMRecon(aMrow,aMcol))
,但仍然收到错误。我确实创建了一个名为BreakInfo的新类,并更新了显示该类内容的帖子。集合无法接受用户定义的类型。如果您确实喜欢使用UDT,则可以使用UDT的数组,例如Dim arrUDT(0到999)作为MyUDT
。然后您可以引用任何元素,例如arrUDT(25).MyField
。显然,对象的键只能是字符串
更改为ObjLSL.Add BI,CStr(键)
。有什么想法吗?我的错。我会修正我的答案。我必须承认,我根本不使用集合,而是使用Scripting.Dictionary,它以几乎任何类型作为键,并提供了永远有用的Exists方法。