vba - 通过VBA Excel从数字中删除小数

标签 vba excel

我在 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/

相关文章:

excel - excel中的条码扫描器

excel - Vba -excel.公式方法速度慢

vba - 执行特定行 vba

excel - 如何按第一列对每个新工作表中的新数据进行排序?

c# - 在 EPPlus 中调用 LoadFromCollection 时忽略属性

vba - 在 Excel 中合并列

c# - 使用 OleDB 读取范围 Excel 工作表

mysql - 如何在 Excel 中的 MS Query 中使用临时表?

MySQL-通过 ODBC 从 MS Access VBA 进行查询 : ADODB asynchronous execution does not work

excel - VBA从ProcessID创建IE对象