☆本期內容概要☆
用戶窗體設置、用戶ID+密碼登錄設計
設計思路、代碼分步演示
前兩天我們分享了一個完整的EXCEL小應用【中醫(yī)診所收費系統(tǒng):【重磅】Excel VBA 應用分享/中醫(yī)診所收費系統(tǒng)/Excel+ListBox版】,打開文件就是一個用戶登錄界面,今天我們就一起來動手重新做一個這樣的登錄界面,用戶名+密碼登錄EXCEL,具體代碼可能與中醫(yī)診所收費系統(tǒng)中的不一樣,我們不去管它,條條大路通羅馬。
設計思路與過程分步演示:
1、新建一個excel文件,另存為啟用宏的工作簿,名稱隨意,我這里命名為:窗體登錄(用戶名+密碼).xlsm
2、在excel文件中,把sheet1重命名為“Main”,作為主界面使用,在其上插入一個命令按鈕CmdLogin,Caption改為“重新登錄”。這個主界面今后可以作為進入其他窗體、表頁的入口。目前就放一個重新登錄的按鈕。
3、插入一張工作表,重命名為“tb用戶”,輸入用戶信息:
這張表存有重要信息,我們最后會把它深度隱藏,在工作表界面是看不到它的。要是能看到,密碼豈不是形同虛設?
4、打開VBE,即Visual Basic編輯器,插入用戶窗體:
5、把窗體名稱修改為Usf_Login,Caption修改為“用戶登錄”:
6、打開工具箱,在窗體上添加控件:
(1)標簽:LbTitle,Caption系統(tǒng)登錄;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()
代碼簡析:定義模塊級變量,以便在本窗體其他過程中引用它們的值。窗體啟動,讀取用戶信息表到數(shù)組arr(),用于后續(xù)登錄時的信息比對。Activate與Initialize在窗體啟動時,都會運行其中的代碼,區(qū)別是Activate方法下,窗體重新激活就會再次運行代碼,Initialize只在窗體啟動時運行,再次激活時不會運行。
(2)雙擊登錄按鈕,輸入代碼:
Private Sub CmdLogin_Click()
'點擊“登錄”按鈕
'判斷一下有沒有輸入用戶ID,
'如果為空,提示信息,然后退出
If Me.TxbUserID = "" Then
MsgBox "請輸入用戶ID!"
Exit Sub
End If
'根據(jù)輸入的用戶ID,在用戶信息(arr())中查找有沒有此用戶ID
'如果循環(huán)結束,仍然沒有找到
'則表明沒有此用戶,通過變量k來判斷,如果找到,使之為1
'如果找到匹配的用戶ID,再比較用戶輸入的密碼與arr()中的密碼是否一致
'如果一致,退出窗體,結束循環(huán)(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()中的數(shù)據(jù)進行比對,
如果找到用戶ID,則比較密碼,如果密碼相符,則登錄成功,退出窗體,如果密碼不符,則不能登錄,清空已輸入的密碼,并把焦點放到TxtPassWord,以便再次輸入;
如果沒有找到用戶ID則提示用戶重新輸入用戶ID。
這里有個公共變量LoginStatus,如果用戶正常登錄,其值為1,在后面退出窗體的代碼中會用到。
公共變量currUserID,currUserName存下當前用戶的信息,供后續(xù)過程使用,比如憑證制單中的制單人,憑證審核中的審核人等需要用到當前用戶名稱的地方。
關于用戶ID與密碼校驗,還有其他方法:
(a)Vlookup工作表函數(shù):查找用戶ID對應的密碼值,與TxbPassWord的值進行比較,再進行相應處理。
(b)SQL語句:查詢“tb用戶”表中,用戶ID=TxbUserID的密碼。這種方法要建立數(shù)據(jù)連接,我們前面分享過【Excel VBA 憑證打印/SQL連接Eexcel文件/Listview控件/CommandButton命令按鈕控件】這里不再重復,有興趣的朋友可以自行測試研究。這種方法還可以用于數(shù)據(jù)存儲在Access數(shù)據(jù)庫的情況,我們后續(xù)可能會遇到,界時再詳細闡述。
(3)繼續(xù)輸入窗體退出代碼:
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用戶"表深度隱藏,再保存工作簿,如果僅有本工作簿處于打開狀態(tài),則關閉EXCEL程序,否則僅關閉本工作簿,保持其他工作簿不被關閉。
(6)插入用戶模塊(如果已有則不用插入),名稱應該是“模塊1”,可改可不改,這里我改為“MyModule”,以示區(qū)別。設置Public變量:
Public LoginStatus As Integer
Public currUserID As String
Public currUserName As String
用戶登錄成功后,LoginStatus的值為1,在用戶窗體退出代碼中用到此變量,如果為1,則窗體退出時僅僅是退出窗體,EXCEL文件正常打開,包括后續(xù)點擊重新登錄時,再點擊“退出”按鈕,程序不會退出。如果為0,則表明用戶沒有正常登錄,我們直接退出EXCEL。
(7)“Main”工作表中CmdLogin(重新登錄)命令按鈕:
Private Sub CmdLogin_Click()
UsF_Login.Show
End Sub
8、給VBA工程添加密碼,保護工程。防止別人進入VBE編輯器查看到密碼。保護密碼這里設為0,各位可自行設置。