【问题标题】:Userform button not working when typing in a textbox vba在文本框 vba 中键入时,用户窗体按钮不起作用
【发布时间】:2020-08-27 12:50:15
【问题描述】:

我有一个用户表单,您必须在其中将数据输入文本框,然后按一个按钮将数据放入工作表中。当我在最后一个文本框中输入并完成时,我单击按钮但它没有响应。另外,我注意到我的光标在最后一个文本框内一直闪烁,所以我猜那里有问题(虽然焦点无法点击按钮)?

我总共有 4 个文本框,其中 3 个在其值更新后使用数据验证。最后一个没有数据验证。

奇怪的是,在“下一步”按钮旁边,我有一个用于清除字段的按钮,而且这个按钮工作得很好。在我的用户表单中的图片下方有一些解释,因为它是另一种语言(荷兰语)。谁能帮我?谢谢!

用于“下一步”按钮的代码是:

注意:数据不仅在更新文本框的值时得到验证,而且在他们单击下一个按钮时还有额外的时间。

Private Sub AddNextBtn_Click()
    AddValueMod.AddDisplayOverview
End Sub

Sub AddDisplayOverview() 'This sub is in the "AddValueMod" module
    'Check if information is valid via a function
    If AddInformationValid("AccountSelector", True) And AddInformationValid("Date", True) And AddInformationValid("Amount", True) And AddInformationValid("Description", True) Then
        'If valid, retrieve entered values
        Dim account, dDate, amount, description As String
        account = main.AddAccountSelector.Value
        dDate = main.AddDateInput.Value
        amount = main.AddValue.Value
        description = main.AddDescription.Value
        'Ask for sheet-writing-confirmation
        overview = MsgBox("Kloppen volgende gegevens (kijk goed na!)?" & vbCrLf & vbCrLf & "Rekening: " & account & vbCrLf & "Datum: " & dDate & vbCrLf & "Bedrag: " & amount & vbCrLf & "Beschrijving: " & description & vbCrLf & "Vermeerdering/vermindering: Waarde wordt vermeerderd", vbYesNo + vbQuestion, "Kloppen volgende gegevens?")
        If overview = vbYes Then
            'Write data to sheet
            AddValueMod.AddEnterDataIntoSheet
        End If
    End If
End Sub

对于“清除字段”按钮:

Private Sub AddClearFieldsBtn_Click()
    AddValueMod.AddClearFields (True)
End Sub

Sub AddClearFields(askForConfirmation As Boolean) 'This sub is in the "AddValueMod" module
    grey = RGB(128, 128, 128)
    'If askForConfirmation = True, ask for confirmation before clearing fields
    If askForConfirmation = True Then
        confirmationMessage = MsgBox("Bent u zeker dat u de velden wilt leegmaken?" + vbCrLf + "U zal terug opnieuw moeten beginnen.", vbYesNo + vbQuestion, "Velden leegmaken?")
        If confirmationMessage = vbYes Then
            'Clear fields
            main.AddAccountSelector.Value = ""
            main.AddDateInput.Value = ""
            main.AddValue.Value = ""
            main.AddDescription.Value = ""
        End If
    ElseIf askForConfirmation = False Then
        'Clear fields
        main.AddAccountSelector.Value = ""
        main.AddDateInput.Value = ""
        main.AddValue.Value = ""
        main.AddDescription.Value = ""
    End If
    'Reset the textboxes' borders (they change if an input error occurred)
    main.AddAccountSelectorError.Visible = False
    main.AddAccountSelector.BorderStyle = fmBorderStyleSingle
    main.AddAccountSelector.BorderColor = grey
    main.AddDateInputError.Visible = False
    main.AddDateInput.BorderStyle = fmBorderStyleSingle
    main.AddDateInput.BorderColor = grey
    main.AddValueError.Visible = False
    main.AddValue.BorderStyle = fmBorderStyleSingle
    main.AddValue.BorderColor = grey
    main.AddDescriptionError.Visible = False
    main.AddDescription.BorderStyle = fmBorderStyleSingle
    main.AddDescription.BorderColor = grey
End Sub

P.S.:我已经用IsCancel = True/False 尝试了一个可能的解决方案,我在this article 上找到了该解决方案。它可能不起作用,因为这篇文章与我的问题不太相关,但我觉得我应该提到它:)。

【问题讨论】:

  • 请显示您通过按钮运行的代码。
  • @TomBrunberg,更新了!很抱歉给您带来不便。
  • 您没有提供AddValueMod.AddEnterDataIntoSheet 子,所以我无法追踪代码。我只是评论一下:变量account, dDate, amount, description As String 当然只在AddDisplayOverview 本地有效。但我猜你确实从 AddEnterDataIntoSheet 的表单中再次读取了这些值?您在代码模块中使用Option Explicit 吗?如果没有,请这样做。无论如何,在AddNextBtn_Click() 的一行上放一个断点,然后使用调试器进入其他子程序,并注意变量如何在工作表中结束。或者发生意外的地方。
  • 另外,如果AddInformationValid() 认为任何数据无效,您并没有向用户展示事实! 您只是默默地绕过数据读取和AddEnterDataIntoSheet sub。看起来验证程序可能是罪魁祸首。
  • 您是否在AddNextBtnClick() 中设置了断点并使用调试器跟踪执行情况?

标签: excel vba


【解决方案1】:

您没有提供所有相关代码。 AddInformationValid()AddEnterDataIntoSheet 不见了。

但是,如果 AddInformationValid() 在任何项目上返回 False,则行为与您描述的一样。在AddDisplayOverview() 中不会出现错误消息,AddEnterDataIntoSheet 子将被绕过,并且在从按钮处理程序返回时,光标在最后一个输入字段中保持闪烁。

您需要验证并更正AddInformationValid() 函数。

我还强烈建议在数据验证失败时显示错误消息。

【讨论】:

  • 你是对的!我确实搞砸了AddInformationValid() 函数。对于一个字段,该函数始终返回 False 而从不返回 True。感谢您帮助解决问题!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-17
  • 1970-01-01
  • 1970-01-01
  • 2011-07-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多