數(shù)據(jù)庫(kù)基礎(chǔ)與應(yīng)用(Access 2016)(第2版)教學(xué)課件第9章 模塊與VBA_第1頁(yè)
數(shù)據(jù)庫(kù)基礎(chǔ)與應(yīng)用(Access 2016)(第2版)教學(xué)課件第9章 模塊與VBA_第2頁(yè)
數(shù)據(jù)庫(kù)基礎(chǔ)與應(yīng)用(Access 2016)(第2版)教學(xué)課件第9章 模塊與VBA_第3頁(yè)
數(shù)據(jù)庫(kù)基礎(chǔ)與應(yīng)用(Access 2016)(第2版)教學(xué)課件第9章 模塊與VBA_第4頁(yè)
數(shù)據(jù)庫(kù)基礎(chǔ)與應(yīng)用(Access 2016)(第2版)教學(xué)課件第9章 模塊與VBA_第5頁(yè)
已閱讀5頁(yè),還剩91頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

本章要點(diǎn)模塊與VBA概述VBA程序的數(shù)據(jù)描述VBA程序的流程控制VBA過程VBA數(shù)據(jù)庫(kù)訪問技術(shù)VBA程序的調(diào)試與錯(cuò)誤處理第9章

模塊與VBA程序設(shè)計(jì)9.1.1

模塊的概念模塊是由VBA通用聲明和一個(gè)或多個(gè)過程組成的單元。組成模塊的基礎(chǔ)是過程,VBA過程通常分為子過程(Sub過程)、函數(shù)過程(Function過程)和屬性過程(Property過程)。每個(gè)過程作為一個(gè)獨(dú)立的程序段,實(shí)現(xiàn)某個(gè)特定的功能。9.1 模塊與VBA概述標(biāo)準(zhǔn)模塊在標(biāo)準(zhǔn)模塊中,放置的是可供整個(gè)數(shù)據(jù)庫(kù)使用的公共過程,這些過程不與任何對(duì)象關(guān)聯(lián)。每個(gè)標(biāo)準(zhǔn)

模塊有唯一的名稱,在導(dǎo)航窗格的“模塊”對(duì)象中,可以查看數(shù)據(jù)庫(kù)中的標(biāo)準(zhǔn)模塊。類模塊類模塊其實(shí)是一個(gè)對(duì)象的定義,它封裝了一些屬性和方法。VBA中類模塊有3種基本類型:窗體模

塊、報(bào)表模塊和自定義類模塊。還有一種自定義類模塊,不與窗體和報(bào)表相關(guān)聯(lián),允許用戶自定義所需的對(duì)象、屬性和方法。9.1.2

VBA的開發(fā)環(huán)境1.VBE的啟動(dòng)單擊“創(chuàng)建”選項(xiàng)卡,再在“宏與代碼”命

令組中單擊“模塊”“類模塊”或“Visual

Basic”命令按鈕,均可以打開VBE窗口。在導(dǎo)航窗格的“模塊”組中雙擊所要顯示的模塊名稱,就會(huì)打開VBE窗口并顯示該模塊的內(nèi)容。在“數(shù)據(jù)庫(kù)工具”選項(xiàng)卡中,單擊“宏”命令組中的“Visual

Basic”命令按鈕,打開VBE窗口。在窗體設(shè)計(jì)視圖或報(bào)表設(shè)計(jì)視圖中,單擊

“窗體設(shè)計(jì)工具/設(shè)計(jì)”選項(xiàng)卡或“報(bào)表設(shè)計(jì)工具/設(shè)計(jì)”選項(xiàng)卡,再在“工具”命令組中單擊“查看代

碼”命令按鈕。在窗體、報(bào)表的設(shè)計(jì)視圖中,右鍵單擊控

件對(duì)象,再在打開的快捷菜單中選擇“事件生成器”命令,打開“選擇生成器”對(duì)話框,選擇其中的“代碼生成器”選項(xiàng),單擊“確定”按鈕。使用Alt+F11組合鍵,可以在Access主窗口和VBE窗口之間進(jìn)行切換。啟動(dòng)VBE后,屏幕出現(xiàn)VBE窗口。2.VBE窗口的組成VBE窗口除主窗口外,主要由工程資源管理器窗口、屬性窗口、代碼窗口和立即窗口等組成,另外還有對(duì)象窗口、對(duì)象瀏覽器、本地窗口和監(jiān)視窗口等,可以通過VBE“視圖”菜單中的相應(yīng)命令來控制這些窗口的顯示。1)VBE主窗口VBE主窗口有菜單欄和工具欄。VBE的菜單欄包括文件、編輯、視圖、插入、調(diào)試、運(yùn)行、工具、外接程序、窗口和幫助10個(gè)菜單項(xiàng),其中包含了各

種操作命令。在默認(rèn)情況下,VBE窗口中顯示的是“標(biāo)準(zhǔn)”工

具欄,其中包括創(chuàng)建模塊時(shí)常用的按鈕。可以通過

