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.任何删除小数分隔符的想法都是受欢迎的!
假设用户提供输入,这是一个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则需要将文本框的当前内容传递给(需要进行微调以支持国际小数分隔符).
我实际上把那个模块作为一个类,但是标准模块也很合适.
重点是,不要在用户输入文本框后修改用户的输入 - 防止用户的无效输入在第一时间输入.