Работа с массивом как новый объект не работает - PullRequest
0 голосов
/ 11 января 2019

мой VBA-код создает проблемы. Я сделал модуль Class под названием "clsColl" со свойствами. Когда я объявляю переменную как "clsColl", все работает нормально, но когда я объявляю массив как "clsColl", я получаю ошибку «Переменная объекта или переменная блока не установлена», если я использую этот массив в другой подпрограмме, которую я вызвал в первой подпрограмме.

Я сделал короткий пример с кодом, который создает проблемы.

Первый модуль моего класса "clsColl"

Option Explicit

Public name As String

Public weight as single

Теперь код, который работает

Sub workingA()

Dim persona As New clsColl

Call workingB(persona)

End Sub

Sub workingB(persona As cls Coll)

persona.name = "phil"

persona.weight = 100

End Sub

Теперь код, который не работает

Sub failingA()

Dim persona() As New clsColl

ReDim persona(1 to 5)


Call failingB(persona)

End Sub

Sub failingB(persona() As cls Coll)



persona(1).name = "phil"

persona(1).weight = 100
End Sub

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

Теперь я получаю сообщение об ошибке «Переменная объекта» или «Не задана переменная блока» со вторым кодом, но я не знаю почему. Я хочу знать, почему использование массива в качестве объекта создает проблемы, подобные этому, при использовании нормальная переменная работает нормально.

Ответы [ 2 ]

0 голосов
/ 11 января 2019

Ваша строка кода

Dim persona As New clsColl

является комбинацией

Dim persona As clsColl
If persona Is Nothing Then Set persona = New clsColl

и это вообще плохая практика - использовать этот объединяющий синтаксис, по крайней мере, в моем мнении.

Теперь для массива это больше не может работать, поскольку каждый элемент массива должен быть Set, чтобы сначала быть clsColl объектом:

Sub notMorefailingA()
 Dim persona() As clsColl
 Dim i As Integer
 ReDim persona(1 To 5)
 For i = 1 To 5
  Set persona(i) = New clsColl
 Next
 Call notMorefailingB(persona)
End Sub

Sub notMorefailingB(persona() As clsColl)
 persona(1).name = "phil"
 persona(1).weight = 100
End Sub
0 голосов
/ 11 января 2019

В массиве нет ничего, что нужно для заполнения массива классами. Ваш Dim не будет использовать новое ключевое слово, вы создадите новые классы и добавите их в массив.

Sub test1()

Dim d As New clsDimension

Dim arrDimensions(5) As clsDimension

Set arrDimensions(0) = d

arrDimensions(0).Breadth = 100
arrDimensions(0).Depth = 200

End Sub

или аналогичный подход к вашему посту

Класс для массива, например, clsDimensionArray

Private arrDimensions() As clsDimension

Public Property Get ArrItems(x As Long) As clsDimension
    Set ArrItems = arrDimensions(x)
End Property

Public Sub Create(lngSize As Long)

Dim l As Long
Dim d As clsDimension

ReDim arrDimensions(lngSize - 1)

For l = 0 To UBound(arrDimensions)
    Set d = New clsDimension
    Set arrDimensions(l) = d
    Set d = Nothing
Next l

End Sub

и используя вот так

Sub test1()

Dim arrDimensions As New clsDimensionArray

arrDimensions.Create (100)

arrDimensions.ArrItems(90).Depth = 50
arrDimensions.ArrItems(90).Breadth = 100

End Sub

Содержит это в хорошем состоянии: o)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...