Проблемы с использованием «TextBox». SetFocus запускает другие события - PullRequest
0 голосов
/ 01 ноября 2019

У меня есть пользовательская форма, UserForm2 Со следующей конфигурацией:

  • имеет четыре кадра
  • Все кадры видны;Frame1 не участвует в этой процедуре
  • В Frame2 входят три Textbox es, два из которых являются обязательными, а один необязательный
  • Frame3 имеет восемь Textboxes, все необязательные
  • Frame4 имеет семь Textbox es, все обязательные

Когда выполняется первая подпрограмма textbox, tbxPostNetStore_Exit, она вызывает подпрограмму tbxValues(C),передавая значение 2. Этот параметр указывает на два массива, tbx() и lbl(), см. Ниже.

Все работало как надо, вплоть до строки MyControl.SetFocus. В этот момент он начал повторное выполнение tbxPostNetStore_Exit, за которым следовали Sub tbxPostNetAddress1 и т. Д.

TextBox tbxPostNetStore был Cyan и tbxPostNetAddress1 был Yellow, но SetFocus был последнимТекстовое поле в Frame3 !!!

Любой совет, что я делаю неправильно?

Каждое текстовое поле имеет одинаковую кодировку

Я добавил дополнительный код ко всему текстовому блокуподпрограммы, см. «Вызов tbxValues ​​(5), а также код Application.EnableEvents. Интересным моментом здесь является то, что после добавления кода« .EnableEvents »управление продолжается до конца подпрограммы tbxValues. После возврата к вызывающей подпрограмме». , control выполняет новый код «Отмена», и в конце вызывающей подпрограммы элемент управления возвращается обратно в Application.EnableEvants = True в подпрограмме tbxValues. Элемент управления снова выполняет весь код до конца подпрограммы, и в этот моментуправление переходит к следующему TextBox, и управление передается обратно пользовательской форме только после достижения последнего TextBox в FRame3.

'====================================================================================
Private Sub tbxPostNetStore_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Call tbxValues(5)
If tbxCancel = True Then  'I added the following code TO ALL THE TextBox
    Cancel = True         'subroutines, and not just those that require
Else                      'an input. Being pedantic, I added the 
    Cancel = False        'Cancel = False also.
End Sub
'====================================================================================
Private Sub tbxPostNetAddress1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Call tbxValues(6)
End Sub
'====================================================================================
Private Sub tbxPostNetAddress2_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Call tbxValues(7)
End Sub 

And so on, up to tbxValues(19)
'====================================================================================
tbxValues() has the following code:
'====================================================================================
Private Sub tbxValues(C)
Dim Asterisk As Integer
tbxCancel = False
Set MyControl = Me.Controls(lbl(C))
Asterisk = InStr(5, MyControl.Caption, "*")
Set MyControl = Me.Controls(tbx(C))
If Asterisk > 0 Then
    If Trim(MyControl.Value) = "" Then
        MsgBox "Please enter a value", vbCritical, "Error"
        tbxCancel = True
        MyControl.BackColor = Pink
        MyControl.SetFocus
        Exit Sub
    End If
End If
strVar(C) = MyControl.Value
MyControl.BackColor = vbCyan
If Not C = I Then
Set MyControl = Me.Controls(tbx(C + 1))     'Next TextBox
MyControl.BackColor = vbYellow
Application.EnableEvents = False
MyControl.SetFocus  '=========STARTS GOING WRONG HERE
Application.EnableEvents = True
Else
cmbAddNewCustomer.SetFocus
End If
'====================================================================================
End Sub

Private Sub tbxArraySet()
tbx = Array( _
"tbxCustomerID", _
"tbxBOBClientID", _
"tbxCustomerFirstName", _
"tbxCustomerSurName", _
"tbxCompanyName", _
"tbxPostNetStore", _
"tbxPostNetAddress1", _
"tbxPostNetAddress2", _
"tbxPostNetSuburb", _
"tbxPostNetCity", _
"tbxPostNetProvince", _
"tbxPostNetPostCode", _
"tbxPostNetCountry", _
"tbxStreetAddress1", _
"tbxStreetAddress2", _
"tbxStreetPostCode", _
"tbxStreetCountry", _
"tbxCellPhone", _
"tbxLandLine", _
"tbxeMailAddress")
=======================
lbl = Array( _
"lblCustomerID", _
"lblBOBClientID", _
"lblCustomerFirstName", _
"lblCustomerSurName", _
"lblCompanyName", _
"lblPostNetStore", _
"lblPostNetAddress1", _
"lblPostNetAddress2", _
"lblPostNetSuburb", _
"lblPostNetCity", _
"lblPostNetProvince", _
"lblPostNetPostCode", _
"lblPostNetCountry", _
"lblStreetAddress1", _
"lblStreetAddress2", _
"lblStreetPostCode", _
"lblStreetCountry", _
"lblCellPhone", _
"lblLandLine", _
"lbleMailAddress")

1 Ответ

0 голосов
/ 01 ноября 2019

Если у вас где-то есть MyControl_GotFocus, это будет срабатывать каждый раз, когда элемент управления имеет фокус, будь то ручной выбор или это делается с помощью VBA. Вы можете подавить это событие с помощью Application.EnableEvents = False. Который отключает все события триггера, пока он не будет снова включен. Если ваш setfocus является единственной проблемой, я предлагаю решить следующим образом:

Set MyControl = Me.Controls(tbx(C + 1))     'Next TextBox
MyControl.BackColor = vbYellow
Application.EnableEvents = False
MyControl.SetFocus  '=========STARTS GOING WRONG HERE // NOT ANYMORE!
Application.EnableEvents = True
Else
etc.

В зависимости от остальных триггеров, это также может быть необходимо для cmbAddNewCustomer.SetFocus.

...