У меня есть пользовательская форма, UserForm2
Со следующей конфигурацией:
- имеет четыре кадра
- Все кадры видны;
Frame1
не участвует в этой процедуре - В
Frame2
входят три Textbox
es, два из которых являются обязательными, а один необязательный Frame3
имеет восемь Textbox
es, все необязательные 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")