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

我开发了一个UserForm来缓解我的一个项目的DataBaseinput。 在这个用友中,有一个文本框专用于一个数值

我使用这个代码来避免文本input:

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 

我的问题是:

在美国的地区设置 ,它几乎工作 :我可以用小数点分隔符input一个十进制数. ,但每次在分隔符右侧的第一个数字之后input一个零时,数字将被截断为一个整数。

在法国的地区设置 ,我只是不能input任何小数 ,它总是一个整数。 我可以显示..0 ,或者,0 ,但是当我走得更远的时候,每次被截断为一个整数都会被擦除。

我看到我们也可以使用CDbl()或者这样的函数,但是当我尝试每次input一个字母时都会得到一个错误。 也许一个CDbl()error handling程序使用Val()就足够了,但我不知道,我不能找出一个方法来做到这一点!

我用这个数字文本框与一个十进制(请参阅检查它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

所以你的代码可以写成( 未testing

 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