Access 2016數(shù)據(jù)庫教程課件_第1頁
Access 2016數(shù)據(jù)庫教程課件_第2頁
Access 2016數(shù)據(jù)庫教程課件_第3頁
Access 2016數(shù)據(jù)庫教程課件_第4頁
Access 2016數(shù)據(jù)庫教程課件_第5頁
已閱讀5頁,還剩95頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第9章VBA程序設計與數(shù)據(jù)庫編程【學習目標】熟悉VBA開發(fā)環(huán)境和模塊的概念。掌握VBA的數(shù)據(jù)類型、輸入/輸出語句以及程序控制結(jié)構(gòu)。了解ADO的主要對象,理解VBA數(shù)據(jù)庫編程技術。主要內(nèi)容9.1模塊概述9.2VBA程序概述9.3VBA程序開發(fā)環(huán)境9.4VBA程序基礎9.5VBA程序語句9.6VBA程序的控制結(jié)構(gòu)9.7VBA自定義過程9.8VBA程序調(diào)試9.9VBA數(shù)據(jù)庫編程模塊的組成1.聲明區(qū)域

聲明區(qū)域主要進行變量、常量或自定義數(shù)據(jù)類型的聲明。2.Sub子過程Sub子過程的定義格式為:Sub子過程名([形參列表])

語句序列EndSub

Sub子過程執(zhí)行語句序列來完成相應的操作,子過程無返回值。3.Function函數(shù)過程

函數(shù)過程的定義格式為:Function函數(shù)名([形參列表])As返回值類型

語句序列EndFunctionFunction函數(shù)過程執(zhí)行語句序列后,有返回值一個簡單的VBA窗體模塊示例【例9-1】新建一個窗體在窗體上放置一個名稱為Command1的命令按鈕,命令按鈕上顯示“歡迎詞”。運行窗體時,單擊命令按鈕后彈出“HelloWorld!”消息框。VBA程序設計概述對象和對象名對象是面向?qū)ο蟪绦蛟O計的基本單元,是一種將數(shù)據(jù)和操作結(jié)合在一起的數(shù)據(jù)結(jié)構(gòu)。每個對象都有名稱,稱為對象名。每個對象都有:

屬性

方法

事件對象實例表、查詢、窗體、報表、宏和模塊都是對象。窗體和報表中的控件(如標簽、文本框、組合框、命令按鈕等)也是對象。

對象的屬性1.在屬性表中設置屬性值2.在VBA代碼中設置屬性值

對象屬性引用格式為:

對象名.屬性Label1.Caption=″學生基本情況表″名稱標題對象的方法方法用來描述對象的行為,對象的方法就是對象可以執(zhí)行的操作,用來完成某種特定的功能。方法引用格式為:

對象名.方法名

Text1.SetFocus為窗體中的文本框Text1設置焦點獲得光標事件

是系統(tǒng)事先設定的能被對象所識別并響應的動作例如:鼠標單擊(Click)事件、打開窗體(Open)等。事件過程

是響應某一事件時去執(zhí)行的程序代碼,與事件一一對應。對象的事件和事件過程(1)“!”運算符

引用窗體、報表或控件對象。(2)“.”運算符

引用窗體、報表或控件等對象的屬性。窗體對象的引用格式:

Forms!窗體名!控件名[.屬性名]對象運算符Forms!計算圓面積!Text2.Value=Forms!計算圓面積!Text1.Value*Forms!計算圓面積!Text1.Value*3.14控件名[.屬性名]Text2.Value=Text1.Value*Text1.Value*3.14推薦使用“計算圓面積”的窗體中,有兩個文本框,名稱分別為“Text1”和“Text2”Forms!計算圓面積!Text2.Value=Forms!計算圓面積!Text1.Value*Forms!計算圓面積!Text1.Value*3.14控件名[.屬性名]Text2.Value=Text1.Value*Text1.Value*3.14推薦使用“計算圓面積”的窗體中,有兩個文本框,名稱分別為“Text1”和“Text2”如果在本窗體的模塊中引用控件對象,可以將“Forms!窗體名”缺省。Text1Text2PrivateSubCommand1_Click() Text1.Value=″Access2016″ '文本框Text1的內(nèi)容顯示Access2016EndSub【例9-2】創(chuàng)建一個名為“例9-2顯示信息”的窗體。在窗體的文本框中顯示“Access2016”

VBE窗口提供了完整的開發(fā)和調(diào)試VBA代碼的環(huán)境代碼窗口頂部包含兩個組合框:左側(cè)為對象列表右側(cè)為事件列表編寫代碼的操作步驟如下:①

從左側(cè)組合框中選擇一個對象后,右側(cè)事件組合框中將列出該對象的所有事件。②

從該對象事件過程列表選項中選擇某個事件名稱,系統(tǒng)將自動生成相應的事件PrivateSubCommand0_Click()

