我为我的一个项目开发了一个UserForm来简化数据库输入。在这个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()
或这样的函数,但是当我尝试时,每次输入字母时都会出现错误。也许使用Val()
的CDbl()
与错误处理程序就足够了,但我不确定,我找不到正确的方法!
我将此用于带有一个小数的数字文本框(参见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
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