我有一个带有复选框和文本框的用户表单。 我想实现验证,以便用户只能插入数字或留空。 如果留空,则文本框的背景颜色变为白色,如果值不是数字,则背景颜色为红色。 我有以下代码,但它运行错误,因为:
当我移动到另一个文本框时,文本保持红色。
当我故意插入错误的值时,我无法移动到另一个文本框,直到我将正确的值放入其中。如果我只是移动到另一个文本框将其留空,它应该会再次变为白色。
Private Sub txt_1x2_1_from_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If Not IsNumeric(txt_1x2_1_from.Value) Then
txt_1x2_1_from.BackColor = vbRed
txt_1x2_1_from.Text = ""
ElseIf (txt_1x2_1_from.Value = "") Then
txt_1x2_1_from.BackColor = vbWhite
Else
txt_1x2_1_from.BackColor = vbWhite
Cancel = True
End If
End Sub
答案 0 :(得分:0)
您似乎也弄错了逻辑,因为我认为如果输入不是数字而不是空白,您只希望文本框的背景颜色为红色。
Private Sub txt_1x2_1_from_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If Not IsNumeric(txt_1x2_1_from.Value) Then
If (txt_1x2_1_from.Value = "") Then
txt_1x2_1_from.BackColor = vbWhite
Else
txt_1x2_1_from.BackColor = vbRed
txt_1x2_1_from.Text = ""
End If
Else
txt_1x2_1_from.BackColor = vbWhite
End If
End Sub
更新:似乎 OP 想要一些不同的东西。需要使用 keypress
事件。
Private Sub txt_1x2_1_from_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
Debug.Print KeyAscii
If (KeyAscii > 47 And KeyAscii < 58) Or KeyAscii = 44 Then
txt_1x2_1_from.BackColor = vbWhite
Else
KeyAscii = 0
txt_1x2_1_from.BackColor = vbRed
End If
End Sub
为了检查所有允许的键,此代码可能仍需要一些改进。
答案 1 :(得分:0)
另一种方法是首先不允许输入文本。在下面的示例中,我已将区分大小写的单词“Numerical”添加到必须为数字的文本框的控件 Tag
属性中。
与不允许用户在添加了错误条目时继续前进相比,我一直发现按下“保存”按钮时检查整个表单更容易。
我在底部添加了用于更改控件背景颜色的代码。
创建一个 Class
并将其命名为 clsTxtBxEvent
。
Option Explicit
Public WithEvents txtBox As MSForms.TextBox
Private Sub txtBox_Change()
Static LastText As String
Static SecondTime As Boolean
Const MaxDecimal As Integer = 2
With txtBox
'Allow only numbers with <=2 decimal places
If Not SecondTime Then
If .Text Like "[!0-9.-]*" Or Val(.Text) < -1 Or _
.Text Like "*.*.*" Or .Text Like "*." & String$(1 + MaxDecimal, "#") Or _
.Text Like "?*[!0-9.]*" Then
SecondTime = True
.Text = LastText
Else
LastText = .Text
End If
End If
SecondTime = False
' 'Allow only whole numbers.
' If .Text Like "[!0-9]" Or Val(.Text) < -1 Or .Text Like "?*[!0-9]*" Then
' .Text = LastText
' Else
' LastText = .Text
' End If
End With
End Sub
将此添加到您的表单中:
Option Explicit
Private TextBoxCollection As Collection
Private Sub UserForm_Initialize()
Dim TxtBxEvent As clsTxtBxEvent
Dim ctrl As Control
Set TextBoxCollection = New Collection
For Each ctrl In Me.Controls
Select Case TypeName(ctrl)
Case "TextBox"
If ctrl.Tag = "Numeric" Then '<Remove check if all textboxes.
Set TxtBxEvent = New clsTxtBxEvent
Set TxtBxEvent.txtBox = ctrl
TextBoxCollection.Add TxtBxEvent
End If '<Remember to remove this as well
End Select
Next ctrl
End Sub
这个添加到表单中的代码会改变控件的背景颜色。
Private Sub ColourBackground(ctrl As Control, Optional ColourOn As Boolean = True)
If ColourOn Then
ctrl.BackColor = &HFFC0C0
Else
ctrl.BackColor = &H80000005
End If
End Sub
'Colour controls on Enter / Exit '
'Enter / Exit isn't exposed to class objects, so needs coding separately. '
Private Sub TextBox1_Enter()
ColourBackground Me.TextBox1
End Sub
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
ColourBackground Me.TextBox1, False
End Sub
Private Sub TextBox2_Enter()
ColourBackground Me.TextBox2
End Sub
Private Sub TextBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean)
ColourBackground Me.TextBox2, False
End Sub
我还没有尝试过,但是您可以将 ColourBackground
过程移动到类模块并检查控件 Tag
值以获取特定控件中的最大/最小允许值,并在更新时相应地使用颜色。
免责声明 - 几年前我有一个类似的问题,并在 MrExcel 上得到了回答。