1、首先,我们最好是添加一个模块,那么无论你有多少个TextBox控件需要实现只能输入数字,都可以直接调用即可。
2、打开Modoule1模块,先定义3个全局变量,用来保存TextBox的现态,代码如下:'LastText变量用于记录TextBox的上次正确输入'LastLen变量用于保存TextBox的上次正确输入时的字符串长度,以便恢复光标的上次位置'NotText变量用来防止在进行撤销行为时进行2次检测而增加CPU负担Public LastText As String, LastLen As Integer, NotText As Boolean
3、由于我的方法是检测到输入非数字,即撤销到上一步状态,所以我们要对需要限定的TextBox赋一个正确的初始值,还是写成模块,这样可以方便所有的TextBox调用,代码如下:Function Initialize(MyText As TextBox) Dim a$ a = MyText & "1" If Not IsNumeric(a) Then MyText = "0" ‘保证TextBox的初始值是数字 LastText = MyText LastLen = Len(MyText) NotText = FalseEnd Function
4、然后是核心代码,就是对输入或粘贴到文本框的内容是否为数字进行检测,通用同样写在怡觎现喾Modoule1模块中,代码如下:Function OnlyNumbers(M烤恤鹇灭yText As TextBox) If NotText Then NotText = False: Exit Function Dim a$, b$, c%, d% a = MyText.Text b = a c = Len(MyText.Text) '保存光标的位置,网上很多限制只能输入数字的代码要么屏蔽了退格、小数点等键,要么把光标位置给变了 d = MyText.SelStart '字符D是十进制数结尾标志,字符E是科学计数法形式,下边这2行是屏蔽这2个字母的,如果需要使用科学计数法,可以自己灵活修改 a = Replace(a, "E", "", 1, -1, 1) a = Replace(a, "D", "", 1, -1, 1) '屏蔽字母D和E的同时会使光标位置的判断出错 If a <> b Then d = d - 1 '这样给b赋值是考虑负数和小数的情况,如果是正整数去掉此行和上一行即可 b = a & "1" '是否允许TextBox的内容为空这里,可以自行设置,我这里是允许为空的 If a = "" Then Exit Function '之所以采用出错即撤销到上次正确的方法,是因为按键检测的方法是无法对直接粘贴的数据进行检测的 If IsNumeric(b) Then LastText = a LastLen = Len(a) Else NotText = True a = LastText d = d + LastLen - c End If '恢复光标所在的位置 MyText.Text = a MyText.SelStart = dEnd Function
5、我们凸鹣沮北把核心代码全部写成了模块,所以,大家看不懂也没关系,把我写的模块直接复制、粘贴即可。在窗体中只需要调用我写的2个模块即可,比如想限定Text1只能脶巴躔炒输入数字,可以加入下列代码:Private Sub Text1_Change() OnlyNumbers Me.Text1End SubPrivate Sub Text1_GotFocus() Initialize Me.Text1End Sub同样,如果有Text2、Text3等多个TextBox需要限定,也只需调用我写的模块即可。而且即使是Form2中的Text2也可以调用的,如下:Private Sub Text2_Change() OnlyNumbers Form2.Text2End SubPrivate Sub Text2_GotFocus() Initialize Form2.Text2End Sub然后,我随便画了2个TextBox,可以看到对Text1的输入限定,并不影响对Text2的输入限定的: