Userform称为Userform TextBox Control行为

时间:2015-05-01 15:09:01

标签: excel vba excel-vba userform

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

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

2 个答案:

答案 0 :(得分:0)

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

要解决此问题,只需无模式显示第二个用户表单:

    UserForm2.Show vbModeless

请不要诉诸建议的黑客。

答案 1 :(得分: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,或者默认情况下使用户窗体无模式。