Единственное время, когда подпрограмма queryclose должна запускаться, это когда кнопка X нажимается на пользовательской форме.
Но это не так, как QueryClose
работает.Событие UserForm.QueryClose
вызывается всякий раз, когда форма закрывается, и ее параметры дают вам возможность отменить ее, в зависимости от того, что побудило ее закрыть.
Что вы хотите - это запустить wb.Close False
условно, когда значение параметра CloseMode
равно vbFormControlMenu
(кнопка X - см. Константы QueryClose ):
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
If CloseMode = vbFormControlMenu Then
wb.Close False
End If
End Sub
Я попытался вернуться к инициализацииsub когда код [...]
Не делай этого.Обработчики событий предназначены для вызова самим VBA, а не кодом пользователя.Если вам нужно вызвать логику, которую вы реализовали в обработчике событий, вместо этого выполните рефакторинг кода из обработчика в свою собственную процедуру:
Private Sub UserForm_Initialize()
DoInitializationStuff
End Sub
Private Sub DoInitializationStuff()
'...
End Sub
Наконец, событие UserForm.Initialize
запускается задолго допоказана форма.
Set EditComp = New ufUpdateComp ' <~ initialize handler runs before this instruction returns
With EditComp
.Top = Application.Top + 125
.Left = Application.Left + 25
.Show
End With
Обратите внимание, что вам не нужно объявлять локальную переменную, если вы используете ее только в блоке With
- вместо этого блок должен содержать ссылку на объект:
With New ufUpdateComp ' <~ initialize handler runs before this instruction returns
.Top = Application.Top + 125
.Left = Application.Left + 25
.Show
End With
Если вы хотите, чтобы DoInitializationStuff
запускался после , когда показывается форма, вызовите ее в событии Activate
.