【问题标题】:Userform called Userform TextBox Control behaviorUserform 称为 Userform TextBox 控件行为
【发布时间】:2015-07-11 10:33:57
【问题描述】:

所以我有一个在工作簿打开事件中打开 userform1 的 excel 工作簿。 一旦在 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

用户表单2:


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

【问题讨论】:

  • 乍得,我已经复制了您的问题,并在下面解决了问题

标签: vba excel userform


【解决方案1】:

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

编辑

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

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

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

【讨论】:

  • 是的,我也一直在玩这个。我遇到的问题是我正在使用外围设备进行输入。当它扫描外部数据并将其粘贴到文本框中时,触发的唯一事件是 BeforeDropOrPaste 事件,但它在值更新之前触发,所以我无法检查值。
【解决方案2】:

我最终使用了 KeyUp 和 BeforeDropOrPaste。

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

【讨论】:

    【解决方案3】:

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

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

        UserForm2.Show vbModeless
    

    请不要诉诸建议的黑客攻击。

    【讨论】:

    • 我也试过了,但是只要第一个用户窗体显示为模态(它必须是),第二个用户窗体也必须是。它不允许我从模式用户窗体打开无模式用户窗体。
    【解决方案4】:

    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 默认设置为无模式。

    【讨论】:

      猜你喜欢
      • 2019-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-28
      相关资源
      最近更新 更多