[摘要] 本文從廣義的角度將VBA的運(yùn)算符進(jìn)行了全面的歸納和總結(jié),包括通常意義上的算術(shù)運(yùn)算符、連接運(yùn)算符、比較運(yùn)算符和邏輯運(yùn)算符,還包括了賦值運(yùn)算符、點(diǎn)運(yùn)算符以及Like運(yùn)算符、AddressOf運(yùn)算符等。同時(shí),概述了表達(dá)式的知識(shí)。 提示 學(xué)習(xí)是需要思考和實(shí)踐的,只有舉一反三,才能真正理解和掌握。因?yàn)閂BA的一些運(yùn)算符涉及到較強(qiáng)的邏輯關(guān)系,您在閱讀本文時(shí),可以不斷思考它們之間的邏輯關(guān)系。同時(shí),您可以在VBE編輯器的模塊中測(cè)試本文中的一些語(yǔ)句和示例,以加深認(rèn)識(shí)。 在使用VBA編程時(shí),您一定會(huì)經(jīng)常使用到VBA運(yùn)算符,它是VBA程序的重要組成部分。在本文中,我將運(yùn)算符分為兩大類,一類是通常意義上的運(yùn)算符,即:算術(shù)運(yùn)算符、連接運(yùn)算符、比較運(yùn)算符和邏輯運(yùn)算符;另一類是與語(yǔ)句相關(guān)的運(yùn)算符,即:賦值運(yùn)算符和點(diǎn)運(yùn)算符。此外,還簡(jiǎn)略地介紹一下Like運(yùn)算符和AddressOf運(yùn)算符。 您通過使用運(yùn)算符,對(duì)VBA各種元素進(jìn)行連接,或者完成一些運(yùn)算以形成了VBA表達(dá)式或語(yǔ)句。再進(jìn)一步說,表達(dá)式是數(shù)字、字符串、常量、變量、對(duì)象成員、以及運(yùn)算符的組合。 算術(shù)運(yùn)算符和表達(dá)式 ■ 算術(shù)運(yùn)算符包括+(加法運(yùn)算符)、- (減法運(yùn)算符)、/ (除法運(yùn)算符)、\(整除運(yùn)算符)、Mod(取模運(yùn)算符)、^(乘冪運(yùn)算符),下面逐一進(jìn)行介紹。 + 加法運(yùn)算符。形成數(shù)值表達(dá)式,并將數(shù)值或數(shù)值表達(dá)式相加。也可用于連接兩個(gè)字符串變量,但建議用連接運(yùn)算符進(jìn)行連接。例如,結(jié)果=表達(dá)式1+表達(dá)式2。 - 減法運(yùn)算符。形成數(shù)值表達(dá)式,將數(shù)值或數(shù)值表達(dá)式相減。也可用在數(shù)值之前,用于表示負(fù)數(shù)。例如,結(jié)果=表達(dá)式1-表達(dá)式2。 * 乘法運(yùn)算符。形成數(shù)值表達(dá)式,將數(shù)值或數(shù)值表達(dá)式相乘。例如,結(jié)果=表達(dá)式1*表達(dá)式2。 / 除法運(yùn)算符。形成數(shù)值表達(dá)式,將兩個(gè)數(shù)值或數(shù)值表達(dá)式相除,其中除數(shù)不能為零,否則會(huì)得到一個(gè)錯(cuò)誤。例如,結(jié)果=表達(dá)式1/表達(dá)式2。 \ 整除運(yùn)算符。將兩個(gè)數(shù)值或數(shù)值表達(dá)式相除,并返回一個(gè)整數(shù),即舍掉余數(shù)或者小數(shù)部分。例如,結(jié)果=表達(dá)式1\表達(dá)式2。例如,7\3的值為2。 Mod 取模運(yùn)算符。將兩個(gè)數(shù)值或數(shù)值表達(dá)式相除,并只返回余數(shù)。例如,結(jié)果=表達(dá)式1 Mod 表達(dá)式2。例如,7 Mod 3的值為1。 ^ 乘冪運(yùn)算符。計(jì)算數(shù)值或數(shù)值表達(dá)式的乘冪。例如,結(jié)果=數(shù)值 ^ 指數(shù)。 ■ 算術(shù)運(yùn)算符的優(yōu)先順序 算術(shù)運(yùn)算符的優(yōu)先順序依次為:乘冪運(yùn)算符(^)——乘法和除法運(yùn)算符(*、/,兩者沒有優(yōu)先順序)——整除運(yùn)算符(\)——取模運(yùn)算符(Mod)——加法和減法運(yùn)算符(+、-,兩者沒有優(yōu)先順序)。若在同一代碼中多次使用同一個(gè)算術(shù)運(yùn)算符,則從左到右運(yùn)算。使用括號(hào)可以改變優(yōu)先順序。 連接運(yùn)算符和表達(dá)式 & 連接運(yùn)算符,用于連接字符串。它能把一些字符串變量連接在一起,形成一個(gè)新的字符串。在進(jìn)行連接運(yùn)算之前,任何非字符串變量或表達(dá)式都轉(zhuǎn)換為字符串。例如,結(jié)果=字符串1&字符串2,其結(jié)果的數(shù)據(jù)類型為String類型。 + 混合連接運(yùn)算符,它運(yùn)用很靈活,但會(huì)與加法運(yùn)算符相混,給您的閱讀帶來不便。例如,結(jié)果=表達(dá)式1+表達(dá)式2,其結(jié)果的數(shù)據(jù)類型取決于表達(dá)式的數(shù)據(jù)類型。 下面對(duì)這兩種連接運(yùn)算符進(jìn)行測(cè)試,測(cè)試表達(dá)式為: 結(jié)果=表達(dá)式1+表達(dá)式2 當(dāng)兩個(gè)表達(dá)式都是數(shù)值數(shù)據(jù)時(shí),用&運(yùn)算符會(huì)將兩個(gè)數(shù)值數(shù)據(jù)連接,如5 & 1連接后為51,但用+運(yùn)算符后,會(huì)將兩數(shù)值相加得到其結(jié)果,如5+1進(jìn)行連接后為6。當(dāng)兩個(gè)表達(dá)式都是字符串(Sting)時(shí),將對(duì)兩個(gè)字符串進(jìn)行連接為一個(gè)字符串。當(dāng)兩個(gè)表達(dá)式為空時(shí),+運(yùn)算符的結(jié)果為0,而&運(yùn)算符的結(jié)果為Null值。當(dāng)一個(gè)表達(dá)式為數(shù)值類型數(shù)據(jù),另一個(gè)表達(dá)式為字符串類型數(shù)據(jù)時(shí),+運(yùn)算符將產(chǎn)生類型不匹配的錯(cuò)誤,而&運(yùn)算符則將兩個(gè)表達(dá)式連接。未聲明變量時(shí),當(dāng)一個(gè)表達(dá)式為數(shù)字,另一個(gè)表達(dá)式為字母時(shí),+運(yùn)算符和&運(yùn)算符的結(jié)果均為數(shù)字,如j=7,k=student,i=j+k與i=j&k的結(jié)果均為7。當(dāng)兩個(gè)表達(dá)式都為空時(shí),+運(yùn)算符結(jié)果為0,而&運(yùn)算符結(jié)果為Null值。 提示 您可以在VBE中調(diào)試,看看它們?cè)诟鞣N情況下的區(qū)別。 比較運(yùn)算符和表達(dá)式 ■ 比較運(yùn)算符包括<(小于)、>(大于)、=(等于)、>=(大于或等于)、<=(小于或等于)、<>(不等于),用于數(shù)據(jù)元素的比較,其一般的語(yǔ)法為: 結(jié)果=表達(dá)式1 <比較運(yùn)算符> 表達(dá)式2 結(jié)果為True(1)、False(0)或者為Null。其中比較運(yùn)算符可以單獨(dú)使用,也可以兩兩結(jié)合使用。如果表達(dá)式1或者表達(dá)式2本身為Null時(shí)才會(huì)產(chǎn)生Null的結(jié)果。 下面結(jié)合上述語(yǔ)法,對(duì)這些比較運(yùn)算產(chǎn)生的結(jié)果為True或False時(shí)所需要的條件進(jìn)行說明: > 表達(dá)式1大于并且不等于表達(dá)式2時(shí),其結(jié)果為True;否則,為False。 < 表達(dá)式1小于并且不等于表達(dá)式2時(shí),其結(jié)果為True;否則,為False。 = 表達(dá)式1等于表達(dá)式2時(shí),其結(jié)果為True;否則,為False。 >= 表達(dá)式1大于或者等于表達(dá)式2時(shí),其結(jié)果為True;否則,為False。 <= 表達(dá)式1小于或者等于表達(dá)式2時(shí),其結(jié)果為True;否則,為False。 <> 表達(dá)式1不等于表達(dá)式2時(shí),其結(jié)果為True;否則,為False。 比較運(yùn)算符可用于數(shù)值比較或字符串變量比較,也可用于數(shù)值與字符串的比較。如果其中一個(gè)表達(dá)式是數(shù)值,另一個(gè)是字符串,則數(shù)值表達(dá)式總是“小于”字符串表達(dá)式;如果都是字符串,則最大的字符串就是最長(zhǎng)的字符串;如果字符串一樣長(zhǎng),則小寫的大于大寫的。 還有一個(gè)比較運(yùn)算符,即Is運(yùn)算符,可用于判斷兩個(gè)對(duì)象變量是否指向同一個(gè)對(duì)象,其語(yǔ)法為: 結(jié)果=對(duì)象1 Is 對(duì)象2 如果對(duì)象1和對(duì)象2都指向同一個(gè)對(duì)象,其結(jié)果為True;否則,結(jié)果為False。 還可以用Is運(yùn)算符來判斷一個(gè)對(duì)象變量是否符合要求,例如,條件判斷語(yǔ)句If objVar Is Nothing Then 表明,如果對(duì)象變量objVar沒有對(duì)象引用,則為True,執(zhí)行Then后面的語(yǔ)句。 ■ 比較運(yùn)算符的優(yōu)先順序。如果多個(gè)比較運(yùn)算符出現(xiàn)在同一行代碼中,則按從左到右的順序計(jì)算。 邏輯運(yùn)算符和表達(dá)式 ■ 邏輯運(yùn)算符允許對(duì)一個(gè)或多個(gè)表達(dá)式進(jìn)行運(yùn)算,并返回一個(gè)邏輯值。VBA的邏輯運(yùn)算符包括:And(邏輯與)、Or(邏輯或)、Not(邏輯非)、Eqv(與或)、Imp(蘊(yùn)含)、Xor(異或)。 And 執(zhí)行邏輯與運(yùn)算,即如果表達(dá)式1和表達(dá)式2都是True,則結(jié)果返回True;只要其中一個(gè)表達(dá)式為False,其結(jié)果就是False;如果有表達(dá)式為Null,則結(jié)果為Null。其語(yǔ)法為: 結(jié)果=表達(dá)式1 And 表達(dá)式2 例如,If x>1 And y<10 Then,表示如果x的值大于1且y的值小于10時(shí),就執(zhí)行Then后面的代碼。又如,語(yǔ)句MsgBox ActiveSheet.Name=”Sheet2” And Range(“A1”)=1表示如果當(dāng)前工作表名為Sheet2并且當(dāng)前工作表上的單元格A1的值為1時(shí),消息框?qū)@示True。 Or 執(zhí)行邏輯或運(yùn)算,即如果表達(dá)式1或者表達(dá)式2為True,或者表達(dá)式1和表達(dá)式2都為True,則結(jié)果為True;只有兩個(gè)表達(dá)式都不是True時(shí),其結(jié)果才為False;如果有表達(dá)式為Null,則結(jié)果也是Null。其語(yǔ)法為: 結(jié)果=表達(dá)式1 Or 表達(dá)式2 例如,If x>1 Or y<10 Then,表示如果x的值大于1,或者y的值小于10,則執(zhí)行Then后面的代碼。又如,語(yǔ)句MsgBox Range(“A1”)=1 Or Range(“B1”)=2表示如果當(dāng)前工作表中的單元格A1中的值為1或者單元格B1中的值為2時(shí),消息框?qū)@示True。 Not 對(duì)一個(gè)表達(dá)式進(jìn)行邏輯非運(yùn)算,即如果表達(dá)式為True,則Not運(yùn)算符使該表達(dá)式變成False;如果表達(dá)式為False,則Not運(yùn)算符使該表達(dá)式變成True;如果表達(dá)式為Null,則Not運(yùn)算符的結(jié)果仍然是Null。其語(yǔ)法為: 結(jié)果=Not 表達(dá)式 例如,If Not IsError(x) Then,如果IsError返回False則執(zhí)行Then后面的代碼,表示x中不包含錯(cuò)誤。 又如,語(yǔ)句Selection.Font.Bold=Not Selection.Font.Bold,其中Bold屬性的值為True或False,使用Not運(yùn)算符會(huì)將值False改為True,將值True改為False,這樣可用于切換所選單元格是否“加粗”。這也是VBA程序編寫時(shí)的一個(gè)技巧,我們可以運(yùn)用Not運(yùn)算符模仿工具欄“加粗”、“斜體”等按鈕的工作模式,如當(dāng)我們點(diǎn)擊“加粗”按鈕時(shí),所選單元格中的字體將加粗顯示,再次單擊“加粗”按鈕,單元格中的字體又正常顯示了。 Eqv 執(zhí)行與或運(yùn)算,即判斷兩個(gè)表達(dá)式是否相等,當(dāng)兩個(gè)表達(dá)式都是True或者都是False時(shí),結(jié)果返回True;若一個(gè)表達(dá)式為True而另一個(gè)表達(dá)式為False時(shí),結(jié)果返回False。其語(yǔ)法為: 結(jié)果=表達(dá)式1 Eqv 表達(dá)式2 Imp 執(zhí)行邏輯蘊(yùn)含運(yùn)算,其語(yǔ)法為: 結(jié)果=表達(dá)式1 Imp 表達(dá)式2 當(dāng)兩個(gè)表達(dá)式都為True和兩個(gè)表達(dá)式都為False時(shí),其結(jié)果為True;當(dāng)表達(dá)式1為True,表達(dá)式2為False時(shí),其結(jié)果為False;當(dāng)表達(dá)式1為False,表達(dá)式2為True時(shí),其結(jié)果為True;當(dāng)表達(dá)式1為False,表達(dá)式2為Null時(shí),其結(jié)果為True;當(dāng)表達(dá)式1為True,表達(dá)式2為Null時(shí),其結(jié)果為Null;當(dāng)表達(dá)式1為Null,表達(dá)式2為True時(shí),其結(jié)果為True;當(dāng)表達(dá)式1為Null,表達(dá)式2為False時(shí),其結(jié)果為Null;當(dāng)兩個(gè)表達(dá)式都為Null時(shí),其結(jié)果為Null。上面的表述可能有點(diǎn)繞口,概括地說,不管表達(dá)式1,當(dāng)表達(dá)式2為真時(shí),其結(jié)果為True;當(dāng)兩個(gè)表達(dá)式都為False,或者表達(dá)式1為False,表達(dá)式2為Null時(shí),其結(jié)果為True;當(dāng)表達(dá)式1為True,表達(dá)式2為False時(shí),結(jié)果為False;其它情況則為Null。 Xor 執(zhí)行邏輯異或運(yùn)算,用于判斷兩個(gè)表達(dá)式是否不同。若兩個(gè)表達(dá)式都是True或都是False時(shí),其結(jié)果就是False;如果只有一個(gè)表達(dá)式是True,其結(jié)果就是True;如果兩個(gè)表達(dá)式中有一個(gè)是Null,其結(jié)果是Null。其語(yǔ)法為: 結(jié)果=表達(dá)式1 Xor 表達(dá)式2 ■ 邏輯運(yùn)算符的優(yōu)先順序 邏輯運(yùn)算符的優(yōu)先順序依次為:Not——And——Or——Xor——Eqv——Imp。如果在同一行代碼中多次使用相同的邏輯運(yùn)算符,則從左到右進(jìn)行運(yùn)算。 運(yùn)算符的優(yōu)先順序 如果您不了解運(yùn)算符的優(yōu)先級(jí)別(即哪個(gè)運(yùn)算符優(yōu)先運(yùn)算,哪個(gè)運(yùn)算符最后才運(yùn)算),您的表達(dá)式可能會(huì)出現(xiàn)意想不到的結(jié)果。在前面的小節(jié)中,介紹了同一類運(yùn)算符的優(yōu)先順序。如果在一行代碼中包括多個(gè)運(yùn)算符,則其進(jìn)行運(yùn)算的優(yōu)先順序是不相同的。運(yùn)算符的優(yōu)先級(jí)會(huì)影響到表達(dá)式的最終結(jié)果。 當(dāng)一行代碼中包括幾類運(yùn)算符時(shí),其優(yōu)先順序?yàn)椋核阈g(shù)運(yùn)算符——連接運(yùn)算符——比較運(yùn)算符——邏輯運(yùn)算符。 如果您要改變同類或不同類運(yùn)算符的優(yōu)先順序,可以使用括號(hào),括號(hào)內(nèi)的表達(dá)式總比括號(hào)外的優(yōu)先進(jìn)行運(yùn)算。 Like運(yùn)算符 Like運(yùn)算符用于判斷給定的字符串是否與指定的模式相匹配,其語(yǔ)法為: 結(jié)果=字符串 Like 模式 其中,字符串為要與模式相比較的字符串,如果字符串與指定的模式相匹配,則結(jié)果為True;否則,其結(jié)果為False。如果字符串或者模式Null,則結(jié)果為Null。 在模式中可使用一些特殊字符,其它的字符都能與它們相匹配,這些字符有:?代表任意一個(gè)字符;*代表0或多個(gè)字符;#代表任意一個(gè)數(shù)字(0-9);[charlist]代表字符列表中的任意一個(gè)字符;[!charlist]代表不在字符列表中的任意一個(gè)字符;[]代表空字符串(“”)。 Charlist將模式中的一組字符與字符串中的一個(gè)字符進(jìn)行匹配,可以包含任何一種字符,包括數(shù)字;在Charlist中使用連字號(hào)(-)產(chǎn)生一組字符來與字符串中的一個(gè)字符相匹配,如[A-D]與字符串相應(yīng)位置的A、B、C或D匹配;在Charlist中可以產(chǎn)生多組字符,如[A-D H-J];各組字符必須是按照排列順序出現(xiàn)的;在Charlist的開頭或結(jié)尾使用連字號(hào)(-)或以與連字號(hào)自身相匹配,例如[-H-N]與連字號(hào)(-)或H到N之間的任何字符相匹配;在Charlist中的一個(gè)字符或者一組字符前加上!號(hào),表明與該字符或該組字符之外的所有字符匹配,如[!H-N]與字符H-N范圍之外的所有字符匹配;而在[]外使用!號(hào)則只匹配其自身。要使用任何特殊字符作為匹配字符,只需將它放在[]中即可,例如[?]表明要與一個(gè)問號(hào)進(jìn)行匹配。下面給出一個(gè)例子。 打開一個(gè)工作簿,選擇菜單“工具——宏——Visual Basic編輯器”或按Alt+F11組合鍵,打開VBE編輯器。在VBE編輯器中,選擇菜單“插入——用戶窗體”,新建一個(gè)用戶窗體,點(diǎn)擊控件工具箱中的“文本框”控件和“按鈕”控件,在用戶窗體上放置一個(gè)“文本框”和一個(gè)“按鈕”,并在用戶窗體中對(duì)它們的大小和位置進(jìn)行合理調(diào)整,雙擊剛創(chuàng)建的“按鈕”控件,并輸入下面的代碼: Private Sub CommandButton1_Click() Dim sEnd As String, sPattern As String sEnd = "in Office" sPattern = "[F W]*" & sEnd If TextBox1.Text Like sPattern Then MsgBox "輸入正確" Else MsgBox "輸入錯(cuò)誤" End If End Sub 本代碼中[F W]*表示字符以F或W開頭的字符串,使用&連接符將其與變量sEnd所代表的字符串“in Office”相連接。如果您在文本框中輸入以字符F或字符W開頭并以“in Office”結(jié)尾的句子,將顯示“輸入正確”消息框,否則將顯示“輸入錯(cuò)誤”的消息框。在VBE編輯器中點(diǎn)擊運(yùn)行按鈕或按F5鍵,運(yùn)行該代碼試試。當(dāng)您在文本框中輸入“Fanjy in Office”后,單擊按鈕,將顯示“輸入正確”消息框。 AddressOf運(yùn)算符 AddressOf運(yùn)算符將過程的地址傳遞給API函數(shù)。其語(yǔ)法為 AddressOf 過程名 其中,過程名為需要傳遞給API函數(shù)地址的過程名稱。AddressOf運(yùn)算符后面必須是用戶定義的函數(shù)名、過程名或?qū)傩悦?,且該過程或函數(shù)必須保存在代碼模塊中。 賦值運(yùn)算符 在VBA中使用等號(hào)(=)作為賦值運(yùn)算符,它將其右側(cè)的數(shù)據(jù)或者表達(dá)式的結(jié)果賦給左側(cè)的變量,使其在程序代碼中運(yùn)用。例如,x=666,Range(“A1”).value="/”Dog”。 點(diǎn)運(yùn)算符 在VBA中,使用點(diǎn)運(yùn)算符來引用某個(gè)對(duì)象。運(yùn)用點(diǎn)運(yùn)算符,可以限定所引用的對(duì)象的位置,清楚地表明該對(duì)象的層次結(jié)構(gòu),還可以指定某對(duì)象的方法或?qū)傩?。例如,語(yǔ)句Workbooks(“Book1.xls”).Worksheets(“Sheet1”).Range(“A1”)表明對(duì)工作簿Book1中的工作表Sheet1上的單元格A1的引用;又如,語(yǔ)句Msgbox" Worksheets(“Sheet1”).Range(“A1”).Value表明顯示當(dāng)前工作簿中工作表Sheet1上單元格A1的值。
|