Моя пользовательская форма открывается в середине длинной подпрограммы, которая должна завершиться после закрытия пользовательской формы.
Ваша процедура делает слишком много вещей и должна быть разбита на более мелкие, более специализированные процедуры.
Правильный способ сделать это - изменить парадигму с процедурной на управляемой событиями .
Вместо показа экземпляра формы по умолчанию, подобного этому:
StartingSINT_Popup.Show vbModeless 'Open userform
Имейте модуль класса, который содержит WithEvent
его экземпляр:
Private WithEvents popup As StartingSINT_Popup
Private Sub Class_Initialize()
Set popup = New StartingSINT_Popup
End Sub
Public Sub Show()
popup.Show vbModeless
End Sub
Private Sub popup_Closed()
' code to run when the form is closed
End Sub
В коде формы объявите Closed
событие:
Public Event Closed()
А затем поднять его в обработчике QueryClose
:
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
If CloseMode = 0 Then 'controlbox was clicked (the "red X button")
Cancel = True 'would otherwise destroy the form instance
Me.Hide 'always hide, never unload
End If
RaiseEvent Closed
End Sub
Теперь скажите, что вы назвали этот класс PopupPresenter
, теперь ваша процедура может сделать это:
Private presenter As PopupPresenter
Public Sub DoStuff()
Set presenter = New PopupPresenter
'do stuff...
presenter.Show
'rest of the code in this scope will run immediately AND THIS IS FINE
End Sub
Держите презентатора на уровне модуля, чтобы объект не выходил из области видимости после завершения DoStuff
, и передавайте любые переменные / значения или утверждайте, что объект презентатора должен выполнять свою работу, когда форма закрыта. Вы можете сделать это, выставив свойства или открытые поля / переменные (хотя предпочитайте свойства, но это совсем другая тема):
Private WithEvents popup As StartingSINT_Popup
Public Foo As String
Private Sub Class_Initialize()
Set popup = New StartingSINT_Popup
End Sub
Public Sub Show()
popup.Show vbModeless
End Sub
Private Sub popup_Closed()
' code to run when the form is closed
MsgBox Foo
End Sub
Private presenter As PopupPresenter
Public Sub DoStuff()
Set presenter = New PopupPresenter
'do stuff...
presenter.Show
presenter.Foo = "some data"
'rest of the code in this scope will run immediately AND THIS IS FINE
End Sub