EndSub插入代碼VBA程序開發(fā)環(huán)境VBA的數(shù)據(jù)類型數(shù)據(jù)類型類型標識符號占用字節(jié)取值范圍字節(jié)型Byte無1字節(jié)0~255整型Integer%2字節(jié)-32768~32767長整型Long&4字節(jié)-2147483648~2147483647單精度Single!4字節(jié)負數(shù):-3.402823E38~-1.401298E-45正數(shù):1.401298E-45~3.402823E38雙精度Double#8字節(jié)負數(shù):-1.79769313486232E308~-4.9406545841247E-324正數(shù):4.9406545841247E-324~1.79769313486232E308貨幣型Currency@8字節(jié)-922337203685477.5808~922337203685477.5807日期型Date無8字節(jié)100年1月1日~9999年12月31日字符串型String$不定定長字符串可以包含0個字符~216個字符變長字符串可以包含0個字符~231個字符布爾型Boolean無2字節(jié)True、False對象型Object無4字節(jié)任何對象引用變體型Variant無不定由最終的數(shù)據(jù)類型決定VBA程序基礎常量按照實際值出現(xiàn)在程序中,它的表示形式?jīng)Q定了其類型。常用的字面常量有:(1)數(shù)值常量:由數(shù)字組成。

例如,156、3.14(2)字符常量:由雙引號括起來的字符串。

例如,″HELLO″、″156″、″數(shù)據(jù)庫系統(tǒng)″(3)日期常量:由符號“#”將數(shù)據(jù)括起來。

例如,#2024-1-1#、#2024/1/110:20:35#(4)布爾常量:只有兩個值Ture和False常量變量變量是指在程序運行期間取值可以變化的量。在程序中每個變量都用唯一的名稱來標識,用戶可以通過變量名來訪問內(nèi)存中的數(shù)據(jù)。變量的三個基本要素:

變量名

變量的數(shù)據(jù)類型

變量值變量的命名規(guī)則變量命名時應該遵守以下的規(guī)則(1)變量名必須以英文字母或漢字為起始字符。(2)變量名可以包含字母、漢字、數(shù)字或下劃線。(3)變量名的長度不能超過255個字符,變量名不區(qū)分大小寫。(4)變量名不能使用VBA的關鍵字。例如:sum、a_1、成績、x15b、sum-1、a.3、a1、if

(1)顯式變量聲明顯式聲明變量的格式:Dim變量名[As類型名|類型符][,變量名[As類型名|類型符]][

]變量聲明語句的功能:

定義變量并為其分配內(nèi)存空間。默認定義變量為變體型(Variant)例如:DimscoreAsIntegerDimnAsInteger,sumAsLong,averAsSingle,strAsString,flagAsBoolean,w可以使用類型符代替類型名來進行變量聲明。例如:Dimname$,age%,score!聲明了一個整型變量score聲明了整型變量n,長整型變量sum,單精度型變量aver,變長字符串型變量str,布爾型變量flag,變體型變量w聲明了字符串變量name,整型變量age,單精度型變量score變量的聲明變量的聲明(2)隱式變量聲明隱式變量是指沒有使用變量聲明語句進行聲明而直接使用的變量,隱式變量的數(shù)據(jù)類型是變體型(Variant)

例如:sum=0數(shù)組是由一組具有相同數(shù)據(jù)類型的變量組成的集合,數(shù)組中的變量稱為數(shù)組元素變量。

數(shù)組變量由變量名稱和數(shù)組下標組成,

必須用Dim語句聲明數(shù)組。

數(shù)組一維數(shù)組的聲明語句格式:Dim數(shù)組名([下標下界To]下標上界)[As

數(shù)據(jù)類型]說明:(1)下標下界缺省值為0。數(shù)組元素為:數(shù)組名(0)~數(shù)組名(下標上界)。(2)如果設置下標下界非0,要使用To選項。例如:Dima(5)AsIntegerDimb(1To5)AsSinglea(0)a(1)a(2)a(3)a(4)a(5)

b(1)b(2)b(3)b(4)b(5)

一維數(shù)組數(shù)組引用數(shù)組元素的引用格式為:

數(shù)組名(下標值)一維數(shù)組,則下標值的范圍為“下標下界~下標上界”的整數(shù)值例如:a(2) '引用一維數(shù)組a的第3個元素,數(shù)組下標下界為

0b(2) '引用一維數(shù)組b的第2個元素,數(shù)組下標下界為

1Dima(5)AsIntegerDimb(1To5)AsSingle運算符VBA提供了多種類型的運算符,通過運算符與操作數(shù)組合成表達式,完成各種形式的運算和處理。1.表達式的組成表達式是將常量、變量或函數(shù)用運算符連接起來的式子表達式的運算結(jié)果是一個值,其類型由表達式中操作數(shù)的類型和運算符決定例如:(9-2)\4+5Mod3+2<6Ture7125

表達式

(-b+Sqr(b^2-4*a*c))/(2*a)

表達式3.表達式中的運算順序一個表達式中含有多種不同類型的運算符時:

運算的先后順序由運算符的優(yōu)先級決定算術字符串關系邏輯表達式當優(yōu)先級相同時運算按照從左到右的順序進行可以通過圓括號來改變運算的優(yōu)先順序VBA程序中的語句一般分為三種類型(1)聲明語句

為變量、常量、過程定義命名,指定數(shù)據(jù)類型。(2)賦值語句

為變量指定一個值或表達式。(3)執(zhí)行語句

執(zhí)行調(diào)用過程或函數(shù)、實現(xiàn)各種流程控制。(4)注釋語句用來說明語句的功能。VBA程序語句(1)在同一行內(nèi)可以書寫多條語句,語句之間需要用冒號“:”進行分隔。(2)語句中的所有符號和括號必須使用英文格式。(3)語句中不區(qū)分字母的大小寫。語句的關鍵字首字母自動轉(zhuǎn)換成大寫,其余字母轉(zhuǎn)換為小寫。

輸入一行語句并按下回車鍵后,VBA會自動進行語法檢查

代碼為紅色顯示表示有錯誤

語句的書寫規(guī)則

聲明語句聲明語句可以命名和定義常量、變量、數(shù)組、過程等。PrivateSubProc()DimrAsSingle,areaAsSingle

EndSub賦值語句給某個變量賦予一個值或表達式。賦值語句格式:[Let]變量名=表達式功能:

計算等號右端的表達式的值,并將結(jié)果賦值給等號左端的變量。例如:r=10 area=r*r*3.14

賦值語句(1)不能在一個賦值語句中同時給多個變量賦值。a=b=c=0(2)賦值號左端只能是變量名稱,不能是常量、常量標識符或表達式。3=x+yx+y=3(3)賦值語句中的“=”為賦值號,表示賦值操作。不要與關系運算符的“=”混淆。

使用賦值語句時需要注意以下幾個方面注釋語句用于對程序或語句的功能進行解釋和說明,可以增強程序的可讀性和可維護性。(1)使用Rem語句

格式:Rem注釋語句(2)使用英文單引號'

格式:'注釋語句

例如:

Rem求圓面積程序DimrAsSingle,areaAsSingler=10 :Rem給變量r賦值為常量10area=r*r*3.14 '變量area賦值為計算圓面積的表達式注釋語句輸入(InputBox)處理輸出(MsgBox)

輸入輸出語句InputBox函數(shù)是用來輸入數(shù)據(jù)的函數(shù),該函數(shù)顯示一個輸入對話框,等待用戶輸入。當用戶單擊“確定”按鈕時,函數(shù)返回輸入的值當用戶單擊“取消”按鈕時,函數(shù)返回空字符串InputBox函數(shù)格式:InputBox(prompt[,title][,default][,xpos][,ypos])顯示對話框的提示信息(必選)對話框標題欄中的顯示信息在輸入文本框中顯示的信息與屏幕左邊和上邊的距離1.InputBox函數(shù)DimpincodeAsStringpincode=InputBox(″請輸入密碼:″,″密碼輸入″,″PASSWORD″)輸入:123,單擊“確定”按鈕結(jié)果:pincode的值為″123″1.InputBox函數(shù)示例MsgBox的功能是輸出顯示,可以在一個對話框中顯示消息,等待用戶單擊按鈕,并返回一個整數(shù)值來告訴系統(tǒng)單擊的是哪個按鈕。MsgBox分為函數(shù)和過程兩種調(diào)用形式:MsgBox函數(shù)調(diào)用格式:MsgBox(prompt[,buttons][,title])MsgBox子過程調(diào)用格式:MsgBoxprompt[,buttons][,title]顯示對話框的提示信息指定顯示按鈕的數(shù)目和形式、使用的圖標樣式在對話框標題欄顯示的信息

區(qū)別:函數(shù)有返回值;子過程沒有返回值2.MsgBox函數(shù)和過程f=MsgBox(″要退出嗎?″) f=MsgBox(″要退出嗎?″,4,″退出提示″) f=MsgBox(″要退出嗎?″,4+32,″退出提示″) 示例程序是按照一定的結(jié)構(gòu)來控制整個流程的常用的程序控制結(jié)構(gòu)可以分為三種:

順序結(jié)構(gòu)

選擇結(jié)構(gòu)

循環(huán)結(jié)構(gòu)順序結(jié)構(gòu)選擇結(jié)構(gòu)循環(huán)結(jié)構(gòu)VBA程序的控制結(jié)構(gòu)按照程序中語句的書寫順序依次執(zhí)行的語句序列。順序結(jié)構(gòu)中經(jīng)常使用的語句:

輸入語句

InputBox

賦值語句

輸出語句

MsgBoxAB

順序結(jié)構(gòu)PrivateSubcmd_Click()DimrAsSingle DimareaAsSingle r=Val(InputBox("請輸入半徑")) area=r*r*3.14 MsgBox"圓的面積="&area

