用户窗体文本框是数字(和空)

Userform Textboxs are numeric (and null)

我正在实施用户表单,并希望在 运行 用户表单之前对输入数据进行一些检查。特别是,检查用户窗体文本框中的所有输入都是数字,尽管文本框为空白或 Null 是有效的。我已尝试执行以下操作:

    Select Case KeyAscii
    Case 0, 46, 48 To 57
    Case Else
    MsgBox "Only numbers allowed"
    End Select

但这不起作用。 请问,想法? 非常感谢!!!!!!!!!

可能有点啰嗦 - 我通常使用 class 模块和控件上的标签 属性 来决定可以在文本框中输入的内容。

创建一个包含四个文本框的表单。
为文本框提供这些标签:

  • 1;CDBL
  • 2;CINT
  • 3;CSTR
  • 4;句子

数字是保存表单时要将值粘贴到的列(我在这里没有描述那个位)。
文本描述了可以在文本框中输入的内容 - CDBL 是带 2 位小数的数字,CINT 是带 0 位小数的数字,CSTR 用于正确文本,CSENTENCE 用于句子文本。

创建一个名为 clsControlText 的 class 模块。
将此代码添加到 class 模块:

Public WithEvents txtBox As MSForms.TextBox

Private Sub txtBox_Change()
  Static LastText As String
  Static SecondTime As Boolean
  Const MaxDecimal As Integer = 2
  Const MaxWhole As Integer = 1

  With txtBox
    If InStr(.Tag, ";") > 0 Then
        Select Case Split(.Tag, ";")(1)
            Case "CDBL", "CCur"
                '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
                        Beep
                        SecondTime = True
                        .Text = LastText
                    Else
                        LastText = .Text
                    End If
                End If
                SecondTime = False
            Case "CINT"
                'Allow only whole numbers.
                If .Text Like "[!0-9]" Or Val(.Text) < -1 Or .Text Like "?*[!0-9]*" Then
                    Beep
                    .Text = LastText
                Else
                    LastText = .Text
                End If
            Case "CSTR"
                'Convert text to proper case.
                .Text = StrConv(.Text, vbProperCase)
            Case "CSENTENCE"
                'Convert text to sentence case (capital after full-stop).
                .Text = ProperCaps(.Text)
            Case Else
                'Allow anything.
        End Select
    End If
  End With
End Sub

Private Function ProperCaps(strIn As String) As String
    Dim objRegex As Object
    Dim objRegMC As Object
    Dim objRegM As Object
    Set objRegex = CreateObject("vbscript.regexp")
    strIn = LCase$(strIn)
    With objRegex
        .Global = True
        .ignoreCase = True
         .Pattern = "(^|[\.\?\!\r\t]\s?)([a-z])"
        If .Test(strIn) Then
            Set objRegMC = .Execute(strIn)
            For Each objRegM In objRegMC
                Mid$(strIn, objRegM.firstindex + 1, objRegM.Length) = UCase$(objRegM)
            Next
        End If
        ProperCaps = strIn
    End With
End Function  

将此代码添加到用户表单:

Private colTextBoxes As Collection

Private Sub UserForm_Initialize()

    Dim ctrlSelect As clsControlText
    Dim ctrl As Control


    Me.Caption = ThisWorkbook.Name

    Set colTextBoxes = New Collection
    For Each ctrl In Me.Controls
        Select Case TypeName(ctrl)
            Case "TextBox"
                Set ctrlSelect = New clsControlText
                Set ctrlSelect.txtBox = ctrl
                colTextBoxes.Add ctrlSelect
        End Select
    Next ctrl

End Sub

注意:并非所有这些代码都是我的。我在本网站的其他地方找到了 ProperCaps 和 CDBL 的代码 - 或者可能是 MrExcel。

您可以使用基本的 LIKERegexp

Sub Test()
Debug.Print StrCheck("")
Debug.Print StrCheck("hello kitty")
Debug.Print StrCheck("4156")
End Sub

函数

Function StrCheck(strIn As String) As String
Dim objRegex As Object
Set objRegex = CreateObject("vbscript.regexp")
objRegex.Pattern = "\d+"
'vaidate empty string
If Len(Trim(strIn)) = 0 Then
    StrCheck = True
Else
'validate whether non-empty string is numeric
    StrCheck = objRegex.Test(strIn)
End If
End Function