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 或使用户窗体默认为无模式。
所以我有一个 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 或使用户窗体默认为无模式。