EndSub【例9-3】輸入圓的半徑值,輸出圓的面積PrivateSubCommand0_Click()DimaAsInteger,bAsInteger,tAsIntegera=Text0.Value b=Text2.Value t=a:a=b:b=t Text0.Value=a Text2.Value=b

EndSub【例9-4】輸入兩個數(shù),交換兩個數(shù)的值并顯示交換后的結(jié)果。1.單分支If語句功能:先計算條件表達式的值當條件表達式的值為真(True)時,執(zhí)行語句或語句序列。執(zhí)行完語句或語句序列后,將執(zhí)行EndIf語句之后的語句當條件表達式的值為假(False)時,直接執(zhí)行EndIf語句之后的語句。格式一:If條件表達式Then語句格式二:If條件表達式Then

語句序列EndIf

選擇結(jié)構(gòu)條件表達式語句序列單分支If語句執(zhí)行過程PrivateSubText1_GotFocus()DimxAsIntegerx=Text0.Value Ifx<0Thenx=-x EndIfText1.Value=x Text0.SetFocus

EndSub【例9-6】輸入一個數(shù),求出該數(shù)的絕對值。二分支If語句的格式:

功能:先計算條件表達式的值。當條件表達式的值為真(True)時,執(zhí)行語句序列1中的語句,然后執(zhí)行EndIf語句之后的語句;當條件表達式的值為假(False)時,執(zhí)行語句序列2中的語句,然后執(zhí)行EndIf語句之后的語句。If條件表達式Then

語句序列1Else

語句序列2EndIf2.二分支If語句條件表達式語句序列1語句序列2二分支If語句執(zhí)行過程PrivateSubText3_GotFocus()DimxAsInteger,yAsInteger,maxAsIntegerx=Text1.Valuey=Text2.ValueIfx>=yThenmax=x Elsemax=y EndIfText3.Value=maxEndSub獲得焦點事件【例9-6】輸入兩個整數(shù),求出這兩個數(shù)中的較大的數(shù)并輸出。PrivateSubCommand0_Click()IfText0.Value>=60ThenMsgBox"通過考試!" ElseMsgBox"未能通過考試!"EndIfText0.SetFocus

EndSub將輸入光標設置在文本框Text0中,等待輸入下一個數(shù)據(jù)【例9-7】輸入一個學生的成績,顯示該學生是否通過考試語句格式:If條件表達式1Then

語句序列1ElseIf條件表達式2Then

語句序列2[Else

語句序列3]EndIf功能:先計算條件表達式1的值。當條件表達式1的值為真(True)時,則執(zhí)行語句序列1中的語句否則當條件表達式2的值為真(True)時,則執(zhí)行語句序列2中的語句,否則(條件表達式2的值為假(False)),則執(zhí)行語句序列3中的語句然后執(zhí)行EndIf語句之后的語句。3.多分支If語句條件表達式1語句序列1TF條件表達式2條件表達式3語句序列2語句序列3語句序列n……TFTF執(zhí)行過程

PrivateSubText1_GotFocus()DimxAsInteger,yAsIntegerx=Text0.ValueIfx>0Theny=1ElseIfx=0Theny=0Elsey=-1EndIfText1.Value=yEndSub【例9-8】分段函數(shù)的計算,輸入x的值,計算y的值。根據(jù)多個表達式的值,從多個操作中選擇一個對應的執(zhí)行。多路分支語句的格式:SelectCase表達式Case表達式1

語句序列1Case表達式2

語句序列2

Case表達式n

語句序列n[CaseElse

語句序列n+1]EndSelect4.多路分支SelectCase語句功能:先計算表達式的值,如果表達式的值與第i(i=1,2,

,n)個Case表達式列表的值匹配,則執(zhí)行語句序列i中的語句;如果表達式的值與所有表達式列表中的值都不匹配,則執(zhí)行語句序列n+1。說明:(1)SelectCase后面的表達式只能是數(shù)值型或字符型。(2)語句中的各個表達式列表應與SelectCase后面的表達式具有相同的數(shù)據(jù)類型。(3)Case語句是依次測試的,并執(zhí)行第一個匹配的Case語句序列,后面即使再有符合條件的分支也不被執(zhí)行。表達式列表:

表達式

用逗號分隔開的一組枚舉表達式

表達式1To表達式2Is關系運算符表達式4.多路分支SelectCase語句PrivateSubCommand0_Click()DimscoreAsIntegerDimgradeAsString score=Text0.ValueSelectCasescoreCaseIs>=90grade="優(yōu)秀"Case80To89grade="良好"Case70To79grade="中等"Case60To69grade="及格"CaseElsegrade="不及格"EndSelectMsgBox"成績等級為:"+grade Text0.SetFocusEndSub【例9-9】輸入一個學生的成績,顯示該學生的成績評定結(jié)果。1.For

Next語句(1)語句格式一般格式:

For循環(huán)變量=初值To終值[Step步長]

循環(huán)體Next[循環(huán)變量]9.6.3循環(huán)結(jié)構(gòu)(2)語句的執(zhí)行步驟①

