所以我有一个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
答案 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,或者默认情况下使用户窗体无模式。