




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第8章模塊與VBA程序設計模塊與VBA程序設計概述
VBA編程基礎VBA程序流程控制
VBA數組VBA模塊的創建
VBA程序的調試VBA的數據庫編程18.1模塊與VBA程序設計概述
8.1.1模塊類型8.1.2模塊組成8.1.3VBA編程環境8.1.4面向對象程序設計的概念2模塊是Access數據庫中的一個數據庫對象,它以VBA語言為基礎編寫。通俗來說,模塊是Access數據庫中用于保存VBA程序代碼的容器。模塊基本上是由聲明、語句和(Sub和Function)過程組成的集合,它們作為一個已命名的單元存儲在一起,對VBA程序代碼進行組織。38.1模塊與VBA程序設計概述
BASICBeginner’sAll-purposeSymbolicInstructionCode初學者萬用符號指令代碼VBA
VisualBasicforApplicationMicrosoftOffice內置的編程語言是根據VB簡化的宏語言,其基本語法、詞法與VB基本相同,具有簡單、易學的特點。8.1.1模塊類型Access有兩種類型的模塊:標準模塊和類模塊。1.標準模塊標準模塊包含與任何其他對象都無關的常規過程,以及可以從數據庫任何位置運行的經常使用的過程。在標準模塊中,可以放置希望供整個數據庫的其他過程使用的Sub過程和Function過程。標準模塊中的公共變量或公共過程具有全局特性,其作用范圍在整個應用程序里,生命周期是伴隨著應用程序的運行而開始、關閉而結束。48.1模塊與VBA程序設計概述
1.類模塊
類模塊是可以包含新對象的定義的模塊。一個類的每個實例都新建一個對象。窗體模塊和報表模塊都是類模塊,它們從屬于各自的窗體和報表。窗體模塊和報表模塊通常都含有事件過程,而過程的運行用于響應窗體或報表上的事件。窗體模塊和報表模塊中的過程可以調用標準模塊中已經定義好的過程。為窗體或報表創建第一個事件過程時,Access將自動創建與之關聯的窗體模塊或報表模塊。類模塊具有局部特性,其作用范圍局限在所屬窗體或報表內部,而生命周期則是伴隨著窗體或報表的打開而開始、關閉而結束58.1模塊與VBA程序設計概述
8.1.2模塊的組成
模塊是裝著VBA代碼的容器。一個模塊包含一個聲明區域,包含一個或多個過程。如下圖所示。過程是模塊的單元組成,用VBA代碼編寫而成。過程分為Sub過程和Function過程兩種類型。68.1模塊與VBA程序設計概述
8.1.3VBA編程環境在Office中使用的VBA開發界面被稱為VBE具有編輯、調試和編譯VisualBasic程序的功能78.1模塊與VBA程序設計概述
切換到VBE環境方法1:“創建”-“宏與代碼”-“VisualBasic”方法2:Alt+F11方法3:設計窗體、報表時轉到VBE環境88.1模塊與VBA程序設計概述
代碼窗口立即窗口工程資源管理器屬性窗口標準工具欄98.1.4面向對象程序設計的概念VBA采用了面向對象的程序設計方法。對象:在采用面向對象程序設計方法的程序中,程序被抽象成了一個個對象,每個對象具有各自的屬性、方法和事件類:是對一類相似對象的定義和描述。因此類可看做是對象的模板,每個對象由類來定義。對象集合:是由一組對象組成的集合,這些對象的類型可以相同,也可以不同。108.1模塊與VBA程序設計概述
常用對象對象名稱說明Application應用程序,即AccessDebug該對象可在調試階段用Print方法在立即窗口輸出信息Forms所有處于打開狀態的窗體構成的集合Reports所有處于打開狀態的報表構成的集合Screen屏幕對象Docmd使用該對象可從VisualBasic中運行Access操作118.1模塊與VBA程序設計概述
8.1.4面向對象程序設計的概念屬性:用來表示對象的狀態,如窗體的Name(名稱)屬性、Caption(標題)屬性等。方法:用來描述對象的行為,如窗體有Refresh方法,Debug對象有Print方法等。引用對象的屬性或方法時應該在屬性名或方法名前加對象名,并用對象引用符“.”連接。128.1模塊與VBA程序設計概述
8.1.4面向對象程序設計的概念事件:是對象可以識別的動作,通常由系統預先定義事件過程:對象在識別了所發生的事件后執行的程序PrivateSubCommand1_Click()Me!Label1.Caption=“學校名稱:"Me!Text0=“湖北汽車工業學院"EndSub138.1模塊與VBA程序設計概述
PrivateSubCommand1_Click()Me!Label1.Caption="學校名稱:"Me!Text0="湖北汽車工業學院"EndSub8.2.1數據類型8.2.2常量8.2.3變量8.2.4函數8.2.5表達式148.2VBA編程基礎8.2.1數據類型VBA的數據類型共有13種存儲時所占的存儲空間和處理時能夠進行的運算都不相同158.2VBA編程基礎數據類型存儲字節范圍Byte(字節型)10~255Boolean(布爾型)2True或FalseInteger(整型)2?32768~+32767Long(長整型)4?2147483648~2147483647Single(單精度型)4負數:?3.402823×1038~?1.401298×10-45正數:1.401298×10-45~3.402823×1038Double(雙精度型)8負數:?1.79769313486232E308~?4.94065645841247E?324正數:4.94065645841247E?324~
1.79769313486232E308Decimal(小數型)12與小數點右邊的數字個數有關168.2VBA編程基礎數據類型存儲字節范圍Currency(貨幣型)8?922337203685447.5808~922337203685447.5807Date(日期型)8100年1月1日~9999年12月31日String(字符型)與字符串的字長有關定長:1~65400變長:0~20億Object(對象型)4任何對象引用Variant(變體型)與具體數據類型有關每個元素數據類型的范圍自定義型各元素所需字節之和續表178.2VBA編程基礎8.2.2常量其值在程序運行期間不變的量字面常量符號常量固有常量188.2VBA編程基礎8.2.2常量其值在程序運行期間不變的量字面常量(1)各種數字型常量(2)字符型常量(3)日期型常量(4)布爾型常量198.2VBA編程基礎8.2.2常量其值在程序運行期間不變的量符號常量可以定義用符號代替常量。如果程序中多處用到某個常量,將其定義成符號常量可增加代碼的可讀性,也便于維護。關鍵字ConstConstPIassingle=3.1415926208.2VBA編程基礎8.2.2常量其值在程序運行期間不變的量固有常量一類特殊的符號常量,通常已經預先在類庫中定義好,編程者只要直接使用這些已經定義好的符號常量即可.例如:VBA類庫中定義的顏色常量vbRed代表紅色vbBlue代表藍色218.2VBA編程基礎8.2.3變量其值在程序運行期間變化的量變量的聲明格式為:Dim變量名[AS類型]如果省略“AS類型”,則所定義的變量為Variant型。建議在程序中顯式聲明變量228.2VBA編程基礎8.2.4函數大量的內置函數極大地豐富了VBA的功能函數名參數(指參數的個數、順序和類型)函數值238.2VBA編程基礎8.2.4函數大量的內置函數極大地豐富了VBA的功能按照函數的功能,VBA的內置函數可分為數學函數字符串函數日期函數轉換函數248.2VBA編程基礎MsgBox函數
MsgBox(提示[,按鈕、圖標和默認按鈕][,標題])258.2VBA編程基礎InputBox函數
InputBox(提示[,標題][,默認])268.2VBA編程基礎8.2.5表達式表達式是將常量、變量、字段名稱、控件的屬性值和函數用運算符連接而成的運算式算術表達式字符表達式關系表達式布爾表達式對象引用表達式278.2VBA編程基礎8.2.5表達式算術運算式288.2VBA編程基礎8.2.5表達式算術運算式字符串表達式&—作用是連接兩個字符串298.2VBA編程基礎8.2.5表達式算術運算式字符串表達式關系表達式運算符意義示例結果<小于5<2False<=小于等于5<=2False>大于5>2True>=大于等于5>=2True=相等5=2False<>不等5<>2TrueLike字符串匹配"This"Like"*is"True308.2VBA編程基礎8.2.5表達式算術運算式字符串表達式關系表達式布爾表達式運算符意義示例結果優先級Not非,將True變False或將False變TrueNotTrueFalse3And與,兩邊都是真,結果才為真5>2And“ab”=“bc”False2Or或,兩邊有一個為真,結果就為真5>2Or“ab”=“abc”True1318.2VBA編程基礎對象引用表達式運算符意義示例示例說明!引用某個對象,該對象通常由用戶定義Forms![系統登錄]引用Forms集合中的“系統登錄”窗體.引用對象的屬性或方法,該屬性或方法通常由Access定義Forms![系統登錄].visible引用Forms集合中的“系統登錄”窗體的visible屬性328.2VBA編程基礎8.3VBA程序流程控制8.3.1程序的順序控制8.3.2程序的分支控制8.3.3程序的循環控制338.3VBA程序流程控制程序由語句組成語句由關鍵字、標識符、運算符和表達式組成每條語句指明了計算機要進行的具體操作按照語句所執行的功能,有賦值語句聲明語句控制語句注釋語句348.3VBA程序流程控制賦值語句給變量或對象的屬性賦值<變量名>=<表達式>或
<對象名.屬性>=<表達式>358.2VBA編程基礎8.3.1程序的順序控制程序的三種基本控制結構順序結構分支結構循環結構36例8-1創建如圖8-5所示的窗體“計算圓的面積和周長”。要求在文本框中輸入了圓的半徑后,單擊“計算”按鈕,在窗體的另外兩個文本框中分別輸出圓的面積和周長。8.3VBA程序流程控制37“計算”按鈕的Click事件過程如下。PrivateSubcmd計算_Click()'定義變量和符號常量DimrAsSingle'r為圓的半徑DimsAsSingle's為圓的面積DimlAsSingle'l為圓的周長ConstPIAsSingle=3.1415926'給變量r賦值r=Me!txt半徑'計算圓的面積和周長s=PI*r^2l=2*PI*r'用文本框輸出結果Me!txt面積=sMe!txt周長=lEndSub8.3VBA程序流程控制388.3VBA程序流程控制8.3.2
程序的分支控制用條件來控制語句的執行有If語句和SelectCase語句39If…Then…Else語句語句格式為If<表達式>Then<語句塊1>Else<語句塊2>EndIf‘輸入兩個數并在立即窗口輸出其中較大的數DimxAsInteger,yAsIntegerx=InputBox("請輸入x的值:")y=InputBox("請輸入y的值:")Ifx>yThenDebug.PrintxElseDebug.PrintyEndIf8.3VBA程序流程控制40<表達式>可以是任何表達式,一般為關系表達式或布爾表達式。如果是其他表達式,則非0認為是True,0認為是False。執行時,先判斷表達式的值,為True則執行語句塊1,否則執行語句塊2。如果語句較短Ifx>yThenDebug.PrintxElseDebug.Printy使用過程中有時沒有語句塊2,這時If語句變為單分支結構。8.3VBA程序流程控制41例8-2用VBA程序實現窗體“系統登錄”8.3VBA程序流程控制42“確定”按鈕的Click事件過程PrivateSubcmd確定_Click()DimnameAsString,passAsStringDimrAsInteger'存放MsgBox消息框的返回值
name=Me!txt用戶名
pass=Me!txt口令
Ifpass="1234"Andname="cueb"Then
'如果用戶名和口令正確,顯示消息框,運行"學生管理模塊"窗體
MsgBox"歡迎進入學生管理模塊!",vbOKOnly+vbCritical,"歡迎"DoCmd.Close '關閉系統登錄窗體
DoCmd.OpenForm"學生管理模塊" '打開"學生管理模塊"窗體
ElseMsgBox"密碼錯誤!",vbOKOnly '顯示消息框
Me!txt用戶名="" '使文本框清空
Me!txt口令=""Me!txt用戶名.SetFocus '使文本框獲得焦點,準備重新輸入
EndIfEndSub43If…Then…ElseIf語句
If<表達式1>Then<語句塊1>ElseIf<表達式2>Then<語句塊2>… [ElseIf<表達式n>Then<語句塊n>Else<語句塊n+1>]EndIf運行時,從表達式1開始逐個測試條件,當找到第一個為True的條件時,即執行該條件后所對應的語句塊。8.3VBA程序流程控制44例8-3編程根據輸入的學生成績,評定其等級。標準是90~100“優秀”80~89“良好”70~79“中等”60~69“及格”60分以下“不合格”。8.3VBA程序流程控制45PublicSubgc1()DimxAsIntegerx=InputBox("請輸入成績:")Ifx>=90ThenDebug.Print"優秀"ElseIfx>=80ThenDebug.Print"良好"ElseIfx>=70ThenDebug.Print"中等"ElseIfx>=60ThenDebug.Print"及格"ElseDebug.Print"不及格"EndIfEndSubSelectCase語句
SelectCase<變量或表達式>Case<表達式列表1>
語句塊1Case<表達式列表2>
語句塊2…[CaseElse
語句塊n+1]EndSelect8.3VBA程序流程控制46SelectCase后只能是數值型或字符型表達式。執行過程:先計算SelectCase后的變量或表達式的值,然后從上至下逐個比較,決定執行哪一個語句塊語句中的各個表達式列表應與SelectCase后的變量或表達式同類型。采用下面的形式表達式:a+5用逗號分隔的一組枚舉表達式:2,4,6,8表達式1To表達式260to100 Is關系運算符表達式Is<608.3VBA程序流程控制47DimxAsIntegerx=InputBox("請輸入成績:")SelectCasexCase90To100Debug.Print"優秀"Case80To89Debug.Print"良好"Case70To79Debug.Print"中等"Case60To69Debug.Print"及格"CaseElseDebug.Print"不及格"EndSelect特別提示:SelectCase語句和If…Then…ElseIf語句并不完全等同。SelectCase語句適用于對一個條件的多個不同取值進行測試的情況,而If…Then…ElseIf語句則可對多個條件進行測試,因此后者的使用范圍更廣一些。8.3VBA程序流程控制48分支嵌套Ifx>yThenIfx>yThen…Else…EndIfElse…EndIf8.3VBA程序流程控制49PrivateSubcmd確定_Click()DimnameAsString,passAsStringDimrAsInteger '存放MsgBox消息框的返回值
name=Me.txt用戶名
pass=Me.txt口令
Ifpass="1234"Andname=“hzh"Then
'如果用戶名和口令正確,顯示消息框,運行"學生管理模塊"窗體
MsgBox"歡迎進入學生管理模塊!",vbOKOnly+vbCritical,"歡迎"DoCmd.Close '關閉系統登錄窗體
DoCmd.OpenForm"學生管理模塊"'打開"學生管理模塊"窗體
Elser=MsgBox("密碼錯誤!要繼續嗎?",vbYesNo)'顯示消息框
Ifr=vbYesThen '繼續輸入
Me.txt用戶名=""'使文本框清空
Me.txt口令=""Me.txt用戶名.SetFocus '使文本框獲得焦點,準備重新輸入
Else '關閉窗體,不繼續輸入
DoCmd.CloseEndIfEndIfEndSub508.3VBA程序流程控制8.3.3
程序的循環控制稱重復控制結構特點是程序執行時,該語句中的一部分操作即循環體被重復執行多次有For語句Do…Loop語句51For循環語句For<循環變量>=<初值>to<終值>[Step<步長>] <語句塊>[ExitFor]<語句塊>Next<循環變量>8.3VBA程序流程控制52循環控制變量的類型必須是數值型步長可以是正數,也可以是負數。如果步長為1,Step短語可以省略根據初值、終值和步長,可以計算出循環的次數,因此For語句一般用于循環次數已知的情況使用ExitFor語句可以提前退出循環8.3VBA程序流程控制53例8-4編程用For語句求1+2+3+…+10之和gc2的程序代碼PublicSubgc2()DimsAsInteger,iAsIntegers=0Fori=1To10Step1s=s+iNextiDebug.PrintsEndSub該循環的執行過程如下。(1)首先給i賦初值1。(2)測試i是否超過終值10。如果沒有,則執行累加;否則,退出循環轉到步驟(5)。(3)將i加上一個步長。(4)重復步驟(2)和步驟(3)。(5)繼續執行Next后面的語句。8.3VBA程序流程控制54Do…Loop循環語句形式1:Do{While|Until}<條件>
語句塊
[ExitDo]
語句塊Loop‘下面的程序用DoWhile…Loop語‘句求1+2+3…+10之和。DimsAsInteger,iAsIntegers=0:i=1DoWhilei<=10s=s+ii=i+1LoopDebug.Prints8.3VBA程序流程控制55這里的條件可以是任何類型的表達式,非0為真,0為假。執行過程是:在每次循環開始時測試條件,對于DoWhile語句,如果條件成立,則執行循環體的內容,然后回到DoWhlie處準備下一次循環;否則,退出循環。對于DoUntile語句,則正好相反,當條件滿足時退出循環。ExitDo語句的作用是提前終止循環。8.3VBA程序流程控制56與For語句相比,有下列幾點不同Do…Loop語句不僅可用于循環次數已知的情況,而且可用于循環次數未知的情況,因此適用的范圍更廣。Do…Loop語句沒有專門的循環控制變量,但一般應有一個專門用來改變條件表達式中變量的語句,使得隨著循環的執行,條件趨于不成立(或成立),最后達到退出循環。8.3VBA程序流程控制57形式2:Do
語句塊
[ExitDo]
語句塊Loop{While|Until}<條件>說明:和形式1不同的是,在每次循環結束時測試條件。因此,二者的區別是如果一開始循環條件就不成立,則形式1中的循環體部分一次也不執行,而形式2中的循環體部分被執行一次。8.3VBA程序流程控制58問題:下面的程序執行結果是什么?控制循環執行的判斷被執行了幾次?‘下面的程序用Do…LoopWhile語‘句求1+2+3…+10之和。DimsAsInteger,iAsIntegers=0:i=1Dos=s+ii=i+1LoopWhilei<=10Debug.Prints8.3VBA程序流程控制59例8-5編程求兩個整數的最大公約數和最小公倍數
算法:設兩個整數分別為m和n,(1)保證m大于n,否則將m和n互換;(2)求m除以n的余數r;(3)若r不為0,則將n賦給m,r賦給n;(4)重復步驟(2)和步驟(3),直到r為0,此時最大公約數為n。將m和n互換的算法是借助于第3個變量t:t=m:m=n:n=t8.3VBA程序流程控制60gc3中的程序代碼。PublicSubgc3()DimnAsInteger,mAsInteger,tAsIntegerDimrAsInteger 'r為m/n的余數
DimmnAsInteger 'mn為m和n的乘積
m=Val(InputBox("m="))n=Val(InputBox("n="))mn=n*mIfm<nThent=m:m=n:n=tr=mModnDoWhile(r<>0)m=nn=rr=mModnLoopDebug.Print"最大公約數=",nDebug.Print"最小公倍數=",mn/nEndSub61循環嵌套Dowhile…Dowhile…Loop…LoopDowhile…if…Endif…Loop8.3VBA程序流程控制628.4.1數組的概念及定義8.4.2數組的應用8.4VBA數組638.4VBA數組8.4.1數組的概念及定義問題:求10個成績的平均值,并對它們按照從大到小排序,這10個數怎么組織?放在10個變量中?放在一個數組中?如果在程序中要對一組數據進行處理,通常的解決方法是將這組數放在數組中。64一維數組的定義使用數組必須先定義數組,格式為Dim數組名([<下界>to]<上界>)[As<數據類型>]所有數組元素具有同一個標識即數組名,數組名后括號內的序號稱為數組元素的下標。(1)所有數組元素在內存連續存放(2)根據下標區分數組元素8.4VBA數組65命名規則與變量名的命名規則相同。一般在定義數組時應給出數組的上界和下界。但也可以省略下界,<下界>缺省為0。例如,Dima(10)AsSingle若希望下標從1開始,可在模塊的通用聲明段聲明OptionBase0|1'后面的參數只能取0或1<下界>和<上界>不能使用變量,必須是常量。如果省略As子句,則數組的類型為Varient變體類型。8.4VBA數組66二維數組的定義
Dim數組名([<下界>to]<上界>,[<下界>to]<上界>)[As<數據類型>]例如,Dimc(1To3,1To4)AsSinglec(1,1)c(1,2)c(1,3)c(1,4)c(2,1)c(2,2)c(2,3)c(2,4)c(3,1)c(3,2)c(3,3)c(3,4)存放的順序是先行后列8.4VBA數組67一旦定義了數組,就可以用前面介紹的對變量的處理方法處理數組,并且可以用循環語句對數組進行處理,提高程序的可讀性。8.4VBA數組8.4.1數組的應用68例8-5編程產生10個0-99之間的隨機數,并找出其中的最大值和最小值用內置函數Rnd()生成隨機數:Int(Rnd()*100)8.4VBA數組69程序代碼如下:PublicSubgc4()Dima(1To10)AsIntegerDimiAsInteger,maxAsInteger,minAsInteger
'生成并輸出數組
Fori=1To10a(i)=Int(Rnd()*100)Debug.Printa(i);NextiDebug.Print '另起一行
'尋找最大值和最小值
max=a(1):min=a(1)Fori=2To10Ifmax<a(i)Thenmax=a(i)Ifmin>a(i)Thenmin=a(i)Nexti
'輸出結果
Debug.Print"max=";maxDebug.Print"min=";minEndSub70111222333OptionBase1PublicSubgc5()Dimc(3,3)AsIntegerDimiAsInteger,jAsIntegerFori=1To3 '賦值
Forj=1To3c(i,j)=iNextjNextiFori=1To3 '輸出
Debug.PrintForj=1To3Debug.Printc(i,j);NextjNextiEndSub8.4VBA數組例8-7
編程在立即窗口輸出所示矩陣71例8-8編程輸入5個整數,并將這5個數按升序排序。有多種算法可以實現排序。本例采用選擇法,其基本思路如下。找出a(1)-a(5)中的最大值,放在a(1)中找出a(2)-a(5)中的最大值,放在a(2)中…找出a(4)-a(5)中的最大值,放在a(4)中問題歸結為尋找4次最大值8.4VBA數組72OptionBase1PublicSubgc6()Dimp(5)AsInteger'存放最小值的下標
DimiminAsInteger DimiAsInteger,jAsInteger,tAsInteger
Debug.Print"排序前:"Fori=1To5 '賦值并輸出
p(i)=InputBox("p("&i&")=")Debug.Printp(i);Nexti
Fori=1To4 '排序
'尋找最小值的位置
imin=iForj=iTo5Ifp(imin)>p(j)Thenimin=jNextj
'交換
t=p(i):p(i)=p(imin):p(imin)=tNexti
Debug.PrintDebug.Print"排序后:“
'輸出排序結果
Fori=1To5 Debug.Printp(i);NextiEndSub738.5.1VBA標準模塊8.5.2過程的創建和調用8.5.3函數的創建和調用8.5.4過程調用中的參數傳遞8.5.5局部變量、全局變量和靜態變量8.5VBA模塊的創建748.5VBA模塊的創建8.5.1VBA標準模塊VBA程序由模塊組成類模塊標準模塊758.5VBA模塊的創建標準模塊引用的代碼按照其是否有返回值可以被組織成Sub過程和Function函數標準模塊不與某個具體的對象相連,它的作用就是為其他模塊提供可共享的公共Sub過程和Function函數
768.5VBA模塊的創建創建標準模塊的方法(1)ACCESS:“創建”-“宏與代碼”-“模塊”(2)VBE:“插入”-“模塊”
778.5VBA模塊的創建8.5.2過程的創建和調用過程是一段可以實現某個具體功能的代碼與函數不同,過程沒有返回值可以在類模塊中,也可以在標準模塊中創建過程PublicSubswap(xAsInteger,yAsInteger)DimtAsIntegert=x:x=y:y=tEndSub788.5VBA模塊的創建過程的定義形式如下:[Public|Private][Static]Sub過程名(變量名1As類型,變量名2As類型,…)<局部變量或常數定義>
<語句塊>
[ExitSub]
<語句塊>EndSub過程名后括號內的變量也叫形式參數。如果過程有形式參數,則要在定義過程時指明形參的名稱和類型;如果省略類型,則形參的默認類型為Varient型。798.5VBA模塊的創建創建過程的方法是:打開模塊菜單“插入”→“過程”
調用過程有以下兩種格式。格式1:call過程名([實參列表])格式2:過程名[實參列表]這里過程名后的參數叫實際參數。調用過程時應注意實參應與形參的順序、類型和個數保持一致。80例8-10創建一個窗體,在其中的某個按鈕的單擊事件中用InputBox函數輸入兩個整數,然后調用過程swap將它們的值互換。按鈕的單擊事件如下:PrivateSubCommand0_Click()DimxAsInteger,yAsIntegerx=InputBox("x=")y=InputBox("y=")Debug.Printx,yswapx,y'或swap(x,y)Debug.Printx,yEndSub8.5VBA模塊的創建818.5VBA模塊的創建8.5.3函數的創建和調用函數有返回值函數的定義形式如下:[Public|Private][Static]Function過程名(變量名1As類型,變量名2As類型,…)As類型
<局部變量或常數定義>
<語句塊>
<函數名>=<表達式>[ExitFunction]
<語句塊>
<函數名>=<表達式>EndFunction828.5VBA模塊的創建例8-11在前面創建的標準模塊“模塊1”內創建函數jc,函數的功能是返回一個數的階乘。另外創建一個過程test,在test過程內調用函數jc。838.5VBA模塊的創建8.5.4過程調用中的參數傳遞在調用過程和函數的過程中,一般會發生數據的傳遞,即將主調過程中的實參傳給被調過程的形參傳址傳值848.5VBA模塊的創建傳址定義過程或函數時,形參的變量名前不加任何前綴傳遞過程是:調用過程時,將實參的地址傳給形參。因此如果在被調過程或函數中修改了形參的值,則主調過程或函數中實參的值也跟著變化。858.5VBA模塊的創建傳值定義過程或函數時,形參的變量名前加ByVal前綴主調過程將實參的值復制后傳給被調過程的形參,因此如果在被調過程或函數中修改了形參的值,則主調過程或函數中實參的值不會跟著變化。86PublicSubswap1(ByValxAsInteger,ByValyAsInteger)DimtAsIntegert=x:x=y:y=tEndSubPublicSubswap(xAsInteger,yAsInteger)DimtAsIntegert=x:x=y:y=tEndSub按鈕的單擊事件如下:PrivateSubCommand0_Click()DimxAsInteger,yAsIntegerx=InputBox("x=")y=InputBox("y=")Debug.Printx,yswapx,yswap1x,yDebug.Printx,yEndSub8.5VBA模塊的創建如果輸入5和7,程序的結果?878.5VBA模塊的創建8.5.5傳遞局部變量、全局變量和靜態變量變量的有效范圍即作用域按照作用域不同,VBA有局部變量模塊級局部變量全局變量888.5VBA模塊的創建過程內局部變量在過程和函數內用關鍵字Dim定義有效范圍是定義該變量的過程或函數
898.5VBA模塊的創建模塊級局部變量在模塊的通用聲明段用關鍵字Dim或Private定義有效范圍是定義該變量的模塊908.5VBA模塊的創建例8-12創建名為“排序”的窗體。運行時自動產生并在左面的列表框中輸出10個0~99之間的隨機數,單擊“排序”按鈕后將這10個數按降序排序,并在右邊的列表框中輸出排序的結果。918.5VBA模塊的創建解題思路:(1)用數組存放10個隨機數。(2)在窗體的Load事件中生成數組中的10個隨機數(3)在“排序”按鈕的Click事件中將數組排序,因此該數組應定義為模塊級數組。92Dima(1To10)AsInteger‘定義模塊級數組PrivateSubForm_Load()DimiAsInteger
'生成并輸出數組
Fori=1To10a(i)=Int(Rnd()*100)Me.lst左.AddItema(i)NextiEndSubPrivateSubcmd排序_Click()DimiAsInteger,jAsInteger,imaxAsInteger,tAsIntegerFori=1To10'排序
'尋找最大值的位置
imax=iForj=iTo10Ifa(imax)<a(j)Thenimax=jNextj'交換
t=a(i):a(i)=a(imax):a(imax)=tNexti
Fori=1To10'輸出排序結果
Me.lst右.AddItema(i)NextiEndSub938.5VBA模塊的創建全局變量在整個應用程序使用的變量在模塊的通用聲明段用Public關鍵字定義引用全局變量時在標準模塊中定義的全局變量,可在應用程序的任何地方直接用變量名引用該變量在類模塊中定義的全局變量,可在應用程序的任何地方用“模塊名.變量名”引用948.5VBA模塊的創建靜態變量決定變量的生存期對于過程內的局部變量,它的生存期從進入過程(Sub)開始,到退出過程(EndSub)時結束。如果要改變過程內局部變量的生存期,可以將它定義為靜態變量定義的方法是在定義過程內局部變量時加關鍵字Static958.5VBA模塊的創建例8-13制作一個“計時器”窗體。要求,該窗體運行后首先單擊“設置”按鈕,然后在輸入框中輸入計時的秒數,單擊“開始”按鈕則開始計時,同時計時的秒數顯示在文本框中。當計時時間到,停止計時并響鈴,同時將文本框清零。968.5VBA模塊的創建解題思路:(1)計時由窗體的Timer事件完成。(2)由于在“設置”按鈕的單擊事件和“開始”按鈕的單擊事件中都要用到計時范圍f,所以將變量f定義成模塊級變量。(3)變量s的作用是計時,即每次Timer事件觸發時s的值要加1,所以將變量s定義成靜態變量。97DimfAsInteger ‘定義模塊級變量‘在窗體的Load事件中設置TimerInterval屬性為0PrivateSubForm_Load()Me.TimerInterval=0EndSub‘窗體的Timer事件PrivateSubForm_Timer()StaticsAsInteger '定義靜態變量
s=s+1Ifs=fThenBeep '響鈴
s=0Me.TimerInterval=0EndIfMe.txt顯示=sEndSub‘按鈕“cmd設置”的單擊事件PrivateSubcmd設置_Click()f=InputBox("請輸入計時范圍:")EndSub‘按鈕“cmd開始”的單擊事件PrivateSubcmd開始_Click()Me.TimerInterval=1000 '開始計時EndSub988.6VBA程序的調試8.6.1錯誤類型8.6.2設置斷點8.6.3單步跟蹤8.6.4設置監視點99中斷模式可以干什么?怎樣進入?怎樣退出?8.6VBA程序的調試1008.6.1
錯誤類型
語法錯誤編譯錯誤運行錯誤邏輯錯誤8.6VBA程序的調試101調試窗口立即窗口本地窗口監視窗口8.6VBA程序的調試1028.6.2
設置斷點
在程序中人為設置斷點,使程序暫停運行并進入中斷狀態…8.6VBA程序的調試1038.6.3
單步跟蹤
設置單步跟蹤程序的運行“調試”→“逐語句”8.6VBA程序的調試1048.6.4
設置監視點
即設置監視表達式。一旦監視表達式的值為真或改變,程序自動進入中斷模式。“調試”→“添加監視”8.6VBA程序的調試1058.7VBA的數據庫編程8.7.1數據訪問接口ADO8.7.2ADO的主要對象8.7.3使用記錄集中的數據1068.7.1
數據訪問接口ADO
ADO(ActiveXDataObject)即ActiveX數據訪問對象,是Microsoft公司在OLE-DB之上提出的一種新的邏輯接口,以便編程者通過OLE-DB更簡單地以編程方式訪問各種各樣的數據源。
8.7VBA的數據庫編程107ADO將訪問數據源的過程抽象成幾個容易理解的具體操作,并由實際的對象來完成。由于采用了ActiveX技術,與具體的編程語言無關,所以可應用在VisualBasic、C++、Java等各種程序設計語言中。ADO能夠訪問各種支持OLE-DB的數據源,包括數據庫和其他文件、電子郵件等數據源。ADO既可以被應用于網絡環境,也可以被應用于桌面應用程序中。
8.7VBA的數據庫編程108ADO訪問數據源的具體過程如下。建立與數據源的連接指定訪問數據源的命令,并向數據源發出命令從數據源以行的形式獲取數據,并將數據暫存在內存的緩存中如果需要可對獲取的數據進行查詢、更新、插入、刪除等操作如果對數據源進行了修改,將更新后的數據發回數據源斷開與數據源的連接8.7VBA的數據庫編程實際使用時,上面過程中的各個步驟分別由ADO的具體對象完成
109要使用ADO對象,先要引用ADO類庫。“工具”→“引用”8.7VBA的數據庫編程110ADO的主要對象Connection對象Command對象Recordset對象
8.7VBA的數據庫編程111Connection對象
8.7VBA的數據庫編程用于建立與數據源的連接112(2)指定OLE-DB數據提供者的名稱和有關的連接信息
MyCnn.Provider="Microsoft.ACE.OLEDB.12.0"MyCnn.ConnectionString="DataSource=D:\教學管理
.accdb"
(3)最后調用MyCnn對象的Open方法打開連接MyCnn.Open(1)定義一個ADO的Connection對象DimMyCnnAsADODB.Connection SetMyCnn=NewADODB.Connection8.7VBA的數據庫編程113用Connection對象顯式建立與Access數據庫“教學管理”的連接的完整程序。PublicSubCnnToDB_1()
'定義Connection對象
DimMyCnnAsADODB.Connection
'初始化
SetMyCnn=NewADODB.Connection
'指定數據提供者的名稱MyCnn.Provider="Microsoft.ACE.OLEDB.12.0"
'指定數據源
MyCnn.ConnectionString="DataSource=D:\教學管理
.accdb"
'打開連接
MyCnn.Open MsgBox("數據庫連接成功")EndSub8.7VBA的數據庫編程114Command對象
8.7VBA的數據庫編程
用來定義并執行針對數據源運行的具體命令,如SQL查詢,并通過Recordset對象返回一個滿足有關條件的記錄集。115(1)創建一個Command對象的實例DimMyCmdAsADODB.Command SetMyCmd=NewADODB.Command(2)使已經打開的連接與Command對象相關聯
MyCmd.ActiveConnection=MyCnn
(3)定義命令(如SQL語句)的可執行文本MyCmd.CommandText="Select*From課程"
(4)執行命令并返回記錄集MyCmd.Execute
8.7VBA的數據庫編程116從數據源獲取的數據存放在Recordset對象中,并且所有Recordset對象均由記錄(行)和字段(列)組成。使用Recordset對象的方法和屬性定位到數據的各行查看行中的值操縱記錄集中的數據Recordset對象
8.7VBA的數據庫編程117定義并初始化一個Recordset對象
DimMyRSAsADODB.RecordsetSetMyRS=NewADODB.Recordset有多種獲取記錄集的方法8.7VBA的數據庫編程118(1)接收Command對象的返回記錄集SetMyRS=MyCmd.Execute調用Command對象的Execute方法執行命令后,可將返回的記錄集指定給一個Recordset對象。8.7VBA的數據庫編程119下面程序實現了創建連接、定義命令和獲取數據的全部過程
PublicSubCnnToDB_2()DimMyCnnAsADODB.ConnectionSetMyCnn=NewADODB.ConnectionDimMyCmdAsADODB.CommandSetMyCmd=NewADODB.CommandDimMyRSAsADODB.RecordsetSetMyRS=NewADODB.RecordsetMyCnn.Provider="Microsoft.ACE.OLEDB.12.0"MyCnn.ConnectionString="DataSource=D:\教學管理
.accdb"MyCnn.OpenMyCmd.ActiveConnection=MyCnnMyCmd.CommandText="Select*From課程"SetMyRS=MyCmd.ExecuteStop ‘斷點,以便觀察得到的數據
MyCnn.CloseEndSub120?Myrs.fields(0),Myrs.fields(1),Myrs.fields(2)立即窗口輸入命令:查看獲取的結果(2)使用Recordset對象的Open方法打開Recordset對象此方法的語法格式如下:recordset.OpenSource,ActiveConnection,CursorType,LockType,OptionsSource可以是SQL命令、Command對象、表名等。ActiveConnection指定所用的連接,可以是Connection對象。CursorType指定記錄集中游標的移動方式。8.7VBA的數據庫編程121下面程序使用方法2獲取數據PublicSubCnnToDB_3()DimMyCnnAsADODB.ConnectionSetMyCnn=NewADODB.ConnectionDimMyRSAsADODB.RecordsetSetMyRS=NewADODB.RecordsetDimstrSQLAsStringMyCnn.Provider="Microsoft.ACE.OLEDB.12.0"MyCnn.ConnectionString="DataSource=D:\教學管理
.accdb“MyCnn.OpenstrSQL="Select*From課程"MyRS.OpenstrSQL,MyCnn,adOpenKeysetStopMyCnn.CloseEndSub122當不再使用Recordset對象中的數據時,應該用Recordset對象的Close方法關閉該對象,釋放所占用的內存空間。8.7VBA的數據庫編程使用當前數據庫的連接MyCmd.ActiveConnection=CurrentProject.ConnectionMyRS.Close1238.7.3
使用記錄集中的數據
現在,數據已在Recordset對象中,如何對數據進行輸出、插入、刪除和更新?
8.7VBA的數據庫編程124輸出記錄集中的數據
8.7VBA的數據庫編程BOF(BeginOfFile)屬性用于檢查當前游標是否在第1條記錄之前。如果是,則返回True,否則返回False。EOF(EndOfFile)屬性用于檢查當前游標是否在最后1條記錄之后即記錄集的末尾。如果是,則返回True,否則返回False。如果記錄集為空,則BOF屬性和EOF屬性的值均為True。125MoveFirst:將游標移到第1條記錄。MoveLast:將游標移到最后1條記錄。MoveNext:將游標移到下一條記錄。MovePrevious:將游標移到上一條記錄。8.7VBA的數據庫編程126PublicSubOutput()DimMyRSAsADODB.RecordsetSetMyRS=NewADODB.RecordsetDimstrSQ
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 健康管理創業計劃書
- 2025年班主任開學第一課主題班會教案
- 廣東省汕頭市潮陽區銅盂中學2025年初三模擬(5月)化學試題含解析
- 濱州市重點中學2024-2025學年高中畢業班第一次復習統一檢測試題化學試題含解析
- 商丘學院《中醫藥論文寫作及發表教程》2023-2024學年第二學期期末試卷
- 湖北水利水電職業技術學院《地理信息系統概論》2023-2024學年第二學期期末試卷
- 小學管理標準化匯報
- 2025年廣東省深圳市錦華實驗校初三第二學期期末考試樣卷英語試題含答案
- 上海市靜安區、青浦區2024-2025學年高三暑假末結業考試生物試題含解析
- 浙江特殊教育職業學院《臨床研究導論》2023-2024學年第一學期期末試卷
- 中綠的制度課
- 質量目標管理表
- 機械原理課程設計-抽油機機械系統設計說明書
- 醫療護理品管圈QCC成果匯報之提高住院病人健康宣教的知曉率(問題解決型)
- DBJ41T 074-2013 高壓細水霧滅火系統設計、施工及驗收規范
- Q∕SY 05262-2019 機械清管器技術條件
- 《出納員登記日記賬》 課件
- DBJ51 014-2021 四川省建筑地基基礎檢測技術規程
- 環境監測課件:第3章 空氣和廢氣監測2
- 航空航天概論(課堂PPT)
- 小學校班子運行情況
評論
0/150
提交評論