




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
本章要點模塊與VBA概述VBA程序的數(shù)據(jù)描述VBA程序的流程控制VBA過程VBA數(shù)據(jù)庫訪問技術(shù)VBA程序的調(diào)試與錯誤處理第9章
模塊與VBA程序設計9.1.1
模塊的概念模塊是由VBA通用聲明和一個或多個過程組成的單元。組成模塊的基礎是過程,VBA過程通常分為子過程(Sub過程)、函數(shù)過程(Function過程)和屬性過程(Property過程)。每個過程作為一個獨立的程序段,實現(xiàn)某個特定的功能。9.1 模塊與VBA概述標準模塊在標準模塊中,放置的是可供整個數(shù)據(jù)庫使用的公共過程,這些過程不與任何對象關(guān)聯(lián)。每個標準
模塊有唯一的名稱,在導航窗格的“模塊”對象中,可以查看數(shù)據(jù)庫中的標準模塊。類模塊類模塊其實是一個對象的定義,它封裝了一些屬性和方法。VBA中類模塊有3種基本類型:窗體模
塊、報表模塊和自定義類模塊。還有一種自定義類模塊,不與窗體和報表相關(guān)聯(lián),允許用戶自定義所需的對象、屬性和方法。9.1.2
VBA的開發(fā)環(huán)境1.VBE的啟動單擊“創(chuàng)建”選項卡,再在“宏與代碼”命
令組中單擊“模塊”“類模塊”或“Visual
Basic”命令按鈕,均可以打開VBE窗口。在導航窗格的“模塊”組中雙擊所要顯示的模塊名稱,就會打開VBE窗口并顯示該模塊的內(nèi)容。在“數(shù)據(jù)庫工具”選項卡中,單擊“宏”命令組中的“Visual
Basic”命令按鈕,打開VBE窗口。在窗體設計視圖或報表設計視圖中,單擊
“窗體設計工具/設計”選項卡或“報表設計工具/設計”選項卡,再在“工具”命令組中單擊“查看代
碼”命令按鈕。在窗體、報表的設計視圖中,右鍵單擊控
件對象,再在打開的快捷菜單中選擇“事件生成器”命令,打開“選擇生成器”對話框,選擇其中的“代碼生成器”選項,單擊“確定”按鈕。使用Alt+F11組合鍵,可以在Access主窗口和VBE窗口之間進行切換。啟動VBE后,屏幕出現(xiàn)VBE窗口。2.VBE窗口的組成VBE窗口除主窗口外,主要由工程資源管理器窗口、屬性窗口、代碼窗口和立即窗口等組成,另外還有對象窗口、對象瀏覽器、本地窗口和監(jiān)視窗口等,可以通過VBE“視圖”菜單中的相應命令來控制這些窗口的顯示。1)VBE主窗口VBE主窗口有菜單欄和工具欄。VBE的菜單欄包括文件、編輯、視圖、插入、調(diào)試、運行、工具、外接程序、窗口和幫助10個菜單項,其中包含了各
種操作命令。在默認情況下,VBE窗口中顯示的是“標準”工
具欄,其中包括創(chuàng)建模塊時常用的按鈕。可以通過
選擇“視圖”→“工具欄”命令來顯示其他工具欄。2)工程資源管理器窗口工程資源管理器窗口列出了在應用程序中用到的模塊。使用該窗口,可以在數(shù)據(jù)庫內(nèi)各個對象之間快速地瀏覽。各對象以樹形圖的形式分級顯示在窗口中,包括Access類對象、模塊和類模塊。要查看對象的代碼,只需在該窗口中雙擊對象即可。要查看對象的窗體,可以右鍵單擊對象名,然后在彈出的快捷菜單中選擇“查看對象”命令。3)屬性窗口屬性窗口列出了所選對象的各種屬性,可按字母和分類排序來查看屬性。可以直接在屬性窗口中對這些屬性進行編輯,還可以在代碼窗口中用VBA語句設置對象的屬性。4)代碼窗口在代碼窗口中可以輸入和編輯VBA代碼??梢?/p>
打開多個代碼窗口來查看各個模塊的代碼,而且可以方便地在代碼窗口之間進行復制和粘貼。在代碼窗口的頂部是兩個下拉列表框,左邊是對象下拉列表框,右邊是事件下拉列表框。對象下拉列表框中列出了所有可用的對象名稱,選擇某一個對象后,在事件下拉列表框中將列出該對象所有的事件。5)立即窗口立即窗口常用于程序在調(diào)試期間輸出中間結(jié)果及幫助用戶在中斷模式下測試表達式的值等,也可以在立即窗口中直接輸入VBA命令并按Enter鍵,此
后VBA會實時解釋并執(zhí)行該命令。9.1.3
模塊的創(chuàng)建1.創(chuàng)建模塊的方法在Access
2016中創(chuàng)建一個窗體或報表,
Access
2016都會自動創(chuàng)建一個對應的窗體模塊或報表模塊。單擊“創(chuàng)建”選項卡,再在“宏與代碼”命令組中單擊“模塊”或“類模塊”命令按鈕,打開
VBE窗口并建立一個新的模塊。(3)在VBE窗口中,選擇“插入”→“模塊”菜單命令可以創(chuàng)建新的標準模塊;選擇“插入”→“類模塊”菜單命令可以創(chuàng)建新的類模塊。單擊VBE“標準”工具欄中“插入模塊”按鈕右側(cè)的向下箭頭,從下拉列表中選擇“模塊”選項或“類模塊”選項。例9-1在“教學管理”數(shù)據(jù)庫中創(chuàng)建一個標準模塊。打開VBE窗口。在代碼窗口中輸入一個名為“qq”的子過程,然后在立即窗口中輸入命令“Call
qq()”,或單擊VBE窗口“標準”工具欄中的“運行子過程/用戶窗體”命令按鈕,或從“運行”菜單中選擇相應命令來運行該過程,隨后可以看到該過程的運行結(jié)果。在VBE窗口中單擊“標準”工具欄中的“保存”按鈕,并輸入模塊名稱將模塊存盤。2.對象的引用引用對象屬性的語法格式為對象名.屬性名在程序代碼中改變屬性的值,其語句格式為對象名.屬性名=屬性值引用方法的語法格式為對象名.方法名(參數(shù)1,參數(shù)2,…)當引用對象的多個屬性時,可使用With…End
With結(jié)構(gòu)。例如,如果要給命令按鈕Cmd1的多個屬性賦
值,可表示為With
Cmd1.Caption="確定".Height=2000.Width=2000End
WithDoCmd對象的主要功能是通過調(diào)用包含在內(nèi)部的方法實現(xiàn)VBA程序設計中對Access的操作。例如,利用DoCmd對象的OpenReport方法打開“學生”報表,語句為DoCmd.OpenReport"學生"3.編寫對象響應的程序代碼使用宏操作來設置事件的屬性。在代碼窗口中為某個事件創(chuàng)建事件過程。例如,命令按鈕Command1的Click事件過程名為“Command1_Click”。該子程序就是處理該事件的程序,稱為事件過程,一般格式為Private
Sub對象名_事件名([參數(shù)表])……(事件過程代碼)End
Sub例9-2在“教學管理”數(shù)據(jù)庫中創(chuàng)建如圖所示的窗體,窗體中包含兩個文本框和相應的標簽及兩個命令按鈕。單擊第1個命令按鈕時將第1個文本框中的內(nèi)容顯示在第2個文本框中,單擊第2個命令按鈕時關(guān)閉該窗體。9.2.1
數(shù)據(jù)類型數(shù)據(jù)類型分為標準數(shù)據(jù)類型和用戶自定義數(shù)據(jù)類型。1.標準數(shù)據(jù)類型VBA支持多種標準數(shù)據(jù)類型。例如,Integer(整
型)、Long(長整型)、Single(單精度型)、Double(雙精度型)、Currency(貨幣型)、String(字符型)、
Date(日期型)、Boolean(布爾型)、Byte(字節(jié)型)、
Variant(變體型)、Object(對象)。9.2
VBA程序的數(shù)據(jù)描述2.用戶自定義數(shù)據(jù)類型VBA允許用戶自定義數(shù)據(jù)類型,使用Type語句就可以實現(xiàn)這個功能。用戶自定義數(shù)據(jù)類型可包含一個或多個某種數(shù)據(jù)類型的數(shù)據(jù)元素。Type語句的語法格式為Type數(shù)據(jù)類型名數(shù)據(jù)元素定義語句End
Type9.2.2
常量與變量1.常量1)直接常量十進制整數(shù)由數(shù)字0~9和正、負號組成,實數(shù)可采用小數(shù)表示形式和科學記數(shù)表示形式。字符串常量是一個用雙引號括起來的字符序列。布爾常量有True和False兩個值。日期常量將日期和時間的字符用一對“#”括起來表示。2)符號常量符號常量用標識符來表示某個常量。聲明常量的語句格式為Const常量名[As數(shù)據(jù)類型|類型符]=表達式[,常量名[As數(shù)據(jù)類型|類型符]=表達式]在VBA中,標識符的命名必須以字母或漢字開頭,且只能由漢字、字母(a~z或A~Z)、數(shù)字(0~9)或下畫線(_)所組成,其最大長度為255個字符。此外,不能使用VBA的關(guān)鍵字作為標識符,標識符不區(qū)分大小寫。3)系統(tǒng)常量系統(tǒng)常量是VBA預先定義好的常量,用戶可以
直接使用。例如,VBA用vbKeyReturn來表示Enter鍵,它的ASCII碼值是13。2.變量變量可以看做是一個被命名的內(nèi)存單元,通過變量的名字來訪問相應的內(nèi)存單元。1)變量的命名規(guī)則VBA的變量名要遵循標識符的命名規(guī)則,可以
在命名變量時使用前綴的約定。這樣通過變量名就可以知道變量的數(shù)據(jù)類型。2)變量的聲明聲明變量要使用Dim語句,Dim語句的格式為Dim變量名[As數(shù)據(jù)類型|類型符][,變量名[As數(shù)據(jù)類型|類型符]]3)變量的賦值聲明了變量后,變量就指向了內(nèi)存的某個單元。在程序的執(zhí)行過程中,可以向這個內(nèi)存單元寫入數(shù)據(jù),這就是變量的賦值。給變量賦值的語句格式為變量名=表達式3.數(shù)組變量數(shù)組是一組具有相同數(shù)據(jù)類型的數(shù)據(jù)所構(gòu)成的集合,而其中單個的數(shù)據(jù)稱為數(shù)組元素。數(shù)組必須先聲明后使用,數(shù)組聲明即定義數(shù)組名、類型、維數(shù)和各維的大小。定義數(shù)組后,數(shù)組名代表所有數(shù)組元素,而數(shù)組名加下標表示一個數(shù)組元素,也稱為下標變量。數(shù)組的聲明方式和其他變量是一樣的,可以使用
Dim語句來聲明,其一般格式為Dim數(shù)組名([下標1下界To]下標1上界[,[下標2下界To]下標2上界]…)As數(shù)據(jù)類型下標下界的默認值為0,在使用數(shù)組時,可以在
模塊的通用聲明部分使用“Option
Base
1”語句來指定數(shù)組下標下界從1開始。1)聲明固定大小數(shù)組下面的語句聲明了一個固定大小數(shù)組。Dim
MyArray(10,10)
As
Integer2)聲明動態(tài)數(shù)組可以利用Dim語句來聲明數(shù)組,不給出數(shù)組大小。每當需要時,可以使用ReDim語句去更改動態(tài)數(shù)組,此時數(shù)組中存在的值會丟失。若要保存數(shù)組中原先的值,則可以使用ReDim
Preserve語句來擴充數(shù)組。9.2.3
內(nèi)部函數(shù)內(nèi)部函數(shù)是VBA系統(tǒng)為用戶提供的標準過程,能完成許多常見運算。根據(jù)內(nèi)部函數(shù)的功能,可將其分為數(shù)學函數(shù)、字符串函數(shù)、日期或時間函數(shù)、類型轉(zhuǎn)換函數(shù)和測試函數(shù)等類型。9.2.4
表達式1.算術(shù)表達式用算術(shù)運算符將運算對象連接起來的式子叫算術(shù)表達式。VBA算術(shù)運算符:+(加)、-(減)、*(乘)、/(除)、\(整除)、Mod(求余)、^(乘方)。如果表達式中含有括號,則先計算括號內(nèi)表達式的值,然后嚴格按照運算符的優(yōu)先級別進行運算。
乘方運算的優(yōu)先級最高,加、減運算的優(yōu)先級最低。2.關(guān)系表達式關(guān)系表達式的結(jié)果是True或FalseVBA中的關(guān)系運算符有大于(>)、小于(<)、大于
或等于(>=)、小于或等于(<=)、等于(=)、不等于
(<>)。數(shù)值按大小比較。日期按先后比較,早的日期小于晚的日期。False大于True。
字符串按ASCII碼排序的先后比較,也就是先比較兩個字符串的第1個字符,按字符的ASCII碼值比較大小,ASCII碼值大的字符串大,如第1個字符相等,則比較第2個字符,直到比較出大小或比較完為止。
漢字字符大于西文字符,漢字的比較是根據(jù)
Unicode碼的大小來比較的。3.邏輯表達式邏輯表達式可以表示比較復雜的比較關(guān)系,結(jié)果是True或False。VBA中的邏輯運算符有Not(非)、
And(與)、Or(或)、Xor(異或)例如,用邏輯表達式描述“1990年出生的男生或
1995年以后出生的女生”,邏輯表達式如下。Year(出生日期)=1990
And性別="男"Or
Year(出生日期)>1995
And性別="女"4.字符串表達式字符串表達式由連接運算符將字符串數(shù)據(jù)連接而成。VBA中的連接運算符有“+”和“&”,作用是將兩個字符串連接起來。當兩個被連接的數(shù)據(jù)都是字符串時,“&”和“+”的作用相同;當數(shù)值型和字符型連接時,“&”把數(shù)
據(jù)轉(zhuǎn)化成字符型后再進行連接,而此時用“+”連接則會出錯。9.3.1
順序控制1.程序語句書寫規(guī)則1)注釋語句在VBA程序中,注釋可以通過使用Rem語句或用單引號“′”來實現(xiàn)。9.3
VBA程序的流程控制語句連寫和換行在一行中寫幾條語句,這時語句之間需要用冒號
“:”來分隔。對于太長的語句,可能一行寫不完,可以用空格加下劃線“_”將其截斷為多行,此為語句的換行。采用縮進格式書寫程序采用縮進格式可以明確示意出程序中語句的結(jié)構(gòu)層次,可以利用VBE的“編輯”→“縮進”或“凸出”菜單命令進行設置。2.輸入輸出
1)InputBox函數(shù)InputBox函數(shù)的作用是顯示一個輸入對話框,對話框中有一些提示信息及文本框,等待用戶輸入信息或單擊按鈕。在按鈕事件發(fā)生后返回文本框的內(nèi)容,返回值的類型為文本類型。InputBox函數(shù)的調(diào)用格式為InputBox(Prompt,[Title],[Default],[XPos],[YPos])2)MsgBox函數(shù)MsgBox函數(shù)的作用是打開一個對話框,等待用戶單擊按鈕,并返回一個整數(shù)告訴用戶單擊了哪一個按鈕。MsgBox函數(shù)的調(diào)用格式為變量名=MsgBox(Prompt,[Buttons],[Title])MsgBox在VBA程序中也可以作為語句使用,其格式為MsgBox
Prompt,[Buttons],[Title]例9-3以下代碼使用InputBox函數(shù)和MsgBox函數(shù)接收用戶的輸入并顯示。Sub
InputFunc()Dim
str
As
StringStr=InputBox("請輸入您的姓名:“,"登錄")MsgBox"歡迎您:"&
str
&"同學“,vbInformation,"歡迎"End
Sub程序在調(diào)用子過程InputFunc時,彈出輸入對話框,要求用戶輸入數(shù)據(jù)。輸入并單擊“確定”按鈕后,彈出輸出對話框。3.賦值語句賦值語句是最簡單而又最常用的語句。語句格式為變量名=表達式該語句的功能是計算右邊表達式的值,再將其賦值給左邊的變量。例9-4設備管理部門對已購入的設備登賬時,為了減少人工輸入,當輸入“設備單價”和“采購數(shù)量”
后,單擊“總金額”文本框,系統(tǒng)就會自動計算結(jié)果,同時給出金額累計,程序的運行界面如圖所示。1.簡單分支控制簡單分支控制結(jié)構(gòu)用If語句實現(xiàn),其格式為If<條件>Then語句塊1[Else語句塊2]End
If9.3.2
選擇控制例9-5輸入一個年份,判斷該年是否為閏年。判斷某年是否為閏年的規(guī)則是:如果此年號能被400整除,則是閏年;如果此年號能被4整除,但不能被
100整除,則也是閏年。創(chuàng)建一個數(shù)據(jù)庫,啟動VBE,在數(shù)據(jù)庫中新建一個標準模塊,程序代碼如下。Sub
Leap()Dim
x
As
Integerx=Val(InputBox("請輸入年份:"))If
x
Mod
400=0
Or(x
Mod
4=0
And
x
Mod
100<>0)ThenMsgBox
Str$(x)&"年是閏年"ElseMsgBox
Str$(x)&"年不是閏年"End
IfEnd
Sub2.多分支選擇控制1)多分支If結(jié)構(gòu)多分支If結(jié)構(gòu)的格式為If條件1
Then語句塊1ElseIf條件2
Then語句塊2……[ElseIf條件n
Then語句塊n][Else語句塊n+1]End
If例9-6記錄數(shù)據(jù)被更新之前會發(fā)生BeforeUpdate事件,利用相應的事件過程對“學生”窗體中“入學成績”文本框中輸入的成績進行驗證,要求入學成績必須在[0,750]范圍內(nèi),否則給出提示。“入學成績”文本框控件的BeforeUpdate事件過程代碼如下。Private
Sub入學成績_BeforeUpdate(Cancel
As
Integer)If
Me!入學成績=""Or
IsNull(Me!入學成績)ThenMsgBox"入學成績不能為空!",vbCritical,"入學成績"Cancel=TrueElseIf
Me!入學成績>750
Or
Me!入學成績<0
ThenMsgBox"入學成績必須在[0,750]范圍內(nèi)!",vbCritical,"入學成績"Cancel=TrueElseMsgBox"入學成績輸入正確!",vbInformation,"入學成績"End
IfEnd
Sub2)Select
Case結(jié)構(gòu)
Select
Case結(jié)構(gòu)的格式為
Select
Case表達式Case表達式列表1語句塊1[Case表達式列表2語句塊2]……[Case表達式列表n語句塊n][Case
Else語句塊n]End
Select說明:(1)“表達式”可以是數(shù)值表達式或字符串表達式。(2)表達式列表可以有如下3種格式。值1[,值2]……。值1
To值2。Is關(guān)系運算符值1[,值2]……。例9-7給學生的成績評級,成績大于等于90分為
“優(yōu)”,大于等于80分且小于90分為“良”,大于等于70分且小于80分為“中”,大于等于60分且小于
70分為“及格”,小于60分的為“不及格”。程序片段如下。Dim
score
As
Integerscore=InputBox("請輸入score的值:")Select
Case
scoreCase
Is
>=
90MsgBox"優(yōu)"Case
Is>=80MsgBox"良"Case
Is>=70MsgBox"中"Case
Is>=60MsgBox"及格"Case
ElseMsgBox"不及格"End
Select3.具有選擇功能的函數(shù)VBA提供了3個具有選擇功能的函數(shù),分別為IIf函數(shù)、Switch函數(shù)和Choose函數(shù)。IIf(條件式,表達式1,表達式2)Switch(條件式1,表達式1,條件式2,表達式2,…,條件式n,達式n)Choose(索引式,選項1,選項2,…,選項n)For循環(huán)變量=初值To終值[Step步長]循環(huán)體Next循環(huán)變量其中,“循環(huán)變量”為數(shù)值型變量,用于統(tǒng)計循環(huán)次數(shù),此變量可以從初值變化到終值,每次變化的差值由“步長”決定。如果“步長”為1,“Step1”可以省略?!把h(huán)體”是在循環(huán)過程中被重復執(zhí)行的語句組。9.3.3
循環(huán)控制1.用For語句實現(xiàn)循環(huán)
For循環(huán)的格式為例9-8利用For語句求s=1+2+3+4+…+1000的值。程序片段如下。
Dim
i
As
IntegerDim
s
As
Longs
=
0For
i
=
1
To
1000s
=
s
+
iNext
iMsgBox
"1到1000的和為:"&
s2.用Do語句實現(xiàn)循環(huán)Do語句根據(jù)某個條件是否成立來決定能否執(zhí)行相應的循環(huán)體部分,它有以下幾種格式。1)Do
While…Loop語句語句格式為Do
While條件表達式循環(huán)體Loop語句執(zhí)行時,若“條件表達式”的值為真,則執(zhí)行Do
While和Loop之間的“循環(huán)體”,直到“條件表達式”的值為假才結(jié)束循環(huán)。2)DoUntil…Loop語句語句格式為Do
Until條件表達式循環(huán)體Loop語句執(zhí)行時,若“條件表達式”的值為假,則執(zhí)行Do
Until和Loop之間的“循環(huán)體”,直到“條件表達式”的值為真才結(jié)束循環(huán)。3)Do…LoopWhile語句語句格式為Do循環(huán)體Loop
While條件表達式語句執(zhí)行時,首先執(zhí)行一次“循環(huán)體”,執(zhí)行到
Loop
While時判斷“條件表達式”的值,如果為真,繼續(xù)執(zhí)行Do和Loop
While之間的“循環(huán)體”,否則,結(jié)束循環(huán)。4)Do…Loop
Until語句語句格式為Do循環(huán)體Loop
Until條件表達式語句執(zhí)行時,首先執(zhí)行一次“循環(huán)體”,執(zhí)行到
Loop
Until時判斷“條件表達式”的值,如果為假,繼續(xù)執(zhí)行Do和Loop
Until之間的“循環(huán)體”,否則,結(jié)束循環(huán)。例9-9假設我國現(xiàn)在的人口為13億,若年增長率為r=1.5%,試計算多少年后我國人口增加到20億。人口計算公式為“p=p0
(1+r)n”,其中p0為人口初始值,r為增長率,n為年數(shù)。程序片段如下。Dim
p
As
Single,
r
As
Single,
i
As
Integerp
=
13r
=
0.015i
=
0Do
While
p
<
20p
=
p
*
(1
+
r)i
=
i
+
1LoopMsgBox
i
&"年后,我國人口將達到"&
p
&"億"3.For
Each…Next語句For
Each…Next語句是對于數(shù)組中的每個元素或?qū)ο蠹现械拿恳豁椫貜蛨?zhí)行一組語句,其語法格式如下:For
Each元素名In名稱循環(huán)體Next[元素名]其中,元素名是用來枚舉數(shù)組元素或集合中所有成員的變量。對于數(shù)組,元素名只能是Variant變量。對于集合,元素名可能是Variant變量、Object變量等。名稱是指數(shù)組或?qū)ο蠹系拿Q。例9-10計算Sub
ForEach()Dim
a(1
To
10)
As
LongDim
result
As
Long,
t
As
LongDim
i
As
Integer,
x
As
Variantresult
=
0t
=
1"求階乘并存入數(shù)組a中For
i
=
1
To
10t
=
t
*
i
a(i)
=
tNext
iFor
Each
x
In
a"利用For
Each…Next語句控制數(shù)組元素,實現(xiàn)累加result=result+xNext
xDebug.Print
"1!+2!+3+……+10!="
&
resultEnd
Sub的值。GoTo控制語句GoTo語句無條件地轉(zhuǎn)移到過程中指定的行,其語法格式如下:GoTo行號Exit語句Exit語句用于退出Do循環(huán)、For循環(huán)、Function過程、Sub過程或Property過程代碼塊,相應地它包括
Exit
Do、Exit
For、Exit
Function、Exit
Sub和ExitProperty幾個語句。9.3.4
輔助控制下面示例代碼使用Exit語句退出Do循環(huán)、For循環(huán)及Sub子過程。Sub
ExitDemo()Dim
i,
RndNumDo
"建立循環(huán),這是一個無止境的循環(huán)For
i
=
1
To
1000
"循環(huán)1000次RndNum=Int(Rnd
*
1000)"生成一個隨機數(shù)"檢查隨機數(shù)"如果是7,退出For循環(huán)
"如果是9,退出Loop循環(huán)
"如果是10,退出子過程Select
Case
RndNumCase
7:
Exit
ForCase
9:
Exit
DoCase
10:
Exit
SubEnd
SelectNext
iLoopEnd
Sub9.4.1
子過程與函數(shù)過程過程必須先聲明后調(diào)用,不同的過程有不同的結(jié)構(gòu)形式和調(diào)用格式。1.子過程1)子過程的聲明子過程的聲明格式如下:Sub子過程名([形式參數(shù)列表])[局部常量或變量的定義][語句序列][Exit
Sub][語句序列]End
Sub9.4
VBA過程2)子過程的創(chuàng)建子過程的創(chuàng)建有以下兩種方法:在VBE的工程資源管理器窗口中,雙擊需要創(chuàng)建的過程窗體模塊或報表模塊或標準模塊,然后選擇“插入”→“過程”命令,打開“添加過程”對話框,然后根據(jù)需要設置參數(shù)。直接在窗體模塊、報表模塊或標準模塊的代碼窗口中,輸入“Sub子過程名”,然后按Enter鍵,自動生成過程的起始語句和結(jié)束語句。3)子過程的調(diào)用子過程的調(diào)用有兩種方式,一種是利用Call語句,另一種方法是把過程名作為一個語句來直接調(diào)用。利用Call語句調(diào)用子過程的語法格式如下:Call過程名([實際參數(shù)列表])利用過程名作為語句的子過程調(diào)用方法如下:過程名[實際參數(shù)列表]實際參數(shù)列表簡稱為實參,它與形式參數(shù)的個數(shù)、位置和類型必須一一對應,調(diào)用時把實參的值傳遞
給形參。程序如下:Sub
Factor1(n
As
Integer,
p
As
Long)Dim
i
As
Integerp
=
1For
i
=
1
To
np
=
p
*
iNext
iEnd
SubSub
MySum1()Dim
n
As
Integer,
p
As
Long,
s
As
LongFor
n
=
1
To
10Call
Factor1(n,
p)s
=
s
+
pNext
nMsgBox"結(jié)果為:"&
sEnd
Sub例9-11編寫一個求n!的子程序,然后調(diào)用它計算的值。2.函數(shù)過程1)函數(shù)過程的聲明函數(shù)過程的聲明格式如下:Function函數(shù)過程名([形式參數(shù)列表])[As數(shù)據(jù)類型][局部常量或變量的定義][語句序列][Exit
Function][語句序列]函數(shù)名=表達式End
Function2)函數(shù)過程的調(diào)用與子過程的調(diào)用方法不同,函數(shù)不能作為單獨的語句加以調(diào)用,而是作為一個運算量出現(xiàn)在表達式中。調(diào)用函數(shù)過程的方法和調(diào)用VBA內(nèi)部函數(shù)的方法一樣,調(diào)用格式如下:函數(shù)過程名([實際參數(shù)列表])程序如下:Function
Factor2(n
As
Integer)
As
LongDim
i
As
Integer,
p
As
Longp
=
1For
i
=
1
To
np
=
p
*
iNext
iFactor2
=
pEnd
FunctionSub
MySum2()Dim
n
As
Integer,
s
As
LongFor
n
=
1
To
10s
=
s
+
Factor2(n)Next
nMsgBox"結(jié)果為:"&
sEnd
Sub例9-12
編寫一個求n!的函數(shù),然后調(diào)用它計算的值。3.屬性過程屬性過程是一系列由Property和End
Property語句所包含起來的VBA語句,也叫Property過程,可以用屬性過程為窗體、報表和類模塊增加自定義屬性。聲明屬性過程的語法格式為:Property
Get|Let|Set屬性名[(形式參數(shù))][As數(shù)據(jù)類型[語句序列]End
PropertyProperty過程包括3種類型:Let類型用來設置屬性值,Get類型用來返回屬性值,Set類型用來設置對對象的引用。Property過程通常是成對使用的:Property
Let與Property
Get一組,而Property
Set與Property
Get一組,這樣聲明的屬性既可讀也可寫。單獨聲明一個Property
Get過程是只讀屬性。9.4.2
過程參數(shù)傳遞1.引用傳遞在形參前面加上ByRef關(guān)鍵字或省略不寫,表示參數(shù)傳遞是引用傳遞方式。引用傳遞方式是過程默認的參數(shù)傳遞方式。引用傳遞方式是將實參的地址傳遞給形參,也就是實參和形參共用同一個內(nèi)存單元,是一種雙向的數(shù)據(jù)傳遞,即調(diào)用時實參將值傳遞給形參,調(diào)用結(jié)束后由形參將操作結(jié)果返回給實參。引用傳遞的實參只能是變量,不能是常量或表達式。例9-13閱讀下面的程序,分析程序的運行結(jié)果。事件過程代碼如下。Sub
Cmd1_Click()Dim
x
As
Integer,
y
As
Integerx
=
10y
=
20Debug.Print
"1,
x=";
x,
"y=";
yCall
Add(x,
y)Debug.Print
"2,
x=“;
x,
"y=";
yEnd
Sub子過程代碼如下。Private
Sub
Add(m,
n)m
=
100:n
=
200m
=
m
+
nn
=
2
*
n
+
mEnd
Sub2.按值傳遞在形參前面加上ByVal關(guān)鍵字時,表示參數(shù)是按
值傳遞方式。按值傳遞方式是一種單向的數(shù)據(jù)傳遞,即調(diào)用時只能由實參將值傳遞給形參,調(diào)用結(jié)束后
不能由形參將操作結(jié)果返回給實參。實參可以是常
量、變量或表達式。例9-14閱讀下面的程序代碼,分析程序的運行結(jié)果。事件過程代碼如下。Sub
Cmd2_Click()Dim
x
As
Integer,
y
As
Integerx
=
10y
=
20Debug.Print
"1,x=";
x,
"y=";
yCall
Add(x,
y)Debug.Print
"2,x=";
x,
"y=";
yEnd
Sub子過程代碼如下。Private
Sub
Add(ByVal
m,
n)m
=
100n
=
200m
=
m
+
nn
=
2
*
n
+
mEnd
Sub9.4.3
變量的作用域和生存期變量的作用域變量可被訪問的范圍稱為變量的作用范圍,也稱為變量的作用域。除了可以使用Dim語句聲明變量外,還可以使用Static、Private或Public語句來聲明變量根據(jù)聲明語句和聲明變量的位置不同,可將變量的作
用域分為3個層次:局部范圍、模塊范圍和全局范圍。變量的生存期變量的生存期是指變量從存在(執(zhí)行變量聲明并分配內(nèi)存單元)到消失的時間段。按生存期,變量可分為動態(tài)變量和靜態(tài)變量。例9-15閱讀下面的程序代碼,分析程序的運行結(jié)果。Private
Sub
Command1_Click()"靜態(tài)變量Static
a
As
Integera
=
a
+
1Debug.Print
aEnd
Sub連續(xù)單擊Command1命令按鈕,輸出1,2,3,4,5,…。這是因為a是靜態(tài)變量,所以a的值是保留的。Private
Sub
Command1_Click()dim
a
As
Integera
=
a
+
1Debug.Print
aEnd
Sub當連續(xù)單擊Command1命令按鈕時,輸出連續(xù)的1。這是因為每次執(zhí)行Command1_Click()時,都是新創(chuàng)建的變量a,變量默認值為0,所以每次結(jié)果均為1。9.5.1
常用的數(shù)據(jù)庫訪問接口技術(shù)直接編程通過數(shù)據(jù)庫本地接口與底層數(shù)據(jù)進行交互是非常困難的,數(shù)據(jù)庫訪問接口技術(shù)可簡化這一過程。數(shù)據(jù)庫訪問接口技術(shù)可以通過編寫相對簡單的程序,來實現(xiàn)非常復雜的任務,并且為不同類別的數(shù)據(jù)庫提供了統(tǒng)一的接口。常用的數(shù)據(jù)庫訪問接口技術(shù)包括ODBC,DAO和ADO等。目前,Microsoft的數(shù)據(jù)庫訪問一般用ADO的方式。9.5
VBA數(shù)據(jù)庫訪問技術(shù)9.5.2
ADO對象模型在ADO
2.1以前,ADO對象模型中有7個對象:Connection,Command,RecordSet,Error,Parameter,F(xiàn)ield,Property,而在ADO
2.5以后新加了兩個對象:Record和Stream。ADO對象模型定義了一個分層的對象集合。9.5.3
利用ADO訪問數(shù)據(jù)庫的基本步驟在VBA中利用ADO訪問數(shù)據(jù)庫的基本步驟為:首先使用Connection對象建立應用程序與數(shù)據(jù)源的連接然后使用Command對象執(zhí)行對數(shù)據(jù)源的操作命令(通
常用SQL命令),接下來使用RecordSet和Field等對象對獲取的數(shù)據(jù)進行查詢或更新操作,最后使用窗體
中的控件向用戶顯示操作的結(jié)果,操作完成后關(guān)閉
連接。1.數(shù)據(jù)庫連接對象(Connection)例9-16建立與Access
2016數(shù)據(jù)庫的連接,包括連接對象的聲明、實例化、連接、關(guān)閉連接和撤銷連接對象。Sub
CreateConnection()Dim
cnn
As
ADODB.Connection
"聲明連接對象Set
cnn=New
ADODB.Connection"實例化對象cnn.Open
"Provider=
Microsoft.Jet.OLEDB.12.0;Persist
SecurityInfo=False;User
ID=Admin;Data
Source=E:\AccessDB\教學管理.accdb;"打開連接cnn.Close"關(guān)閉連接Set
cnn=Nothing"撤銷連接End
Sub連接對象的Close方法不能將對象從內(nèi)存中清除,但將Connection對象設置為Nothing可以從內(nèi)存中清除對象。以上代碼中,打開當前數(shù)據(jù)庫的連接也可以修改為以下代碼。cnn.Open
CurrentProject.Connection2.數(shù)據(jù)集對象(RecordSet)例9-17在“教學管理”數(shù)據(jù)庫中使用RecordSet對象創(chuàng)建“學生”記錄集。Sub
DemoRecordSet()"聲明并實例化RecordSet對象
Dim
rst
As
ADODB.RecordSetSet
rst=New
ADODB.RecordSet"使用RecordSet對象的Open方法打開記錄集rst.Open
"SELECT
*
FROM學生",CurrentProject.Connection"在立即窗口打印記錄集Debug.Print
rst.GetString"關(guān)閉并銷毀變量rstrst.CloseSet
rst=NothingEnd
Sub例9-18在“教學管理”數(shù)據(jù)庫中使用RecordSet和Connection對象一起創(chuàng)建“學生”記錄集,向后移動記錄并計算記錄數(shù)。Sub
DemoRecordSet1()"聲明并實例化Connection對象和RecordSet對象
Dim
cnn
As
ADODB.ConnectionDim
rst
As
ADODB.RecordSetSet
cnn=New
ADODB.ConnectionSet
rst=New
ADODB.RecordSet"將RecordSet連接到當前數(shù)據(jù)庫Set
cnn=
CurrentProject.Connectionrst.ActiveConnection=cnn"使用RecordSet對象的Open方法打開記錄集rst.Open
"SELECT
*
FROM學生""在立即窗口打印第1條記錄的姓名Debug.Print
rst("姓名")"向后移動記錄并打印第2條記錄的姓名rst.MovenextDebug.Print
rst("姓名")"打印記錄總數(shù)Debug.Print
rst.RecordCount"關(guān)閉并銷毀變量rst.Close:cnn.CloseSet
rst=Nothing:Set
cnn=NothingEnd
Sub3.命令對象(Command)例9-19在“教學管理”數(shù)據(jù)庫中,使用Command對象獲取“學生”記錄集。Sub
DemoCommand()"聲明并實例化Command對象和RecordSet對象
Dim
rst
As
ADODB.RecordSetDim
cmd
As
ADODB.Command
Set
rst=New
ADODB.RecordSetSet
cmd=New
ADODB.Command"使用SQL語句設置數(shù)據(jù)源cmd.CommandText="SELECT
*
FROM學生"cmd.ActiveConnection=CurrentProject.Connection"使用Execute方法執(zhí)行SQL語句,返回記錄集Set
rst=cmd.ExecuteDebug.Print
rst.GetStringrst.Close:Set
rst=Nothing:Set
cmd=NothingEnd
Sub4.字段對象(Field)ADO的Field對象包含關(guān)于RecordSet對象中某一
列的信息。
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025新員工入職安全培訓考試試題及下載答案可打印
- 2025年礦用自卸卡車項目可行性研究報告
- 2025年監(jiān)控罩項目可行性研究報告
- 2025年-甘肅省建筑安全員《B證》考試題庫
- 2025年電液比例壓力控制閥項目可行性研究報告
- 呼吸內(nèi)科實習生基礎護理技能培訓計劃
- 老年人營養(yǎng)補充的預防措施
- 2025年高考英語作文旅行經(jīng)歷與創(chuàng)意范文
- 籃球公益活動閉幕式流程
- 職業(yè)道德培訓入團情況證明范文
- 女生青春期教育教學設計
- 主體結(jié)構(gòu)工程施工單選題100道及答案
- 浙江省寧波市2024年中考二模英語試卷(含答案)
- 第19課 資本主義國家的新變化 高一下學期統(tǒng)編版(2019)必修中外歷史綱要下
- 2025數(shù)學步步高大一輪復習講義人教A版復習講義含答案
- GB/T 15597.2-2024塑料聚甲基丙烯酸甲酯(PMMA)模塑和擠出材料第2部分:試樣制備和性能測定
- 金相試題完整版本
- 給水排水(中級職稱)試題
- 銀行業(yè)金融機構(gòu)安全評估標準
- SH/T 3115-2024 石油化工管式爐輕質(zhì)澆注料襯里工程技術(shù)規(guī)范(正式版)
- HCIA H13-111鯤鵬應用開發(fā)考試復習題庫(含答案)
評論
0/150
提交評論