VBA UserForm - 使用TextBox作为十进制数字输入的最佳方式,与区域设置无关?

时间:2015-05-26 06:38:03

标签: excel vba excel-vba userform

我开发了一个UserForm来简化我的一个项目的DataBase输入。 在这个UF中,有一个 TextBox专用于数值

我使用此代码来避免文本输入:

Private Sub TextBox1_Change()
    If Right(Me.TextBox1.Value, 1) = "." Or Right(Me.TextBox1.Value, 1) = "," Or _
        Right(Me.TextBox1.Value, 2) = ".0" Or Right(Me.TextBox1.Value, 2) = ",0" Then

    Else
        Me.TextBox1.Value = Val(Me.TextBox1.Value)
    End If
End Sub

我的问题是:

在美国区域设置几乎正常:我可以输入带小数分隔符.的十进制数字,但每次输入零在分隔符右侧的第一个数字之后,该数字将被截断为整数。

在法语区域设置中,我只是无法输入任何小数,它始终是一个整数。我可以在结尾显示..0,,0,但是当我走得更远时,每次被截断为整数时都会被删除。

我看到我们也可以使用CDbl()或类似的功能,但是当我尝试每次输入一个字母时都会出错。也许CDbl()使用Val() 错误处理程序就足够了,但我不确定,我无法找到办法正确!

1 个答案:

答案 0 :(得分:1)

我将它用于带有一个十进制的数字文本框(请参阅检查If KeyAscii = 46

Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    Select Case KeyAscii
        Case vbKey0 To vbKey9, vbKeyBack, vbKeyClear, vbKeyDelete, _
        vbKeyLeft, vbKeyRight, vbKeyUp, vbKeyDown, vbKeyTab
            '~~> Check to see if there is already a decimal
            If KeyAscii = 46 Then If InStr(1, TextBox1.Text, ".") Then KeyAscii = 0
        Case Else
            KeyAscii = 0
            Beep
    End Select
End Sub

请根据您的需要进行修改。

对于,,KeyAscii为44。您可以在上面的代码中添加它。

修改

您可以使用Application.International(xlCountrySetting)检查国家/地区设置,然后使用KeyAscii 44KeyAscii 46。您还可以使用API​​ GetLocaleInfo来检索区域设置。

如果我没错,那么法国的xlCountrySetting33,而美国为1

因此,您的代码可以写成(未经测试

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 Application.International(xlCountrySetting) = 1 Then
                If KeyAscii = 46 Then If InStr(1, TextBox1.Text, ".") Then KeyAscii = 0
            ElseIf Application.International(xlCountrySetting) = 33 Then
                If KeyAscii = 44 Then If InStr(1, TextBox1.Text, ",") Then KeyAscii = 0
            End If
        Case Else
            KeyAscii = 0
            Beep
    End Select
End Sub