版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第8章模塊與VBA程序設(shè)計(jì)模塊與VBA程序設(shè)計(jì)概述
VBA編程基礎(chǔ)VBA程序流程控制
VBA數(shù)組VBA模塊的創(chuàng)建
VBA程序的調(diào)試VBA的數(shù)據(jù)庫(kù)編程18.1模塊與VBA程序設(shè)計(jì)概述
8.1.1模塊類型8.1.2模塊組成8.1.3VBA編程環(huán)境8.1.4面向?qū)ο蟪绦蛟O(shè)計(jì)的概念2模塊是Access數(shù)據(jù)庫(kù)中的一個(gè)數(shù)據(jù)庫(kù)對(duì)象,它以VBA語(yǔ)言為基礎(chǔ)編寫。通俗來說,模塊是Access數(shù)據(jù)庫(kù)中用于保存VBA程序代碼的容器。模塊基本上是由聲明、語(yǔ)句和(Sub和Function)過程組成的集合,它們作為一個(gè)已命名的單元存儲(chǔ)在一起,對(duì)VBA程序代碼進(jìn)行組織。38.1模塊與VBA程序設(shè)計(jì)概述
BASICBeginner’sAll-purposeSymbolicInstructionCode初學(xué)者萬(wàn)用符號(hào)指令代碼VBA
VisualBasicforApplicationMicrosoftOffice內(nèi)置的編程語(yǔ)言是根據(jù)VB簡(jiǎn)化的宏語(yǔ)言,其基本語(yǔ)法、詞法與VB基本相同,具有簡(jiǎn)單、易學(xué)的特點(diǎn)。8.1.1模塊類型Access有兩種類型的模塊:標(biāo)準(zhǔn)模塊和類模塊。1.標(biāo)準(zhǔn)模塊標(biāo)準(zhǔn)模塊包含與任何其他對(duì)象都無(wú)關(guān)的常規(guī)過程,以及可以從數(shù)據(jù)庫(kù)任何位置運(yùn)行的經(jīng)常使用的過程。在標(biāo)準(zhǔn)模塊中,可以放置希望供整個(gè)數(shù)據(jù)庫(kù)的其他過程使用的Sub過程和Function過程。標(biāo)準(zhǔn)模塊中的公共變量或公共過程具有全局特性,其作用范圍在整個(gè)應(yīng)用程序里,生命周期是伴隨著應(yīng)用程序的運(yùn)行而開始、關(guān)閉而結(jié)束。48.1模塊與VBA程序設(shè)計(jì)概述
1.類模塊
類模塊是可以包含新對(duì)象的定義的模塊。一個(gè)類的每個(gè)實(shí)例都新建一個(gè)對(duì)象。窗體模塊和報(bào)表模塊都是類模塊,它們從屬于各自的窗體和報(bào)表。窗體模塊和報(bào)表模塊通常都含有事件過程,而過程的運(yùn)行用于響應(yīng)窗體或報(bào)表上的事件。窗體模塊和報(bào)表模塊中的過程可以調(diào)用標(biāo)準(zhǔn)模塊中已經(jīng)定義好的過程。為窗體或報(bào)表創(chuàng)建第一個(gè)事件過程時(shí),Access將自動(dòng)創(chuàng)建與之關(guān)聯(lián)的窗體模塊或報(bào)表模塊。類模塊具有局部特性,其作用范圍局限在所屬窗體或報(bào)表內(nèi)部,而生命周期則是伴隨著窗體或報(bào)表的打開而開始、關(guān)閉而結(jié)束58.1模塊與VBA程序設(shè)計(jì)概述
8.1.2模塊的組成
模塊是裝著VBA代碼的容器。一個(gè)模塊包含一個(gè)聲明區(qū)域,包含一個(gè)或多個(gè)過程。如下圖所示。過程是模塊的單元組成,用VBA代碼編寫而成。過程分為Sub過程和Function過程兩種類型。68.1模塊與VBA程序設(shè)計(jì)概述
8.1.3VBA編程環(huán)境在Office中使用的VBA開發(fā)界面被稱為VBE具有編輯、調(diào)試和編譯VisualBasic程序的功能78.1模塊與VBA程序設(shè)計(jì)概述
切換到VBE環(huán)境方法1:“創(chuàng)建”-“宏與代碼”-“VisualBasic”方法2:Alt+F11方法3:設(shè)計(jì)窗體、報(bào)表時(shí)轉(zhuǎn)到VBE環(huán)境88.1模塊與VBA程序設(shè)計(jì)概述
代碼窗口立即窗口工程資源管理器屬性窗口標(biāo)準(zhǔn)工具欄98.1.4面向?qū)ο蟪绦蛟O(shè)計(jì)的概念VBA采用了面向?qū)ο蟮某绦蛟O(shè)計(jì)方法。對(duì)象:在采用面向?qū)ο蟪绦蛟O(shè)計(jì)方法的程序中,程序被抽象成了一個(gè)個(gè)對(duì)象,每個(gè)對(duì)象具有各自的屬性、方法和事件類:是對(duì)一類相似對(duì)象的定義和描述。因此類可看做是對(duì)象的模板,每個(gè)對(duì)象由類來定義。對(duì)象集合:是由一組對(duì)象組成的集合,這些對(duì)象的類型可以相同,也可以不同。108.1模塊與VBA程序設(shè)計(jì)概述
常用對(duì)象對(duì)象名稱說明Application應(yīng)用程序,即AccessDebug該對(duì)象可在調(diào)試階段用Print方法在立即窗口輸出信息Forms所有處于打開狀態(tài)的窗體構(gòu)成的集合Reports所有處于打開狀態(tài)的報(bào)表構(gòu)成的集合Screen屏幕對(duì)象Docmd使用該對(duì)象可從VisualBasic中運(yùn)行Access操作118.1模塊與VBA程序設(shè)計(jì)概述
8.1.4面向?qū)ο蟪绦蛟O(shè)計(jì)的概念屬性:用來表示對(duì)象的狀態(tài),如窗體的Name(名稱)屬性、Caption(標(biāo)題)屬性等。方法:用來描述對(duì)象的行為,如窗體有Refresh方法,Debug對(duì)象有Print方法等。引用對(duì)象的屬性或方法時(shí)應(yīng)該在屬性名或方法名前加對(duì)象名,并用對(duì)象引用符“.”連接。128.1模塊與VBA程序設(shè)計(jì)概述
8.1.4面向?qū)ο蟪绦蛟O(shè)計(jì)的概念事件:是對(duì)象可以識(shí)別的動(dòng)作,通常由系統(tǒng)預(yù)先定義事件過程:對(duì)象在識(shí)別了所發(fā)生的事件后執(zhí)行的程序PrivateSubCommand1_Click()Me!Label1.Caption=“學(xué)校名稱:"Me!Text0=“湖北汽車工業(yè)學(xué)院"EndSub138.1模塊與VBA程序設(shè)計(jì)概述
PrivateSubCommand1_Click()Me!Label1.Caption="學(xué)校名稱:"Me!Text0="湖北汽車工業(yè)學(xué)院"EndSub8.2.1數(shù)據(jù)類型8.2.2常量8.2.3變量8.2.4函數(shù)8.2.5表達(dá)式148.2VBA編程基礎(chǔ)8.2.1數(shù)據(jù)類型VBA的數(shù)據(jù)類型共有13種存儲(chǔ)時(shí)所占的存儲(chǔ)空間和處理時(shí)能夠進(jìn)行的運(yùn)算都不相同158.2VBA編程基礎(chǔ)數(shù)據(jù)類型存儲(chǔ)字節(jié)范圍Byte(字節(jié)型)10~255Boolean(布爾型)2True或FalseInteger(整型)2?32768~+32767Long(長(zhǎng)整型)4?2147483648~2147483647Single(單精度型)4負(fù)數(shù):?3.402823×1038~?1.401298×10-45正數(shù):1.401298×10-45~3.402823×1038Double(雙精度型)8負(fù)數(shù):?1.79769313486232E308~?4.94065645841247E?324正數(shù):4.94065645841247E?324~
1.79769313486232E308Decimal(小數(shù)型)12與小數(shù)點(diǎn)右邊的數(shù)字個(gè)數(shù)有關(guān)168.2VBA編程基礎(chǔ)數(shù)據(jù)類型存儲(chǔ)字節(jié)范圍Currency(貨幣型)8?922337203685447.5808~922337203685447.5807Date(日期型)8100年1月1日~9999年12月31日String(字符型)與字符串的字長(zhǎng)有關(guān)定長(zhǎng):1~65400變長(zhǎng):0~20億Object(對(duì)象型)4任何對(duì)象引用Variant(變體型)與具體數(shù)據(jù)類型有關(guān)每個(gè)元素?cái)?shù)據(jù)類型的范圍自定義型各元素所需字節(jié)之和續(xù)表178.2VBA編程基礎(chǔ)8.2.2常量其值在程序運(yùn)行期間不變的量字面常量符號(hào)常量固有常量188.2VBA編程基礎(chǔ)8.2.2常量其值在程序運(yùn)行期間不變的量字面常量(1)各種數(shù)字型常量(2)字符型常量(3)日期型常量(4)布爾型常量198.2VBA編程基礎(chǔ)8.2.2常量其值在程序運(yùn)行期間不變的量符號(hào)常量可以定義用符號(hào)代替常量。如果程序中多處用到某個(gè)常量,將其定義成符號(hào)常量可增加代碼的可讀性,也便于維護(hù)。關(guān)鍵字ConstConstPIassingle=3.1415926208.2VBA編程基礎(chǔ)8.2.2常量其值在程序運(yùn)行期間不變的量固有常量一類特殊的符號(hào)常量,通常已經(jīng)預(yù)先在類庫(kù)中定義好,編程者只要直接使用這些已經(jīng)定義好的符號(hào)常量即可.例如:VBA類庫(kù)中定義的顏色常量vbRed代表紅色vbBlue代表藍(lán)色218.2VBA編程基礎(chǔ)8.2.3變量其值在程序運(yùn)行期間變化的量變量的聲明格式為:Dim變量名[AS類型]如果省略“AS類型”,則所定義的變量為Variant型。建議在程序中顯式聲明變量228.2VBA編程基礎(chǔ)8.2.4函數(shù)大量的內(nèi)置函數(shù)極大地豐富了VBA的功能函數(shù)名參數(shù)(指參數(shù)的個(gè)數(shù)、順序和類型)函數(shù)值238.2VBA編程基礎(chǔ)8.2.4函數(shù)大量的內(nèi)置函數(shù)極大地豐富了VBA的功能按照函數(shù)的功能,VBA的內(nèi)置函數(shù)可分為數(shù)學(xué)函數(shù)字符串函數(shù)日期函數(shù)轉(zhuǎn)換函數(shù)248.2VBA編程基礎(chǔ)MsgBox函數(shù)
MsgBox(提示[,按鈕、圖標(biāo)和默認(rèn)按鈕][,標(biāo)題])258.2VBA編程基礎(chǔ)InputBox函數(shù)
InputBox(提示[,標(biāo)題][,默認(rèn)])268.2VBA編程基礎(chǔ)8.2.5表達(dá)式表達(dá)式是將常量、變量、字段名稱、控件的屬性值和函數(shù)用運(yùn)算符連接而成的運(yùn)算式算術(shù)表達(dá)式字符表達(dá)式關(guān)系表達(dá)式布爾表達(dá)式對(duì)象引用表達(dá)式278.2VBA編程基礎(chǔ)8.2.5表達(dá)式算術(shù)運(yùn)算式288.2VBA編程基礎(chǔ)8.2.5表達(dá)式算術(shù)運(yùn)算式字符串表達(dá)式&—作用是連接兩個(gè)字符串298.2VBA編程基礎(chǔ)8.2.5表達(dá)式算術(shù)運(yùn)算式字符串表達(dá)式關(guān)系表達(dá)式運(yùn)算符意義示例結(jié)果<小于5<2False<=小于等于5<=2False>大于5>2True>=大于等于5>=2True=相等5=2False<>不等5<>2TrueLike字符串匹配"This"Like"*is"True308.2VBA編程基礎(chǔ)8.2.5表達(dá)式算術(shù)運(yùn)算式字符串表達(dá)式關(guān)系表達(dá)式布爾表達(dá)式運(yùn)算符意義示例結(jié)果優(yōu)先級(jí)Not非,將True變False或?qū)alse變TrueNotTrueFalse3And與,兩邊都是真,結(jié)果才為真5>2And“ab”=“bc”False2Or或,兩邊有一個(gè)為真,結(jié)果就為真5>2Or“ab”=“abc”True1318.2VBA編程基礎(chǔ)對(duì)象引用表達(dá)式運(yùn)算符意義示例示例說明!引用某個(gè)對(duì)象,該對(duì)象通常由用戶定義Forms![系統(tǒng)登錄]引用Forms集合中的“系統(tǒng)登錄”窗體.引用對(duì)象的屬性或方法,該屬性或方法通常由Access定義Forms![系統(tǒng)登錄].visible引用Forms集合中的“系統(tǒng)登錄”窗體的visible屬性328.2VBA編程基礎(chǔ)8.3VBA程序流程控制8.3.1程序的順序控制8.3.2程序的分支控制8.3.3程序的循環(huán)控制338.3VBA程序流程控制程序由語(yǔ)句組成語(yǔ)句由關(guān)鍵字、標(biāo)識(shí)符、運(yùn)算符和表達(dá)式組成每條語(yǔ)句指明了計(jì)算機(jī)要進(jìn)行的具體操作按照語(yǔ)句所執(zhí)行的功能,有賦值語(yǔ)句聲明語(yǔ)句控制語(yǔ)句注釋語(yǔ)句348.3VBA程序流程控制賦值語(yǔ)句給變量或?qū)ο蟮膶傩再x值<變量名>=<表達(dá)式>或
<對(duì)象名.屬性>=<表達(dá)式>358.2VBA編程基礎(chǔ)8.3.1程序的順序控制程序的三種基本控制結(jié)構(gòu)順序結(jié)構(gòu)分支結(jié)構(gòu)循環(huán)結(jié)構(gòu)36例8-1創(chuàng)建如圖8-5所示的窗體“計(jì)算圓的面積和周長(zhǎng)”。要求在文本框中輸入了圓的半徑后,單擊“計(jì)算”按鈕,在窗體的另外兩個(gè)文本框中分別輸出圓的面積和周長(zhǎng)。8.3VBA程序流程控制37“計(jì)算”按鈕的Click事件過程如下。PrivateSubcmd計(jì)算_Click()'定義變量和符號(hào)常量DimrAsSingle'r為圓的半徑DimsAsSingle's為圓的面積DimlAsSingle'l為圓的周長(zhǎng)ConstPIAsSingle=3.1415926'給變量r賦值r=Me!txt半徑'計(jì)算圓的面積和周長(zhǎng)s=PI*r^2l=2*PI*r'用文本框輸出結(jié)果Me!txt面積=sMe!txt周長(zhǎng)=lEndSub8.3VBA程序流程控制388.3VBA程序流程控制8.3.2
程序的分支控制用條件來控制語(yǔ)句的執(zhí)行有If語(yǔ)句和SelectCase語(yǔ)句39If…Then…Else語(yǔ)句語(yǔ)句格式為If<表達(dá)式>Then<語(yǔ)句塊1>Else<語(yǔ)句塊2>EndIf‘輸入兩個(gè)數(shù)并在立即窗口輸出其中較大的數(shù)DimxAsInteger,yAsIntegerx=InputBox("請(qǐng)輸入x的值:")y=InputBox("請(qǐng)輸入y的值:")Ifx>yThenDebug.PrintxElseDebug.PrintyEndIf8.3VBA程序流程控制40<表達(dá)式>可以是任何表達(dá)式,一般為關(guān)系表達(dá)式或布爾表達(dá)式。如果是其他表達(dá)式,則非0認(rèn)為是True,0認(rèn)為是False。執(zhí)行時(shí),先判斷表達(dá)式的值,為True則執(zhí)行語(yǔ)句塊1,否則執(zhí)行語(yǔ)句塊2。如果語(yǔ)句較短Ifx>yThenDebug.PrintxElseDebug.Printy使用過程中有時(shí)沒有語(yǔ)句塊2,這時(shí)If語(yǔ)句變?yōu)閱畏种ЫY(jié)構(gòu)。8.3VBA程序流程控制41例8-2用VBA程序?qū)崿F(xiàn)窗體“系統(tǒng)登錄”8.3VBA程序流程控制42“確定”按鈕的Click事件過程PrivateSubcmd確定_Click()DimnameAsString,passAsStringDimrAsInteger'存放MsgBox消息框的返回值
name=Me!txt用戶名
pass=Me!txt口令
Ifpass="1234"Andname="cueb"Then
'如果用戶名和口令正確,顯示消息框,運(yùn)行"學(xué)生管理模塊"窗體
MsgBox"歡迎進(jìn)入學(xué)生管理模塊!",vbOKOnly+vbCritical,"歡迎"DoCmd.Close '關(guān)閉系統(tǒng)登錄窗體
DoCmd.OpenForm"學(xué)生管理模塊" '打開"學(xué)生管理模塊"窗體
ElseMsgBox"密碼錯(cuò)誤!",vbOKOnly '顯示消息框
Me!txt用戶名="" '使文本框清空
Me!txt口令=""Me!txt用戶名.SetFocus '使文本框獲得焦點(diǎn),準(zhǔn)備重新輸入
EndIfEndSub43If…Then…ElseIf語(yǔ)句
If<表達(dá)式1>Then<語(yǔ)句塊1>ElseIf<表達(dá)式2>Then<語(yǔ)句塊2>… [ElseIf<表達(dá)式n>Then<語(yǔ)句塊n>Else<語(yǔ)句塊n+1>]EndIf運(yùn)行時(shí),從表達(dá)式1開始逐個(gè)測(cè)試條件,當(dāng)找到第一個(gè)為True的條件時(shí),即執(zhí)行該條件后所對(duì)應(yīng)的語(yǔ)句塊。8.3VBA程序流程控制44例8-3編程根據(jù)輸入的學(xué)生成績(jī),評(píng)定其等級(jí)。標(biāo)準(zhǔn)是90~100“優(yōu)秀”80~89“良好”70~79“中等”60~69“及格”60分以下“不合格”。8.3VBA程序流程控制45PublicSubgc1()DimxAsIntegerx=InputBox("請(qǐng)輸入成績(jī):")Ifx>=90ThenDebug.Print"優(yōu)秀"ElseIfx>=80ThenDebug.Print"良好"ElseIfx>=70ThenDebug.Print"中等"ElseIfx>=60ThenDebug.Print"及格"ElseDebug.Print"不及格"EndIfEndSubSelectCase語(yǔ)句
SelectCase<變量或表達(dá)式>Case<表達(dá)式列表1>
語(yǔ)句塊1Case<表達(dá)式列表2>
語(yǔ)句塊2…[CaseElse
語(yǔ)句塊n+1]EndSelect8.3VBA程序流程控制46SelectCase后只能是數(shù)值型或字符型表達(dá)式。執(zhí)行過程:先計(jì)算SelectCase后的變量或表達(dá)式的值,然后從上至下逐個(gè)比較,決定執(zhí)行哪一個(gè)語(yǔ)句塊語(yǔ)句中的各個(gè)表達(dá)式列表應(yīng)與SelectCase后的變量或表達(dá)式同類型。采用下面的形式表達(dá)式:a+5用逗號(hào)分隔的一組枚舉表達(dá)式:2,4,6,8表達(dá)式1To表達(dá)式260to100 Is關(guān)系運(yùn)算符表達(dá)式Is<608.3VBA程序流程控制47DimxAsIntegerx=InputBox("請(qǐng)輸入成績(jī):")SelectCasexCase90To100Debug.Print"優(yōu)秀"Case80To89Debug.Print"良好"Case70To79Debug.Print"中等"Case60To69Debug.Print"及格"CaseElseDebug.Print"不及格"EndSelect特別提示:SelectCase語(yǔ)句和If…Then…ElseIf語(yǔ)句并不完全等同。SelectCase語(yǔ)句適用于對(duì)一個(gè)條件的多個(gè)不同取值進(jìn)行測(cè)試的情況,而If…Then…ElseIf語(yǔ)句則可對(duì)多個(gè)條件進(jìn)行測(cè)試,因此后者的使用范圍更廣一些。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
'如果用戶名和口令正確,顯示消息框,運(yùn)行"學(xué)生管理模塊"窗體
MsgBox"歡迎進(jìn)入學(xué)生管理模塊!",vbOKOnly+vbCritical,"歡迎"DoCmd.Close '關(guān)閉系統(tǒng)登錄窗體
DoCmd.OpenForm"學(xué)生管理模塊"'打開"學(xué)生管理模塊"窗體
Elser=MsgBox("密碼錯(cuò)誤!要繼續(xù)嗎?",vbYesNo)'顯示消息框
Ifr=vbYesThen '繼續(xù)輸入
Me.txt用戶名=""'使文本框清空
Me.txt口令=""Me.txt用戶名.SetFocus '使文本框獲得焦點(diǎn),準(zhǔn)備重新輸入
Else '關(guān)閉窗體,不繼續(xù)輸入
DoCmd.CloseEndIfEndIfEndSub508.3VBA程序流程控制8.3.3
程序的循環(huán)控制稱重復(fù)控制結(jié)構(gòu)特點(diǎn)是程序執(zhí)行時(shí),該語(yǔ)句中的一部分操作即循環(huán)體被重復(fù)執(zhí)行多次有For語(yǔ)句Do…Loop語(yǔ)句51For循環(huán)語(yǔ)句For<循環(huán)變量>=<初值>to<終值>[Step<步長(zhǎng)>] <語(yǔ)句塊>[ExitFor]<語(yǔ)句塊>Next<循環(huán)變量>8.3VBA程序流程控制52循環(huán)控制變量的類型必須是數(shù)值型步長(zhǎng)可以是正數(shù),也可以是負(fù)數(shù)。如果步長(zhǎng)為1,Step短語(yǔ)可以省略根據(jù)初值、終值和步長(zhǎng),可以計(jì)算出循環(huán)的次數(shù),因此For語(yǔ)句一般用于循環(huán)次數(shù)已知的情況使用ExitFor語(yǔ)句可以提前退出循環(huán)8.3VBA程序流程控制53例8-4編程用For語(yǔ)句求1+2+3+…+10之和gc2的程序代碼PublicSubgc2()DimsAsInteger,iAsIntegers=0Fori=1To10Step1s=s+iNextiDebug.PrintsEndSub該循環(huán)的執(zhí)行過程如下。(1)首先給i賦初值1。(2)測(cè)試i是否超過終值10。如果沒有,則執(zhí)行累加;否則,退出循環(huán)轉(zhuǎn)到步驟(5)。(3)將i加上一個(gè)步長(zhǎng)。(4)重復(fù)步驟(2)和步驟(3)。(5)繼續(xù)執(zhí)行Next后面的語(yǔ)句。8.3VBA程序流程控制54Do…Loop循環(huán)語(yǔ)句形式1:Do{While|Until}<條件>
語(yǔ)句塊
[ExitDo]
語(yǔ)句塊Loop‘下面的程序用DoWhile…Loop語(yǔ)‘句求1+2+3…+10之和。DimsAsInteger,iAsIntegers=0:i=1DoWhilei<=10s=s+ii=i+1LoopDebug.Prints8.3VBA程序流程控制55這里的條件可以是任何類型的表達(dá)式,非0為真,0為假。執(zhí)行過程是:在每次循環(huán)開始時(shí)測(cè)試條件,對(duì)于DoWhile語(yǔ)句,如果條件成立,則執(zhí)行循環(huán)體的內(nèi)容,然后回到DoWhlie處準(zhǔn)備下一次循環(huán);否則,退出循環(huán)。對(duì)于DoUntile語(yǔ)句,則正好相反,當(dāng)條件滿足時(shí)退出循環(huán)。ExitDo語(yǔ)句的作用是提前終止循環(huán)。8.3VBA程序流程控制56與For語(yǔ)句相比,有下列幾點(diǎn)不同Do…Loop語(yǔ)句不僅可用于循環(huán)次數(shù)已知的情況,而且可用于循環(huán)次數(shù)未知的情況,因此適用的范圍更廣。Do…Loop語(yǔ)句沒有專門的循環(huán)控制變量,但一般應(yīng)有一個(gè)專門用來改變條件表達(dá)式中變量的語(yǔ)句,使得隨著循環(huán)的執(zhí)行,條件趨于不成立(或成立),最后達(dá)到退出循環(huán)。8.3VBA程序流程控制57形式2:Do
語(yǔ)句塊
[ExitDo]
語(yǔ)句塊Loop{While|Until}<條件>說明:和形式1不同的是,在每次循環(huán)結(jié)束時(shí)測(cè)試條件。因此,二者的區(qū)別是如果一開始循環(huán)條件就不成立,則形式1中的循環(huán)體部分一次也不執(zhí)行,而形式2中的循環(huán)體部分被執(zhí)行一次。8.3VBA程序流程控制58問題:下面的程序執(zhí)行結(jié)果是什么?控制循環(huán)執(zhí)行的判斷被執(zhí)行了幾次?‘下面的程序用Do…LoopWhile語(yǔ)‘句求1+2+3…+10之和。DimsAsInteger,iAsIntegers=0:i=1Dos=s+ii=i+1LoopWhilei<=10Debug.Prints8.3VBA程序流程控制59例8-5編程求兩個(gè)整數(shù)的最大公約數(shù)和最小公倍數(shù)
算法:設(shè)兩個(gè)整數(shù)分別為m和n,(1)保證m大于n,否則將m和n互換;(2)求m除以n的余數(shù)r;(3)若r不為0,則將n賦給m,r賦給n;(4)重復(fù)步驟(2)和步驟(3),直到r為0,此時(shí)最大公約數(shù)為n。將m和n互換的算法是借助于第3個(gè)變量t:t=m:m=n:n=t8.3VBA程序流程控制60gc3中的程序代碼。PublicSubgc3()DimnAsInteger,mAsInteger,tAsIntegerDimrAsInteger 'r為m/n的余數(shù)
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"最大公約數(shù)=",nDebug.Print"最小公倍數(shù)=",mn/nEndSub61循環(huán)嵌套Dowhile…Dowhile…Loop…LoopDowhile…if…Endif…Loop8.3VBA程序流程控制628.4.1數(shù)組的概念及定義8.4.2數(shù)組的應(yīng)用8.4VBA數(shù)組638.4VBA數(shù)組8.4.1數(shù)組的概念及定義問題:求10個(gè)成績(jī)的平均值,并對(duì)它們按照從大到小排序,這10個(gè)數(shù)怎么組織?放在10個(gè)變量中?放在一個(gè)數(shù)組中?如果在程序中要對(duì)一組數(shù)據(jù)進(jìn)行處理,通常的解決方法是將這組數(shù)放在數(shù)組中。64一維數(shù)組的定義使用數(shù)組必須先定義數(shù)組,格式為Dim數(shù)組名([<下界>to]<上界>)[As<數(shù)據(jù)類型>]所有數(shù)組元素具有同一個(gè)標(biāo)識(shí)即數(shù)組名,數(shù)組名后括號(hào)內(nèi)的序號(hào)稱為數(shù)組元素的下標(biāo)。(1)所有數(shù)組元素在內(nèi)存連續(xù)存放(2)根據(jù)下標(biāo)區(qū)分?jǐn)?shù)組元素8.4VBA數(shù)組65命名規(guī)則與變量名的命名規(guī)則相同。一般在定義數(shù)組時(shí)應(yīng)給出數(shù)組的上界和下界。但也可以省略下界,<下界>缺省為0。例如,Dima(10)AsSingle若希望下標(biāo)從1開始,可在模塊的通用聲明段聲明OptionBase0|1'后面的參數(shù)只能取0或1<下界>和<上界>不能使用變量,必須是常量。如果省略As子句,則數(shù)組的類型為Varient變體類型。8.4VBA數(shù)組66二維數(shù)組的定義
Dim數(shù)組名([<下界>to]<上界>,[<下界>to]<上界>)[As<數(shù)據(jù)類型>]例如,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數(shù)組67一旦定義了數(shù)組,就可以用前面介紹的對(duì)變量的處理方法處理數(shù)組,并且可以用循環(huán)語(yǔ)句對(duì)數(shù)組進(jìn)行處理,提高程序的可讀性。8.4VBA數(shù)組8.4.1數(shù)組的應(yīng)用68例8-5編程產(chǎn)生10個(gè)0-99之間的隨機(jī)數(shù),并找出其中的最大值和最小值用內(nèi)置函數(shù)Rnd()生成隨機(jī)數(shù):Int(Rnd()*100)8.4VBA數(shù)組69程序代碼如下:PublicSubgc4()Dima(1To10)AsIntegerDimiAsInteger,maxAsInteger,minAsInteger
'生成并輸出數(shù)組
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
'輸出結(jié)果
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數(shù)組例8-7
編程在立即窗口輸出所示矩陣71例8-8編程輸入5個(gè)整數(shù),并將這5個(gè)數(shù)按升序排序。有多種算法可以實(shí)現(xiàn)排序。本例采用選擇法,其基本思路如下。找出a(1)-a(5)中的最大值,放在a(1)中找出a(2)-a(5)中的最大值,放在a(2)中…找出a(4)-a(5)中的最大值,放在a(4)中問題歸結(jié)為尋找4次最大值8.4VBA數(shù)組72OptionBase1PublicSubgc6()Dimp(5)AsInteger'存放最小值的下標(biāo)
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"排序后:“
'輸出排序結(jié)果
Fori=1To5 Debug.Printp(i);NextiEndSub738.5.1VBA標(biāo)準(zhǔn)模塊8.5.2過程的創(chuàng)建和調(diào)用8.5.3函數(shù)的創(chuàng)建和調(diào)用8.5.4過程調(diào)用中的參數(shù)傳遞8.5.5局部變量、全局變量和靜態(tài)變量8.5VBA模塊的創(chuàng)建748.5VBA模塊的創(chuàng)建8.5.1VBA標(biāo)準(zhǔn)模塊VBA程序由模塊組成類模塊標(biāo)準(zhǔn)模塊758.5VBA模塊的創(chuàng)建標(biāo)準(zhǔn)模塊引用的代碼按照其是否有返回值可以被組織成Sub過程和Function函數(shù)標(biāo)準(zhǔn)模塊不與某個(gè)具體的對(duì)象相連,它的作用就是為其他模塊提供可共享的公共Sub過程和Function函數(shù)
768.5VBA模塊的創(chuàng)建創(chuàng)建標(biāo)準(zhǔn)模塊的方法(1)ACCESS:“創(chuàng)建”-“宏與代碼”-“模塊”(2)VBE:“插入”-“模塊”
778.5VBA模塊的創(chuàng)建8.5.2過程的創(chuàng)建和調(diào)用過程是一段可以實(shí)現(xiàn)某個(gè)具體功能的代碼與函數(shù)不同,過程沒有返回值可以在類模塊中,也可以在標(biāo)準(zhǔn)模塊中創(chuàng)建過程PublicSubswap(xAsInteger,yAsInteger)DimtAsIntegert=x:x=y:y=tEndSub788.5VBA模塊的創(chuàng)建過程的定義形式如下:[Public|Private][Static]Sub過程名(變量名1As類型,變量名2As類型,…)<局部變量或常數(shù)定義>
<語(yǔ)句塊>
[ExitSub]
<語(yǔ)句塊>EndSub過程名后括號(hào)內(nèi)的變量也叫形式參數(shù)。如果過程有形式參數(shù),則要在定義過程時(shí)指明形參的名稱和類型;如果省略類型,則形參的默認(rèn)類型為Varient型。798.5VBA模塊的創(chuàng)建創(chuàng)建過程的方法是:打開模塊菜單“插入”→“過程”
調(diào)用過程有以下兩種格式。格式1:call過程名([實(shí)參列表])格式2:過程名[實(shí)參列表]這里過程名后的參數(shù)叫實(shí)際參數(shù)。調(diào)用過程時(shí)應(yīng)注意實(shí)參應(yīng)與形參的順序、類型和個(gè)數(shù)保持一致。80例8-10創(chuàng)建一個(gè)窗體,在其中的某個(gè)按鈕的單擊事件中用InputBox函數(shù)輸入兩個(gè)整數(shù),然后調(diào)用過程swap將它們的值互換。按鈕的單擊事件如下:PrivateSubCommand0_Click()DimxAsInteger,yAsIntegerx=InputBox("x=")y=InputBox("y=")Debug.Printx,yswapx,y'或swap(x,y)Debug.Printx,yEndSub8.5VBA模塊的創(chuàng)建818.5VBA模塊的創(chuàng)建8.5.3函數(shù)的創(chuàng)建和調(diào)用函數(shù)有返回值函數(shù)的定義形式如下:[Public|Private][Static]Function過程名(變量名1As類型,變量名2As類型,…)As類型
<局部變量或常數(shù)定義>
<語(yǔ)句塊>
<函數(shù)名>=<表達(dá)式>[ExitFunction]
<語(yǔ)句塊>
<函數(shù)名>=<表達(dá)式>EndFunction828.5VBA模塊的創(chuàng)建例8-11在前面創(chuàng)建的標(biāo)準(zhǔn)模塊“模塊1”內(nèi)創(chuàng)建函數(shù)jc,函數(shù)的功能是返回一個(gè)數(shù)的階乘。另外創(chuàng)建一個(gè)過程test,在test過程內(nèi)調(diào)用函數(shù)jc。838.5VBA模塊的創(chuàng)建8.5.4過程調(diào)用中的參數(shù)傳遞在調(diào)用過程和函數(shù)的過程中,一般會(huì)發(fā)生數(shù)據(jù)的傳遞,即將主調(diào)過程中的實(shí)參傳給被調(diào)過程的形參傳址傳值848.5VBA模塊的創(chuàng)建傳址定義過程或函數(shù)時(shí),形參的變量名前不加任何前綴傳遞過程是:調(diào)用過程時(shí),將實(shí)參的地址傳給形參。因此如果在被調(diào)過程或函數(shù)中修改了形參的值,則主調(diào)過程或函數(shù)中實(shí)參的值也跟著變化。858.5VBA模塊的創(chuàng)建傳值定義過程或函數(shù)時(shí),形參的變量名前加ByVal前綴主調(diào)過程將實(shí)參的值復(fù)制后傳給被調(diào)過程的形參,因此如果在被調(diào)過程或函數(shù)中修改了形參的值,則主調(diào)過程或函數(shù)中實(shí)參的值不會(huì)跟著變化。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模塊的創(chuàng)建如果輸入5和7,程序的結(jié)果?878.5VBA模塊的創(chuàng)建8.5.5傳遞局部變量、全局變量和靜態(tài)變量變量的有效范圍即作用域按照作用域不同,VBA有局部變量模塊級(jí)局部變量全局變量888.5VBA模塊的創(chuàng)建過程內(nèi)局部變量在過程和函數(shù)內(nèi)用關(guān)鍵字Dim定義有效范圍是定義該變量的過程或函數(shù)
898.5VBA模塊的創(chuàng)建模塊級(jí)局部變量在模塊的通用聲明段用關(guān)鍵字Dim或Private定義有效范圍是定義該變量的模塊908.5VBA模塊的創(chuàng)建例8-12創(chuàng)建名為“排序”的窗體。運(yùn)行時(shí)自動(dòng)產(chǎn)生并在左面的列表框中輸出10個(gè)0~99之間的隨機(jī)數(shù),單擊“排序”按鈕后將這10個(gè)數(shù)按降序排序,并在右邊的列表框中輸出排序的結(jié)果。918.5VBA模塊的創(chuàng)建解題思路:(1)用數(shù)組存放10個(gè)隨機(jī)數(shù)。(2)在窗體的Load事件中生成數(shù)組中的10個(gè)隨機(jī)數(shù)(3)在“排序”按鈕的Click事件中將數(shù)組排序,因此該數(shù)組應(yīng)定義為模塊級(jí)數(shù)組。92Dima(1To10)AsInteger‘定義模塊級(jí)數(shù)組PrivateSubForm_Load()DimiAsInteger
'生成并輸出數(shù)組
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'輸出排序結(jié)果
Me.lst右.AddItema(i)NextiEndSub938.5VBA模塊的創(chuàng)建全局變量在整個(gè)應(yīng)用程序使用的變量在模塊的通用聲明段用Public關(guān)鍵字定義引用全局變量時(shí)在標(biāo)準(zhǔn)模塊中定義的全局變量,可在應(yīng)用程序的任何地方直接用變量名引用該變量在類模塊中定義的全局變量,可在應(yīng)用程序的任何地方用“模塊名.變量名”引用948.5VBA模塊的創(chuàng)建靜態(tài)變量決定變量的生存期對(duì)于過程內(nèi)的局部變量,它的生存期從進(jìn)入過程(Sub)開始,到退出過程(EndSub)時(shí)結(jié)束。如果要改變過程內(nèi)局部變量的生存期,可以將它定義為靜態(tài)變量定義的方法是在定義過程內(nèi)局部變量時(shí)加關(guān)鍵字Static958.5VBA模塊的創(chuàng)建例8-13制作一個(gè)“計(jì)時(shí)器”窗體。要求,該窗體運(yùn)行后首先單擊“設(shè)置”按鈕,然后在輸入框中輸入計(jì)時(shí)的秒數(shù),單擊“開始”按鈕則開始計(jì)時(shí),同時(shí)計(jì)時(shí)的秒數(shù)顯示在文本框中。當(dāng)計(jì)時(shí)時(shí)間到,停止計(jì)時(shí)并響鈴,同時(shí)將文本框清零。968.5VBA模塊的創(chuàng)建解題思路:(1)計(jì)時(shí)由窗體的Timer事件完成。(2)由于在“設(shè)置”按鈕的單擊事件和“開始”按鈕的單擊事件中都要用到計(jì)時(shí)范圍f,所以將變量f定義成模塊級(jí)變量。(3)變量s的作用是計(jì)時(shí),即每次Timer事件觸發(fā)時(shí)s的值要加1,所以將變量s定義成靜態(tài)變量。97DimfAsInteger ‘定義模塊級(jí)變量‘在窗體的Load事件中設(shè)置TimerInterval屬性為0PrivateSubForm_Load()Me.TimerInterval=0EndSub‘窗體的Timer事件PrivateSubForm_Timer()StaticsAsInteger '定義靜態(tài)變量
s=s+1Ifs=fThenBeep '響鈴
s=0Me.TimerInterval=0EndIfMe.txt顯示=sEndSub‘按鈕“cmd設(shè)置”的單擊事件PrivateSubcmd設(shè)置_Click()f=InputBox("請(qǐng)輸入計(jì)時(shí)范圍:")EndSub‘按鈕“cmd開始”的單擊事件PrivateSubcmd開始_Click()Me.TimerInterval=1000 '開始計(jì)時(shí)EndSub988.6VBA程序的調(diào)試8.6.1錯(cuò)誤類型8.6.2設(shè)置斷點(diǎn)8.6.3單步跟蹤8.6.4設(shè)置監(jiān)視點(diǎn)99中斷模式可以干什么?怎樣進(jìn)入?怎樣退出?8.6VBA程序的調(diào)試1008.6.1
錯(cuò)誤類型
語(yǔ)法錯(cuò)誤編譯錯(cuò)誤運(yùn)行錯(cuò)誤邏輯錯(cuò)誤8.6VBA程序的調(diào)試101調(diào)試窗口立即窗口本地窗口監(jiān)視窗口8.6VBA程序的調(diào)試1028.6.2
設(shè)置斷點(diǎn)
在程序中人為設(shè)置斷點(diǎn),使程序暫停運(yùn)行并進(jìn)入中斷狀態(tài)…8.6VBA程序的調(diào)試1038.6.3
單步跟蹤
設(shè)置單步跟蹤程序的運(yùn)行“調(diào)試”→“逐語(yǔ)句”8.6VBA程序的調(diào)試1048.6.4
設(shè)置監(jiān)視點(diǎn)
即設(shè)置監(jiān)視表達(dá)式。一旦監(jiān)視表達(dá)式的值為真或改變,程序自動(dòng)進(jìn)入中斷模式。“調(diào)試”→“添加監(jiān)視”8.6VBA程序的調(diào)試1058.7VBA的數(shù)據(jù)庫(kù)編程8.7.1數(shù)據(jù)訪問接口ADO8.7.2ADO的主要對(duì)象8.7.3使用記錄集中的數(shù)據(jù)1068.7.1
數(shù)據(jù)訪問接口ADO
ADO(ActiveXDataObject)即ActiveX數(shù)據(jù)訪問對(duì)象,是Microsoft公司在OLE-DB之上提出的一種新的邏輯接口,以便編程者通過OLE-DB更簡(jiǎn)單地以編程方式訪問各種各樣的數(shù)據(jù)源。
8.7VBA的數(shù)據(jù)庫(kù)編程107ADO將訪問數(shù)據(jù)源的過程抽象成幾個(gè)容易理解的具體操作,并由實(shí)際的對(duì)象來完成。由于采用了ActiveX技術(shù),與具體的編程語(yǔ)言無(wú)關(guān),所以可應(yīng)用在VisualBasic、C++、Java等各種程序設(shè)計(jì)語(yǔ)言中。ADO能夠訪問各種支持OLE-DB的數(shù)據(jù)源,包括數(shù)據(jù)庫(kù)和其他文件、電子郵件等數(shù)據(jù)源。ADO既可以被應(yīng)用于網(wǎng)絡(luò)環(huán)境,也可以被應(yīng)用于桌面應(yīng)用程序中。
8.7VBA的數(shù)據(jù)庫(kù)編程108ADO訪問數(shù)據(jù)源的具體過程如下。建立與數(shù)據(jù)源的連接指定訪問數(shù)據(jù)源的命令,并向數(shù)據(jù)源發(fā)出命令從數(shù)據(jù)源以行的形式獲取數(shù)據(jù),并將數(shù)據(jù)暫存在內(nèi)存的緩存中如果需要可對(duì)獲取的數(shù)據(jù)進(jìn)行查詢、更新、插入、刪除等操作如果對(duì)數(shù)據(jù)源進(jìn)行了修改,將更新后的數(shù)據(jù)發(fā)回?cái)?shù)據(jù)源斷開與數(shù)據(jù)源的連接8.7VBA的數(shù)據(jù)庫(kù)編程實(shí)際使用時(shí),上面過程中的各個(gè)步驟分別由ADO的具體對(duì)象完成
109要使用ADO對(duì)象,先要引用ADO類庫(kù)?!肮ぞ摺薄耙谩?.7VBA的數(shù)據(jù)庫(kù)編程110ADO的主要對(duì)象Connection對(duì)象Command對(duì)象Recordset對(duì)象
8.7VBA的數(shù)據(jù)庫(kù)編程111Connection對(duì)象
8.7VBA的數(shù)據(jù)庫(kù)編程用于建立與數(shù)據(jù)源的連接112(2)指定OLE-DB數(shù)據(jù)提供者的名稱和有關(guān)的連接信息
MyCnn.Provider="Microsoft.ACE.OLEDB.12.0"MyCnn.ConnectionString="DataSource=D:\教學(xué)管理
.accdb"
(3)最后調(diào)用MyCnn對(duì)象的Open方法打開連接MyCnn.Open(1)定義一個(gè)ADO的Connection對(duì)象DimMyCnnAsADODB.Connection SetMyCnn=NewADODB.Connection8.7VBA的數(shù)據(jù)庫(kù)編程113用Connection對(duì)象顯式建立與Access數(shù)據(jù)庫(kù)“教學(xué)管理”的連接的完整程序。PublicSubCnnToDB_1()
'定義Connection對(duì)象
DimMyCnnAsADODB.Connection
'初始化
SetMyCnn=NewADODB.Connection
'指定數(shù)據(jù)提供者的名稱MyCnn.Provider="Microsoft.ACE.OLEDB.12.0"
'指定數(shù)據(jù)源
MyCnn.ConnectionString="DataSource=D:\教學(xué)管理
.accdb"
'打開連接
MyCnn.Open MsgBox("數(shù)據(jù)庫(kù)連接成功")EndSub8.7VBA的數(shù)據(jù)庫(kù)編程114Command對(duì)象
8.7VBA的數(shù)據(jù)庫(kù)編程
用來定義并執(zhí)行針對(duì)數(shù)據(jù)源運(yùn)行的具體命令,如SQL查詢,并通過Recordset對(duì)象返回一個(gè)滿足有關(guān)條件的記錄集。115(1)創(chuàng)建一個(gè)Command對(duì)象的實(shí)例DimMyCmdAsADODB.Command SetMyCmd=NewADODB.Command(2)使已經(jīng)打開的連接與Command對(duì)象相關(guān)聯(lián)
MyCmd.ActiveConnection=MyCnn
(3)定義命令(如SQL語(yǔ)句)的可執(zhí)行文本MyCmd.CommandText="Select*From課程"
(4)執(zhí)行命令并返回記錄集MyCmd.Execute
8.7VBA的數(shù)據(jù)庫(kù)編程116從數(shù)據(jù)源獲取的數(shù)據(jù)存放在Recordset對(duì)象中,并且所有Recordset對(duì)象均由記錄(行)和字段(列)組成。使用Recordset對(duì)象的方法和屬性定位到數(shù)據(jù)的各行查看行中的值操縱記錄集中的數(shù)據(jù)Recordset對(duì)象
8.7VBA的數(shù)據(jù)庫(kù)編程117定義并初始化一個(gè)Recordset對(duì)象
DimMyRSAsADODB.RecordsetSetMyRS=NewADODB.Recordset有多種獲取記錄集的方法8.7VBA的數(shù)據(jù)庫(kù)編程118(1)接收Command對(duì)象的返回記錄集SetMyRS=MyCmd.Execute調(diào)用Command對(duì)象的Execute方法執(zhí)行命令后,可將返回的記錄集指定給一個(gè)Recordset對(duì)象。8.7VBA的數(shù)據(jù)庫(kù)編程119下面程序?qū)崿F(xiàn)了創(chuàng)建連接、定義命令和獲取數(shù)據(jù)的全部過程
PublicSubCnnToDB_2()DimMyCnnAsADODB.ConnectionSetMyCnn=NewADODB.ConnectionDimMyCmdAsADODB.CommandSetMyCmd=NewADODB.CommandDimMyRSAsADODB.RecordsetSetMyRS=NewADODB.RecordsetMyCnn.Provider="Microsoft.ACE.OLEDB.12.0"MyCnn.ConnectionString="DataSource=D:\教學(xué)管理
.accdb"MyCnn.OpenMyCmd.ActiveConnection=MyCnnMyCmd.CommandText="Select*From課程"SetMyRS=MyCmd.ExecuteStop ‘?dāng)帱c(diǎn),以便觀察得到的數(shù)據(jù)
MyCnn.CloseEndSub120?Myrs.fields(0),Myrs.fields(1),Myrs.fields(2)立即窗口輸入命令:查看獲取的結(jié)果(2)使用Recordset對(duì)象的Open方法打開Recordset對(duì)象此方法的語(yǔ)法格式如下:recordset.OpenSource,ActiveConnection,CursorType,LockType,OptionsSource可以是SQL命令、Command對(duì)象、表名等。ActiveConnection指定所用的連接,可以是Connection對(duì)象。CursorType指定記錄集中游標(biāo)的移動(dòng)方式。8.7VBA的數(shù)據(jù)庫(kù)編程121下面程序使用方法2獲取數(shù)據(jù)PublicSubCnnToDB_3()DimMyCnnAsADODB.ConnectionSetMyCnn=NewADODB.ConnectionDimMyRSAsADODB.RecordsetSetMyRS=NewADODB.RecordsetDimstrSQLAsStringMyCnn.Provider="Microsoft.ACE.OLEDB.12.0"MyCnn.ConnectionString="DataSource=D:\教學(xué)管理
.accdb“MyCnn.OpenstrSQL="Select*From課程"MyRS.OpenstrSQL,MyCnn,adOpenKeysetStopMyCnn.CloseEndSub122當(dāng)不再使用Recordset對(duì)象中的數(shù)據(jù)時(shí),應(yīng)該用Recordset對(duì)象的Close方法關(guān)閉該對(duì)象,釋放所占用的內(nèi)存空間。8.7VBA的數(shù)據(jù)庫(kù)編程使用當(dāng)前數(shù)據(jù)庫(kù)的連接MyCmd.ActiveConnection=CurrentProject.ConnectionMyRS.Close1238.7.3
使用記錄集中的數(shù)據(jù)
現(xiàn)在,數(shù)據(jù)已在Recordset對(duì)象中,如何對(duì)數(shù)據(jù)進(jìn)行輸出、插入、刪除和更新?
8.7VBA的數(shù)據(jù)庫(kù)編程124輸出記錄集中的數(shù)據(jù)
8.7VBA的數(shù)據(jù)庫(kù)編程BOF(BeginOfFile)屬性用于檢查當(dāng)前游標(biāo)是否在第1條記錄之前。如果是,則返回True,否則返回False。EOF(EndOfFile)屬性用于檢查當(dāng)前游標(biāo)是否在最后1條記錄之后即記錄集的末尾。如果是,則返回True,否則返回False。如果記錄集為空,則BOF屬性和EOF屬性的值均為True。125MoveFirst:將游標(biāo)移到第1條記錄。MoveLast:將游標(biāo)移到最后1條記錄。MoveNext:將游標(biāo)移到下一條記錄。MovePrevious:將游標(biāo)移到上一條記錄。8.7VBA的數(shù)據(jù)庫(kù)編程126PublicSubOutput()DimMyRSAsADODB.RecordsetSetMyRS=NewADODB.RecordsetDimstrSQ
溫馨提示
- 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 《狀態(tài)檢修基礎(chǔ)知識(shí)》課件
- 內(nèi)蒙古呼和浩特市2024屆九年級(jí)上學(xué)期期末考試數(shù)學(xué)試卷(含答案)
- 養(yǎng)老院老人滿意度調(diào)查評(píng)估制度
- 《電動(dòng)機(jī)與電氣傳動(dòng)》課件
- 《市場(chǎng)調(diào)查講座》課件
- 《石墨烯的研究》課件
- 2024年版:國(guó)際文化旅游項(xiàng)目開發(fā)合同
- 技術(shù)研發(fā)合作合同(2篇)
- 2024年版金融服務(wù)合同(企業(yè)上市輔導(dǎo))
- 2024天津房屋買賣合同中房屋租賃保證金及退還3篇
- GB/T 43700-2024滑雪場(chǎng)所的運(yùn)行和管理規(guī)范
- 新媒體部門崗位配置人員架構(gòu)圖
- 水電站廠房設(shè)計(jì)-畢業(yè)設(shè)計(jì)
- 綜合金融服務(wù)方案課件
- 《鎮(zhèn)原民俗》課件
- 球磨機(jī)崗位作業(yè)指導(dǎo)書
- 眼科護(hù)理滴眼藥水論文
- 市級(jí)社?;疬\(yùn)行分析報(bào)告
- 2024年遼寧省水資源管理集團(tuán)招聘筆試參考題庫(kù)附帶答案詳解
- 小學(xué)信息技術(shù)畫圖課件巧妙的直線和曲線
- 《籃球原地單手肩上投籃》教案
評(píng)論
0/150
提交評(píng)論