优秀的编程知识分享平台

网站首页 > 技术文章 正文

Excel VBA 用户窗体设置/一步一步代你设计EXCEL用户+密码登录界面

nanyue 2024-12-24 14:51:23 技术文章 4 ℃

???本文于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活学活用,更多文章敬请关注

Tags:

最近发表
标签列表