VBA在限定Excel工作表用戶按鈕中的應(yīng)用_第1頁
VBA在限定Excel工作表用戶按鈕中的應(yīng)用_第2頁
VBA在限定Excel工作表用戶按鈕中的應(yīng)用_第3頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

VBA在限定Excel工作表用戶按鈕中的應(yīng)用

摘要通過研究VBE及其下層對象的訪問方法,本文詳細地探討了按鈕過程的代碼控制技術(shù),從而實現(xiàn)了Excel測試軟件中工作表用戶按鈕的執(zhí)行限定。關(guān)鍵詞按鈕過程VBE下層對象代碼限定1引言作為一個優(yōu)秀的表格處理軟件和系統(tǒng)開發(fā)平臺,Excel擁有許多無可替代的優(yōu)勢?;贓xcel環(huán)境開發(fā)的管理信息系統(tǒng),具有操作直觀性強、開發(fā)周期短的特點,因此形成了熟悉Excel操作的廣大用戶。為了保證開發(fā)系統(tǒng)的正常渠道流通及著作者利益,必須保護系統(tǒng)的使用權(quán)限,本文通過VBA的開發(fā)應(yīng)用,提出了一種Excel工作表用戶按鈕的限定方法,以此來完善其系統(tǒng)測試軟件的功能。2限定按鈕執(zhí)行及其對應(yīng)過程代碼限定工作表用戶按鈕的執(zhí)行包括兩個方面的含義,即限定其按鈕對象的顯示及其指定宏過程代碼的有效性,兩者結(jié)合在一起加以實現(xiàn),才能起到既展現(xiàn)軟件功能,又真正限制其過分執(zhí)行操作的作用,從而體現(xiàn)對用戶軟件的測試目的。2.1查找按鈕執(zhí)行過程代碼限定按鈕對象及其執(zhí)行代碼,首要的問題便是獲得其對應(yīng)的執(zhí)行代碼過程名,并在當前工程的所有代碼模塊中查找其代碼位置。實踐表明,按鈕對象與圖形圖像和藝術(shù)字體一樣,都屬于Shape形狀對象,它們都有其對應(yīng)的OnAction屬性,代表其被指定的宏過程代碼名稱。需要指出的是窗體類型按鈕對應(yīng)的宏過程代碼一般位于工程的標準模塊中,而ActiveX按鈕過程代碼則位于工作表代碼模塊中,且其對應(yīng)的正確執(zhí)行過程名為其按鈕名與相應(yīng)的事件名的連接串。為了查找某個按鈕對應(yīng)的過程代碼,需要對VBE(VisualBasic編輯器)的下層對象VBComponents進行搜索。VBComponents對象代表VBE編輯器下的各個代碼模塊VBComponent。通過對某一VBComponent的下一層對象CodeModule的相關(guān)屬性的訪問,可以獲得諸如模塊代碼總行數(shù)等信息,也可以通過其Find方法查找指定內(nèi)容的代碼行。下面即為查找按鈕過程、處理按鈕過程代碼的算法代碼。SheetsCount=ActiveWorkbook.Worksheets.Count'對所有工作表中的所有按鈕對象循環(huán)Fori=1ToSheetsCountSetMySheet=Worksheets(i)MySheet.ActivateForEachshInMySheet.Shapessh.Visible=Truesh.Select'取得選定對象所對應(yīng)的過程名MyProname=sh.OnAction'對于ActiveX按鈕,則只取得其onClick事件過程名Ifsh.Type=msoOLEControlObjectThen

MyProname=sh.Name&"_Click"EndIf……'StartLine、StartCol為設(shè)置查找按鈕過程名的開始行、列序號,并在代碼查找成功時'返回所在的代碼行、列序號StartLine=1StartCol=1SetMyCoponent=Application.VBE.ActiveVBProject.VBComponents'在各代碼模塊中查找按鈕過程ForEachchInMyCoponent

Ifsh.Type=msoOLEControlObjectAndch.Name<>sh.Parent.CodeNameThen

GoToLabel4EndIf'本代碼模塊的代碼總行數(shù)

LinesCount=ch.CodeModule.CountOfLines

Endline=LinesCount

'忽略注釋行,查找正確的過程頭部位置

DoWhilech.CodeModule.Find("Sub"&MyProname&"()",StartLine,StartCol,Endline,1,F(xiàn)alse,F(xiàn)alse)AndLeft(Trim(ch.CodeModule.Lines(StartLine,1)),1)="'"StartLine=StartLine+1StartCol=1Endline=LinesCount

Loop

'找到了過程頭部位置

Ifch.CodeModule.Find("Sub"&MyProname&"()",StartLine,StartCol,LinesCount,1,F(xiàn)alse,F(xiàn)alse)Andch.CodeModule.ProcOfLine(StartLine,vbext_pk_Proc)=MyPronameThen

'若還沒有插入規(guī)定的代碼

IfTrim(ch.CodeModule.Lines(StartLine+1,1))<>"'隱藏過程代碼"Then

