ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 修改书上的代码,确定按钮的,有2个不懂,求教。

[复制链接]

TA的精华主题

TA的得分主题

发表于 2018-9-30 15:19 | 显示全部楼层 |阅读模式
下面的代码是根据书上的内容做了修改的。但是有两个不明白,为什么判断用户名的时候可以直接做对比,而判断密码的时候CStr(Password.Value) 这个要使用CStr呢?用户名那里不使用却没有问题,我也测试过这两个输入的数值,是一样的,为什么会这样?
这里判断3次的机会登录,应该是exit sub清空了i这个变量的内存,所以每次就重算,那么怎样才可以做到记次呢?


Private Sub CmdOK_Click()

Application.ScreenUpdating = False

Dim us As Range, passw As Range
Dim ipassw As Long, i As Integer
i = 1
If User.Value = "" Then
    MsgBox "用户名不能为空!"
    Exit Sub
End If

If Password.Value = "" Then
    MsgBox "密码不能为空!"
    Exit Sub
End If


    For Each us In Worksheets("namepassword").Range("A1:A10")
        If us.Value = User.Value Then
            ipassw = us.Row()
           '下面的Password.Value要通过CStr才能正常,不使用就不行,而上面的us.Value却可以呢?
            If CStr(Password.Value) = Worksheets("namepassword").Range("B" & ipassw).Value Then
               'MsgBox "相同"   '测试值
                Unload Me
                Application.Visible = True
                Application.ScreenUpdating = True
                Exit Sub
            Else
               'MsgBox Password.Value       '测试值
               'MsgBox Worksheets("namepassword").Range("B" & ipassw).Value       '测试值
                If i = 3 Then
                    MsgBox "对不起你无权打开工作簿!"
                    ThisWorkbook.Close savechanges:=False
                Else
                    MsgBox "输入密码错误,你还有" & (3 - i) & "次输入机会!"
                   '为什么这里的i变量不会变化呢?是因为后面的exit sub退出此过程导致把变量清空?
                    i = i + 1
                    'MsgBox "输入密码不正确!"

                    Application.ScreenUpdating = True
                End If
                Exit Sub     '这里做退出处理,不退出会导致后面的那个Msgbox "输入用户名不正确!"会显示
            End If
        End If
    Next
MsgBox "输入用户名不正确!"

Application.ScreenUpdating = True



End Sub





用户登录(需改进).rar (19.98 KB, 下载次数: 3)

TA的精华主题

TA的得分主题

发表于 2018-9-30 15:56 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 xd3210 于 2018-9-30 16:05 编辑

Worksheets("namepassword").Range("B" & ipassw).Value 是一个双精度数值,而Password.Value是不一个文本值,两者比较返回false,故不能达到目的为什么if us.Value = User.Value能返回true呢?因为us是一个单元格,单元格的值类型是variant,当是文本时us.value返回文本,是数值则返回双精度数值,当us为文本时自动转换数据为文本类型,Worksheets("namepassword").Range("B" & ipassw).Value 自动转换为双精度类型,两者与文本类型变量比较时,一个返回true,而别一个返回false.

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-9-30 16:23 | 显示全部楼层
xd3210 发表于 2018-9-30 15:56
Worksheets("namepassword").Range("B" & ipassw).Value 是一个双精度数值,而Password.Value是不一个文本 ...

在这先谢谢回答。
那可不可以这样说,就是如果用户名是数字的话,那us.Value也是跟Password.Value一样运行不了?
另外说如果密码不是纯文字,那Password.Value一样能运行?
因为上面的User.Value其实就是对应的Password.Value,只是两个判断语句调换了一下位置。

TA的精华主题

TA的得分主题

发表于 2018-9-30 16:46 | 显示全部楼层
stoncold 发表于 2018-9-30 16:23
在这先谢谢回答。
那可不可以这样说,就是如果用户名是数字的话,那us.Value也是跟Password.Value一样运 ...

换成这样说,是否方便你理解?
1.不是纯数字就是文本;
2.单元格value属性返回数值,text属性返回显示的文本,同一单元格value和text可能返回不一样;
3.窗体控件textbox返回的是纯文本;
4.user.value和password.value不是换位置的问题,而换了比较的对象;
5.为了便于理解,user、password都用text属性,即user.text、password.text;
6.单元格中的用户名或密码尽量用text属性,即us.text、pwdrng.text
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2025-1-16 08:00 , Processed in 0.023957 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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