選擇“視圖”→“工具欄”命令來顯示其他工具欄。2)工程資源管理器窗口工程資源管理器窗口列出了在應(yīng)用程序中用到的模塊。使用該窗口,可以在數(shù)據(jù)庫(kù)內(nèi)各個(gè)對(duì)象之間快速地瀏覽。各對(duì)象以樹形圖的形式分級(jí)顯示在窗口中,包括Access類對(duì)象、模塊和類模塊。要查看對(duì)象的代碼,只需在該窗口中雙擊對(duì)象即可。要查看對(duì)象的窗體,可以右鍵單擊對(duì)象名,然后在彈出的快捷菜單中選擇“查看對(duì)象”命令。3)屬性窗口屬性窗口列出了所選對(duì)象的各種屬性,可按字母和分類排序來查看屬性。可以直接在屬性窗口中對(duì)這些屬性進(jìn)行編輯,還可以在代碼窗口中用VBA語句設(shè)置對(duì)象的屬性。4)代碼窗口在代碼窗口中可以輸入和編輯VBA代碼??梢?/p>

打開多個(gè)代碼窗口來查看各個(gè)模塊的代碼,而且可以方便地在代碼窗口之間進(jìn)行復(fù)制和粘貼。在代碼窗口的頂部是兩個(gè)下拉列表框,左邊是對(duì)象下拉列表框,右邊是事件下拉列表框。對(duì)象下拉列表框中列出了所有可用的對(duì)象名稱,選擇某一個(gè)對(duì)象后,在事件下拉列表框中將列出該對(duì)象所有的事件。5)立即窗口立即窗口常用于程序在調(diào)試期間輸出中間結(jié)果及幫助用戶在中斷模式下測(cè)試表達(dá)式的值等,也可以在立即窗口中直接輸入VBA命令并按Enter鍵,此

后VBA會(huì)實(shí)時(shí)解釋并執(zhí)行該命令。9.1.3

模塊的創(chuàng)建1.創(chuàng)建模塊的方法在Access

2016中創(chuàng)建一個(gè)窗體或報(bào)表,

Access

2016都會(huì)自動(dòng)創(chuàng)建一個(gè)對(duì)應(yīng)的窗體模塊或報(bào)表模塊。單擊“創(chuàng)建”選項(xiàng)卡,再在“宏與代碼”命令組中單擊“模塊”或“類模塊”命令按鈕,打開

VBE窗口并建立一個(gè)新的模塊。(3)在VBE窗口中,選擇“插入”→“模塊”菜單命令可以創(chuàng)建新的標(biāo)準(zhǔn)模塊;選擇“插入”→“類模塊”菜單命令可以創(chuàng)建新的類模塊。單擊VBE“標(biāo)準(zhǔn)”工具欄中“插入模塊”按鈕右側(cè)的向下箭頭,從下拉列表中選擇“模塊”選項(xiàng)或“類模塊”選項(xiàng)。例9-1在“教學(xué)管理”數(shù)據(jù)庫(kù)中創(chuàng)建一個(gè)標(biāo)準(zhǔn)模塊。打開VBE窗口。在代碼窗口中輸入一個(gè)名為“qq”的子過程,然后在立即窗口中輸入命令“Call

qq()”,或單擊VBE窗口“標(biāo)準(zhǔn)”工具欄中的“運(yùn)行子過程/用戶窗體”命令按鈕,或從“運(yùn)行”菜單中選擇相應(yīng)命令來運(yùn)行該過程,隨后可以看到該過程的運(yùn)行結(jié)果。在VBE窗口中單擊“標(biāo)準(zhǔn)”工具欄中的“保存”按鈕,并輸入模塊名稱將模塊存盤。2.對(duì)象的引用引用對(duì)象屬性的語法格式為對(duì)象名.屬性名在程序代碼中改變屬性的值,其語句格式為對(duì)象名.屬性名=屬性值引用方法的語法格式為對(duì)象名.方法名(參數(shù)1,參數(shù)2,…)當(dāng)引用對(duì)象的多個(gè)屬性時(shí),可使用With…End

With結(jié)構(gòu)。例如,如果要給命令按鈕Cmd1的多個(gè)屬性賦

值,可表示為With

Cmd1.Caption="確定".Height=2000.Width=2000End

WithDoCmd對(duì)象的主要功能是通過調(diào)用包含在內(nèi)部的方法實(shí)現(xiàn)VBA程序設(shè)計(jì)中對(duì)Access的操作。例如,利用DoCmd對(duì)象的OpenReport方法打開“學(xué)生”報(bào)表,語句為DoCmd.OpenReport"學(xué)生"3.編寫對(duì)象響應(yīng)的程序代碼使用宏操作來設(shè)置事件的屬性。在代碼窗口中為某個(gè)事件創(chuàng)建事件過程。例如,命令按鈕Command1的Click事件過程名為“Command1_Click”。該子程序就是處理該事件的程序,稱為事件過程,一般格式為Private

Sub對(duì)象名_事件名([參數(shù)表])……(事件過程代碼)End