將初值賦值給循環(huán)變量。②

將循環(huán)變量與終值比較,根據(jù)比較的結(jié)果來確定循環(huán)是否進行,比較分為以下三種情況。步長>0時:若循環(huán)變量<=終值,循環(huán)繼續(xù),執(zhí)行步驟③;若循環(huán)變量>終值,退出循環(huán)。步長=0時:若循環(huán)變量<=終值,進行無限次的死循環(huán);若循環(huán)變量>終值,一次也不執(zhí)行循環(huán)。步長<0時:若循環(huán)變量>=終值,循環(huán)繼續(xù),執(zhí)行步驟③;若循環(huán)變量<終值,退出循環(huán)。③

執(zhí)行循環(huán)體。如果在循環(huán)體內(nèi)執(zhí)行到ExitFor語句,則直接退出循環(huán)。④

循環(huán)變量增加步長,即循環(huán)變量=循環(huán)變量+步長,程序轉(zhuǎn)到②執(zhí)行。當缺省步長時,步長的默認值為1。For

Next語句的執(zhí)行步驟終值循環(huán)體FTfor初值步長(3)語句的執(zhí)行過程PrivateSubCommand1_Click()DimiAsInteger,sAsIntegers=0 Fori=1To100 s=s+iNextiText1.Value=s

EndSub【例9-10】求1+2+3+

+100的和,并輸出顯示。PrivateSubCommand1_Click()DimiAsInteger,sAsIntegers=0Fori=2To100Step2

s=s+iNextiText1.Value=sEndSub【例9-11】求100以內(nèi)的偶數(shù)之和,即2+4+

+100的和。首先將第一個數(shù)賦值給最大值和最小值變量從第二個數(shù)開始逐個與最大值(最小值)進行比較,若大于最大值(小于最小值),則用該數(shù)替換最大值(最小值)比較完所有數(shù)據(jù),則最大值(最小值)變量中存儲的是所有數(shù)據(jù)中的最大值(最小值)分析:采用逐個比較法【例9-12】輸入10個整數(shù),求出其中的最大值和最小值PrivateSubCommand1_Click()Dima(1To10)AsInteger DimiAsInteger,maxAsInteger,minAsIntegerFori=1To10a(i)=Val(InputBox("輸入一個數(shù):"))Text1.Value=Text1.Value&a(i)&""Nextimax=a(1)min=a(1)

Fori=2To10Ifa(i)>maxThenmax=a(i) Ifa(i)<minThenmin=a(i)

NextiText2.Value=max Text3.Value=min EndSub(1)語句格式While條件表達式

循環(huán)體Wend2.While

Wend語句①

判斷條件是否成立。如果條件成立,則執(zhí)行循環(huán)體;否則轉(zhuǎn)到③執(zhí)行。②

執(zhí)行到Wend語句,轉(zhuǎn)到①執(zhí)行。③

執(zhí)行Wend語句后面的語句。(2)語句的執(zhí)行步驟

表達式語句假(0)真(非0)while的后續(xù)語句While

Wend語句的執(zhí)行過程必須在循環(huán)體內(nèi)設置相應的語句來修改循環(huán)條件,使得整個循環(huán)趨于結(jié)束,避免出現(xiàn)死循環(huán)。While循環(huán)語句先對條件進行判斷,如果條件成立,則執(zhí)行循環(huán)體;否則一次也不執(zhí)行循環(huán)體。(4)While循環(huán)的幾點說明PrivateSubCommand1_Click()n=0Whilen<=10IfnMod2=0Then MsgBoxn EndIfn=n+1 WendEndSub【例9-13】輸出10以內(nèi)的全部偶數(shù)Do

Loop語句有以下兩種形式(1)DoWhile

Loop語句

語句格式:DoWhile條件表達式

循環(huán)體LoopDoWhile

Loop語句的執(zhí)行步驟如下:①

判斷條件是否成立。如果條件成立,則執(zhí)行循環(huán)體;否則轉(zhuǎn)到③執(zhí)行。②

執(zhí)行到Loop語句,轉(zhuǎn)到①執(zhí)行。③

執(zhí)行Loop語句后面的語句。3.Do

Loop語句PrivateSubCommand1_Click()DimiAsInteger,nAsIntegerDimsAslong

i=1s=1 n=Text1.ValueDoWhilei<=ns=s*ii=i+1LoopText2.Value=s EndSub【例9-14】求n!的階乘,n!=1×2×

×n

程序代碼運行時,如果輸入整數(shù)對應的階乘的結(jié)果超出Long長整型變量的范圍,系統(tǒng)會出現(xiàn)“溢出”錯誤的提示,所以需要注意輸入的整數(shù)范圍。語句格式:Do

循環(huán)體LoopWhile條件表達式(2)Do

LoopWhile①

執(zhí)行循環(huán)體語句。②

