VBA UserForm动态文本框属性配置、输入校验及自动大写问题咨询
VBA UserForm动态文本框需求解决方案
首先你需要先创建类模块实现动态文本框的事件绑定,因为动态生成的控件默认没有事件触发逻辑,操作如下:
- 插入类模块,命名为
clsDynamicTxt,写入以下代码:
Option Explicit Public WithEvents txt As MSForms.TextBox ' 实现输入内容自动大写 Private Sub txt_Change() Dim selStart As Integer ' 记录光标位置,避免转大写后光标跳转到末尾影响输入 selStart = txt.SelStart txt.Text = UCase(txt.Text) txt.SelStart = selStart End Sub ' 失去焦点时触发校验规则 Private Sub txt_LostFocus() Dim refChar As String ' 提取Form1输入内容的最后一个字符作为校验基准 refChar = UCase(Right(Trim(Form1.txtbox_count.Text), 1)) ' 非空时校验输入长度是否为2 If Len(Trim(txt.Text)) <> 0 And Len(Trim(txt.Text)) <> 2 Then MsgBox "输入内容必须为2个字符", vbExclamation, "输入错误" txt.SetFocus Exit Sub End If ' 输入长度达标时校验首字符规则 If Len(Trim(txt.Text)) = 2 Then If UCase(Left(Trim(txt.Text), 1)) <> refChar Then MsgBox "输入内容首字符必须为" & refChar, vbExclamation, "输入错误" txt.SetFocus Exit Sub End If End If End Sub
- 修改Form2的代码,顶部声明全局集合存储动态文本框的类实例,保证绑定的事件生效,修改后的初始化代码如下:
Option Explicit ' 全局集合存储动态文本框的类实例,避免事件失效 Dim txtCollection As New Collection Private Sub Form2_Initialize() Dim textbox_count As Integer Dim txtB1 As Control Dim clsTxt As clsDynamicTxt textbox_count = Val(Form1.txtbox_count.Value) ' 增加边界判断避免输入非数字报错 If textbox_count < 1 Then MsgBox "文本框数量输入错误", vbCritical Unload Me Exit Sub End If For i = 1 To textbox_count Set txtB1 = Controls.Add("Forms.TextBox.1") With txtB1 .Name = "txtBox" & i .Height = 20 .Width = 90 .Left = 80 .Top = 25 * i .MaxLength = 2 End With ' 将动态文本框绑定到类实例加入集合 Set clsTxt = New clsDynamicTxt Set clsTxt.txt = txtB1 txtCollection.Add clsTxt Next i End Sub
三个需求的实现逻辑说明:
- 长度不足2弹出提示:在动态文本框的
LostFocus事件中判断输入内容长度,非空状态下长度不等于2就弹出提示并强制返回文本框重新输入,也可以根据需求把该校验逻辑放到Form2的提交按钮点击事件中,提交时统一校验所有文本框。 - 首字符匹配校验:提前提取Form1输入内容的最后一个字符作为基准,输入内容长度为2时判断首字符是否和基准一致,不匹配就弹出提示。
- 输入内容自动大写:之前未生效是因为没有绑定动态文本框的
Change事件,现在在类模块的Change事件中做转大写处理,同时保留光标位置不影响输入体验。
如果需要提交时统一校验所有文本框,可在Form2中新增提交按钮,加入以下代码:
Private Sub btnSubmit_Click() Dim i As Integer Dim refChar As String refChar = UCase(Right(Trim(Form1.txtbox_count.Text), 1)) For i = 1 To txtCollection.Count With txtCollection(i).txt If Len(Trim(.Text)) <> 2 Then MsgBox "第" & i & "个文本框输入必须为2个字符", vbExclamation .SetFocus Exit Sub End If If UCase(Left(.Text, 1)) <> refChar Then MsgBox "第" & i & "个文本框首字符必须为" & refChar, vbExclamation .SetFocus Exit Sub End If End With Next i ' 校验通过后可执行后续业务逻辑 MsgBox "所有输入校验通过" End Sub
内容的提问来源于stack exchange,提问作者jshvt17
相关产品推荐
相关产品推荐