Sub例9-2在“教學(xué)管理”數(shù)據(jù)庫(kù)中創(chuàng)建如圖所示的窗體,窗體中包含兩個(gè)文本框和相應(yīng)的標(biāo)簽及兩個(gè)命令按鈕。單擊第1個(gè)命令按鈕時(shí)將第1個(gè)文本框中的內(nèi)容顯示在第2個(gè)文本框中,單擊第2個(gè)命令按鈕時(shí)關(guān)閉該窗體。9.2.1

數(shù)據(jù)類型數(shù)據(jù)類型分為標(biāo)準(zhǔn)數(shù)據(jù)類型和用戶自定義數(shù)據(jù)類型。1.標(biāo)準(zhǔn)數(shù)據(jù)類型VBA支持多種標(biāo)準(zhǔn)數(shù)據(jù)類型。例如,Integer(整

型)、Long(長(zhǎng)整型)、Single(單精度型)、Double(雙精度型)、Currency(貨幣型)、String(字符型)、

Date(日期型)、Boolean(布爾型)、Byte(字節(jié)型)、

Variant(變體型)、Object(對(duì)象)。9.2

VBA程序的數(shù)據(jù)描述2.用戶自定義數(shù)據(jù)類型VBA允許用戶自定義數(shù)據(jù)類型,使用Type語句就可以實(shí)現(xiàn)這個(gè)功能。用戶自定義數(shù)據(jù)類型可包含一個(gè)或多個(gè)某種數(shù)據(jù)類型的數(shù)據(jù)元素。Type語句的語法格式為Type數(shù)據(jù)類型名數(shù)據(jù)元素定義語句End

Type9.2.2

常量與變量1.常量1)直接常量十進(jìn)制整數(shù)由數(shù)字0~9和正、負(fù)號(hào)組成,實(shí)數(shù)可采用小數(shù)表示形式和科學(xué)記數(shù)表示形式。字符串常量是一個(gè)用雙引號(hào)括起來的字符序列。布爾常量有True和False兩個(gè)值。日期常量將日期和時(shí)間的字符用一對(duì)“#”括起來表示。2)符號(hào)常量符號(hào)常量用標(biāo)識(shí)符來表示某個(gè)常量。聲明常量的語句格式為Const常量名[As數(shù)據(jù)類型|類型符]=表達(dá)式[,常量名[As數(shù)據(jù)類型|類型符]=表達(dá)式]在VBA中,標(biāo)識(shí)符的命名必須以字母或漢字開頭,且只能由漢字、字母(a~z或A~Z)、數(shù)字(0~9)或下畫線(_)所組成,其最大長(zhǎng)度為255個(gè)字符。此外,不能使用VBA的關(guān)鍵字作為標(biāo)識(shí)符,標(biāo)識(shí)符不區(qū)分大小寫。3)系統(tǒng)常量系統(tǒng)常量是VBA預(yù)先定義好的常量,用戶可以

直接使用。例如,VBA用vbKeyReturn來表示Enter鍵,它的ASCII碼值是13。2.變量變量可以看做是一個(gè)被命名的內(nèi)存單元,通過變量的名字來訪問相應(yīng)的內(nèi)存單元。1)變量的命名規(guī)則VBA的變量名要遵循標(biāo)識(shí)符的命名規(guī)則,可以

在命名變量時(shí)使用前綴的約定。這樣通過變量名就可以知道變量的數(shù)據(jù)類型。2)變量的聲明聲明變量要使用Dim語句,Dim語句的格式為Dim變量名[As數(shù)據(jù)類型|類型符][,變量名[As數(shù)據(jù)類型|類型符]]3)變量的賦值聲明了變量后,變量就指向了內(nèi)存的某個(gè)單元。在程序的執(zhí)行過程中,可以向這個(gè)內(nèi)存單元寫入數(shù)據(jù),這就是變量的賦值。給變量賦值的語句格式為變量名=表達(dá)式3.?dāng)?shù)組變量數(shù)組是一組具有相同數(shù)據(jù)類型的數(shù)據(jù)所構(gòu)成的集合,而其中單個(gè)的數(shù)據(jù)稱為數(shù)組元素。數(shù)組必須先聲明后使用,數(shù)組聲明即定義數(shù)組名、類型、維數(shù)和各維的大小。定義數(shù)組后,數(shù)組名代表所有數(shù)組元素,而數(shù)組名加下標(biāo)表示一個(gè)數(shù)組元素,也稱為下標(biāo)變量。數(shù)組的聲明方式和其他變量是一樣的,可以使用

Dim語句來聲明,其一般格式為Dim數(shù)組名([下標(biāo)1下界To]下標(biāo)1上界[,[下標(biāo)2下界To]下標(biāo)2上界]…)As數(shù)據(jù)類型下標(biāo)下界的默認(rèn)值為0,在使用數(shù)組時(shí),可以在

模塊的通用聲明部分使用“Option

Base

1”語句來指定數(shù)組下標(biāo)下界從1開始。1)聲明固定大小數(shù)組下面的語句聲明了一個(gè)固定大小數(shù)組。Dim

MyArray(10,10)

As