執(zhí)行到Loop語句,判斷條件是否成立。如果條件成立,則轉(zhuǎn)到①執(zhí)行;如果條件不成立,則結(jié)束循環(huán),執(zhí)行l(wèi)oop語句后面的語句。循環(huán)體語句條件表達式真假Do

LoopWhile語句的執(zhí)行步驟PrivateSubCommand1_Click()Dimscore,iAsInteger,totalAsSingle,averAsSingletotal=0i=1Doscore=Val(InputBox("請輸入成績:")) total=total+score i=i+1LoopWhilei<=10aver=total/10 MsgBox"平均成績?yōu)椋?&Str(aver) EndSub【例9-15】輸入10個學生的成績,求出平均成績并輸出顯示。在程序設計中通常將某些反復使用的程序段定義成子過程,在程序中需要使用這些程序段時,調(diào)用相應的子過程,達到簡化程序設計的目的,實現(xiàn)了程序的復用。1.子過程聲明子過程聲明語句格式:[Public|Private][Static]Sub子過程名([形參列表])

語句序列EndSubPublic表示在程序的任何地方都可以調(diào)用該過程Private表示該過程只能被同一模塊中的其他過程調(diào)用9.7VBA自定義過程Sub子過程的調(diào)用有兩種格式格式一:

子過程名[實參列表]格式二:Call子過程名[(實參列表)]2.子過程調(diào)用子過程swap的代碼:PublicSubswap(xAsInteger,yAsInteger)DimtAsIntegert=xx=yy=tEndSub【例9-16】定義一個子過程swap,實現(xiàn)將兩個參數(shù)的值進行交換。并在一個窗體中調(diào)用該子過程。PrivateSubCommand1_Click()DimaAsInteger,bAsIntegera=Text1.Valueb=Text2.Valueswapa,b Text1.Value=aText2.Value=bEndSub調(diào)用子過程swap命令按鈕Command1的單擊事件代碼9.7.2函數(shù)聲明和調(diào)用函數(shù)也是一種過程VBA中提供了大量的可以直接使用的標準函數(shù),用戶也可以根據(jù)自己的需要來定義函數(shù)以實現(xiàn)某些特定的功能Sub子過程與Function函數(shù)之間的區(qū)別是:

Sub子過程沒有返回值

Function函數(shù)有返回值。1.函數(shù)聲明函數(shù)聲明的格式如下。[Public|Private]Function函數(shù)名([形參列表])As返回值數(shù)據(jù)類型

語句序列EndFunction2.函數(shù)調(diào)用由于函數(shù)過程會返回一個值,所以函數(shù)過程不能作為單獨的語句進行調(diào)用,必須作為表達式或表達式的一部分使用。函數(shù)最簡單的調(diào)用形式是將其返回值賦值給某個變量,格式如下。變量=函數(shù)名([實參列表])【例9-17】計算m!-n!。輸入兩個整數(shù),計算兩個數(shù)階乘的差,編寫函數(shù)實現(xiàn)求階乘求階乘函數(shù)f的代碼如下。PublicFunctionf(nAsInteger)AsLong '求階乘的函數(shù),返回值為長整型

DimiAsInteger

f=1

Fori=1Ton

f=f*i '與函數(shù)名同名的變量值作為函數(shù)的返回值

NextiEndFunction命令按鈕單擊事件的代碼如下。

PrivateSubCommand1_Click()

DimmAsInteger,nAsInteger

DimcaAslong

m=Text1.Value

n=Text2.Value

ca=f(m)-f(n) '兩次調(diào)用f函數(shù)求階乘

Text3.Value=caEndSub9.9VBA數(shù)據(jù)庫編程9.9.1ADO概述VBA通過數(shù)據(jù)庫引擎工具來支持對數(shù)據(jù)庫的訪問。數(shù)據(jù)庫引擎是應用程序與物理數(shù)據(jù)庫之間的橋梁,通過接口的方式,用戶可以使用相同的數(shù)據(jù)訪問和處理方式訪問不同類型的數(shù)據(jù)庫。主要的接口技術有:ODBCAPI(開放數(shù)據(jù)庫互聯(lián)應用編程接口)DAO(數(shù)據(jù)訪問對象)ADO(ActiveX數(shù)據(jù)對象)ADO是DAO的后繼產(chǎn)物,擴展了DAO的層次對象模型,簡單易用,是當前數(shù)據(jù)庫開發(fā)的主流接口技術。9.9VBA數(shù)據(jù)庫編程1.ADOADO(ActiveXDataObject,ActiveX數(shù)據(jù)訪問對象)是Microsoft公司提供的通用數(shù)據(jù)庫訪問技術。ADO是基于組件的數(shù)據(jù)庫編程接口,是一個與編程語言無關的COM組件系統(tǒng)。使用它可以很方便地連接符合ODBC標準的數(shù)據(jù)庫。ADO編程模型定義一組對象,用于訪問和更新數(shù)據(jù)源。它提供一系列方法完成連接數(shù)據(jù)源、執(zhí)行查詢命令、添加記錄、更新記錄、刪除記錄等操作。2.在VBA中引用ADO類庫

