VBA UserForm - 将 TextBox 用作十进制数字输入的最佳方式,与区域设置无关?
VBA UserForm - Best way to use a TextBox as a decimal numerical input, independently of regional settings?
我开发了一个用户窗体来简化我的一个项目的数据库输入。
在这个用友中,有一个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()
就足够了,但我不确定,我想不出正确的方法!
我将其用于带一位小数的数字文本框(请参阅检查 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
我开发了一个用户窗体来简化我的一个项目的数据库输入。 在这个用友中,有一个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()
就足够了,但我不确定,我想不出正确的方法!
我将其用于带一位小数的数字文本框(请参阅检查 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