Integer2)聲明動(dòng)態(tài)數(shù)組可以利用Dim語句來聲明數(shù)組,不給出數(shù)組大小。每當(dāng)需要時(shí),可以使用ReDim語句去更改動(dòng)態(tài)數(shù)組,此時(shí)數(shù)組中存在的值會(huì)丟失。若要保存數(shù)組中原先的值,則可以使用ReDim

Preserve語句來擴(kuò)充數(shù)組。9.2.3

內(nèi)部函數(shù)內(nèi)部函數(shù)是VBA系統(tǒng)為用戶提供的標(biāo)準(zhǔn)過程,能完成許多常見運(yùn)算。根據(jù)內(nèi)部函數(shù)的功能,可將其分為數(shù)學(xué)函數(shù)、字符串函數(shù)、日期或時(shí)間函數(shù)、類型轉(zhuǎn)換函數(shù)和測(cè)試函數(shù)等類型。9.2.4

表達(dá)式1.算術(shù)表達(dá)式用算術(shù)運(yùn)算符將運(yùn)算對(duì)象連接起來的式子叫算術(shù)表達(dá)式。VBA算術(shù)運(yùn)算符:+(加)、-(減)、*(乘)、/(除)、\(整除)、Mod(求余)、^(乘方)。如果表達(dá)式中含有括號(hào),則先計(jì)算括號(hào)內(nèi)表達(dá)式的值,然后嚴(yán)格按照運(yùn)算符的優(yōu)先級(jí)別進(jìn)行運(yùn)算。

乘方運(yùn)算的優(yōu)先級(jí)最高,加、減運(yùn)算的優(yōu)先級(jí)最低。2.關(guān)系表達(dá)式關(guān)系表達(dá)式的結(jié)果是True或FalseVBA中的關(guān)系運(yùn)算符有大于(>)、小于(<)、大于

或等于(>=)、小于或等于(<=)、等于(=)、不等于

(<>)。數(shù)值按大小比較。日期按先后比較,早的日期小于晚的日期。False大于True。

字符串按ASCII碼排序的先后比較,也就是先比較兩個(gè)字符串的第1個(gè)字符,按字符的ASCII碼值比較大小,ASCII碼值大的字符串大,如第1個(gè)字符相等,則比較第2個(gè)字符,直到比較出大小或比較完為止。

漢字字符大于西文字符,漢字的比較是根據(jù)

Unicode碼的大小來比較的。3.邏輯表達(dá)式邏輯表達(dá)式可以表示比較復(fù)雜的比較關(guān)系,結(jié)果是True或False。VBA中的邏輯運(yùn)算符有Not(非)、

And(與)、Or(或)、Xor(異或)例如,用邏輯表達(dá)式描述“1990年出生的男生或

1995年以后出生的女生”,邏輯表達(dá)式如下。Year(出生日期)=1990

And性別="男"Or

Year(出生日期)>1995

And性別="女"4.字符串表達(dá)式字符串表達(dá)式由連接運(yùn)算符將字符串?dāng)?shù)據(jù)連接而成。VBA中的連接運(yùn)算符有“+”和“&”,作用是將兩個(gè)字符串連接起來。當(dāng)兩個(gè)被連接的數(shù)據(jù)都是字符串時(shí),“&”和“+”的作用相同;當(dāng)數(shù)值型和字符型連接時(shí),“&”把數(shù)

據(jù)轉(zhuǎn)化成字符型后再進(jìn)行連接,而此時(shí)用“+”連接則會(huì)出錯(cuò)。9.3.1

順序控制1.程序語句書寫規(guī)則1)注釋語句在VBA程序中,注釋可以通過使用Rem語句或用單引號(hào)“′”來實(shí)現(xiàn)。9.3

VBA程序的流程控制語句連寫和換行在一行中寫幾條語句,這時(shí)語句之間需要用冒號(hào)

“:”來分隔。對(duì)于太長(zhǎng)的語句,可能一行寫不完,可以用空格加下劃線“_”將其截?cái)酁槎嘈?,此為語句的換行。采用縮進(jìn)格式書寫程序采用縮進(jìn)格式可以明確示意出程序中語句的結(jié)構(gòu)層次,可以利用VBE的“編輯”→“縮進(jìn)”或“凸出”菜單命令進(jìn)行設(shè)置。2.輸入輸出

