Вам не хватает понятия экземпляр .UserForm
- это класс, а классы определяют форму / интерфейс объекта .Особенностью UserForm
является то, что 1) у него есть визуальный конструктор, и 2) у него есть скрытый атрибут VB_PredeclaredId
, установленный на True
, что означает, что у класса есть экземпляр по умолчанию .
Когда вы делаете это:
UserForm1.Show
Вы вызываете метод Show
для экземпляра по умолчанию формы.Когда эта форма закрыта, объект уничтожается ... до тех пор, пока он не будет автоматически создан снова при следующей ссылке на экземпляр UserForm1
по умолчанию.
Я знаю, что могу форсировать новый текство время выполнения, назначив его в подпрограмме UserForm_Initialize, но я бы предпочел этого не делать, поскольку это добавило бы уровень неэффективности.
Совсем нет.Что-то, где-то нужно инициализировать форму.Если ваши элементы управления формой должны быть настроены во время выполнения, UserForm_Initialize
является единственным наилучшим возможным местом для запуска этой конфигурации - это гарантирует, что каждый раз новый экземпляр формысоздан, он правильно инициализирован.В случае такой инструкции, как UserForm1.Show
, обработчик запускается с оператором разыменования .
непосредственно перед вызовом метода Show
.
Объект сохраняет свое состояние до тех пор, пока он существует.Проблема в том, что «X'ing-out» формы уничтожит объект и, таким образом, вернет его в исходное состояние времени разработки.
Вы можете предотвратить самоуничтожение экземпляра формы, обработавСобытие QueryClose
и установка параметра Cancel
на True
, когда значение параметра CloseMode
равно VbQueryClose.vbFormControlMenu
, а затем Hide
, вместо того, чтобы уничтожать форму - конечно, вы должныникогда Unload
форма тоже.
Работа с UserForm
становится намного проще, когда вы контролируете, когда он создан, и когда он уничтожен .Другими словами, когда вы избегаете использования его экземпляра по умолчанию для хранения любого состояния.
With New UserForm1 ' _Initialize handler runs
'..setup initial form state here..
.Show
'..access form state here..
End With ' _Terminate handler runs, object is destroyed
Я написал статьи UserForm1.Show и О модулях классов, подробно охватывающих эти темы.