Excel VBA:为什么将自定义类对象添加到自定义类数组中时会出现运行时错误438?

8 浏览
0 Comments

Excel VBA:为什么将自定义类对象添加到自定义类数组中时会出现运行时错误438?

我知道这个错误在这里和其他地方有几个帖子,但是导致问题的原因似乎到处都是,到目前为止我看到的解决方案似乎都无法解决我面临的问题。

我有一个类模块,其中包含以下代码:

Public questionID As Integer
Public score As Double
Public time As Date
Private lines() As New Line                '如果我删除'New',我会得到运行时错误91
Sub CreateByRow(row As Range)
    questionID = row.Cells(1, 1)
    score = row.Cells(1, 7)
    time = row.Cells(1, 8)
    ''' 插入行 '''
    Dim tLines As ListObject
    Set tLines = shtLines.ListObjects("lines")
    Erase lines
    Dim rLine As Range
    For Each rLine In tLines.Range.Rows
        If rLine.Cells(1, 1) = questionID Then
            Dim ln As New Line
            ln.CreateByRow rLine           'Line对象按预期创建
            u = UBound(lines) + 1          'u = 0,如预期
            ReDim lines(u)                 '数组的长度为1,索引为0,如预期
            lines(u) = ln                  '这就是错误发生的地方
        End If
    Next
End Sub

当我运行这段代码时,我得到运行时错误438,但我不明白为什么。数组正在寻找`Line`对象。我尝试放入的`Line`对象不为空。

当我在出现问题的行上暂停时:

[![lines data and Ln data](https://i.stack.imgur.com/TySJI.png)](https://i.stack.imgur.com/TySJI.png)

0
0 Comments

问题的出现原因是在将自定义类对象添加到自定义类数组时,出现了运行时错误438。原因是在VBA中,使用Set关键字是必要的,用于区分对对象的赋值和对对象的默认属性的赋值。

解决方法是在将自定义类对象添加到自定义类数组时使用Set关键字。示例代码如下:

Set lines(u) = ln

在VBA中,当你想要在变量中获取对实际Range对象的引用(而不是其值)时,你需要使用Set关键字告诉运行时你真正想要的是什么。例如:

Set a = Range("a1")

因此,使用Set的需要是由于默认属性(例如Value)的“方便性”导致的。

0