1)InputBox函數(shù)InputBox函數(shù)的作用是顯示一個(gè)輸入對(duì)話框,對(duì)話框中有一些提示信息及文本框,等待用戶輸入信息或單擊按鈕。在按鈕事件發(fā)生后返回文本框的內(nèi)容,返回值的類型為文本類型。InputBox函數(shù)的調(diào)用格式為InputBox(Prompt,[Title],[Default],[XPos],[YPos])2)MsgBox函數(shù)MsgBox函數(shù)的作用是打開一個(gè)對(duì)話框,等待用戶單擊按鈕,并返回一個(gè)整數(shù)告訴用戶單擊了哪一個(gè)按鈕。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("請(qǐng)輸入您的姓名:“,"登錄")MsgBox"歡迎您:"&

str

&"同學(xué)“,vbInformation,"歡迎"End

Sub程序在調(diào)用子過程InputFunc時(shí),彈出輸入對(duì)話框,要求用戶輸入數(shù)據(jù)。輸入并單擊“確定”按鈕后,彈出輸出對(duì)話框。3.賦值語句賦值語句是最簡(jiǎn)單而又最常用的語句。語句格式為變量名=表達(dá)式該語句的功能是計(jì)算右邊表達(dá)式的值,再將其賦值給左邊的變量。例9-4設(shè)備管理部門對(duì)已購(gòu)入的設(shè)備登賬時(shí),為了減少人工輸入,當(dāng)輸入“設(shè)備單價(jià)”和“采購(gòu)數(shù)量”

后,單擊“總金額”文本框,系統(tǒng)就會(huì)自動(dòng)計(jì)算結(jié)果,同時(shí)給出金額累計(jì),程序的運(yùn)行界面如圖所示。1.簡(jiǎn)單分支控制簡(jiǎn)單分支控制結(jié)構(gòu)用If語句實(shí)現(xiàn),其格式為If<條件>Then語句塊1[Else語句塊2]End

If9.3.2

選擇控制例9-5輸入一個(gè)年份,判斷該年是否為閏年。判斷某年是否為閏年的規(guī)則是:如果此年號(hào)能被400整除,則是閏年;如果此年號(hào)能被4整除,但不能被

100整除,則也是閏年。創(chuàng)建一個(gè)數(shù)據(jù)庫(kù),啟動(dòng)VBE,在數(shù)據(jù)庫(kù)中新建一個(gè)標(biāo)準(zhǔn)模塊,程序代碼如下。Sub

Leap()Dim

x

As

Integerx=Val(InputBox("請(qǐng)輸入年份:"))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ù)被更新之前會(huì)發(fā)生BeforeUpdate事件,利用相應(yīng)的事件過程對(duì)“學(xué)生”窗體中“入學(xué)成績(jī)”文本框中輸入的成績(jī)進(jìn)行驗(yàn)證,要求入學(xué)成績(jī)必須在[0,750]范圍內(nèi),否則給出提示。“入學(xué)成績(jī)”文本框控件的BeforeUpdate事件過程代碼如下。Private

Sub入學(xué)成績(jī)_BeforeUpdate(Cancel

As

Integer)If

Me!入學(xué)成績(jī)=""Or

IsNull(Me!入學(xué)成績(jī))ThenMsgBox"入學(xué)成績(jī)不能為空!",vbCritical,"入學(xué)成績(jī)"Cancel=TrueElseIf

Me!入學(xué)成績(jī)>750

Or

Me!入學(xué)成績(jī)<0

ThenMsgBox"入學(xué)成績(jī)必須在[0,750]范圍內(nèi)!",vbCritical,"入學(xué)成績(jī)"Cancel=TrueElseMsgBox"入學(xué)成績(jī)輸入正確!",vbInformation,"入學(xué)成績(jī)"End

IfEnd

Sub2)Select

Case結(jié)構(gòu)

Select

Case結(jié)構(gòu)的格式為

Select

Case表達(dá)式Case表達(dá)式列表1語句塊1[Case表達(dá)式列表2語句塊2]……[Case表達(dá)式列表n語句塊n][Case

Else語句塊n]End

Select說明:(1)“表達(dá)式”可以是數(shù)值表達(dá)式或字符串表達(dá)式。(2)表達(dá)式列表可以有如下3種格式。值1[,值2]……。值1

To值2。Is關(guān)系運(yùn)算符值1[,值2]……。例9-7給學(xué)生的成績(jī)?cè)u(píng)級(jí),成績(jī)大于等于90分為

“優(yōu)”,大于等于80分且小于90分為“良”,大于等于70分且小于80分為“中”,大于等于60分且小于

70分為“及格”,小于60分的為“不及格”。程序片段如下。Dim

score

As

Integerscore=InputBox("請(qǐng)輸入score的值:")Select

Case

scoreCase

Is

>=

90MsgBox"優(yōu)"Case

Is>=80MsgBox"良"Case

Is>=70MsgBox"中"Case

Is>=60MsgBox"及格"Case

ElseMsgBox"不及格"End

Select3.具有選擇功能的函數(shù)VBA提供了3個(gè)具有選擇功能的函數(shù),分別為IIf函數(shù)、Switch函數(shù)和Choose函數(shù)。IIf(條件式,表達(dá)式1,表達(dá)式2)Switch(條件式1,表達(dá)式1,條件式2,表達(dá)式2,…,條件式n,達(dá)式n)Choose(索引式,選項(xiàng)1,選項(xiàng)2,…,選項(xiàng)n)For循環(huán)變量=初值To終值[Step步長(zhǎng)]循環(huán)體Next循環(huán)變量其中,“循環(huán)變量”為數(shù)值型變量,用于統(tǒng)計(jì)循環(huán)次數(shù),此變量可以從初值變化到終值,每次變化的差值由“步長(zhǎng)”決定。如果“步長(zhǎng)”為1,“Step1”可以省略?!把h(huán)體”是在循環(huán)過程中被重復(fù)執(zhí)行的語句組。9.3.3

