Вы можете использовать локальную переменную Static
, чтобы «запомнить», был ли обработчик хотя бы один раз или нет:
Private Sub SWName_Field_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
Static executed As Boolean
If Not executed Then
SWName_Field.Text = ""
executed = True
End If
End Sub
Состояние локального Static
привязано к вашему экземпляру UserForm
- значение будет «запомнено», пока экземпляр формы жив.
Это означает, что если вы показываете экземпляр формы по умолчанию , состояние не обязательно будет сброшено. Вам нужно будет получать новое состояние формы по умолчанию каждый раз, когда форма показывается, а не только в первый раз - для этого вы New
заполняете форму:
With New UserForm1
.Show
End With
Если вы просто выполните UserForm1.Show
, тогда вы не будете контролировать, когда будет создан экземпляр формы, - это сделает VBA.
Вы также захотите контролировать, когда экземпляр формы будет уничтожен - вы можете сделать это, обработав событие QueryClose
формы:
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
If CloseMode = VbQueryClose.vbFormControlMenu Then
Cancel = True ' cancel the destruction of the object
Me.Hide ' hide the instance instead
End If
End Sub
При этом объект будет уничтожен, когда выполнение достигнет End With
. Без него объект будет уничтожен, если пользователь нажмет кнопку «X», и вы, вероятно, не захотите, чтобы это произошло (особенно если вам нужно получить доступ к состоянию формы после ее закрытия).