第6章 VBA常用語(yǔ)句
在VBA的程序代碼中,語(yǔ)句是程序的主要成份,或者說(shuō)是程序的主體部分。每個(gè)語(yǔ)句以回車(chē)鍵結(jié)束。
6.1 語(yǔ)句
在默認(rèn)情況下,在VBE中輸入語(yǔ)句后,VBE將自動(dòng)進(jìn)行語(yǔ)法檢查,如果發(fā)現(xiàn)語(yǔ)法錯(cuò)誤,將打開(kāi)一個(gè)提示對(duì)話框。
6.1.1 自動(dòng)格式化
輸入VBA語(yǔ)句后,VBE將按一定的規(guī)則進(jìn)行簡(jiǎn)單的格式化處理。如將關(guān)鍵字的首字母大寫(xiě),在運(yùn)算符前后加入空格,刪除各部分多余的空格等。
在輸入VBA關(guān)鍵字時(shí),可以不區(qū)分大小寫(xiě)。例如輸入MsgBox時(shí),無(wú)論輸入的是Msgbox,msgbox,還是MSGBOX,當(dāng)輸入完該函數(shù)的參數(shù)并按回車(chē)鍵后,VBE都自動(dòng)將其變?yōu)镸sgBox。
為了提高程序的可讀性,VBA代碼中應(yīng)加上適當(dāng)?shù)目崭瘛.?dāng)按回車(chē)鍵完成語(yǔ)句的輸入后,各關(guān)鍵字之間無(wú)論插入多少空格,VBE都將其自動(dòng)調(diào)整為一個(gè)空格。例如輸入以下代碼(在關(guān)鍵字“Selection”與“Borders”之間插入了多個(gè) 空格,在“=”與“xlNone”之間無(wú)空格):
Selection.Borders (xlDigaonalDown).LineStyle =xlNone
輸入完語(yǔ)句并按回車(chē)鍵后,VBE將其自動(dòng)格式化以下格式:
Selection.Borders(xlDigaonalDown).LineStyle =xlNone
在“=”前后各插入一個(gè)空格,同時(shí)其他關(guān)鍵字之間的空格被自動(dòng)刪除。
注意:不能在關(guān)鍵字的中間加入空格。
6.1.2 復(fù)合語(yǔ)句與語(yǔ)句斷行
一般情況下,要求程序中每個(gè)語(yǔ)句占一行。但在VBA中,也可以把幾個(gè)語(yǔ)句放在一行中構(gòu)成復(fù)合語(yǔ)句。各語(yǔ)句之間用冒號(hào)(:)分隔,例如:
Selection.Font.Bold = True: Selection.Font.Size = 20
與以下兩行語(yǔ)句功能相同:
Selection.Font.Bold = True
Selection.Font.Size = 20
在VBE的代碼窗口中,每行VBA代碼可包含1023個(gè)字符。但是,為了使程序便于閱讀,建議讀者將一條長(zhǎng)的語(yǔ)句打斷為若干行。VBA中使用空格后接著一個(gè)下畫(huà)線——續(xù)行符,可將一行代碼延伸成兩行以上。例如,以下語(yǔ)句
ActiveWorkbook.Protect Password: = " abc ",Structure:=Treu,Windows:=False
可改寫(xiě)為以下格式:
ActiveWorkbook.Protect _
Password: = " abc ",_
Structure:=Treu,_
Windows:=False
通過(guò)續(xù)行符(_)可創(chuàng)建長(zhǎng)的邏輯行。一個(gè)邏輯行,最多可包含24個(gè)連續(xù)的續(xù)行字符,也就是最多可以包含25個(gè)物理行。這樣,邏輯行的字符總量可達(dá)1023字符。如果超過(guò)了字符總量,必須將該行分為若干語(yǔ)句,或指定一些表達(dá)式為中間變量。
6.2賦值語(yǔ)句和注釋語(yǔ)句
賦值語(yǔ)句和注釋語(yǔ)句是VBA中用得最多的兩類(lèi)語(yǔ)句。
6.2.1 賦值語(yǔ)句
賦值語(yǔ)句的作用是對(duì)表達(dá)式進(jìn)行運(yùn)算,并將運(yùn)算結(jié)果賦給左側(cè)的變量或?qū)傩浴F湔Z(yǔ)法格式如下:
?。跮et]varname = expression
一般都省略關(guān)鍵字Let.varname為變量或?qū)傩缘拿Q(chēng),必須遵循標(biāo)識(shí)符的命名約定;Expression為賦給變量或?qū)傩缘闹?,可以為一個(gè)表達(dá)式或一個(gè)常量值。
只有當(dāng)表達(dá)式是一種與變量兼容的數(shù)據(jù)類(lèi)型時(shí),該表達(dá)式的值才可以賦給變量或?qū)傩?。不以將字符串表達(dá)式的值賦給數(shù)值變量,也不能將數(shù)值表達(dá)式的值賦給字符串變量。否則就會(huì)在編譯時(shí)出現(xiàn)錯(cuò)誤。
可以用字符串或數(shù)值表達(dá)式賦值給Variant變量,但反過(guò)來(lái)不一定正確。任何除Null之外的Variant都可以賦給字符串變量,但只有當(dāng)Variant的值可以解釋為某個(gè)數(shù)時(shí)才能賦給數(shù)值變量。
注意:將一種數(shù)值類(lèi)型的表達(dá)式賦給另一種數(shù)值類(lèi)型的變量時(shí),會(huì)強(qiáng)制將該表達(dá)式的值轉(zhuǎn)換為結(jié)果變量的數(shù)值類(lèi)型。
例如,下面的語(yǔ)句使用顯式的Let語(yǔ)句將表達(dá)式的值賦給變量。
Dim MyStr,MyInt
'下面的變量賦值使用了Let語(yǔ)句
Let MyStr = "Hello World"
Let MyInt = 5
下面是沒(méi)有使用Let語(yǔ)句的相同賦值:
Dim MyStr,MyInt
MyStr = "Hello World"
MyInt = 5
下面的語(yǔ)句設(shè)置工作表“Sheet2”的Visible屬性值為“True”(即將該工作表顯示出來(lái)):
Sheets("Sheet2").Visible = True
6.2.2 注釋語(yǔ)句
在程序代碼中,適當(dāng)?shù)丶尤胱⑨尶商岣叱绦虻目勺x性,方便代碼的維護(hù)。在VBA中,注釋以撇號(hào)(')開(kāi)頭,或者以Rem關(guān)鍵字開(kāi)頭,再在其后寫(xiě)上注釋內(nèi)容。
Rem語(yǔ)句的格式如下:
Rem 注釋文本
也可以使用如下語(yǔ)法:
'注釋文本
也可不寫(xiě)任何注釋文本。在Rem關(guān)鍵字與“注釋文本”之間要加一個(gè)空格。
若使用撇號(hào)來(lái)添加注釋文本,則在其他語(yǔ)句行后面使用時(shí)不必加冒號(hào)。例如:
?。觝eets("Sheet2").Visible = True '設(shè)置工作表為可視狀態(tài)
如果使用Rem關(guān)鍵字,則需要在兩條語(yǔ)句之間加上冒號(hào),如:
?。觝eets("Sheet2").Visible = True : 設(shè)置工作表為可視狀態(tài)
注釋語(yǔ)句在程序中不產(chǎn)生執(zhí)行代碼,只是方便程序員與用戶之間交流。
技巧:在調(diào)試程序時(shí),可在不希望執(zhí)行的代碼前面添加注釋符號(hào)。
在VBE中,“編輯”工具欄提供了兩個(gè)按鈕:“設(shè)置注釋塊”和“解除注釋塊”。使用這兩個(gè)命令按鈕可將選中的代碼快速設(shè)置為注釋?zhuān)蛉∠淝懊娴淖⑨尫?hào)(撇號(hào)),如圖6-1所示。
6.3 數(shù)據(jù)輸入/輸出
計(jì)算機(jī)程序一般分為三部分:首先接收用戶輸入的數(shù)據(jù),再按一定的算法對(duì)數(shù)據(jù)進(jìn)行加工處理,最后輸出程序處理的結(jié)果。在程序中,輸入/輸出語(yǔ)句占有很大的比例。在Excel中,可從工作表、用戶窗體等多處獲取數(shù)據(jù),并可將數(shù)據(jù)輸出到這些對(duì)象中。數(shù)據(jù)輸入、輸出的相關(guān)內(nèi)容將在后續(xù)章節(jié)中進(jìn)行介紹,本節(jié)主要介紹VBA中標(biāo)準(zhǔn)的輸入/輸出方法。
6.3.1 數(shù)據(jù)輸入——InputBox函數(shù)
為了實(shí)現(xiàn)數(shù)據(jù)輸入,VBA提供了InputBox函數(shù)。該函數(shù)將打開(kāi)一個(gè)對(duì)話框作為輸入數(shù)據(jù)的界面,等待用戶輸入數(shù)據(jù),并返回所輸入的內(nèi)容。語(yǔ)法格式如下:
InputBox(prompt[,title][,default] [,xpos] [,ypos] [,helpfile,context])
該函數(shù)有7個(gè)參數(shù),其意義分別如下:
1)Prompt為對(duì)話框消息出現(xiàn)的字符串表達(dá)式,最大長(zhǎng)度為1024個(gè)字符。如果需要在對(duì)話框中顯示多行數(shù)據(jù),則可在各行之間用回車(chē)換行符來(lái)分隔,一般使用VBA的常數(shù)vbCrLf代表回車(chē)換行符。
?。玻㏕itle為對(duì)話框標(biāo)題欄中的字符串。如果省略該參數(shù),則把應(yīng)用程序名放入標(biāo)題欄中。
?。常〥efault為顯示在文本框中的字符串。如果省略該參數(shù),則文本框?yàn)榭铡?/div>
4)Xpos應(yīng)和Ypos成對(duì)出現(xiàn),指定對(duì)話框的左邊與屏幕左邊的水平距離。如果省略該參數(shù),則對(duì)話框會(huì)在水平方向居中。
5)Ypos應(yīng)和Xpos成對(duì)出現(xiàn),指定對(duì)話框的上邊與屏幕上邊的距離。如果省略該參數(shù),則對(duì)話框被放置在屏幕垂直方向距下邊大約三分之一的位置。
?。叮〩elpfile設(shè)置對(duì)話框的幫助文件,可省略。
?。罚〤ontext設(shè)置對(duì)話框的幫助主題編號(hào),可省略。
例如,使用以下的代碼可接收用戶輸入的數(shù)據(jù)。
Sub 使用InputBos函數(shù)()
Dim strPrompt As String
Dim strTitle As String
Dim strDefault As String
Dim strReturn As String
strPrompt = "請(qǐng)輸入用戶姓名:"
strTitle = "輸入對(duì)話框"
strReturn = "伍云輝"
strReturn = InputBox(strPrompt,strTitle,strDefault)
Debug.Print strReturn
End Sub
執(zhí)行上述代碼,顯示如圖6-2所示的對(duì)話框。
在文本框中輸入新的姓名,單擊“確定”按鈕,程序?qū)延脩糨斎氲膬?nèi)容輸出到“立即窗口”中。使用InputBox函數(shù)時(shí),應(yīng)注意以下幾點(diǎn):
1)在默認(rèn)情況下,InputBox函數(shù)的返回值是一個(gè)字符串類(lèi)型,而不是變體類(lèi)型。如果需要使用該函數(shù)輸入數(shù)值,則需要使用Val函數(shù)(或其他的轉(zhuǎn)換函數(shù))將返回值轉(zhuǎn)換為相應(yīng)類(lèi)型的數(shù)值。
2)在圖6-2所示的對(duì)話框中,如果用戶單擊“取消”按鈕(或ESC鍵),則表示不使用當(dāng)前輸入的值,函數(shù)將返回一個(gè)空字符串。根據(jù)這一特性,可以判斷用戶是否輸入數(shù)據(jù)到對(duì)話框中了。
?。常﹫?zhí)行一次InputBox函數(shù),只能返回一個(gè)值,如果需要輸入多個(gè)值,則必須多次調(diào)用該函數(shù)。
6.3.2 數(shù)據(jù)輸出——Print方法
在早期版本的Basic中,數(shù)據(jù)的輸出主要通過(guò)Print語(yǔ)句來(lái)實(shí)現(xiàn)。在VB中,Print作為窗體的一個(gè)方法,也可用來(lái)輸出信息。但是在VBA中,用戶窗體已經(jīng)不支持Print方法了,因?yàn)樵冢郑拢林?,Print方法主要用來(lái)向“立即窗口”中輸出程序的調(diào)試信息。
例如,在上例中使用如下語(yǔ)句向“立即窗口”中輸出用戶輸入的信息:
Debug.Print strReturn
Print方法的語(yǔ)法格式如下:
object.Print [outputlist]
在VBA中,object只能為Debug對(duì)象,表示向“立即窗口”輸出內(nèi)容。
參數(shù)outputlist是要打印的表達(dá)式或表達(dá)式的列表。如果省略,則打印一個(gè)空白行。
Print首先計(jì)算表達(dá)式的值,然后輸出計(jì)算的結(jié)果。在outputlist參數(shù)中還可以使用分隔符以格式化輸出的數(shù)據(jù)。格式化分隔符有以下4種。
A)Spc(n):插入n個(gè)空格到輸出數(shù)據(jù)之間;
B)Tab(n):移動(dòng)光標(biāo)到適當(dāng)位置,n為移動(dòng)的列數(shù);
C)分號(hào):表示前后兩個(gè)數(shù)據(jù)項(xiàng)連在一起輸出;
D)逗號(hào):以14個(gè)字符為一個(gè)輸出區(qū),每個(gè)數(shù)據(jù)輸出到對(duì)應(yīng)的輸出區(qū)。
例如:在“立即窗口”中輸入圖6-3所示的語(yǔ)句,可在語(yǔ)句的下方得到輸出的結(jié)果。
6.3.3 數(shù)據(jù)輸出——MsgBox函數(shù)
使用MsgBox函數(shù)打開(kāi)一個(gè)對(duì)話框,在對(duì)話框中顯示一個(gè)提示信息,并讓用戶單擊對(duì)話框中的按鈕,使程序繼續(xù)執(zhí)行。MsgBox有語(yǔ)句和函數(shù)兩種格式,語(yǔ)句格式如下:
MstBox prompt[,buttons][,title][,helpfile,context]
函數(shù)格式如下:
Value=MsgBox(prompt[,buttons][,title][,helpfile,context]
通過(guò)函數(shù)返回值獲得用戶單擊的按鈕,并可根據(jù)按鈕的不同而選擇不同的程序段來(lái)執(zhí)行。
該函數(shù)(或語(yǔ)句)共有5個(gè)參數(shù),除第一個(gè)參數(shù)外,其余參數(shù)都可省略。各參數(shù)的意義與Inputbox函數(shù)參數(shù)的意義相同,不同的是多了一個(gè)buttons參數(shù)。buttons參數(shù)用來(lái)指定顯示按鈕的數(shù)目及形式、使用提示圖標(biāo)樣式、默認(rèn)按鈕,以及消息框的強(qiáng)制響應(yīng)等,其常數(shù)值如表
6-1所示。
圖6-1中的數(shù)值(或常數(shù))可分為4組,其作用分別為:
第一組值(0~5)用來(lái)決定對(duì)話框中按鈕的類(lèi)型與數(shù)量。
第二組值(16,32,48,64)用來(lái)決定對(duì)話框中顯示的圖標(biāo)。
第三組值(0,256,512,768)設(shè)置對(duì)話框的默認(rèn)活動(dòng)按鈕?;顒?dòng)按鈕中文字的周?chē)刑摼€,按回車(chē)鍵可執(zhí)行該按鈕的單擊事件代 碼。
第四組值(0,4096)決定消息框的強(qiáng)制響應(yīng)性。
buttons參數(shù)可由上面4組數(shù)值組成,其組成原則是:從每一類(lèi)中選擇一個(gè)值,把這幾個(gè)累加在一起就是buttons參數(shù)的值(大部分時(shí)間里都只使用前三組數(shù)值的組合),不同的組合可得到不同的結(jié)果。
例如,設(shè)置buttons參數(shù)為16,得到的對(duì)話框如圖6-4所示;設(shè)置buttons參數(shù)為50,得到的對(duì)話框如圖6-5所示。
在VBE環(huán)境中輸入MsgBox函數(shù)時(shí),將自動(dòng)列出常數(shù)值,選擇了一個(gè)buttons常數(shù)后,輸入加號(hào)將再次顯示buttons的常數(shù)列表,如圖6-6所示。
使用下面的代碼可以獲取用戶的選擇,再根據(jù)用戶的選擇決定是否退出系統(tǒng)。
Sub 使用msgbox函數(shù)退出系統(tǒng)()
Dim intReturn AS Integer
intReturn = MsgBox("真的退出系統(tǒng)碼?", vbYesNo + vbQuestion,"提示")
If intReturn = vbYes Then Application.Quit
End Sub
執(zhí)行以上程序,顯示如圖6-7所示對(duì)話框。
單擊“是”按鈕,將執(zhí)行Quit方法退出Excel;單擊“否”按鈕,將返回應(yīng)用程序。
6.4 程序暫停和退出語(yǔ)句
程序在運(yùn)行過(guò)程中,如果需要查看變量的運(yùn)算中間值,可在代碼中加入暫停語(yǔ)句,使程序暫停運(yùn)行,然后在立即窗口中查看各變量的值。當(dāng)滿足一定條件時(shí),可使用退出語(yǔ)句結(jié)束程序的運(yùn)行。
6.4.1 暫停語(yǔ)句
在需要暫停程序執(zhí)行的地方放置Stop語(yǔ)句,即可讓程序暫停運(yùn)行。用Stop語(yǔ)句,就相當(dāng)于在程序代碼中設(shè)置斷點(diǎn)。
Stop語(yǔ)句會(huì)暫停程序的執(zhí)行,但是它不像End語(yǔ)句,因?yàn)镾top不會(huì)關(guān)閉任何文件,或清除變量。暫停的程序又可以接著執(zhí)行后續(xù)的代碼。
Stop語(yǔ)句主要用在調(diào)試程序階段,在應(yīng)用程序發(fā)布之前需要將程序中的Stop語(yǔ)句刪除或注釋掉。下面的代碼使用Stop語(yǔ)句來(lái)暫停“For
……Next”循環(huán)里的每一次完成。
Sub 暫停程序的執(zhí)行()
Dim i As Integer
For i = 1 To 10 '開(kāi)始For……Next循環(huán)
Debug.Print i '將變量i的值輸出到“立即”窗口
Stop '每一次的完成都會(huì)在此暫停
Next
End Sub
按“F5”鍵執(zhí)行以上過(guò)程,在“立即窗口”中輸出一個(gè)數(shù)值1,程序就在Stop語(yǔ)句處暫停,再次按“F5”鍵,在“立即窗口”中輸出一個(gè)數(shù)值2,程序又暫停,如圖6-8所示。
在暫停狀態(tài)下,下一個(gè)將要執(zhí)行的語(yǔ)句的底色顯示為黃色,同時(shí)在左側(cè)有一個(gè)黃色箭頭。這時(shí)可按“F8”鍵來(lái)逐語(yǔ)句執(zhí)行,也可按“F5”鍵繼續(xù)執(zhí)行后續(xù)的所有代碼。
在暫停狀態(tài)下,可在“立即窗口”中輸入Print語(yǔ)句顯示程序中各變量的值,也可通過(guò)“本地窗口”查看變量的當(dāng)前值。有關(guān)這兩個(gè)窗口的使用方法,將在本書(shū)第30章中進(jìn)行介紹。
6.4.2 退出語(yǔ)句
所謂的退出有兩種意義,一是退出正在執(zhí)行的VBA代碼,返回到VBE編輯環(huán)境中;另一種是退出Excel系統(tǒng)。
1.End語(yǔ)句
使用End語(yǔ)句可結(jié)束程序的運(yùn)行,返回到VBE編輯環(huán)境中。執(zhí)行End語(yǔ)句會(huì)重置所有模塊級(jí)別變量和所有模塊的靜態(tài)局部變量。若要保留這些變量的值,需改為使用Stop語(yǔ)句,以在保留這些變量值的基礎(chǔ)上恢復(fù)執(zhí)行。
注意:End語(yǔ)句不調(diào)用Unload,QueryUnload或Terminate事件或任何其他VBA代碼,只是強(qiáng)制性地終止代碼執(zhí)行。窗體和類(lèi)模塊中的Unload,QuerUnload和Terminate事件代碼未被執(zhí)行。類(lèi)模塊創(chuàng)建的對(duì)象被破壞,由Open語(yǔ)句打開(kāi)的文件被關(guān)閉,并且釋放程序所占用的內(nèi)存。其他程序的對(duì)象引用無(wú)效。
End語(yǔ)句提供了一種強(qiáng)迫終止程序的方法。VBA程序正常結(jié)束應(yīng)該卸載所有的窗體。只要沒(méi)有其他程序引用該程序公共類(lèi)模塊創(chuàng)建的對(duì)象并且無(wú)代碼執(zhí)行,程序?qū)⒘⒓搓P(guān)閉。
2. Quit方法
使用Application對(duì)象的Quit方法,將退出Excel。
使用此方法時(shí),如果未保存的工作簿處于打開(kāi)狀態(tài),則Excel將顯示一個(gè)對(duì)話框,詢問(wèn)是否要保存所做更改。
|
|