excel 使VBA窗体文本框仅接受数字(包括+、-和.)

ev7lccsx  于 2023-03-09  发布在  其他
关注(0)|答案(8)|浏览(229)

我有一个简单的textBox,我想验证它的输入,包括“+”、“-”和“”。下面是我所尝试的

Private Sub DisplayValue_TextBox_Change()
If Not IsNumeric(DisplayValue_TextBox.Value) Then
               MsgBox "Only numbers allowed"

      End If
End Sub

但这只接受数字0-9没有负值,正值或浮点值。

jaxagkaj

jaxagkaj1#

关于我的评论:
考虑一个包含文本框1和命令按钮1的用户表单1示例

当你在TextBox1中输入任何内容时,change事件触发--即,输入一个字符触发Change()事件并传递当前值,因此即使你输入负号,你的当前逻辑也会失败。
您需要的是使用另一个事件,如_AfterUpdate()_Exit(),并强调第二个,因为您可以取消该事件:)

Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    If Not IsNumeric(TextBox1.Value) Then
        MsgBox "only numbers allowed"
        Cancel = True
    End If
End Sub

您可以在此处找到活动:

mcvgt66p

mcvgt66p2#

使用KeyPress事件,并放弃任何非数字输入:

Private Sub txtShift1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
Debug.Print KeyAscii
If KeyAscii >= 48 And KeyAscii <= 57 Then
    Debug.Print "number"
Else
    Debug.Print "other"
    KeyAscii = 0
End If
End Sub
wz3gfoph

wz3gfoph3#

到目前为止,我一直依赖于字符串解析来完成这项工作,我很高兴我决定检查一下,看看其他人是如何做的,并发现了这个问题。
我改进了Ruben Alvarez的精彩答案。下面只允许输入数字,并且只有一个小数点。

Private Sub txtShift1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)

    Select Case KeyAscii
        Case 46
            If InStr(1, txtShift1, ".") > 0 Then KeyAscii = 0
        Case 48 To 57
        Case Else
            KeyAscii = 0
    End Select

End Sub

这可以进一步细化,以便在必要时只允许单个“+"、“-”等。

x8goxv8g

x8goxv8g4#

我用这个。它只允许带小数的数字。

Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    Select Case KeyAscii
        Case vbKey0 To vbKey9, vbKeyBack, vbKeyClear, vbKeyDelete, _
        vbKeyLeft, vbKeyRight, vbKeyUp, vbKeyDown, vbKeyTab
            If KeyAscii = 46 Then If InStr(1, TextBox1.Text, ".") Then KeyAscii = 0
        Case Else
            KeyAscii = 0
            Beep
    End Select
End Sub
z9smfwbn

z9smfwbn5#

我用的是:

Private Sub txtGiaNet_Change()
    If IsNumeric(txtGiaNet.Value) Then
        //if number do sth
    Else
        //if not, delete this character
        txtGiaNet.Value = Left(txtGiaNet.Value, Len(txtGiaNet.Value) - 1)
    End If

End Sub
1yjd4xko

1yjd4xko6#

If TextBox1.Value <> "" Then
    Dim N As Boolean
    N = True
    Do While N
        If Not IsNumeric(TextBox1.Value) Then
            TextBox1.Value = Left(TextBox1.Value, Len(TextBox1.Value) - 1)
        Else
            N = False
        End If
    Loop
End If
gzszwxb4

gzszwxb47#

Private Sub TbCout_D_Edlp_Change()

Dim NotNumeric As Boolean

Dim TempValue As String

     If Not IsNumeric(TbCout_D_Edlp.Value) Then
 
        If TbCout_D_Edlp.Value <> "" Then
        
              NotNumeric = True
              
              MsgBox "Only numbers allowed"
              
              TempValue = Left(Me.TbCout_D_Edlp.Value, Len(Me.TbCout_D_Edlp.Value) - 1)
              
              While NotNumeric = True And TempValue <> ""
              
                   If Not IsNumeric(TempValue) Then
              
                        TempValue = Left(TempValue, Len(TempValue) - 1)
                        
                   
                   Else
                        
                        NotNumeric = False
                        
                   End If
        
              Wend
              
              Me.TbCout_D_Edlp.Value = TempValue
                
        End If
        
     End If

End Sub
nkkqxpd9

nkkqxpd98#

FWIW,我可以接受OP对接受值类型的限制,但不能接受在不适当的时间到达的msgbox(例如使用Backspace时)。要解决此问题,我在工作表中创建了计算字段(“Value_AnyGood”)对输入的数据使用ISNUMBER函数。然后,我对任何离开输入数据的UF的事件进行了“True”测试。这导致了一个进程捕获任何非数字输入,但没有弹出合法编辑努力的消息。如果值为False,它会让用户知道,然后结束例程,显示当前的UF。

相关问题