EXCEL VBA-将类实例分配给动态数组

时间:2018-08-10 23:56:29

标签: excel-vba dynamic-arrays

我每次遍历一行并将该行中的数据存储到该对象中时都实例化一个对象。我将它们附加到数组中,但是出现“对象变量或未设置块变量”错误。我也尝试了Set Headers(Counter) = objRow,但是数组的所有元素都与数组的最后一个元素相同

有人可以指出我下面的代码有什么问题吗?

非常感谢您。

Option Explicit
Option Base 0
Public Headers() As clsDataRow

Sub CreateTemplate()

Dim iLastRow As Integer
Dim iHeaderCount As Integer
Dim rngFirstRow As Range
Dim Counter As Integer
Set rngFirstRow = shtSetup.Range("rngTemplate")


With shtSetup

    'Get the last row of the table
    iLastRow = .Cells(Rows.count, "A").End(xlUp).Row
    'Get the number of headers
    iHeaderCount = iLastRow - rngFirstRow.Row + 1
    'Initialize the public static variable array to store DataRow class instances
    ReDim Headers(iHeaderCount - 1)

    'For each row, we create clsDataRow instance with relevant data
    For Counter = 0 To iHeaderCount - 1

        Dim objRow As New clsDataRow
        objRow.Name = rngFirstRow.Offset(Counter, 0).Value
        objRow.Number = rngFirstRow.Offset(Counter, 1).Value
        objRow.PDFFieldName = rngFirstRow.Offset(Counter, 2).Value
        objRow.MinCharLimit = rngFirstRow.Offset(Counter, 3).Value
        objRow.MaxCharLimit = rngFirstRow.Offset(Counter, 4).Value
        Headers(Counter) = objRow 'THIS IS WHERE THE ERROR HAPPENS

    Next


   End With


End Sub

1 个答案:

答案 0 :(得分:0)

在循环中声明变量不是一个好主意,这是一个示例。在这种情况下,无论如何,循环的每次迭代都不需要新变量-您可以重复使用同一变量,因为ObjRow不需要在循环外。

再进一步,您可能完全不需要中间变量。

我无法对此进行测试,因为您的问题没有包括自定义类型clsDataRow的定义,也没有任何示例数据,但是基本上您可以执行以下操作:

Option Explicit
Option Base 0

Public Headers() As clsDataRow

Sub CreateTemplate()
    Dim iLastRow As Integer, iHeaderCount As Integer, Counter As Integer
    With shtsetup.Range("rngTemplate")
        iLastRow=shtsetup.Cells(Rows.Count,"A").End(xlUp).Row 'get last row#
        iHeaderCount = iLastRow - .Row                        'count headers
        ReDim Headers(iHeaderCount)                           'init array
        For Counter = 0 To iHeaderCount                       'populate headers()
            Headers(Counter).Name = .Offset(Counter, 0)
            Headers(Counter).Number = .Offset(Counter, 1)
            Headers(Counter).PDFFieldName = .Offset(Counter, 2)
            Headers(Counter).MinCharLimit = .Offset(Counter, 3)
            Headers(Counter).MaxCharLimit = .Offset(Counter, 4)
        Next Counter
    End With
End Sub
  • 我也切换了With语句,因为您只引用了一次;这种方法效率更高,因为您多次使用它。
  • 您无需指定.Value,因为这是从单元格返回的默认属性。
  • 您的+1-1彼此保持平衡,因此我将它们移除。
  • 消除了两个不必要的变量。

正如我所说,这可能会或可能不会按原样工作;由于我正在对丢失的信息进行假设,因此无法确定。