'代碼1……,在按鈕過程代碼的首部加入過程調(diào)用代碼

'代碼2……,調(diào)整本代碼行以后的已經(jīng)插入的代碼行調(diào)用參數(shù)

EndifEndIfLabel4:NextNextNextiActiveWorkbook.Save2.2插入過程調(diào)用代碼經(jīng)過查找按鈕的執(zhí)行過程代碼的正確位置,就能夠限定其執(zhí)行的有效性。本文的處理方法是,在按鈕的對應(yīng)過程代碼的首部加入兩行代碼,如:'隱藏過程代碼Call模塊5.隱藏過程代碼(256,73,”Sheet2”,2,3)可以看出第一行代碼是一注釋行,第二行代碼是一過程調(diào)用。正是這一過程調(diào)用,在按鈕點擊時首先被執(zhí)行,從而實現(xiàn)了對按鈕執(zhí)行的準確計數(shù),并在按鈕執(zhí)行到達規(guī)定次數(shù)時,阻止其執(zhí)行。下面的代碼通過對找到的按鈕過程所在代碼模塊VBComponent的下層對象CodeModule采用InsertLines方法,首先在按鈕對應(yīng)過程的首部插入兩行臨時代碼,然后通過該對象的ReplaceLine方法,將它們分別替換為正確的上述兩行代碼。這樣先插入代碼行、后替換代碼行的目的是,在插入代碼行后便于獲得準確的過程起始代碼行號,從而為下面的替換代碼行語句準備正確的參數(shù)。下面即是上述查找按鈕過程代碼中“代碼1”位置處的算法代碼,其功能是在查找到的按鈕過程代碼的首部加入上述的兩行代碼:ModuleName=Application.VBE.SelectedVBComponent.Nam'獲得過程所處的代碼模塊名CodeName=ch.Name'插入兩行臨時代碼行ch.CodeModule.InsertLinesStartLine+1,"'插入代碼行1"ch.CodeModule.InsertLinesStartLine+2,"'插入代碼行2"'獲得模塊代碼總行數(shù)、過程起始行號、過程代碼總行數(shù)LinesCount=ch.CodeModule.CountOfLines'過程代碼起始行號ProcStartline=ch.CodeModule.ProcStartline(MyProname,vbext_pk_Proc)'過程代碼總行數(shù)ProcCountLines=ch.CodeModule.ProcCountLines(MyProname,vbext_pk_Proc)'替換為兩行正確的代碼行ch.CodeModule.ReplaceLineStartLine+1,"'隱藏過程代碼"ch.CodeModule.ReplaceLineStartLine+2,"Call"&ModuleName&".隱藏過程代碼("&ProcStartline&","&ProcCountLines&","&""""&CodeName&""""&","&i&","&sh.ZOrderPosition&")"此外,當按鈕被點擊執(zhí)行并進入到插入的調(diào)用過程內(nèi)部時,還需要確定哪個按鈕被執(zhí)行、執(zhí)行的次數(shù)情況、以及執(zhí)行按鈕的對應(yīng)過程代碼的行范圍等情況,以便準確地實施對執(zhí)行按鈕及其過程代碼的控制,所以在上述為按鈕過程替換為正確的過程調(diào)用代碼的同時,需要添入正確的下列五個過程調(diào)用參數(shù):(1)按鈕的對應(yīng)過程頭部所在代碼模塊中的代碼起始行號;(2)按鈕過程的對應(yīng)代碼行數(shù);(3)按鈕過程所處的代碼模塊名;(4)按鈕所在的工作表序號;(5)按鈕在所在工作表上的Shape形狀對象集合的序號。從上面的插入代碼中可以看出獲得這些參數(shù)的方法。針對上例的過程調(diào)用語句:Call模塊5.隱藏過程代碼(256,73,”Sheet2”,2,3),其參數(shù)含義是:當?shù)?個工作表中的第3個Shape對象(按鈕)執(zhí)行次數(shù)到達規(guī)定次數(shù)時,則將名稱為“Sheet2”的代碼模塊中從256行起的73行代碼設(shè)為無效,并將該按鈕進行隱藏。值得注意的是,由于某些按鈕的對應(yīng)過程代碼加入了上述的過程調(diào)用代碼,必然導(dǎo)致與之處于同一代碼模塊的其他按鈕過程、并已經(jīng)添入的上述過程調(diào)用代碼中的參數(shù)值出現(xiàn)偏差,因此需要對其中的過程代碼起始行參數(shù)值作修改。下面的代碼就是起這個作用,此代碼須插入于前述查找按鈕過程代碼的“代碼2”位置。'調(diào)整代碼查找起始位置Line1=StartLine+3Col1=1Endline=LinesCountDoIfNotch.CodeModule.Find("'隱藏過程代碼",Line1,Col1,Endline,1,F(xiàn)alse,F(xiàn)alse)Then

ExitDoEndIf'如果查找的代碼不符合插入的代碼格式,則繼續(xù)查找IfCol1>1Then

