Userform Textboxs是数字(和null)

时间:2016-04-01 15:34:41

标签: vba userform isnumeric

我正在实现Userform,并希望在运行Userform之前对输入数据进行一些检查。特别是,检查Userform文本框中的所有输入都是数字,尽管它是有效的文本框是空白还是空。我尝试过实施以下内容:

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

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

2 个答案:

答案 0 :(得分:0)

也许有点长篇大论 - 我通常使用类模块和控件上的tag属性来决定可以在文本框中输入什么。

创建一个包含四个文本框的表单 给文本框这些标签:

  • 1; CDBL
  • 2; CINT
  • 3; CSTR
  • 4; CSENTENCE

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

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

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。

答案 1 :(得分:0)

您可以使用基本的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