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