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 44
或KeyAscii 46
。 您也可以使用API GetLocaleInfo
来检索区域设置。
如果我没有错,那么法国的xlCountrySetting
是33
,美国是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