ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 14007|回复: 13

VBA 限制多个textbox 只能输入数字,小数,负数 。

[复制链接]

TA的精华主题

TA的得分主题

发表于 2013-3-6 12:10 | 显示全部楼层 |阅读模式
各位大神, 我的界面有大量的TEXTBOX ,没有用数组控件。
我要限制textbox只能输入数字,小数和负数。
帮我看看 代码那里有问题。
运行无效果,还是可以输入中英文字符。

Dim m_currentTextBox As TextBox
Private Sub Form_Initialize()
Me.KeyPreview = True
End Sub
Private Sub Form_KeyPress(KeyAscii As Integer)

If m_currentTextBox Is Me.ActiveControl And IsNumeric(Chr(KeyAscii)) = False And KeyAscii <> 46 Then KeyAscii = 0

End Sub

TA的精华主题

TA的得分主题

发表于 2013-3-6 14:33 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
VBA 在语言上不直接支持控件数组。
而且你限制Ascii 码的代码应用的事件恐怕是不行的,那个事件是针对窗体的按键。Form_keypress
如果是针对文本框 TextBox_keypress 那一定是可以的,但是你有几十个文本框,就要重写几十个事件,这是不现实的。
解决方案有2种(我设想的未必对,提供一条思路)
第一种是直接解决的方法:
利用类模块做一个文本框控件数组的类,定义该类的事件,类似keypress 但是对象是你类模块的文本控件数组类。你的文本框都可以是new 的这个类模块的对象。理论大体如此,但是鉴于俺的类模块还没有入门只能纸上谈兵。

第二种思路是间接解决方法:
即在录入时不限制,而在提交的时候进行检验,如果某文本框内不是数字,就报错不予提交。
这样只要能模拟解决控件数组的问题,能让所有文本框循环就可以做到了。(建议你所有的提示信息使用label 窗体控件,这样可以避免和文本框混淆)
下面是我设计的模拟控件数组循环片段,思路来自百度,自己也没调试,仅仅希望能对你有所帮助:
这样仅用一段代码就可以循环你所有的文本框控件了。
  1. Dim shp As OLEObject, mark As String, text_in As String
  2.     mark = "TextBox" '建议你的文本框都用TextBox 开头后面不同这样容易取巧
  3.     For Each shp In .OLEObjects '在所有控件中进行循环
  4.         If InStr(shp.Name, mark) > 0 Then '如果控件的名称中出现了TextBox 即为一个文本框
  5.            '之所以使用工作表函数isnumber 是因为vba 函数isnumeric 对空值夜判断为真,懒的加一个条件了
  6.            '下面判断语句很简单,如果文本框内容不是数值就直接填0,你可以根据需要进行程序控制的更改
  7.            If (Not WorksheetFunction.IsNumber(shp.Object.Text)) Then shp.Object.Text = 0
  8.             
  9.         End If
  10.     Next
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-3-6 15:12 | 显示全部楼层
谢谢,我一直想写个公共类,调用不行吗。 点击事件的时候遍历?

TA的精华主题

TA的得分主题

发表于 2013-3-6 15:19 | 显示全部楼层
37623412 发表于 2013-3-6 15:12
谢谢,我一直想写个公共类,调用不行吗。 点击事件的时候遍历?

我觉得这个问题应该是用类模块来解决是正理。但是类模块对新手来说比较复杂,我也还没入门,不会写。
类模块里用With events 可以定义事件,做一个文本框控件数组的类,定义一个key press 事件,你所有的文本框都可以调用这个事件,就可以稍作修改你顶楼的代码就工作了。
理论上是如此,实际操作的话,知识欠缺太多。

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-3-6 17:49 | 显示全部楼层
还是谢谢你啊  继续求大神   

TA的精华主题

TA的得分主题

发表于 2013-3-7 18:07 | 显示全部楼层
短信收到,需要类模块,请参考下面我回复的帖子:
VB中不是控件数据,多个文本框设置,代码简化
http://club.excelhome.net/thread-968033-1-1.html

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2013-3-7 19:02 | 显示全部楼层
本帖最后由 zhaogang1960 于 2013-3-7 23:02 编辑

针对你的要求——有负号,重新写了一个,请测试
类模块clsTxt:

  1. Public WithEvents Txtbox As MSForms.TextBox

  2. Private Sub Txtbox_Change()
  3.     Dim s As String, t As String, a, i As Integer
  4.     s = Txtbox.Text
  5.     If InStr(s, ".") Then '仅保留一个小数点,且不在最左边
  6.         If Left(s, 1) = "." Then
  7.             Txtbox.Text = Mid(s, 2)
  8.         Else
  9.             a = Split(s, ".")
  10.             If UBound(a) > 1 Then
  11.                 t = a(0) & "."
  12.                 For i = 1 To UBound(a)
  13.                     t = t & a(i)
  14.                 Next
  15.                 Txtbox.Text = t
  16.             End If
  17.         End If
  18.     End If
  19.     If InStr(s, "-") Then '仅保留一个负号,且在最左边
  20.         a = Split(s, "-")
  21.         If Left(s, 1) <> "-" Then
  22.             Txtbox.Text = Replace(s, "-", "")
  23.         Else
  24.             If InStr(Mid(s, 2), "-") Then Txtbox.Text = "-" & Replace(s, "-", "")
  25.         End If
  26.     End If
  27.     With CreateObject("vbscript.regexp") '最后只保留数字,小数点,负号
  28.         .Global = True
  29.         .Pattern = "[^0-9.-]+"
  30.         If .test(s) Then
  31.             Txtbox.Text = .Replace(s, "")
  32.         End If
  33.     End With
  34.     Txtbox.SelStart = Len(s)
  35. End Sub

复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2013-3-7 19:05 | 显示全部楼层
本帖最后由 zhaogang1960 于 2013-3-7 23:02 编辑

还有其他辅助代码,都写在窗体里面,请看附件
限制多个textbox 只能输入数字,小数,负数.rar (13.39 KB, 下载次数: 368)

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-3-8 11:34 | 显示全部楼层
感谢赵刚老师的帮助,受教了。 衷心祝愿您万事如意。

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-3-8 11:41 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
代码已测试,完全符合要求。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-26 16:19 , Processed in 0.053563 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表