我在 Excel 中编写了一些 VBA 代码,以删除包含数字的文本框中的小数分隔符。代码如下:
Private Sub TextBox1_Change()
TextBox1 = Format(TextBox1, "Standard")
End Sub
但是它不能正常工作。最终结果有千位分隔符,也有小数位。
这个TextBox并不是一个输入数据入口,事实上,它是一个隐藏单元格的输出显示。与单元格(“B15”)有关,该单元格设置为分隔千位组(开)和无小数位(关)。但 TextBox1 显示带有分隔符 T.Group(打开)和小数位(打开)的数字。我需要VB代码的语法来保持Separator T.Group没有小数位。 欢迎任何删除小数点分隔符的想法!
最佳答案
假设用户正在提供输入,这在我看来是一个 X-Y 问题:您的目标是确保用户只能在该文本框中键入数字字符,而不是截断小数。
问题是文本框的 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
有一个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
如果您想支持小数,您可以将文本框的当前内容传递给 IsValidDecimalInput
(需要进行细微调整以支持国际小数分隔符)。
我实际上将该模块作为一个类,但标准模块也很适合。
重点是,在用户的输入进入文本框后,不要修复它 - 防止用户的无效输入甚至从一开始就被输入。
关于vba - 通过VBA Excel从数字中删除小数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48307766/