网站首页 > 技术文章 正文
???本文于2023年5月11日首发于本人同名公众号:Excel活学活用,更多文章敬请关注!
☆本期内容概要☆
- 用户窗体设置、用户ID+密码登录设计
- 设计思路、代码分步演示
前两天我们分享了一个完整的EXCEL小应用【中医诊所收费系统:【重磅】Excel VBA 应用分享/中医诊所收费系统/Excel+ListBox版】,打开文件就是一个用户登录界面,今天我们就一起来动手重新做一个这样的登录界面,用户名+密码登录EXCEL,具体代码可能与中医诊所收费系统中的不一样,我们不去管它,条条大路通罗马。
设计思路与过程分步演示:
1、新建一个excel文件,另存为启用宏的工作簿,名称随意,我这里命名为:窗体登录(用户名+密码).xlsm
2、在excel文件中,把sheet1重命名为“Main”,作为主界面使用,在其上插入一个命令按钮CmdLogin,Caption改为“重新登录”。这个主界面今后可以作为进入其他窗体、表页的入口。目前就放一个重新登录的按钮。
3、插入一张工作表,重命名为“tb用户”,输入用户信息:
这张表存有重要信息,我们最后会把它深度隐藏,在工作表界面是看不到它的。要是能看到,密码岂不是形同虚设?
4、打开VBE,即Visual Basic编辑器,插入用户窗体:
5、把窗体名称修改为Usf_Login,Caption修改为“用户登录”:
6、打开工具箱,在窗体上添加控件:
(1)标签:LbTitle,Caption系统登录;Label1,Caption“用户ID:”;Label2,Caption“密 码:”,字体大小位置适当调整,背景调成透明。
其他控件属性调整如法炮制,不再赘述。如果没有看到属性窗口,可以右击任意控件,在弹出的菜单中点“属性”,然后点击相应控件则切换到该控件的“属性”。
(2)文本框:TxbUserID,TxtPassWord,用来输入信息。在TxtPassWord的属性中,设置密码掩码(PasswordChar)为*。
(3)命令按钮:CmdLogin,Caption“登录”,CmdExit,Caption“退出”。
7、编写代码:
(1)双击用户窗体,点选右侧方法与事件,选择Activate或者Initialize,输入代码:
Dim arr()
Dim iRow As Integer, iCol As Integer
Dim PsW As String
Private Sub UserForm_Activate()
ThisWorkbook.Activate
Sheets("tb用户").Activate
With Sheets("tb用户")
iRow = .UsedRange.Rows.Count
iCol = .UsedRange.Columns.Count
arr = .Range(Cells(1, 1), Cells(iRow, iCol)).Value
End With
'Stop
End Sub
如果用Initialize方法,过程名称就改成:
Private Sub UserForm_Initialize()
代码简析:定义模块级变量,以便在本窗体其他过程中引用它们的值。窗体启动,读取用户信息表到数组arr(),用于后续登录时的信息比对。Activate与Initialize在窗体启动时,都会运行其中的代码,区别是Activate方法下,窗体重新激活就会再次运行代码,Initialize只在窗体启动时运行,再次激活时不会运行。
(2)双击登录按钮,输入代码:
Private Sub CmdLogin_Click()
'点击“登录”按钮
'判断一下有没有输入用户ID,
'如果为空,提示信息,然后退出
If Me.TxbUserID = "" Then
MsgBox "请输入用户ID!"
Exit Sub
End If
'根据输入的用户ID,在用户信息(arr())中查找有没有此用户ID
'如果循环结束,仍然没有找到
'则表明没有此用户,通过变量k来判断,如果找到,使之为1
'如果找到匹配的用户ID,再比较用户输入的密码与arr()中的密码是否一致
'如果一致,退出窗体,结束循环(Exit For),也可以直接结束过程(Exit sub)
For i = 1 To iRow
If arr(i, 2) = Me.TxbUserID Then
k = 1
If CStr(arr(i, 4)) = Me.TxtPassWord Then
Sheets("Main").Activate
Sheets("tb用户").Visible = 2 '深度隐藏
currUserID = arr(i, 2)
currUserName = arr(i, 3)
'把登录用户信息记到Sheets("Main")
Sheets("Main").Range("A1") = "用户ID:"
Sheets("Main").Range("A2") = "用户姓名:"
Sheets("Main").Range("B1") = currUserID
Sheets("Main").Range("B2") = currUserName
LoginStatus = 1
Unload Me
Exit For
Else
MsgBox "密码不正确,请重新输入!"
Me.TxtPassWord = ""
Me.TxtPassWord.SetFocus
End If
End If
Next
If k = 0 Then
MsgBox "不存在此用户,请重新输入!"
End If
End Sub
代码简析:代码块亦有注释。
CmdLogin的Click事件,把用户输入的用户ID与密码跟arr()中的数据进行比对,
如果找到用户ID,则比较密码,如果密码相符,则登录成功,退出窗体,如果密码不符,则不能登录,清空已输入的密码,并把焦点放到TxtPassWord,以便再次输入;
如果没有找到用户ID则提示用户重新输入用户ID。
这里有个公共变量LoginStatus,如果用户正常登录,其值为1,在后面退出窗体的代码中会用到。
公共变量currUserID,currUserName存下当前用户的信息,供后续过程使用,比如凭证制单中的制单人,凭证审核中的审核人等需要用到当前用户名称的地方。
关于用户ID与密码校验,还有其他方法:
(a)Vlookup工作表函数:查找用户ID对应的密码值,与TxbPassWord的值进行比较,再进行相应处理。
(b)SQL语句:查询“tb用户”表中,用户ID=TxbUserID的密码。这种方法要建立数据连接,我们前面分享过【Excel VBA 凭证打印/SQL连接Eexcel文件/Listview控件/CommandButton命令按钮控件】这里不再重复,有兴趣的朋友可以自行测试研究。这种方法还可以用于数据存储在Access数据库的情况,我们后续可能会遇到,界时再详细阐述。
(3)继续输入窗体退出代码:
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
If LoginStatus = 0 Then
ThisWorkbook.Save
If Workbooks.Count > 1 Then
ThisWorkbook.Close savechanges:=False
Else
Application.Quit
End If
End If
End Sub
代码简析:窗体退出,包括用户点击窗体右上角的X按钮。主要是防止用户在没有正确输入用户ID、密码的情况下,点击窗体右上角的X按钮退出窗体,从而直接进入EXCEL工作簿。
如果用户正常登录,此时LoginStatus的值应为1,如果为0,则表明用户非正常进入,我们就退出EXCEL文件。
(4)CmdExit(退出)按钮点击事件:
Private Sub CmdExit_Click()
Unload Me
End Sub
(5)ThisworkBook
后来又修改了代码,图就不改了。
Private Sub Workbook_BeforeClose(Cancel As Boolean)
ThisWorkbook.Activate
Sheets("tb用户").Visible = 2
Sheets("Main").Range("A1:B2").ClearContents
ThisWorkbook.Save
If Workbooks.Count > 1 Then
ThisWorkbook.Close savechanges:=False
Else
Application.Quit
End If
End Sub
Private Sub Workbook_Open()
UsF_Login.Show
End Sub
代码简析:
工作簿打开时,激活UsF_Login窗体,等待用户输入用户ID与密码进入。
工作簿关闭时,先把"tb用户"表深度隐藏,再保存工作簿,如果仅有本工作簿处于打开状态,则关闭EXCEL程序,否则仅关闭本工作簿,保持其他工作簿不被关闭。
(6)插入用户模块(如果已有则不用插入),名称应该是“模块1”,可改可不改,这里我改为“MyModule”,以示区别。设置Public变量:
Public LoginStatus As Integer
Public currUserID As String
Public currUserName As String
用户登录成功后,LoginStatus的值为1,在用户窗体退出代码中用到此变量,如果为1,则窗体退出时仅仅是退出窗体,EXCEL文件正常打开,包括后续点击重新登录时,再点击“退出”按钮,程序不会退出。如果为0,则表明用户没有正常登录,我们直接退出EXCEL。
(7)“Main”工作表中CmdLogin(重新登录)命令按钮:
Private Sub CmdLogin_Click()
UsF_Login.Show
End Sub
8、给VBA工程添加密码,保护工程。防止别人进入VBE编辑器查看到密码。保护密码这里设为0,各位可自行设置。
9、如果要查看、修改“tb用户”表信息,暂时可以在VBE窗口把它的visible属性改为-1,也可以使用代码显示它,甚至(也应该)通过窗体来增加、修改、删除用户信息,由于时间关系,就不再写代码了,以后再完善。
基本差不多了,我们来看一下成品:
另外,该EXCEL文档,在关闭时,会自动保存数据。
好,今天就分享到这,请大家点赞、留言、分享,谢谢大家,我们下期再会吧。
☆猜你喜欢☆
Excel VBA 这样酷炫的日期控件,你不想要吗? | Excel 公式函数/数据透视表/固定资产折旧计提表! |
Excel VBA 自定义函数/数组字段定位/数组字段排序 | Excel 功能/公式函数/VBA/多种姿势处理重复值 |
Excel VBA 最简单的收发存登记系统 | Excel 公式函数/查找函数之LOOKUP |
Excel VBA 文件批量改名 | Excel 公式函数/数据验证/动态下拉列表 |
Excel VBA 输入逐步提示/TextBox+ListBox | Excel 基础功能【数据验证】,你会怎么用? |
????本文于2023年5月11日首发于本人同名公众号:Excel活学活用,更多文章敬请关注!
猜你喜欢
- 2024-12-24 家庭收支理财管理系统 Access数据库系统课程设计制作实例
- 2024-12-24 Qt 2D绘图:图形视图框架的事件处理与传播
- 2024-12-24 MFC界面库BCGControlBar v32.1 - 可视化管理器和主题升级
- 2024-12-24 DJYGUI系列文章九:GDD消息系统 gd信息
- 2024-12-24 Qt设备识别(简单的密钥生成器) qt设备管理系统
- 2024-12-24 Access开发的《财务经济管理系统》
- 2024-12-24 初级开发人员告诉我:OO 设计模式太复杂而且没用
- 2024-12-24 从零开始学Qt(89):UDP单播和广播
- 2024-12-24 Qt入门阶段之事件 qtc间期延长的临床意义
- 2024-12-24 Access窗体查询制作步骤第二课 access窗体怎么做查询按钮
- 02-21走进git时代, 你该怎么玩?_gits
- 02-21GitHub是什么?它可不仅仅是云中的Git版本控制器
- 02-21Git常用操作总结_git基本用法
- 02-21为什么互联网巨头使用Git而放弃SVN?(含核心命令与原理)
- 02-21Git 高级用法,喜欢就拿去用_git基本用法
- 02-21Git常用命令和Git团队使用规范指南
- 02-21总结几个常用的Git命令的使用方法
- 02-21Git工作原理和常用指令_git原理详解
- 最近发表
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)