Object 秒中的 Collection 在通过数组循环时将新的 UDT 传递给每个 Object

Collection of Objects Passing a new UDT to each Object while Looping thru an Array

我的 aMRecon 数组是 2500 行 x 65 列。我需要在每一行中评估多达 10 多列,因此我相信我需要创建一个 object 代表每一行。我已经创建了一个 UDT 并且在下面的基本过程中我试图创建一个 object for each row 每个 object 都有一个 .EntityID 属性 (这是单元格Column BColumn 2).

中每一行的值
Public Type BreakInfo
    EntityID As String
    IssueName As String  
    ValDate As Date
    LedgerAMT As Long
    NetAMTL As Long
    PriceDiff As Long                    
End Type

Sub Fill_Objects()

Dim aMrow As Integer, aMcol As Integer
Dim BI As BreakInfo

For aMcol = LBound(aMRecon, 2) To UBound(aMRecon, 2)
        For aMrow = LBound(aMRecon, 1) To UBound(aMRecon, 1)
                If aMcol = 2 Then
                    Debug.Print aMRecon(aMrow, aMcol)
                    Set ObjLSL = New Collection
                    BI.EntityID = aMRecon(aMrow, aMcol)
                End If
        Next aMrow
    Next aMcol
End If

End Sub

我需要以某种方式创建 collection 个 object 吗?有人可以给我举个例子来帮助吗?截至目前,我认为我只有一个 object 并且 .EntityID 属性 不断被覆盖。谢谢

其实每一行随意只有1个属性,基本上每个属性就是一个ColumnHeader。我这样做是最有效的方法吗?最终我需要评估 object 中的每个 属性 并对其进行分类。

插入了一个 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 

这就是 class 中的所有内容。

您需要先创建(插入)一个 Class 模块,将其命名为 BreakInfo,并为其提供 Public 成员,如下所示:

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 并且不使用外部 ForIf aMcol = 2。除此之外,我不明白你想用你的价值观做什么。