Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 循环通过数组时向每个对象传递新UDT的对象集合_Excel_Object_Collections_User Defined Types_Vba - Fatal编程技术网

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方法。