2015-05-01 1 views
0

Так что у меня есть книга Excel, которая открывает userform1 в событии openbook. Когда определенные условия выполняются в userform1, он вызывает процедуру, которая загружает и показывает userform2. Userform2 имеет ярлык, текстовое поле и кнопку. Эта проблема заключается в том, что события для текстового поля на userform2 не все правильно работают. События KeyUp & KeyDown срабатывают, как ожидалось, но события Change и AfterUpdate никогда не вызываются.
Я смог воспроизвести поведение в другой книге, которая значительно упрощена. Если вы вставляете или вставляете текстовую строку длиной более 7 символов в текстовое поле userform1, она загружает userform2. Желаемое поведение состоит в том, чтобы ввести трехзначное числовое значение в текстовое поле userform2 и вызвать sub из userform1. Это никогда не происходит. Кто-нибудь еще видел это поведение раньше? Как вы обходились?Userform Userform TextBox Управление поведением

UserForm1: (извините искусство Ascii, очевидно, не хватает репутации размещать изображения):/


Label1:    [ Textbox1 ] 
Label2: 



       [ CommandButton1 ] 

Option Explicit 

Private Sub CommandButton1_Click() 
Unload Me 
End Sub 

Private Sub TextBox1_Change() 
If Me.TextBox1.TextLength >= 7 Then 
    Load UserForm2 
    UserForm2.Label1.Caption = "Value for " & Me.TextBox1.Text & "?" 
    UserForm2.Show 
End If 
End Sub 

Public Sub Form2(data As Variant) 
On Error GoTo eh 
Me.Label2.Caption = Me.Label2.Caption & vbCrLf & Me.TextBox1.Text & vbTab & CStr(CLng(data)) 
eh: 
If Err.Number = 13 Then 
    MsgBox "Please input a #" 
    UserForm2.TextBox1.SetFocus 
ElseIf Err.Number = 0 Then 
    Unload UserForm2 
End If 
End Sub 

USERFORM2:


label1: [ Textbox1 ] 
    [ CommandButton1 ] 

Option Explicit 

Private Sub CommandButton1_Click() 
Call UserForm1.Form2(Me.TextBox1.Text) 
End Sub 

Private Sub TextBox1_Change() 
'This event never fires 
If Me.TextBox1.TextLength >= 3 Then 
    Call UserForm1.Form2(Me.TextBox1.Text) 
Else 
    Debug.Print "here" 
End If 
End Sub 

Private Sub TextBox1_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) 
'This event fires 
Debug.Print KeyCode 
End Sub 
+0

Чад, я реплицировал вашу проблему и работаю ниже – Sam

ответ

0

Я не уверен, почему это происходит, поскольку вы можете запускать userform2 самостоятельно, и это работает. Однако, чтобы обойти это, чтобы начать с него, лучше всего поместить код в событие keyUp. Это должно работать

РЕДАКТИРОВАНИЕ

Я нашел небольшую работу вокруг. Это не идеально, поскольку я не могу понять, почему он не стреляет. Однако нажатие клавиши вверх и вниз работает отлично. Я добавил этот код, и теперь событие должно срабатывать. Но это полуавтоматическое событие.

Private Sub TextBox2_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)  
    Call TextBox2_Change 
End Sub 

Поэтому, когда нажата клавиша. Он будет проверять любые изменения.

+0

Да, я тоже играл с этим. Проблема в том, что я использую периферийное устройство для ввода. Когда он сканирует внешние данные и вставляет их в текстовое поле, единственным событием, которое срабатывает, является событие BeforeDropOrPaste, но оно срабатывает до того, как значение было обновлено, поэтому я не могу проверить значение. –

0

В результате я использовал KeyUp и BeforeDropOrPaste.

Сэм, спасибо за вдохновение. Я пытался копировать код события Change в фактическую процедуру. В итоге я вызвал событие непосредственно из процедуры KeyUp и использовал Application.OnTime "UserForm2.TextBox1_Change" в событии BeforeDropOrPaste, чтобы обойти недостающие данные.

0

Проблема в том, что ваш код показывается 2-м пользовательским форматом. В этой ситуации процедура TextBox1_Change() в 1-й форме не может быть завершена, пока отображается вторая пользовательская форма. Это мешает обмену событиями.

Чтобы решить эту проблему, просто показать 2-й UserForm modelessly:

UserForm2.Show vbModeless 

Пожалуйста, не прибегать к предложенному хаку.

+0

Я тоже это пробовал, но пока первая пользовательская форма показана модальной (она должна быть), должна быть и вторая пользовательская форма. Это не позволит мне открыть модельную пользовательскую форму из модальной пользовательской формы. –

0

Excel Hero - это правильно, единственное, что нужно для загрузки моделируемой пользовательской формы рядом с модальной формой пользователя, которой вы должны обладать: .hide - модальная пользовательская форма, чтобы она не мешала безмодельной пользовательской форме.

см код ниже:

Private Sub TextBox1_Change() 
If Me.TextBox1.TextLength >= 7 Then 
    Me.hide 
    Load UserForm2 vbModeless 
    UserForm2.Label1.Caption = "Value for " & Me.TextBox1.Text & "?" 
    UserForm2.Show 
End If 
End Sub 

вы можете загрузить UserForm2 в vbModeless или сделать UserForm по умолчанию безрежимные.