Ответ 1
Основываясь на разделе VBA Language Specification 5.3.1.10 Декларации обработчика жизненного цикла, я бы предположил, что это причина (внимание мое):
Если класс определяет обработчик жизненного цикла Class_Initialize, эта подпрограмма будет вызываться как метод каждый раз, когда экземпляр этого класса создается оператором New, ссылаясь на переменную, объявленную с помощью
<as-auto-object>
и текущее значение которой Nothing или вызовом функции CreateObject (раздел 6.1.2.8.1.4) стандартной библиотеки VBA. Целевой объект вызова - это вновь созданный объект. Вызов происходит до того, как ссылка на вновь созданный объект возвращается из операций, которые его создают.
Итак, в вашем случае в строке
Set cFactory = New Factory
Метод Class_Initialize
Factory
запускается до того, как будет выполнено присвоение, что означает, что при возникновении события IS экземпляр FactoryTest
не знает об этом.
UPDATE
Я дал ему быстрый тест, добавив метод Factory
, который вызывает функцию Class_Initialize
:
Public Sub test()
Class_Initialize
End Sub
И затем добавил к нему вызов как часть метода FactoryTest.Class_Initialize
:
Private Sub Class_Initialize()
Set cFactory = New Factory
cFactory.test
End Sub
Поскольку вызов метода test
выполняется после того, как New Factory
был назначен cFactory
, сообщение "после инициализации..." отображается как ожидалось.