Как правильно инициализировать объекты в VBA? - PullRequest
5 голосов
/ 02 апреля 2012

У меня есть пользовательский объект, который я добавлял в массив через цикл.Проблема заключалась в том, что когда я инициализировал объект следующим образом:

Dim CallNum As New Lib_CallNum

Последний объект, добавленный в цикл, будет перезаписывать все другие объекты, добавленные во время цикла.Поэтому я бы получил массив, заполненный кучей одинаковых объектов.Чтобы это исправить, мне пришлось изменить способ инициализации объекта на:

Dim CallNum As Lib_CallNum
Set CallNum = New Lib_CallNum

Но я не уверен, почему первая инициализация не будет работать.Так в чем же разница между двумя наборами кода?

Ответы [ 2 ]

10 голосов
/ 02 апреля 2012

Dim внутри цикла фактически не выполняется на каждой итерации.Он выполняется только при первом обнаружении переменной.

Чтобы продемонстрировать это, добавьте раздел в определение инициализации класса Lib_CallNum:

Private Sub Class_Initialize()
    Debug.Print "Initialise Lib_CallNum"
    ' ...
End Sub

и запустите исходный код.Инициализация будет сообщена только один раз.С тех пор вы добавляете один и тот же экземпляр в массив много раз.

Правильный способ инициализации объектов новых экземпляров, как сказал @Doug, Set ... = New ...

3 голосов
/ 02 апреля 2012

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

Function Something
Dim CallNum as Lib_CallNum
...
Do While SomeCondition
   Set CallNum = New Lib_CallNum
   'do some stuff
   Set CallNum = Nothing
Loop
Return Whatever
End Function

Другими словами, вы должны объявить объект в верхней части функции - не многократно в цикле - и создать экземпляр (и установить для него значение Nothing) в цикле.

Если вы гуглите, вы можете найти объяснения, почему бы не создать экземпляр объекта в его объявлении. Профессиональная разработка Excel имеет хороший . Но я думаю, что ваша проблема, возможно, заключалась в том, что вы никогда не устанавливали это в Ничто. Хотя не уверен.

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