ADO采用面向?qū)ο蠓椒ㄔO計,在VBA中使用ADO的組件對象,需要先引用ADO類庫。引用設置操作步驟如下。(1)在VBE窗口中選擇“工具”菜單中的“引用”選項,打開“引用”對話框。(2)在“可使用的引用”列表框中勾選“MicrosoftActiveXDataObjects6.1Library”復選框。(3)單擊“確定”按鈕完成引用。9.9.2ADO主要對象使用ADO實現(xiàn)對數(shù)據(jù)庫的訪問時,要先創(chuàng)建對象實例,再通過對象實例的屬性和方法進行操作。ADO的對象模型采用分層結(jié)構(gòu),經(jīng)常使用的對象有Connection對象、Command對象和Recordset對象。1.Connection對象Connection對象的作用是建立與數(shù)據(jù)源的連接,只有連接成功后才能訪問數(shù)據(jù)源。(1)定義Connection對象要創(chuàng)建數(shù)據(jù)源的連接,先定義一個Connection對象,其方法為:Dim對象名AsADODB.ConnectionSet對象名=NewADODB.Connection例如:創(chuàng)建一個名為cnn的連接DimcnnAsADODB.ConnectionSetcnn=NewADODB.Connection可以合并為一條語句。DimcnnAsNewADODB.Connection(2)Connection對象的方法主要有Open、Execute和Close。①Open方法:創(chuàng)建連接后調(diào)用Open方法打開這個連接。②

Execute方法:用于執(zhí)行指定的SQL語句。③Close方法:關閉與數(shù)據(jù)庫的連接。例如:關閉cnn連接。cnn.Close創(chuàng)建成功后,可以用Provider屬性設置OLE-DB數(shù)據(jù)提供者的名稱;用ConnectionString屬性指定數(shù)據(jù)源的信息。例如:cnn.Provider="Microsoft.ACE.OLEDB.12.0"cnn.ConnectionString="DataSource=D:\學生成績管理.accdb"如果連接的是當前數(shù)據(jù)庫,可以使用一條語句替換以上的兩條語句。Setcnn=CurrentProject.Connection例如:打開cnn連接。cnn.Open3.Recordset對象

Recordset記錄集對象是最常用的ADO對象,從數(shù)據(jù)源獲取的數(shù)據(jù)存放在Recordset記錄集對象中可以使用Recordset記錄集對象的方法和屬性定位到數(shù)據(jù)行,查看數(shù)據(jù)行中的值或操作記錄集中的數(shù)據(jù)。(1)建立Recordset記錄集對象方法為:Dim對象名AsADODB.RecordsetSet對象名=NewADODB.Recordset例如:創(chuàng)建一個名為rs的記錄集對象。DimrsAsADODB.RecordsetSetrs=NewADODB.Recordset可以兩條語句合并為一條語句。DimrsAsNewADODB.Recordset(2)打開Recordset對象Open方法用來打開Recordset記錄集對象,其方法為:對象名.OpenSource,ActiveConnection,CursorType,LockType,Options其中:Source:指定所打開的記錄源信息,可以是SQL命令、表名等。ActiveConnection:指定所用的連接,可以是Connection對象。通常連接的是當前數(shù)據(jù)庫,使用的參數(shù)為:CurrentProject.Connection。CursorType:指定記錄集中游標的移動方式。游標可以控制記錄的定位,游標指向的記錄稱為當前記錄,其參數(shù)和說明如表9-6所示。LockType:指定編輯過程中當前記錄的鎖定類型,是可選項。Options:指定計算Source參數(shù)的方式,是可選項。3.Command對象

連接到數(shù)據(jù)庫后,Command對象的作用是定義并執(zhí)行針對數(shù)據(jù)源運行的具體命令,如SQL查詢。它可以通過Recordset對象返回一個滿足條件的記錄集,其格式為:Dim對象名AsADODB.CommandSet對象名=NewADODB.Command創(chuàng)建一個Command對象后,通過設置Command對象的ActiveConnection屬性連接數(shù)據(jù)庫(如,CurrentProject.Connection連接當前數(shù)據(jù)庫);再通過使用CommandText屬性來定義命令(如SQL語句)的可執(zhí)行文本;最后調(diào)用Command對象的Execute方法執(zhí)行命令并返回記錄集。例如:執(zhí)行CommandText的SQL命令(查詢學生的姓名、性別、入學總分)后,將查詢結(jié)果存儲到rs的記錄集中。DimcmdAsNewADODB.Commandcmd.ActiveConnection=CurrentProject.Connectioncmd.CommandText="Select姓名,性別,入學總分From學生表"Setrs=cmd.Execute4.Field對象除了三個主要的對象外,可能會使用到Field字段對象,它包含Recordset記錄集對象中的某一列信息,Recordset對象的每一列對應一個Field對象。Field對象的常用屬性有:Name(字段名稱)Value(字段值)9.9.3操作記錄集中的數(shù)據(jù)1.瀏覽記錄集中的數(shù)據(jù)(1)BOF屬性和EOF屬性BOF屬性用于檢查當前游標是否在第一條記錄之前,如果是,返回True;否則返回False。EOF屬性用于檢查當前游標是否在最后一條記錄之后即記錄集的末尾,如果是,返回True;否則返回False。如果記錄集為空,則BOF和EOF的值均為True。(2)Filter屬性Filter屬性用來指定記錄集的過濾條件,只有滿足條件的記錄才會被篩選出來。例如:在rs的記錄集中篩選出性別為“女”的學生信息。rs.Filter="性別=

