Userform 称为 Userform TextBox 控件的行为

Userform called Userform TextBox Control behavior

所以我有一个 excel 工作簿,它在工作簿打开事件中打开 userform1。 一旦在 userform1 上满足某些条件,它就会调用一个加载和显示 userform2 的过程。 Userform2 有一个标签、一个文本框和一个按钮。我遇到的这个问题是 userform2 上文本框的事件并没有全部正确触发。 KeyUp 和 KeyDown 事件按预期触发,但永远不会调用 Change 和 AfterUpdate 事件。
我已经能够在另一个大大简化的工作簿中复制该行为。如果您在 userform1 的文本框中键入或粘贴超过 7 个字符的文本字符串,它会加载 userform2。所需的行为是在 userform2 的文本框中键入一个 3 位数的数值,然后从 userform1 调用一个子程序。这永远不会发生。有没有其他人见过这种行为?你是如何解决这个问题的?

USERFORM1:(请原谅 Ascii 艺术,显然我没有足够的声誉来 post 图片):/


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

我不确定为什么会发生这种情况,因为您可以 运行 userform2 本身并且它有效。然而,要解决这个问题,最好将代码放在 keyUp 事件中。这应该有效

编辑

我找到了一些解决方法。它并不完美,因为我无法找出它不开火的原因。但是,向上和向下按键工作正常。我已经添加了这段代码,现在事件应该会触发。但这是一个半手动的事件。

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

所以当一个键被按下时。它将检查任何更改。

我最终使用了 KeyUp 和 BeforeDropOrPaste。

山姆,感谢您的启发。我试图将 Change 事件的代码复制到实际过程中。我最终直接从 KeyUp 过程调用事件并在 BeforeDropOrPaste 事件中使用 Application.OnTime "UserForm2.TextBox1_Change" 来绕过丢失的数据。

问题是您的代码以模态方式显示第二个用户窗体。在这种情况下,在显示第二个用户窗体时,不允许完成第一个窗体中的 TextBox1_Change() 过程。这会干扰事件消息传递。

要解决此问题,只需非模式地显示第二个用户窗体:

    UserForm2.Show vbModeless

请不要使用建议的技巧。

Excel 英雄是正确的,唯一的一点是在模式用户窗体旁边加载一个无模式用户窗体,你必须 .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 或使用户窗体默认为无模式。