EXCEL 验证用户表单文本框

时间:2021-01-02 09:28:36

标签: excel vba

我有一个带有复选框和文本框的用户表单。 我想实现验证,以便用户只能插入数字或留空。 如果留空,则文本框的背景颜色变为白色,如果值不是数字,则背景颜色为红色。 我有以下代码,但它运行错误,因为:

  1. 当我移动到另一个文本框时,文本保持红色。

  2. 当我故意插入错误的值时,我无法移动到另一个文本框,直到我将正确的值放入其中。如果我只是移动到另一个文本框将其留空,它应该会再次变为白色。

     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
    

2 个答案:

答案 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 上得到了回答。