通常一提到編程,您可能馬上會想到C語言、C++語言、Delphi等,以及它們種種煩瑣的類型說明、定義等,讓人覺得延時廢力,開發(fā)效率不高。相對而言,MircrosoftOffice2000中的VisualBasic(VBA)則編程簡便,其所提供的各種控件和交互式的編程方式可以很輕易地編出合格的程序,完成自己的任務(wù)。VBA是VisualBasic的一個子集,它可以廣泛地應(yīng)用于微軟公司開發(fā)的各種軟件中,使用好VBA就能更方便地操作Office2000,更深入地開發(fā)其強大功能,使用戶能方便快捷地定制和擴展Office2000系統(tǒng),并能讓各個Office軟件更好地協(xié)同工作。
從編程工作實踐看,VBA的最大優(yōu)點在于它不像其它編程語言要事無巨細,全靠自己打理,而是依托于Office2000的強大功能,在其基礎(chǔ)上加以一定的拓展、補充,通過精心設(shè)計實現(xiàn)強大的編程功能。
一、登錄相關(guān)的用戶、口令信息存放
最方便的方法就是存放在工作簿的一張表中,表名為“Users”,無需像其它數(shù)據(jù)庫系統(tǒng)設(shè)計什么字段名、字段類型,直接錄入信息即可,錄入完成后也就同時實現(xiàn)了表結(jié)構(gòu)的設(shè)計,如圖1所示:
圖1
注重:圖1所示的“Users”表中的B1單元中的數(shù)據(jù)是動態(tài)的,它負責(zé)記錄下當(dāng)前登錄的用戶名,如您所想,是在登錄成功后緊接著記錄下當(dāng)前登錄用戶名,這樣我們在用VBA編程時,就可以很方便地使用“Sheets(“Users”)。Cells(1,2)”表達式的內(nèi)容來知道當(dāng)前登錄的用戶名,從而可以對其分別賦予不同的操作權(quán)限,這也正是我們要設(shè)計不同登錄用戶的初衷。至于如何記錄下此信息,將在下面的登錄窗口編程中加以詳述。
從“Users”表的A3到B103,分別存放各個用戶名和相應(yīng)的密碼。實際上Excel表的最大行數(shù)可以到65535行,但在實際應(yīng)用中根本不需要這么多,可以用A3:B103(共100行)作為存放用戶名和密碼的范圍。
二、登錄窗口的設(shè)計及其代碼實現(xiàn)
為了實現(xiàn)登錄功能,一個設(shè)計良好的登錄窗口是必不可少的,在VBA中實現(xiàn)這一點很輕易,進入Ex?鄄cel后按下“Alt+F11”即可進入VBA設(shè)計環(huán)境,選擇菜單命令“插入/用戶窗體”,插入一個窗體。
通過VBA環(huán)境方便的拖放控件功能,可以很方便地設(shè)計一個對話框,我們給它取名為“FrmLogin”,并且為其中關(guān)鍵的控件分別取上有意義的名字,詳見圖2。
圖2
右擊“FrmLogin”打開右鍵菜單,選擇“查看代碼”,進入其代碼設(shè)計窗口。首先,我們想自動從表“Users”的范圍A1:B103中自動提取所有用戶名填充進復(fù)合框CboName,很明顯的,執(zhí)行該功能的最佳時機是響應(yīng)窗體對象“FrmLogin”的“Initialize”事件,首先生成該事件的代碼框架。
生成的框架代碼如下:
PrivateSubUserForm_Initialize()
EndSub
此時就可以在其中添加代碼,如下:
PrivateSubUserForm_Initialize()
’將CboName風(fēng)格設(shè)置為只答應(yīng)列表選擇,而不能自行輸入
CboName。Style=fmStyleDropDownList
’設(shè)定其數(shù)據(jù)源
CboName。RowSource=“用戶名“
’設(shè)置鍵盤焦點
CboName。SetFocus
EndSub
代碼各行已經(jīng)有了詳盡的注釋(盡量用在代碼中用加注釋的方式加以說明),唯一讓讀者覺得含糊的可能就是“用戶名”從何而來它實際上是表“Users”范圍A3:A103的一個引用別名。這樣,通過“FrmLogin”的UserForm_Initialize代碼,窗體在啟動時自動向CboName中填入相關(guān)的用戶名數(shù)據(jù),供終端用戶選擇。
下面分別選擇代碼編輯窗口上方的“對象”和“事件”組合框,響應(yīng)如下事件:
響應(yīng)“CboName”組合框?qū)ο蟮?#8220;Change”事件:
PrivateSubCboName_Change()
’用戶名改變后將鍵盤焦點設(shè)置在“口令”TxtPass處
TxtPass。SetFocus
EndSub
響應(yīng)“CmdCancel”(取消按鈕)對象的“Click”事件:
PrivateSubCmdCancel_Click()
’用戶按了“取消”按鈕,即不登錄,那么關(guān)閉Excel,因尚未編輯所以不保存改變
ThisWorkbook。Closesavechanges:=False
Application。Quit
EndSub
響應(yīng)“CmdOK”(確定按鈕)對象的“Click”事件:
PrivateSubCmdOK_Click()
’定義一個整型變量FindRow
DimFindRowAsInteger
WithSheets(“Users“)
’在“Users”表中A3:A103找到與CboName相匹配用戶名的對應(yīng)行數(shù)
FindRow=。Range(“A3:A103“)。Find(What:=CboName)。Row
IfCboName。Value=““Then
’假如登錄名為空,屬誤操作,退出本次點擊事件,繼續(xù)登錄
MsgBox“登錄系統(tǒng)請先選擇用戶名!“,vbInfor?鄄mation,“系統(tǒng)提示“
ExitSub
EndIf
If。Cells(FindRow,2)<>CStr(TxtPass。Text)Then
’假如密碼不匹配,不能通過,繼續(xù)登錄
MsgBox“未授權(quán)的錯誤密碼!“,vbCritical,“系統(tǒng)消息“
ExitSub
EndIf
EndWith
’登錄成功,在Users表B1處記錄下當(dāng)前用戶名
Sheets(“Users“)。Cells(1,2)=FrmLogin。CboName。Value
’卸載登錄窗口,退出登錄界面
UnloadMe
EndSub
三、登錄窗口的啟動及其它問題
假如該登錄窗體不能被啟動,那么為其編寫的代碼將毫無用處,因為它們不會被執(zhí)行。我們必須在合適的地方和合適的時間來啟動登錄窗口。也就是說,我們要響應(yīng)“ThisWorkbook”文檔對象的“Open”事件:
PrivateSubWorkbook_Open()
Application。Visible=False’隱藏應(yīng)用程序窗口
Application。EnableCancelKey=xlDisabled’不答應(yīng)應(yīng)用程序中止
FrmLogin。Show1’模態(tài)啟動登錄對話框,進入登錄界面
Application。WindowState=xlMaximized’登錄完成后窗口最大化
Application。Visible=True’顯示應(yīng)用程序窗口
Application。EnableCancelKey=xlInterrupt’答應(yīng)應(yīng)用程序中止
EndSub
此后還有一個問題:表“Users”存放著所有用戶的用戶名和口令,一個普通用戶登錄完后,就可以知道所有其他用戶的口令,這可不行。我們可以在文檔被關(guān)閉的瞬間,將“Users”表隱藏起來,也即響應(yīng)“This?鄄Workbook”文檔對象的“BeforeClose”事件:
PrivateSubWorkbook_BeforeClose(CancelAsBoolean)
’隱藏關(guān)鍵表“Users”
ThisWorkbook。Sheets(“Users“)。Visible=xlSheetVery?鄄Hidden
’自動保存文檔
Me。Save
’退出Excel
Application。Quit
EndSub
這樣,只要文檔被關(guān)閉,表“Users”就自動隱藏了起來,而下次打開時該表仍被隱藏,對普通用戶而言沒什么不妥,而對Administrator而言,則有些不方便了,因為他要維護數(shù)據(jù)庫系統(tǒng),我們可以在Work?鄄book_Open事件的最下面添加如下代碼:
’判定登錄用戶是否是治理員,是則不再隱藏“Users”表
IfSheets(“Users“)。Cells(1,2)=“Administrator“Then
ThisWorkbook。Sheets(“Users“)。Visible=xlSheetVisi?鄄ble
EndIf
自登錄成功后,表“Users”的B1處就記錄下了當(dāng)前登錄的用戶名,此時便發(fā)揮了它應(yīng)有的作用。在實際工作中,該處記錄的作用會更明顯,可以對不同的用戶賦予不同的操作權(quán)限,如Administrator無所不能,普通用戶只能對數(shù)據(jù)進行追加操作而不能刪除,Guest用戶只能瀏覽而無操作權(quán)限等。
聯(lián)系客服
微信登錄中...
請勿關(guān)閉此頁面