VBA UserForm点击取消可卸载,提交正确数据时无法卸载及判断异常
问题定位
你代码的两个问题全部来自第一个用户名校验分支的错误写法:
- 只要用户名非空走到Else分支,就会触发
Exit Sub直接结束整个点击事件过程,后面的密码校验、分值计算、卸载窗体的代码完全不会执行,这就是你遇到的「用户名校验通过后代码停止、双字段填完窗体不卸载」的直接原因。 - 代码存在冗余变量问题:你提前声明了
corect_details但全程未使用,反而给未声明的details变量赋值,虽然VBA的变体类型默认不会触发语法报错,但属于不规范写法,容易埋下隐性bug。
另外你直接取控件名判断长度的写法不够严谨,没有处理用户输入全空格的场景,也没有显式调用控件的Value属性,存在低版本兼容风险。
修正后代码
直接把原有登录按钮的点击事件替换为以下代码即可,去掉了无意义的标记位累加逻辑,用早返回结构做校验,逻辑更直白不容易出错:
Private Sub Login_Click() ' 校验用户名输入 If Len(Trim(Username.Value)) = 0 Then MsgBox "please enter your user name", vbOKOnly Username.SetFocus Exit Sub End If ' 校验密码输入 If Len(Trim(Password.Value)) = 0 Then MsgBox "please enter a password", vbOKOnly Password.SetFocus Exit Sub End If ' 双字段校验通过,卸载窗体 Unload Me End Sub
逻辑说明
- 校验顺序从上到下执行:如果用户名为空,弹提示、把光标定位回用户名输入框、直接退出过程,不会往下走密码校验;如果用户名没问题再校验密码,逻辑完全独立不会互相干扰。
- 加
Trim()函数是为了过滤用户输入的前后空格,避免只输入空格的无效内容被判定为合法输入。 - 显式调用文本框的
.Value属性取输入内容,避免依赖控件默认属性带来的兼容问题。 - 校验全部通过后才会执行
Unload Me卸载窗体,符合你的预期需求。
内容的提问来源于stack exchange,提问作者lshneier
相关产品推荐
相关产品推荐

