通过VBA Excel从数字中删除十进制

Kas*_*sra 3 excel vba excel-vba

我在Excel中写了一些VBA代码来删除包含数字的文本框中的小数分隔符.代码如下:

Private Sub TextBox1_Change()

TextBox1 = Format(TextBox1, "Standard")

End Sub
Run Code Online (Sandbox Code Playgroud)

但它不能正常工作.最终结果有千位分隔符,也有小数位.

此TextBox不是输入数据入口,实际上,它是隐藏单元格的输出显示.它与一个单元格("B15")相关,该单元格设置在Separator Thousand Group(On)和No Decimal Place(Off)上.但TextBox1显示带有分隔符T.Group(On)和带小数位(On)的数字.我需要VB代码的语法来保持Separator T.Group没有Decimal Place.任何删除小数分隔符的想法都是受欢迎的!

Mat*_*don 5

假设用户提供输入,这是一个XY问题IMO:您的目标是确保您的用户只能在该文本框中键入数字字符,而不是截断小数.

问题是文本框' Change事件被触发太晚了.相反,处理KeyDown- 我会做这样的事情:

Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    If Not KeyCodeValidator.IsValidDigitInput(KeyCode.value) Then KeyCode.value = 0
End Sub
Run Code Online (Sandbox Code Playgroud)

有一个KeyCodeValidator标准模块:

Option Explicit
Option Private Module

Public Function IsValidAlphaInput(ByVal keyAscii As Long, Optional ByVal allowDeletion As Boolean = True, Optional ByVal allowNav As Boolean = True) As Boolean
    IsValidAlphaInput = (keyAscii >= vbKeyA And keyAscii <= vbKeyZ) Or (allowDeletion And IsDeletion(keyAscii)) Or (allowNav And IsNavKey(keyAscii))
End Function

Public Function IsValidDigitInput(ByVal keyAscii As Long, Optional ByVal allowDeletion As Boolean = True, Optional ByVal allowNav As Boolean = True) As Boolean
    IsValidDigitInput = (keyAscii >= vbKey0 And keyAscii <= vbKey9) Or (keyAscii >= vbKeyNumpad0 And keyAscii <= vbKeyNumpad9) Or (allowDeletion And IsDeletion(keyAscii)) Or (allowNav And IsNavKey(keyAscii))
End Function

Public Function IsValidAlphanumericInput(ByVal keyAscii As Long, Optional ByVal allowDeletion As Boolean = True, Optional ByVal allowNav As Boolean = True) As Boolean
    IsValidAlphanumericInput = IsValidAlphaInput(keyAscii) Or IsValidDigitInput(keyAscii) Or (allowDeletion And IsDeletion(keyAscii)) Or (allowNav And IsNavKey(keyAscii))
End Function

Public Function IsValidDecimalInput(ByVal keyAscii As Long, ByVal contents As String) As Boolean
    If IsValidDigitInput(keyAscii) Or keyAscii = Asc(".") Then
        IsValidDecimalInput = IsNumeric(contents & Chr$(keyAscii))
    End If
End Function

Private Function IsDeletion(ByVal keyAscii As Long) As Boolean
    IsDeletion = keyAscii = vbKeyDelete Or keyAscii = vbKeyBack
End Function

Private Function IsNavKey(ByVal keyAscii As Long) As Boolean
    IsNavKey = keyAscii = vbKeyTab Or keyAscii = vbKeyLeft Or keyAscii = vbKeyRight
End Function
Run Code Online (Sandbox Code Playgroud)

如果要支持小数,IsValidDecimalInput则需要将文本框的当前内容传递给(需要进行微调以支持国际小数分隔符).

我实际上把那个模块作为一个类,但是标准模块也很合适.

重点是,不要在用户输入文本框后修改用户的输入 - 防止用户的无效输入在第一时间输入.