GoToLabel3EndIf'調(diào)整代碼調(diào)用參數(shù)Str1=ch.CodeModule.Lines(Line1+1,1)IfInStr(Str1,"Call")ThenStr2=Mid(Str1,InStr(Str1,"(")+1,InStr(Str1,",")-InStr(Str1,"(")+1)Str2=Trim(Str(Val(Trim(Str2))+2))Str1=Left(Str1,InStr(Str1,"("))&Str2&Mid(Str1,InStr(Str1,","))ch.CodeModule.ReplaceLineLine1+1,Str1EndIfLabel3:Line1=Line1+1Col1=1Endline=LinesCountLoop2.3限定按鈕對象及其執(zhí)行過程代碼限定按鈕對象本身,之前我們可以為之添加一個名為“按鈕運行次數(shù)記錄表”的工作表,以便使用其第i行j列的單元格來記錄當前工程第i個工作表上第j個形狀對象的運行次數(shù)。此外,為了實現(xiàn)對按鈕執(zhí)行的準確計數(shù),也需要在工程打開時清除其內(nèi)容,為了防止工作表數(shù)據(jù)意外修改,最好將其隱藏。這些均可以通過創(chuàng)建自動宏來加以實現(xiàn)。下面的代碼即是按鈕執(zhí)行時首先被調(diào)用的過程,其作用為對按鈕執(zhí)行進行計數(shù),在按鈕執(zhí)行到達規(guī)定次數(shù)(這里暫定為5次)時,隱藏該按鈕,并將其執(zhí)行過程代碼設(shè)為無效。這里將代碼行設(shè)為無效的方式是將其改成注釋,方法仍然是通過訪問指定的VBComponent下CodeModule對象的Lines屬性,并采用ReplaceLine方法來實現(xiàn)。改成的注釋行的格式為:'隱藏行*:原代碼行,其中*號代表其在本代碼模塊中的行號。下面的代碼需要與前述的查找按鈕過程代碼位于同一代碼模塊。PublicSub隱藏過程代碼(ByValBeginlineAsInteger,ByValLinesCountAsInteger,ByValCodeNameAsString,ByValSheetIndexAsInteger,ByValButtonIndexAsLong)……

Sheets("按鈕運行次數(shù)記錄表").Cells(SheetIndex,ButtonIndex).Value=Sheets("按鈕運行次數(shù)記錄表").Cells(SheetIndex,ButtonIndex).Value+1

IfSheets("按鈕運行次數(shù)記錄表").Cells(SheetIndex,ButtonIndex).Value>=5ThenSetMyCoponent=Application.VBE.ActiveVBProject.VBComponentsForEachchInMyCoponentIfch.Name<>CodeNameThen

GoToLabel5EndIf'將參數(shù)規(guī)定范圍的代碼改為注釋Fork=BeginlineToBeginline+LinesCount-1

Str1=ch.CodeModule.Lines(k,1)

Str1="'隱藏行"&k-Beginline+1&":"&Str1

ch.CodeModule.ReplaceLinek,Str1Nextk'隱藏執(zhí)行的按鈕ActiveWorkbook.Sheets(SheetIndex).Shapes(ButtonIndex).Visible=FalseLabel5:Next……

EndIfEndSub3支撐對象與軟件恢復(fù)提供對VBE及其下層對象的訪問,需要創(chuàng)建對其支撐對象的引用,方法是進入VBE編輯環(huán)境,單擊“工具”菜單的“引用”命令,然后加入對“MicrosoftVisualBasicforApplicationExtensibility5.3”的引用。此外,軟件運行不應(yīng)該影響其本來面目,所以在其被打開時需要將其本身提供的界面恢復(fù)初態(tài),在工程保存時將已經(jīng)變?yōu)樽⑨屝械拇a恢復(fù)原狀,下面通過編寫當前工程的自動宏AUTO_OPEN和“ThisWorkbook”模塊的Workbook_BeforeSave事件過程去分別實現(xiàn)這兩個軟件恢復(fù)功能:PublicSubAUTO_OPEN()'查找輔助工作表SheetsCount=Application.ActiveWorkbook.Worksheets.CountFori=1ToSheetsCountIfActiveWorkbook.Sheets(i).Name="按鈕運行次數(shù)記錄表"Then

FoundSheet=TrueEndIfNexti'添加或清除輔助工作表內(nèi)容IfNotFoundSheetThenActiveWorkbook.UnprotectWorksheets.add.MoveAfter:=Worksheets(SheetsCount)ActiveSheet.Name="按鈕運行次數(shù)記錄表"ActiveSheet.Visible=FalseElseSheets("按鈕運行次數(shù)記錄表").Cells.ClearSheets("按鈕運行次數(shù)記錄表").Visible=FalseEndIf'將工作表中按鈕恢復(fù)為顯示狀態(tài)SheetsCount=ActiveWorkbook.Worksheets.CountFori=1ToSheetsCountSetMySheet=Worksheets(i)ForEachshInMySheet.Shapes

Ifsh.Visible=FalseThensh.Visible=TrueNex

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論