模塊與VBA編程基礎(chǔ)
《模塊與VBA編程基礎(chǔ)》由會員分享,可在線閱讀,更多相關(guān)《模塊與VBA編程基礎(chǔ)(93頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、第8章 模塊與VBA編程基礎(chǔ) 模塊的基本概念 8.1創(chuàng)建模塊8.2 VBA程序設計基礎(chǔ)8.3 VBA流程控制語句8.4 過程調(diào)用和參數(shù)傳遞8.5 VBA程序的調(diào)試8.7 VBA程序運行錯誤處理8.6 8.1 模塊的基本概念模塊是Access中一個重要的數(shù)據(jù)庫對象,模塊中可包含一個或多個過程。過程是由一系列VBA代碼組成的。它包含許多VBA語句和方法,以執(zhí)行特定的操作或計算數(shù)值。簡而言之,模塊是裝著VBA代碼的容器。特點:l模塊比宏的功能更強大,運行速度更快,能直接運行Windows的其他程序。 l使用模塊可以建立用戶自己的函數(shù),完成復雜的計算、執(zhí)行宏所不能完成的任務。l使用模塊可以開發(fā)十分復雜
2、的應用程序,使數(shù)據(jù)庫系統(tǒng)功能更加完善。 Access中,模塊分為類模塊和標準模塊兩種。 8.1.1 標準模塊標準模塊一般用于存放供其他Access數(shù)據(jù)庫對象使用的公共過程。標準模塊通常安排一些公共變量或過程供類模塊里的過程調(diào)用。在標準模塊內(nèi)部也可以定義私有變量和私有過程僅供本模塊內(nèi)部使用特點:標準模塊中的公共變量和公共過程具有全局特性,其作用在整個應用程序里,生命周期是伴隨著應用程序的運行而開始、關(guān)閉而結(jié)束。創(chuàng)建方法:選擇模塊對象,然后單擊新建按鈕或插入菜單選擇模塊。 8.1.2 類模塊類模塊是以類的形式封裝的模塊,是面向?qū)ο缶幊痰膯挝?。類模塊按照形式不同分為兩大類:l系統(tǒng)對象類模塊l用戶定義
3、類模塊 系統(tǒng)對象類模塊窗體和報表都可以含有自己的事件代碼和處理模塊,這些模塊屬于系統(tǒng)對象類模塊。進入相應的模塊代碼設計區(qū)域的方法:一單擊“代碼”按鈕;二是單擊事件過程。特點:類模塊具有局部特性,其作用范圍局限在所屬窗體或報表內(nèi)部,而生命周期則是伴隨著窗體或報表的打開而開始、關(guān)閉而結(jié)束。 用戶定義類模塊創(chuàng)建方法:在模塊對象下:單擊”插入”|“類模塊” 8.2 創(chuàng)建模塊創(chuàng)建模塊就是創(chuàng)建過程過程是模塊的單元組成,由VBA代碼編寫而成。過程是一段可以實現(xiàn)某個具體功能的代碼過程分為兩類:Sub子過程和Function函數(shù)過程。一、在模塊中加入過程:創(chuàng)建方法:打開窗體或報表的事件過程進入選中單擊模塊對象,
4、單擊“新建”一個模塊包含一個聲明區(qū)域,且可以包含一個或多個子過程或函數(shù)過程。 1、Sub過程(子過程)無返回值。定義格式:Sub 過程名 程序代碼 End Sub過程的調(diào)用:Call 過程名Sub jc()Dim str1, str2, str3str1 = beijing : Rem 給變量str1賦值str2 = shanghai 給變量str2賦值str3 = str1 + str2Debug.Print str3End Sub Debug.Print在立即 窗口中顯示結(jié)果: Rem Dim定義變量立即窗口的顯示:視圖|立即窗口 Public Sub name Private Sub n
5、ame Public 表示 Sub 過程可被所有 Script 中的所有其他過程訪問。 Private 表示 Sub 過程只可被聲明該過程的 Script 中的其他過程訪問。 Name Sub 的名稱,遵循標準變量命名約定。 Integer-數(shù)據(jù)類型Integer 字節(jié)或者整數(shù) 。如果知道變量總是存放整數(shù),則應該將其申明為Interger類型或Long 類型。整數(shù)的運算速度快,而且占用的內(nèi)存少。 Dim (定義變量) 方法為:Dim 變量 As 變量類型 2、Function過程(又稱函數(shù))有返回值定義格式:Function 過程名 AS(返回值)類型 程序代碼 END Function調(diào)用:
6、直接用函數(shù)名調(diào)用過程test的定義如下:Sub test() Dim n As Integer, k As Long n = InputBox(n=) Debug.Print jc(n) k = jc(n) + jc(n+2) 調(diào)用函數(shù)jc Debug.Print “n!+(n+2)!=; kEnd Sub函數(shù)jc的定義如下:Function jc(n As Integer) As Long 函數(shù)的返回值為Long型 Dim i As Integer, s As Long s = 1 For i = 1 To n s = s * i Next i jc = s 給函數(shù)賦值End Functio
7、n 二、在模塊中執(zhí)行宏在模塊的過程定義中,使用Docmd對象的RunMacro方法可以執(zhí)行設計好的宏調(diào)用格式:Docmd. RunMacro 宏名,宏的運行次數(shù),數(shù)值表達式注意:宏名用雙引號引起來 8.3 VBA程序設計基礎(chǔ)VBA是Microsoft Office內(nèi)置的編程語言,其語法與VB語言兼容。不是一個獨立的開發(fā)工具,一般被嵌入到像Word、Excel、Access這樣的宿主軟件中,與其配套使用VBA采用了面向?qū)ο蟮某绦蛟O計方法。 8.3.1、程序語句書寫原則1、語句書寫規(guī)則通常一個語句寫在一行,語句較長一行寫不下時,可以用續(xù)行符(_)將語句連續(xù)寫在下一行可以使用冒號將幾個語句分隔寫在一
8、行中 例如模塊2當輸入一行語句并按下回車鍵后,代碼以紅色文本顯示表明該語句存在錯誤2、注釋語句兩種方式::Rem 注釋語句注釋語句注釋默認以綠色文本顯示。還可以利用“編輯”工具欄中的“設置注釋塊”按鈕和“解除注釋塊”按鈕對大塊代碼進行注釋或解除注 釋 例題:定義變量,賦值并添加注釋 Sub ab() Dim str1, str2 str1 = “shanghai“ : Rem 為變量str1賦值 str2 = shi bo hui 為變量str2賦值 Debug.Print str1 + str2 End Sub3、采用縮進格式書寫程序顯示出流程中的結(jié)構(gòu) 也可以利用編輯縮進或凸出 1對象和集合
9、對象:在采用面向?qū)ο蟪绦蛟O計方法的程序中,程序處理的目標被抽象成了一個個對象,每個對象具有各自的屬性、方法和事件。一個對象就是一個實體。對象的方法就是對象的可以執(zhí)行的行為,一個對象都有多種方法。對象集合:Access數(shù)據(jù)庫窗口左側(cè)的7類對象列表形成對象類。7類對象。 集合表示的是某類對象所包含的實例構(gòu)成 Access中除了數(shù)據(jù)庫的7類個對象外,還提供一個重要的對象:DoCmd。主要功能是通過調(diào)用包含在內(nèi)部的方法實現(xiàn)VBA編輯中對Access的操作。 屬性和方法描述了對象的性質(zhì)和行為格式:對象.屬性或?qū)ο?行為屬性:用來表示對象的狀態(tài),如窗體的Name(名稱)屬性、Caption(標題)屬性等。
10、 如:Label1.caption方法:用來描述對象的行為,如窗體有Refresh方法,例如,利用Docmd對象的方法可以打開報表“教師信息”,其格式為: Docmd.OpenReport “教師信息” Debug對象有Print方法等。 Debug對象:該對象可在調(diào)試階段用Print方法在立即窗口輸出信息 Debug.print2屬性和方法 3事件和事件過程 事件:是對象可以識別的動作,通常由系統(tǒng)預先定義(附錄E列出了Access數(shù)據(jù)庫對象的事件)事件過程:對象在識別了所發(fā)生的事件后執(zhí)行的程序例如,下面的事件過程描述了單擊按鈕之后所發(fā)生的一系列動作。Private Sub Command1_
11、Click() Command1.Caption = 首都經(jīng)濟貿(mào)易大學End Sub 8.3.3 數(shù)據(jù)類型和數(shù)據(jù)庫對象Access數(shù)據(jù)庫系統(tǒng)創(chuàng)建表對象時所涉及的字段數(shù)據(jù)類型(除了OLE對象和備注數(shù)據(jù)類型外),在VBA中都有數(shù)據(jù)類型相對應一、標準數(shù)據(jù)類型定義數(shù)據(jù)類型時,也可以用符號定義Dim a as single dim a!1、布爾型數(shù)據(jù):兩個值True和False。True=-1 False=02、日期型數(shù)據(jù):前后必須用#號,如#2012/11/233、變體類型數(shù)據(jù):除定長字符串類型及用戶自定義類型外,包含其他任何類型數(shù)據(jù)。VBA中規(guī)定,程序中如果沒有顯式聲明或使用符號來定義變量的數(shù)據(jù)類型
12、,則默認為變體類型 數(shù)據(jù)類型類型標識符號取值范圍整數(shù)Integer % -32,768 32,767長整數(shù)Long & -2,147,483,648 2,147,483,647單精度數(shù)Single !雙精度數(shù)Double #貨幣Currency 字符串String $ 065500字符布爾型Boolean True 或False日期型Date 100年1月1日9999年12月31日變體類型Variant無 二、用戶自定義的數(shù)據(jù)類型在應用過程中利用VBA標準數(shù)據(jù)類型自己定義需要的多種數(shù)據(jù)類型格式:Type 數(shù)據(jù)類型名 As As End Type例:定義一個學生信息數(shù)據(jù)類型Type NewStu
13、denttxtNo As String*7 學號,7位定長字符串txtName As string 姓名,變長字符串txtSex As String*1 性別,1位定長字符串txtAge As Integer 年齡,整型 End Type 當需要建立一個變量用來保存包含不同數(shù)據(jù)類型字段的數(shù)據(jù)表的一條或多條記錄時,用戶自定義數(shù)據(jù)類型就特別有用。一般用戶自定義數(shù)據(jù)類型使用時,首先要在模塊區(qū)域中定義用戶數(shù)據(jù)類型,然后顯式以Dim,Public或Static關(guān)鍵字來定義此用戶類型變量 用戶定義類型變量的取值:變量名.分量名例:Dim NewStud as NewStudent NewStud.txtn
14、o=“980306” NewStud.txtName=“馮偉” NewStud.txtSex=“女” NewStud.txtAge=20也可以使用With關(guān)鍵字簡化一下程序中的重復部分。Dim NewStud as NewStudentWith NewStud .txtno=“980306” .txtName=“馮偉” .txtSex=“女” .txtAge=20End With 三、數(shù)據(jù)庫對象(略)8.3.4變量與常量變量是指程序運行時值會發(fā)生變化的數(shù)據(jù)。程序運行時,變量代表的就是內(nèi)存中的某塊臨時存儲空間 1、變量的命名規(guī)則(1)以字母或漢字開頭,后可跟字母、數(shù)字或下劃線。(2)變量名最長為
15、255個字符。(3)不區(qū)分變量名的大小寫(4)不能包含空格2、常量是指在程序中可以直接引用的實際值,其值在程序運行中不變。VBA中有三種常量:直接常量、符號常量、系統(tǒng)常量。 一變量的聲明變 量 聲 明 就 是 定 義 變 量 名 稱 及 類 型 , 使 系 統(tǒng) 為 變 量分 配 存 儲 空 間 。 一 般 , 變 量 在 使 用 前 應 該 先 聲 明 。VBA聲 明 變 量 有 兩 種 方 法 :顯式聲明 隱含聲明u顯式聲明:格式為 Dim 變量名 AS 數(shù)據(jù)類型(或者字符)例如 Dim ab As integer , sum As single或 Dim ab%, sum!u隱含聲明沒有直
16、接定義而通過一個值指定給變量名,或dim定義中省略了AS 數(shù)據(jù)類型,或在變量名稱后沒有附加類型說明字符來指明隱含變量的數(shù)據(jù)類型時,默認為Variant數(shù)據(jù)類型。例如:Dim m,n m,n為變體變量 ab=123 ab為變體變量,值是123 建 議 在 程 序 中 顯 式 聲 明 變 量 二、強制聲明在默認情況下,VBA允許在代碼中使用未聲明的變量,如果在模塊設計窗口的頂部“通用-聲明”區(qū)域中,加入語句:Option Explicit強制要求所有變量必須定義才能使用。這種方法只為當前模塊設置了自動變量聲明功能。 如果想為所有模塊都啟用此功能,“工具”菜單“選項”對話框,在“編輯器”選項卡中選中
17、“要求變量聲明”選項即可。 三、變量的作用域VBA編程中,變量定義的位置和方式不同,則它存在的時間和起作用的范圍也有所不同。這就是變量的生命周期和作用域。VBA中變量的作用域有3個層次:1、局部范圍:變量定義在模塊的過程內(nèi)部在子過程或函數(shù)內(nèi)部使用Dim、 Static(靜態(tài))As關(guān)鍵字說明的變量就是局部范圍的。2、模塊范圍:變量定義在模塊的所有過程之外的起始位置在模塊的通用說明區(qū),用Dim 、Static、private(私有)As關(guān)鍵自定義的變量作用域都是模塊范圍。3、全局范圍:定義在標準模塊的所有過程之外的起始位置,作用范圍所有類模塊和標準模塊的所有子過程與函數(shù)過程。 在標準模塊的變量定義
18、區(qū)域,用PublicAs關(guān)鍵字說明 四、數(shù)據(jù)庫對象變量Access建立的數(shù)據(jù)庫對象及其屬性均可被看成是VBA程序代碼中的變量及其指定的值來加以引用。引用格式:Forms!窗體名稱!控件名稱.屬性名稱或Reports!報表名稱!控件名稱.屬性名稱如果對象名稱中含有空格或標點符號,就要用方括號把名稱括起來。例如:forms!系統(tǒng)登錄!用戶名=“cueb” forms!系統(tǒng)登錄!用 戶名=“cueb”此外還可以用Set關(guān)鍵字來建立控件對象的變量。當需要多次引用對象時,這種方法很方便。例如:Dim txtName as control 定義控件類型變量Set txtname= Forms!窗體名稱!控
19、件名稱.屬性名稱 txtName=“馮偉” 五、數(shù)組問題:求10個成績的平均值,并對它們按照從大到小排序,這10個數(shù)怎么組織?如果在程序中要對一組數(shù)據(jù)進行處理,通常的解決方法是將這組數(shù)放在數(shù)組中。 放在10個變量中?放在一個數(shù)組中? 數(shù)組是一組相同數(shù)據(jù)類型的數(shù)據(jù)的集合 1一維數(shù)組的定義 使用數(shù)組必須先定義數(shù)組,格式為Dim 數(shù)組名(to)As 例如,dim score(1 to 10)as Integer定義了一個有10個元素的整型數(shù)組,所有數(shù)組元素具有同一個標識即數(shù)組名,數(shù)組名后括號內(nèi)的序號稱為數(shù)組元素的下標。(1)所有數(shù)組元素在內(nèi)存連續(xù)存放(2)根據(jù)下標區(qū)分數(shù)組元素 Score(1) sc
20、ore(2)score(3) score(9)Score(10) 關(guān)于數(shù)組的定義,還有下面的說明。(1)定義數(shù)組時數(shù)組名的命名規(guī)則與變量名的命名規(guī)則相同(2)一般在定義數(shù)組時應給出數(shù)組下標的上限和下限。但也可以省略下限,缺省為0。例如,Dim a(10) As Single默認情況下,數(shù)組a由11個元素組成。若希望下標從1開始,可在模塊的通用聲明段使用Option Base語句聲明。其使用格式為 Option Base 1 (3)和不能使用變量,必須是常量,常量可以是字面常量或符號常量,一般是整型常量。(4)如果省略As子句,則數(shù)組的類型為Varient變體類型。 2二維數(shù)組的定義 格式為Di
21、m 數(shù)組名(to,to)As 例如,Dim c(1 To 3, 1 To 4)As Singlec(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) 3、動態(tài)數(shù)組當預先不知道數(shù)組定義需要多少元素時,可以把數(shù)組定義為動態(tài)數(shù)組定義和使用方法:先用dim顯式定義數(shù)組但不指明數(shù)組元素數(shù)目,然后用Redim關(guān)鍵字來決定數(shù)組中包含的元素數(shù)。例:dim newarray() as long Redim newarray(9,9,9) 六、變量標識符命名法則對于控件對象定義變量時,可以用小寫字母作為變量名的前綴。例如
22、:文本框用txt,定義一個文本框變量名為txtName表8.4例出了最常用變量標識符的前綴。為了易于記憶變量名 p212 七、符號常量(固定不變的值)如果程序中多處用到某個常量,將其定義成符號常量可增加代碼的可讀性,也便于維護。 用關(guān)鍵字Const定義符號常量:格式:Const 符號常量名稱=常量值 Const PI =3.1415926符號常量一般需要大寫,以便與變量區(qū)分在定義符號常量時,如果前面加上Global或Public關(guān)鍵字,這一符號常量會涵蓋全局或模塊級別范圍。例如:Global Const PI=3.1415926 八、系統(tǒng)常量True False Yes No On Off N
23、ull等單擊“視圖”菜單選擇“對象瀏覽器”就可以查看Access、VBA等對象庫中提供的常量。 8.3.5 常用標準函數(shù)VBA提供了大量的內(nèi)置函數(shù),這些函數(shù)極大地豐富了VBA的功能 了解和使用函數(shù),應從下面三個方面:函數(shù)名參數(shù)(指參數(shù)的個數(shù)、順序和類型 )函數(shù)值(每個函數(shù)被調(diào)用時都會有一個返回值)常用函數(shù)的使用可以參照附錄A學習下面介紹一些常用函數(shù) 一、算術(shù)函數(shù)(完成數(shù)學計算功能)1、絕對值函數(shù):Abs()返回數(shù)值表達式的絕對值。如Abs(-3)=32、向下取整函數(shù):Int()向下取整數(shù)的結(jié)果,參數(shù)為負值時返回小于等于參數(shù)值的第一個負數(shù)。只取整數(shù)部分,不考慮四舍五入3、取整函數(shù):Fix()參數(shù)
24、為正數(shù)時與Int結(jié)果一樣,參數(shù)為負數(shù)時返回大于等參數(shù)值的第一個負數(shù)例:Int(-3.25)=-4 Fix(-3.25)=-3 4、四舍五入函數(shù):Round(,)按照指定的小數(shù)進行四舍五入。 就是用來指定小數(shù)位數(shù)的。例:Round(3.255,1)=3.35、開平方函數(shù):Sqr()Sqr(9)=36、產(chǎn)生隨機數(shù)函數(shù):Rnd()數(shù)值表達式:小于0,每次產(chǎn)生相同的隨機數(shù)大于0,每次產(chǎn)生新的隨機數(shù)等于0,產(chǎn)生最近生成的隨機數(shù)省略參數(shù),默認為大于0 二、字符串函數(shù)1、字符串檢索函數(shù):InStr(start,compare)檢索子字符串str2在字符串str1中最早出現(xiàn)的位置,返回一整型數(shù)。Start為可
25、選參數(shù),為數(shù)值式,設置檢索的起始位置。如省略,從第一個字符開始檢索。Compare也為可選參數(shù),指定字符串的比較方法。值可以是1、2和0(缺?。?。0做二進制比較,1不區(qū)分大小寫的文本比較,2基于數(shù)據(jù)庫中包含信息的比較。例:str1=“98765” str2=“65”S=Instr(str1,str2)=4S=Instr(3,”aSsiAB”,”a”,1)=5 2、字符串長度檢測函數(shù):Len(或)返回字符串所含字符數(shù)。注意:定長字符串,其長度是定義時的長度,和字符串實際值無關(guān)。例:dim str as string*10Dim I Str=“123”i=12Len1=Len(“12345”) =
26、5Len2=Len(12) 錯誤Len3=Len(i) =2Len4=Len (“考試中心”)=4Len5=Len(str) =10 3、字符串截取函數(shù)Left right midMid(,N2):從字符串左邊第N1個字符起截取N2個字符。缺省N2截取所有字符。4、生成空格字符函數(shù):Space()返回數(shù)值表達式的值指定的空格字符數(shù)5、大小寫轉(zhuǎn)換函數(shù):ucase:小寫轉(zhuǎn)換成大寫Lcase:大寫轉(zhuǎn)換成小寫6、刪除空格函數(shù):LTrim():刪除開始的空格RTrim():刪除尾部的空格Trim():刪除開始和尾部的空格 三、日期/時間函數(shù)1、獲取系統(tǒng)日期和時間函數(shù)Date() time() Now()
27、2、截取日期分量函數(shù)Year() Month() Day() Weekday()3、截取時間分量函數(shù) Hour() Minute() Second()4、日期/時間增加或減少一個時間間隔DateAdd(,)對表達式表示的日期按照間隔類型加上或減去指定的時間間隔值。間隔值正數(shù)為加,負數(shù)為減間隔類型參照8.6 5、計算兩個日期的間隔值函數(shù)DateDiff(,W1,W2)返回日期1和日期2之間按照間隔類型所指定的時間間隔數(shù)目。W1可選參數(shù),指定一個星期的第一天是星期幾的常數(shù)W2可選參數(shù),指定一年的第一個周的常數(shù)(參照表8.7)6、返回日期指定時間部分函數(shù)DatePart(,W1,W2)返回日期中按照
28、間隔類型所指定的時間部分值7、返回包含指定年月日的日期函數(shù)DateSerial(表達式1,表達式2,表達式3)返回由表達式1值為年,表達式2值為月,表達式3值為日而組成的日期值。每個參數(shù)的取值范圍應該是可接受的。當任何一個參數(shù)的取值 超出可接受范圍時,它會適時進位到下一個較大的時間單位。 四、類型轉(zhuǎn)換函數(shù)1、字符串轉(zhuǎn)換字符代碼函數(shù):Asc()返回字符串首字符的ASCII值。2、字符代碼轉(zhuǎn)換成字符函數(shù):Chr()返回與字符代碼相關(guān)的字符。3、數(shù)字轉(zhuǎn)換成字符串函數(shù):Str()將數(shù)值表達式轉(zhuǎn)換成字符串。表達式值為正,返回的字符串包含一前導空格表示有一正號4、字符串轉(zhuǎn)換成數(shù)字函數(shù):Val()將數(shù)字字符
29、串轉(zhuǎn)換成數(shù)值型數(shù)字。注意,數(shù)字串轉(zhuǎn)換成自動將字符串中的空格、制表符和換行符去掉,當遇到它不能識別為數(shù)字的第一個字符時,停止讀入字符串 5、字符串轉(zhuǎn)換日期日期函數(shù):DateValue()將字符串轉(zhuǎn)換成日期值例:D=DateValue(“February 29,2004”),返回#2004-2-29#6、Nz函數(shù):Nz(表達式或字段屬性值,規(guī)定值當一個表達式或字段屬性值為Null時,函數(shù)可返回0、零長度字符串(”)或其他指定的值。當缺省“規(guī)定值”時,如果表達式或字段屬性值為數(shù)值型且值為Null,Nz函數(shù)返回0如果表達式或字段屬性值為字符型且值為Null,Nz函數(shù)返回空字符串。 8.3.6 運算符和
30、表達式一、運算符(算術(shù)運算符、關(guān)系運算符、邏輯運算符和連接運算符)1、算術(shù)運算符乘冪()、乘法(*)、除法(/)、整數(shù)除法()求模運算(Mod)、加法、減法。整數(shù)除法():對兩個數(shù)做除法運算并返回一個整數(shù)如果操作數(shù)有小數(shù)部分,舍去小數(shù)后再運算,如果結(jié)果有小數(shù)也要舍去求模運算(Mod):求余數(shù)如果操作數(shù)是小數(shù),四舍五入變成整數(shù)后再運算;余數(shù)的符號跟被除數(shù)相同。 2、關(guān)系運算符= = 運算結(jié)果為True或False。進行算術(shù)運算時,True當成-1False當成03、邏輯運算符And(與) Or(或) Not(非)運算結(jié)果為True或False4、連接運算符&和+&:將兩個表達式作字符串連接例:”
31、2+3”&”=”&(2+3) 運算結(jié)果為2+3=5+:將兩個表達式均為字符串時,才將兩個表達式連接成一個新字符串。例:”2+3”&”=”+(2+3)出錯二、表達式和優(yōu)先級(參照表8.9)p220 一個語句就是能夠完成某項操作的一條命令。VBA程序就是有大量語句構(gòu)成的。按照語句所執(zhí)行的功能,VBA的程序語句有賦值語句、聲明語句、控制語句、注釋語句等??刂普Z句分三種結(jié)構(gòu)是順序結(jié)構(gòu)、分支結(jié)構(gòu)和循環(huán)結(jié)構(gòu) 順序結(jié)構(gòu)是最簡單的一種結(jié)構(gòu),按照語句的排列順序依次執(zhí)行程序中的每一條語句。分支結(jié)構(gòu)又稱選擇結(jié)構(gòu),根據(jù)條件選擇執(zhí)行路徑,需要使用條件語句循環(huán)結(jié)構(gòu):程序執(zhí)行時,該語句中的一部分操作即循環(huán)體被重復執(zhí)行多次,
32、需要使用循環(huán)語句8.4 VBA流程控制語句 8.4 VBA流程控制語句8.4.1 賦值語句是最基本的語句。它的功能是給變量或?qū)ο蟮膶傩再x值。其格式為 例如,Ra = 0.1 給變量賦值Text1.Value = 歡迎使用ACCESS 給控件的屬性賦值“=”為賦值號,表示賦值的動作,不要理解為數(shù)學上的等號。 程序的順序結(jié)構(gòu)例8-1 創(chuàng)建如圖8-5所示的窗體“計算圓的面積和周長”。要求在文本框中輸入了圓的半徑后,單擊“計算”按鈕,在窗體的另外兩個文本框中分別輸出圓的面積和周長。 “計算”按鈕的Click事件過程如下。Private Sub command0_Click()定義變量和符號常量Dim
33、r As Single r為圓的半徑Dim s As Single s為圓的面積Dim l As Single l為圓的周長Const PI = 3.1415926給變量r賦值r = text0計算圓的面積和周長s = PI * r 2l = 2 * PI * r用文本框輸出結(jié)果 text2 = stext4 = lEnd Sub 條件表達式語句塊當條件為假時當條件為真時開始結(jié)束 語句塊語句塊基本語句條件表達式當條件為假時當條件為真時 8.4.2條件語句1、If-Then語句(單分支結(jié)構(gòu))流程圖見P222If Then End If或 者 If Then 例 8.4 自 定 義 過 程 Pro
34、cedure1的 功 能 是 : 如 果 當 前 系 統(tǒng) 時 間超 過 12點 , 則 在 立 即 窗 口 顯 示 “ 下 午 好 ! ”Sub Pro1()If Hour(Time()=12 then Debug.print “下 午 好 ! ”End Sub 2、If-Then-Else(雙分支結(jié)構(gòu))語句結(jié)構(gòu): 流程圖見P222If Then Else End If例8.5 修改過程Pro1,新增功能是,如果當前系統(tǒng)時間為12點至18點,則在立即窗口顯示“下午好!”,否則顯示“歡迎下次光臨!” Sub Pro1() If Hour(Time() = 12 And Hour(Time() y
35、 Then Debug.Print xElse Debug.Print yEnd If 例8.6試用If-Else語句結(jié)構(gòu)編程實現(xiàn)由X的值計算表達式Y(jié)的值 x0 Y= 0 x=0 |x| x0 Then y=Sqr(x)Else If x=0 Then y=0 Else y=Abs(x) End IfEnd If程序段2:If x0 Then y=Sqr(x)ElseIf x=0 Then y=0Else y=Abs(x)End If 例8-2 用VBA程序?qū)崿F(xiàn)窗體“系統(tǒng)登錄”。 “確定”按鈕的Click事件過程 Private Sub cmd確定_Click() Dim name As St
36、ring, pass As String Dim r As Integer 存放MsgBox消息框的返回值 name = Me!txt用戶名 pass = Me!txt口令 If pass = 1234 And name = cueb Then 如果用戶名和口令正確,顯示消息框,運行學生管理模塊窗體 MsgBox 歡迎進入學生管理模塊!, vbOKOnly + vbCritical, 歡迎 DoCmd.Close 關(guān)閉系統(tǒng)登錄窗體 DoCmd.OpenForm 學生管理模塊 打開學生管理模塊窗體 Else MsgBox 密碼錯誤!, vbOKOnly 顯示消息框 Me!txt用戶名 = 使文本
37、框清空 Me!txt口令 = Me!txt用戶名.SetFocus 使文本框獲得焦點,準備重新輸入 End IfEnd Sub 3、 If-Then-ElseIf(多分支結(jié)構(gòu))If Then ElseIf Then ElseIF Then Else End If流程圖見P223 例8.7 定義過程Pro3 功能:如果當前系統(tǒng)時間為8至12點鐘之間,在立即窗口顯示“上午好!”,系統(tǒng)時間為12點至18點,則顯示“下午好!”,其他時間均顯示“歡迎下次光臨!”Sub Pro3() If Hour(time()=8 and Hour(time()=12 and Hour(time()= 90 and x
38、= 80 and x= 70 and x= 60 and x70 Then Debug.Print 及格 Else Debug.Print 不及格 End IfEnd Sub 4、 Select Case-End Select語句 當條件比較多時,用If-End If需要多重嵌套,使用程序變得復雜。用Select Case-End Select語句就可以方便解決語句格式為Select Case Case 語句塊1 表達式的值與表達式列表1相等時執(zhí)行 Case 語句塊2 表達式的值與表達式列表2相等時執(zhí)行 Case Else 語句塊n+1 上面的情況均不符合時執(zhí)行End Select 說明:(1
39、)執(zhí)行過程是先計算Select Case后的變量或表達式的值,然后從上至下逐個比較,決定執(zhí)行哪一個語句塊。如果有多個Case后的表達式列表與其相匹配,則只執(zhí)行第一個Case后的語句塊。(2)Select Case后的變量或表達式只能是數(shù)值型或字符型表達式。(3)Case表達式可以是: 單一數(shù)值: 5 用逗號分隔的一組枚舉表達式: 2, 4, 6, 8 表達式1 To 表達式2 60 to 100 Is 關(guān)系運算符表達式 Is b,a,b)(2)Switch函數(shù):Switch(條件式1,表達式1,條件式2,表達式2,條件式n,表達式n)例:y=Switch(x0,1,x=0,0,x0,-1)(3
40、)Choose函數(shù):Choose(索引式,選項1,選項2,選項n)根據(jù)索引式的值來返回選項列表中的某個值。索引值為1,返回選項1,索引值為2,返回選項2,以此類推。注意:只有索引值在界于1到可選擇項目數(shù)之間,才返回其后的選項值,否則返回無效值Null 知識回顧程序流程控制結(jié)構(gòu):l順序結(jié)構(gòu)l分支結(jié)構(gòu)l循環(huán)結(jié)構(gòu)分支結(jié)構(gòu):l單分支結(jié)構(gòu)l雙分支結(jié)構(gòu) l多分支結(jié)構(gòu) 單分支結(jié)構(gòu)If-Then語句If Then End If 雙分支結(jié)構(gòu)If-Then-Else語句結(jié)構(gòu):If Then Else End If 多分支結(jié)構(gòu)1、If-Then-ElseIfl語句結(jié)構(gòu):If Then ElseIf Then Els
41、e End If 2、Select Case-End Select語句格式為Select Case Case 語句塊1 表達式的值與表達式列表1相等時執(zhí)行 Case 語句塊2 表達式的值與表達式列表2相等時執(zhí)行 Case Else 語句塊n+1 上面的情況均不符合時執(zhí)行End Select 標準模塊的編譯順序Sub 過程名() Dim 變量名as 數(shù)據(jù)類型 可省略為變量賦值 可省略輸入流程控制結(jié)構(gòu)Debug.print 變量名 可省略End sub Access對象中的事件過程模塊右擊控件,選擇屬性|事件選擇一種事件的事件過程清楚sub-end sub 中的語句輸入新的語句 習題:創(chuàng)建一個窗體
42、,此窗體包括3個文本框和一個命令按鈕,要求此窗體實現(xiàn)下列功能:l其中兩個文本框可以輸入數(shù)據(jù)l單擊命令按鈕時,在第三個文本框中顯示前兩個文本框中較大的值 8.4.3 循環(huán)語句重復執(zhí)行一行或幾行程序代碼。VBA支持以下循環(huán)語句結(jié)構(gòu):For-Next 、Do While-Loop和While-Wend1.For-Next語句語句格式為For to Step 條件語句序列 Exit For Next 說明:(1)循環(huán)控制變量的類型必須是數(shù)值型。(2)步長可以是正數(shù),也可以是負數(shù)。如果步長為1,Step短語可以省略。如果步長值為0,該循環(huán)執(zhí)行無數(shù)次,造成“死循環(huán)”(3)根據(jù)初值、終值和步長,可以計算出循
43、環(huán)的次數(shù),循環(huán)次數(shù)=(終值-初值+1)/步長 因此For語句一般用于循環(huán)次數(shù)已知的情況。(4)使用Exit For語句可以提前退出循環(huán)。例8.12 分析下列程序段的循環(huán)結(jié)構(gòu)For K=5 to 10 Step 2 K=2*KNext K 例8.13 編程用For語句求1-100之間奇數(shù)的和Public Sub gc2() Dim s, i As Integer s=0 For i = 1 To 100 Step 2 s = s + i Next i Debug.Print sEnd Sub 例8.14 在立即窗口中顯示有星號(*)組成的55的正方形Sub Pro5() Dim Str As S
44、tring For n = 1 To 5 Step 1 Str = Str + * Next n For n = 1 To 5 Step 1 Debug.Print Str Next nEnd Sub 另一種編譯方法:Sub Pro5() const MAX=5 Dim Str As String str=“” For n=1 to MAX Str=Str+”* ” Next n For n=1 to MAX Debug.Print Str Next nEnd Sub 2. Do WhileLoop循環(huán)語句 Do While 循環(huán)體 條件為真時執(zhí)行循環(huán)體 條件語句序列 Exit Do 結(jié)束條件
45、語句序列Loop 例題8.15 用Do WhileLoop語句求1+2+3+100之和Dim s, i As Integers = 0: i = 1Do While i =2時編寫程序,在立即窗口顯示n為2到10時對應的序列值 Sub Pro6() n=1 f1=0 f2=1Do while n10 f=f1+f2 debug.print f f1=f2 f2=f n=n+1Loop End sub 3.Do UntilLoop語句條件為假時執(zhí)行循環(huán)體,條件為真時結(jié)束循環(huán)Do Until 循環(huán)體 條件語句序列 Exit Do 結(jié)束條件語句序列Loop 例題8-17 用Do UntilLoop語
46、句求1+2+3+10之和。Dim s, i As Integers = 0: i = 1Do until i10 s = s + i i = i + 1LoopDebug.Print s 4.DoLoop While語句Do 循環(huán)體 條件語句序列 Exit Do 結(jié)束條件語句序列Loop While 先執(zhí)行循環(huán)體,再判斷條件 問題:下面的程序執(zhí)行結(jié)果是什么?控制循環(huán)執(zhí)行的判斷被執(zhí)行了幾次?Dim s, i As Integers = 0: i = 1Do s = s + i i = i + 1Loop While i = 10Debug.Print s 5.DoLoop Until語句Do 循
47、環(huán)體 條件語句序列 Exit Do 結(jié)束條件語句序列Loop Until 6.While-Wend語句 While-Wend語句與Do While-Loop結(jié)構(gòu)類似,其語句格式為:While 條件式循環(huán)體Wend注意:在While-Wend語句中不能使用Exit Do語句來提早結(jié)束循環(huán)體。 例題8-18:使用WhileWend語句完成1+2+10的求和計算Sub f1()While i = 10s = s + ii = i + 1WendDebug.Print sEnd Sub 8.4.4 GoTo語句無條件轉(zhuǎn)移語句goto 標號標號必須是首先在程序中定義好,否則無法實現(xiàn)。標號定義格式 標號:
48、Dim i,sum as Integer i=1 sum=0Loop: if(i=100) sum=sum+i i=i+1 goto loop 8.5 過程調(diào)用和參數(shù)傳遞8.5.1 過程調(diào)用1、子過程的定義和調(diào)用格式:public|Privatestaticsub 過程名(形參) exit sub End subPublic:使過程適用于所有模塊中的所有其他過程Private:使該子過程只適用于同一模塊中的其他過程Static:只要模塊是打開的,運行時變量值都將被保留。 子過程的調(diào)用Call 子過程名()或子過程名例8.18 下面編寫一個打開指定窗體的子過程openforms()Sub openforms(strformname as string)If strformname=“” then Msgbox “打開窗體名稱不能為空!”,vbcritical,”警告”End if Docmd.openform strformnameEnd sub 調(diào)用子過程:Call openforms(“學生管理”)或openforms”學生管理” 2、函數(shù)過程的定義和調(diào)用Public|PrivateStatic Function 函數(shù)過程名()as 數(shù)據(jù)類型 函數(shù)過程名= Exit Function 函數(shù)過程語句 =End Function調(diào)用過程:函數(shù)過程名()
- 溫馨提示:
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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。