循環(huán)控制1.用For語句實(shí)現(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語句實(shí)現(xiàn)循環(huán)Do語句根據(jù)某個(gè)條件是否成立來決定能否執(zhí)行相應(yīng)的循環(huán)體部分,它有以下幾種格式。1)Do

While…Loop語句語句格式為Do

While條件表達(dá)式循環(huán)體Loop語句執(zhí)行時(shí),若“條件表達(dá)式”的值為真,則執(zhí)行Do

While和Loop之間的“循環(huán)體”,直到“條件表達(dá)式”的值為假才結(jié)束循環(huán)。2)DoUntil…Loop語句語句格式為Do

Until條件表達(dá)式循環(huán)體Loop語句執(zhí)行時(shí),若“條件表達(dá)式”的值為假,則執(zhí)行Do

Until和Loop之間的“循環(huán)體”,直到“條件表達(dá)式”的值為真才結(jié)束循環(huán)。3)Do…LoopWhile語句語句格式為Do循環(huán)體Loop

While條件表達(dá)式語句執(zhí)行時(shí),首先執(zhí)行一次“循環(huán)體”,執(zhí)行到

Loop

While時(shí)判斷“條件表達(dá)式”的值,如果為真,繼續(xù)執(zhí)行Do和Loop

While之間的“循環(huán)體”,否則,結(jié)束循環(huán)。4)Do…Loop

Until語句語句格式為Do循環(huán)體Loop

Until條件表達(dá)式語句執(zhí)行時(shí),首先執(zhí)行一次“循環(huán)體”,執(zhí)行到

Loop

Until時(shí)判斷“條件表達(dá)式”的值,如果為假,繼續(xù)執(zhí)行Do和Loop

Until之間的“循環(huán)體”,否則,結(jié)束循環(huán)。例9-9假設(shè)我國(guó)現(xiàn)在的人口為13億,若年增長(zhǎng)率為r=1.5%,試計(jì)算多少年后我國(guó)人口增加到20億。人口計(jì)算公式為“p=p0

(1+r)n”,其中p0為人口初始值,r為增長(zhǎng)率,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

&"年后,我國(guó)人口將達(dá)到"&

p

&"億"3.For

Each…Next語句For

Each…Next語句是對(duì)于數(shù)組中的每個(gè)元素或?qū)ο蠹现械拿恳豁?xiàng)重復(fù)執(zhí)行一組語句,其語法格式如下:For

Each元素名In名稱循環(huán)體Next[元素名]其中,元素名是用來枚舉數(shù)組元素或集合中所有成員的變量。對(duì)于數(shù)組,元素名只能是Variant變量。對(duì)于集合,元素名可能是Variant變量、Object變量等。名稱是指數(shù)組或?qū)ο蠹系拿Q。例9-10計(jì)算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ù)組元素,實(shí)現(xiàn)累加result=result+xNext

xDebug.Print

"1!+2!+3+……+10!="

&

resultEnd

Sub的值。GoTo控制語句GoTo語句無條件地轉(zhuǎn)移到過程中指定的行,其語法格式如下:GoTo行號(hào)Exit語句Exit語句用于退出Do循環(huán)、For循環(huán)、Function過程、Sub過程或Property過程代碼塊,相應(yīng)地它包括

Exit

Do、Exit

For、Exit

Function、Exit

Sub和ExitProperty幾個(gè)語句。9.3.4

輔助控制下面示例代碼使用Exit語句退出Do循環(huán)、For循環(huán)及Sub子過程。Sub

ExitDemo()Dim

i,

RndNumDo

"建立循環(huán),這是一個(gè)無止境的循環(huán)For

i

=

1

To

1000

"循環(huán)1000次RndNum=Int(Rnd

*

1000)"生成一個(gè)隨機(jī)數(shù)"檢查隨機(jī)數(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的工程資源管理器窗口中,雙擊需要?jiǎng)?chuàng)建的過程窗體模塊或報(bào)表模塊或標(biāo)準(zhǔn)模塊,然后選擇“插入”→“過程”命令,打開“添加過程”對(duì)話框,然后根據(jù)需要設(shè)置參數(shù)。直接在窗體模塊、報(bào)表模塊或標(biāo)準(zhǔn)模塊的代碼窗口中,輸入“Sub子過程名”,然后按Enter鍵,自動(dòng)生成過程的起始語句和結(jié)束語句。3)子過程的調(diào)用子過程的調(diào)用有兩種方式,一種是利用Call語句,另一種方法是把過程名作為一個(gè)語句來直接調(diào)用。利用Call語句調(diào)用子過程的語法格式如下:Call過程名([實(shí)際參數(shù)列表])利用過程名作為語句的子過程調(diào)用方法如下:過程名[實(shí)際參數(shù)列表]實(shí)際參數(shù)列表簡(jiǎn)稱為實(shí)參,它與形式參數(shù)的個(gè)數(shù)、位置和類型必須一一對(duì)應(yīng),調(diào)用時(shí)把實(shí)參的值傳遞