"(3)移動游標的方法打開某個記錄集時,記錄指針自動指向第一條記錄。Recordset記錄集對象提供了以下幾種方法控制游標在記錄集中移動的方式。MoveFirst:將游標移到第一條記錄。MoveLast:將游標移到最后一條記錄。MoveNext:將游標移到當前記錄的下一條記錄。MovePrevious:將游標移到當前記錄的上一條記錄。【例9-18】

在模塊中編寫子過程,顯示學生表中女生的姓名、性別和入學總分

子過程p的代碼如下。PrivateSubp()DimrsAsNewADODB.RecordsetDimcmdAsNewADODB.Commandcmd.ActiveConnection=CurrentProject.Connection‘連接當前數(shù)據(jù)庫cmd.CommandText="select姓名,性別,入學總分from學生表"

‘定義命令Setrs=cmd.Execute‘執(zhí)行命令,返回記錄集rs.Filter="性別='女'"‘設置篩選條件,篩選出女學生DoWhileNotrs.EOFDebug.Printrs("姓名"),rs("性別"),rs("入學總分")‘在立即窗口中輸出當前記錄rs.MoveNext‘游標移動到下一條記錄Looprs.CloseEndSub

勾選“MicrosoftActiveXDataObjects6.1Library”復選框2.編輯記錄集中的數(shù)據(jù)

可以使用以下的方法實現(xiàn)對記錄集的添加、刪除和更新操作。(1)AddNew方法AddNew方法用于在Recordset記錄集對象中添加一條記錄,其格式為:對象名.AddNewFieldList,Values其中:FieldList是字段名稱,Values是字段值。這兩項均為可選項。如果缺省這兩個參數(shù),則在記錄集中添加一條空白記錄。(2)Delete方法Delete方法用于刪除Recordset記錄集對象中的一條或多條記錄,其格式為:對象名.DeleteAffectRecords其中:AffectRecords默認值為1,只刪除當前記錄;如果值為2,則刪除符合Filter屬性的多條記錄。(3)Update方法Update方法用于將Recordset記錄集對象中對當前記錄的修改保存到數(shù)據(jù)庫表中,其格式為:對象名.Update對Recordset記錄集對象中的記錄進行修改、刪除或添加了新記錄后,必須使用Update方法才能保存到數(shù)據(jù)庫表中;否則數(shù)據(jù)庫表中數(shù)據(jù)沒有改變?!纠?-19】在窗體中輸入課程編號和課程名稱后,在課程表中添加一條記錄。

PrivateSubCommand0_Click()DimrsAsADODB.RecordsetSetrs=NewADODB.RecordsetDimstrsqlAsStringDimkcbhAsString,kcmcAsStringstrsql="Select*From課程表"rs.Openstrsql,CurrentProject.Connection,adOpenKeyset,adlockoptimistickcbh=Text1.Valuekcmc=Text2.Valuers.AddNew‘添加空白記錄rs("課程編號")=kcbh‘將輸入的數(shù)據(jù)填入記錄集的空白記錄中rs("課程名稱")=kcmcrs.Update‘將數(shù)據(jù)集更新到數(shù)據(jù)庫表中rs.CloseEndSub【例9-21】輸入課程名稱,統(tǒng)計選修了該課程的各分數(shù)段的人數(shù)。

PrivateSubCommand0_Click()DimrsAsNewADODB.RecordsetDimstrsqlAsString,nameAsStringDimk1AsInteger,k2AsInteger,k3AsInteger,k4AsInteger,k5AsIntegerDimfldAsADODB.Fieldname=Text0.Valuestrsql="Select成績From課程表InnerJoin選課成績表On課程表.課程編號=選課成績表.課程編號Where課程名稱='"&name&"'"rs.Openstrsql,CurrentProject.Connection,adOpenDynamic,adLockOptimistic,adCmdTextSetfld=rs.Fields("成績")DoWhileNotrs.EOFSelectCasefld.Value

CaseIs>=90k1=k1+1Case80To89k2=k2+1Case70To79k3=k3+1Case60To69k4=k4+1CaseElsek5=k5+1EndSelectrs.MoveNextLoopText1.Value=k1Text2.Value=K2Text3.Value=K3Text4.Value=k4Text5.Value=k5rs.CloseEndSubPrivateSubText2_GotFocus()Di

溫馨提示

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

評論

0/150

提交評論