【发布时间】: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()认为任何数据无效,您并没有向用户展示事实! 您只是默默地绕过数据读取和AddEnterDataIntoSheetsub。看起来验证程序可能是罪魁祸首。 -
您是否在
AddNextBtnClick()中设置了断点并使用调试器跟踪执行情况?