給形參。程序如下: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編寫一個(gè)求n!的子程序,然后調(diào)用它計(jì)算的值。2.函數(shù)過程1)函數(shù)過程的聲明函數(shù)過程的聲明格式如下:Function函數(shù)過程名([形式參數(shù)列表])[As數(shù)據(jù)類型][局部常量或變量的定義][語句序列][Exit

Function][語句序列]函數(shù)名=表達(dá)式End

Function2)函數(shù)過程的調(diào)用與子過程的調(diào)用方法不同,函數(shù)不能作為單獨(dú)的語句加以調(diào)用,而是作為一個(gè)運(yùn)算量出現(xiàn)在表達(dá)式中。調(diào)用函數(shù)過程的方法和調(diào)用VBA內(nèi)部函數(shù)的方法一樣,調(diào)用格式如下:函數(shù)過程名([實(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

編寫一個(gè)求n!的函數(shù),然后調(diào)用它計(jì)算的值。3.屬性過程屬性過程是一系列由Property和End

Property語句所包含起來的VBA語句,也叫Property過程,可以用屬性過程為窗體、報(bào)表和類模塊增加自定義屬性。聲明屬性過程的語法格式為:Property

Get|Let|Set屬性名[(形式參數(shù))][As數(shù)據(jù)類型[語句序列]End

PropertyProperty過程包括3種類型:Let類型用來設(shè)置屬性值,Get類型用來返回屬性值,Set類型用來設(shè)置對(duì)對(duì)象的引用。Property過程通常是成對(duì)使用的:Property

Let與Property

Get一組,而Property

Set與Property

Get一組,這樣聲明的屬性既可讀也可寫。單獨(dú)聲明一個(gè)Property

Get過程是只讀屬性。9.4.2

過程參數(shù)傳遞1.引用傳遞在形參前面加上ByRef關(guān)鍵字或省略不寫,表示參數(shù)傳遞是引用傳遞方式。引用傳遞方式是過程默認(rèn)的參數(shù)傳遞方式。引用傳遞方式是將實(shí)參的地址傳遞給形參,也就是實(shí)參和形參共用同一個(gè)內(nèi)存單元,是一種雙向的數(shù)據(jù)傳遞,即調(diào)用時(shí)實(shí)參將值傳遞給形參,調(diào)用結(jié)束后由形參將操作結(jié)果返回給實(shí)參。引用傳遞的實(shí)參只能是變量,不能是常量或表達(dá)式。例9-13閱讀下面的程序,分析程序的運(yùn)行結(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ù)是按

值傳遞方式。按值傳遞方式是一種單向的數(shù)據(jù)傳遞,即調(diào)用時(shí)只能由實(shí)參將值傳遞給形參,調(diào)用結(jié)束后

不能由形參將操作結(jié)果返回給實(shí)參。實(shí)參可以是常

量、變量或表達(dá)式。例9-14閱讀下面的程序代碼,分析程序的運(yùn)行結(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個(gè)層次:局部范圍、模塊范圍和全局范圍。變量的生存期變量的生存期是指變量從存在(執(zhí)行變量聲明并分配內(nèi)存單元)到消失的時(shí)間段。按生存期,變量可分為動(dòng)態(tài)變量和靜態(tài)變量。例9-15閱讀下面的程序代碼,分析程序的運(yùn)行結(jié)果。Private

Sub

Command1_Click()"靜態(tài)變量Static

a

As

Integera

=

a

+

1Debug.Print

aEnd

Sub連續(xù)單擊Command1命令按鈕,輸出1,2,3,4,5,…。這是因?yàn)閍是靜態(tài)變量,所以a的值是保留的。Private

Sub

Command1_Click()dim

a

As

Integera

=

a

+

1Debug.Print

aEnd

Sub當(dāng)連續(xù)單擊Command1命令按鈕時(shí),輸出連續(xù)的1。這是因?yàn)槊看螆?zhí)行Command1_Click()時(shí),都是新創(chuàng)建的變量a,變量默認(rèn)值為0,所以每次結(jié)果均為1。9.5.1

常用的數(shù)據(jù)庫(kù)訪問接口技術(shù)直接編程通過數(shù)據(jù)庫(kù)本地接口與底層數(shù)據(jù)進(jìn)行交互是非常困難的,數(shù)據(jù)庫(kù)訪問接口技術(shù)可簡(jiǎn)化這一過程。數(shù)據(jù)庫(kù)訪問接口技術(shù)可以通過編寫相對(duì)簡(jiǎn)單的程序,來實(shí)現(xiàn)非常復(fù)雜的任務(wù),并且為不同類別的數(shù)據(jù)庫(kù)提供了統(tǒng)一的接口。常用的數(shù)據(jù)庫(kù)訪問接口技術(shù)包括ODBC,DAO和ADO等。目前,Microsoft的數(shù)據(jù)庫(kù)訪問一般用ADO的方式。9.5

VBA數(shù)據(jù)庫(kù)訪問技術(shù)9.5.2

ADO對(duì)象模型在ADO

2.1以前,ADO對(duì)象模型中有7個(gè)對(duì)象:Connection,Command,RecordSet,Error,Parameter,F(xiàn)ield,Property,而在ADO

2.5以后新加了兩個(gè)對(duì)象:Record和Stream。ADO對(duì)象模型定義了一個(gè)分層的對(duì)象集合。9.5.3

利用ADO訪問數(shù)據(jù)庫(kù)的基本步驟在VBA中利用ADO訪問數(shù)據(jù)庫(kù)的基本步驟為:首先使用Connection對(duì)象建立應(yīng)用程序與數(shù)據(jù)源的連接然后使用Command對(duì)象執(zhí)行對(duì)數(shù)據(jù)源的操作命令(通

常用SQL命令),接下來使用RecordSet和Field等對(duì)象對(duì)獲取的數(shù)據(jù)進(jìn)行查詢或更新操作,最后使用窗體

中的控件向用戶顯示操作的結(jié)果,操作完成后關(guān)閉

連接。1.?dāng)?shù)據(jù)庫(kù)連接對(duì)象(Connection)例9-16建立與Access

