Excel VBA: Почему при добавлении объекта пользовательского класса в массив пользовательского класса появляется ошибка 438 во время выполнения? - PullRequest
0 голосов
/ 04 мая 2020

Я понимаю, что здесь и в других местах есть несколько других сообщений об этой ошибке, но вещи, вызывающие проблему, кажутся повсеместными, и ни одно из решений, которые я видел до сих пор, кажется, не решает проблему Я сталкиваюсь.

У меня есть модуль класса со следующим кодом:

Public questionID As Integer
Public score As Double
Public time As Date
Private lines() As New Line                'If I remove 'New', I end up getting Run-time error 91 instead

Sub CreateByRow(row As Range)
    questionID = row.Cells(1, 1)
    score = row.Cells(1, 7)
    time = row.Cells(1, 8)

    ''' INSERT LINES '''
    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 object is created as expected

            u = UBound(lines) + 1          'u = 0 as expected
            ReDim lines(u)                 'Array has a length of 1 and index of 0 as expected
            lines(u) = ln                  'This is where the error happens
        End If
    Next
End Sub

Когда я запускаю этот код, я получаю ошибку времени выполнения 438, но я не понимаю почему. Массив ищет объект Line. Line объект, который я пытаюсь вставить, не равен нулю.

Когда я делаю паузу в строке, вызывающей у меня проблему:

image of lines data and Ln data

1 Ответ

2 голосов
/ 04 мая 2020
Set lines(u) = ln

From: https://docs.microsoft.com/en-us/previous-versions/office/developer/office-2003/aa192490 (v = office.11)? Redirectedfrom = MSDN

"В VBA ключевое слово Set необходимо различать guish между назначением объекта и назначением свойства объекта по умолчанию. "

Поскольку в VBA это работает нормально:

Dim a
a = Range("a1")   'implicitly uses default property: Range("A1").Value

... когда вы хотите получить ссылку в a к реальному объекту Range (а не к его значению), тогда вам нужно использовать Set, чтобы сообщить среде выполнения, что вы действительно хотите:

Set a = Range("a1")

Таким образом, необходимость использования Set является побочной эффект "удобства" наличия свойств по умолчанию, таких как Value

...