2016數(shù)據(jù)庫(kù)的連接,包括連接對(duì)象的聲明、實(shí)例化、連接、關(guān)閉連接和撤銷連接對(duì)象。Sub

CreateConnection()Dim

cnn

As

ADODB.Connection

"聲明連接對(duì)象Set

cnn=New

ADODB.Connection"實(shí)例化對(duì)象cnn.Open

"Provider=

Microsoft.Jet.OLEDB.12.0;Persist

SecurityInfo=False;User

ID=Admin;Data

Source=E:\AccessDB\教學(xué)管理.accdb;"打開連接cnn.Close"關(guān)閉連接Set

cnn=Nothing"撤銷連接End

Sub連接對(duì)象的Close方法不能將對(duì)象從內(nèi)存中清除,但將Connection對(duì)象設(shè)置為Nothing可以從內(nèi)存中清除對(duì)象。以上代碼中,打開當(dāng)前數(shù)據(jù)庫(kù)的連接也可以修改為以下代碼。cnn.Open

CurrentProject.Connection2.?dāng)?shù)據(jù)集對(duì)象(RecordSet)例9-17在“教學(xué)管理”數(shù)據(jù)庫(kù)中使用RecordSet對(duì)象創(chuàng)建“學(xué)生”記錄集。Sub

DemoRecordSet()"聲明并實(shí)例化RecordSet對(duì)象

Dim

rst

As

ADODB.RecordSetSet

rst=New

ADODB.RecordSet"使用RecordSet對(duì)象的Open方法打開記錄集rst.Open

"SELECT

*

FROM學(xué)生",CurrentProject.Connection"在立即窗口打印記錄集Debug.Print

rst.GetString"關(guān)閉并銷毀變量rstrst.CloseSet

rst=NothingEnd

Sub例9-18在“教學(xué)管理”數(shù)據(jù)庫(kù)中使用RecordSet和Connection對(duì)象一起創(chuàng)建“學(xué)生”記錄集,向后移動(dòng)記錄并計(jì)算記錄數(shù)。Sub

DemoRecordSet1()"聲明并實(shí)例化Connection對(duì)象和RecordSet對(duì)象

Dim

cnn

As

ADODB.ConnectionDim

rst

As

ADODB.RecordSetSet

cnn=New

ADODB.ConnectionSet

rst=New

ADODB.RecordSet"將RecordSet連接到當(dāng)前數(shù)據(jù)庫(kù)Set

cnn=

CurrentProject.Connectionrst.ActiveConnection=cnn"使用RecordSet對(duì)象的Open方法打開記錄集rst.Open

"SELECT

*

FROM學(xué)生""在立即窗口打印第1條記錄的姓名Debug.Print

rst("姓名")"向后移動(dòng)記錄并打印第2條記錄的姓名rst.MovenextDebug.Print

rst("姓名")"打印記錄總數(shù)Debug.Print

rst.RecordCount"關(guān)閉并銷毀變量rst.Close:cnn.CloseSet

rst=Nothing:Set

cnn=NothingEnd

Sub3.命令對(duì)象(Command)例9-19在“教學(xué)管理”數(shù)據(jù)庫(kù)中,使用Command對(duì)象獲取“學(xué)生”記錄集。Sub

DemoCommand()"聲明并實(shí)例化Command對(duì)象和RecordSet對(duì)象

Dim

rst

As

ADODB.RecordSetDim

cmd

As

ADODB.Command

Set

rst=New

ADODB.RecordSetSet

cmd=New

ADODB.Command"使用SQL語句設(shè)置數(shù)據(jù)源cmd.CommandText="SELECT

*

FROM學(xué)生"cmd.ActiveConnection=CurrentProject.Connection"使用Execute方法執(zhí)行SQL語句,返回記錄集Set

rst=cmd.ExecuteDebug.Print

rst.GetStringrst.Close:Set

rst=Nothing:Set

cmd=NothingEnd

Sub4.字段對(duì)象(Field)ADO的Field對(duì)象包含關(guān)于RecordSet對(duì)象中某一

列的信息。

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論