3.4 运算符和表达式
仅有变量是无法完成任务的,变量总是要参与到一定的运算中才能起作用。在VBA中根据功能的不同可以分为赋值运算符、算术运算符、逻辑运算符和比较运算符。当将常量、变量、函数等用运算符连接起来生成的运算式就称为表达式。
3.4.1 赋值运算符
赋值运算符从外观上来看就是一个等号“=”。其含义表示将赋值运算符右侧的值赋给运算符左侧。在VBA编程实践中,赋值既可以为一般的变量赋值也可以为对象变量赋值。
1. 为非对象变量赋值
为非对象变量赋值左侧通常为变量名,右侧通常为指定的值。指定的值可以是数值、字符串,也可以是其他的变量的值和函数运算的结果。例如将数值10赋值给了变量a可以用如下的代码来表示。
a = 10
2. 为对象变量赋值
除了给变量赋值外,还可以为对象变量赋值。赋值运算符的左侧是对象变量名,右侧是指定的内容。不同的是为对象赋值的时候需要使用关键字Set。
例3-13:将A1到B10单元格区域赋值给变量rng,并将rng的值赋值给一个新的变量newRng。
#001: Sub为对象赋值() #002: Dim rng As Range #003: Set rng = Range("a1:b10") #004: rng = 1 #005: End Sub
第2行代码声明了一个名为rng的对象变量,此时rng表示一个单元格区域对象。第3行代码指明了这个对象变量rng具体指代的单元格区域是A1到B10单元格区域。第4行代码表示将单元格区域中所有的单元格值全部用数值1来填充。
3.4.2 算术运算符
算术运算符是指用来进行数值运算的符号。算术运算符的含义和数学上的运算符的含义相同。一般来说算术运算符使用方法比较简单,算术运算符包括的内容如表3-3所示。
表3-3 算术运算符
1. 连接符&
用&作为连接符将&左侧和右侧的内容连接起来。连接的时候&左侧和右侧的内容都被当成了字符串类型看待。表3-4给出了用&表达式计算的结果。
表3-4 使用&的表达式
2. 加减乘除等其他运算符
加减乘除运算符的含义和数学中加减乘除的含义是相同的。表3-5给出了不同运算符下计算的结果。
表3-5 使用其他算术运算符运算实例
注意
如果参与运算的值有一个值为Null,那么最终运行的结果就是Null。例如“C=10+Null”,那么这个表达式的运算结果就是Null。
在进行除运算的时候,如果0做除数,将会返回一个错误。
3.4.3 比较运算符
常见的比较运算符有用于数值大小比较的大于、小于和等于等运算符符号。用于数值比较运算符和数学上的用法类似。常见的进行文本比较的运算符有Like和Is等。在Select Case结构中,不能使用Is或者Like作为比较运算符。比较运算符运行的结果有三种可能分别是True、False和Null。比较运算符包括的内容如表3-6所示。
表3-6 比较运算符
1. Like运算符
Like从字面含义来说就是“像”的意思,在此处用“可以表示为”来表示Like的含义更加贴切。该运算符是将位于Like右侧内容或结构去和左侧的内容进行比较是否相似。
在Like运算符中,其右侧可以使用通配符,在Like中支持的通配符如表3-7所示。
表3-7 通配符
如果位于Like运算符右侧的通配符通过补齐能够和左侧的内容一致,则结果为True,否则为False。左右两侧只要有一个为Null,那么最终的结果总是Null。
表3-8给出了用Like表达式运算的结果。
表3-8 使用Like运算符的运算示例
2. Is运算符
等号用于数值之间的比较,而对象之间的比较可以使用Is运算符,其含义可以理解为“就是”。表示Is运算符的左侧对象和右侧对象所引用的对象两者是一致的,只是称呼不同而已。
例3-14:在过程中,rng表示的单元格区域为A1到B10单元格区域,将rng单元格区域赋值给变量newRng,利用Is运算符,来对rng和myRng进行比较判断两者是否为同一区域,并用消息框给出最终结果。
#001: Sub演示Is运算符() #002: Dim rng As Range #003: Dim newRng As Range #004: Set rng = Range("a1:b10") #005: Set newRng = rng #006: MsgBox newRng Is rng #007: End Sub
第2行代码和第3行代码分别声明了两个类型为单元格区域的变量rng和newRng,第4行代码用Set关键字为对象变量rng赋值,使得rng表示的单元格区域为A1到B10单元格区域。第5行代码用Set关键字为将rng所表示的单元格区域赋值给newRng变量。第6行代码用消息框来显示newRng和rng用Is运算符判断的结果,代码运行的结果是True。
3. 其他比较运算符
其他比较运算符的含义相对简单,和数学上的比较概念类似。表3-9给出了用其他比较运算符表达式运算的结果。
表3-9 使用其他算术运算符运算实例
3.4.4 逻辑运算符
逻辑运算符是用于逻辑运算的运算符。逻辑运算符包括了And、Or、Not、Eqv和Imp等。逻辑运算符的运行结果为True、False或者Null。常用逻辑运算符包括的内容如表3-10所示。
表3-10 逻辑运算符
1. And运算符
And表示“且”的意思。表示对连接的两个条件判断是否都为真,如果And左右两侧表达式都为True,那么用And运算结果就是True,否则的话,只要有一个条件不成立,最终的结果为False。
下述代码给出了And运算符的运行结果。
Dim a,b,c,myResult a=2,b=3,c=7 myResult=(a < c) And (b < c) '运行结果为True myResult=(a>b) And (a < c) '运行结果为False myResult=(a<c) And Null '运行结果为Null
2. Or运算符
Or的字面含义就是或者。Or运算符左右两侧的判断结构都为True,那么Or运算符的运算结果就为True。如果Or运算符左右两侧的判断结果都为Fasle,那么Or运算符运行的结果就是False。
下述代码给出了Or运算符的运行结果。
Dim a,b,c,myResult a=2,b=3,c=7 myResult=(a< c) Or (b >c) '运行结果为True myResult= (a>c) Or (a >b) '运行结果为False myResult= (a<c) Or Null '运行结果为True myResult= (a> c) Or Null '运行结果为Null
那么最终的结果就是True,只有当两个判断的条件都不成立,其最终结果才是False。例如下述代码的运行结果就是True。
3. Not运算符
Not表示对一个判断表达式的否定,如果原来表达式的结果为True,那么使用经过Not运算符否定后,运算结果就是False。如果原来的判断表达式的结果为False,那么用Not否定后,运算结果就是True。
Dim a,b,c,myResult a=2,b=3,c=7 Not (a<c) '运行结果为False Not (a>c) '运行结果为True
4. Eqv运算符
从字面上来看Eqv似乎也是等于的意思。简单的理解可以认为位于Eqv左侧和右侧都是逻辑表达式,使用Eqv是用来判断左侧表达式的值和Eqv右侧表达式的值是否相等。如果Eqv运算符左右两侧同时为True或者同时为False,那么运算的结果为True;如果如果Eqv运算符左右两侧有一个值为False,一个值为True,那么运算的结果为False;如果Eqv左右两侧有一个值为Null,那么最终的运算结果总是Null。
Dim a,b,c,myResult a=2,b=3,c=7 (a > c) Eqv (b <a) '运行结果为True (a>c) Eqv (a<b) '运行结果为False (a > c) Eqv (c<Null) '运行结果为Null (a > c) Eqv Null '运行结果为Null
4. Imp运算符
Imp是逻辑蕴涵运算,简单来说就是逻辑表达式中的大于等于,理解的时候可以将True的值看做0,False的值看做1,夹在True和False之间的是Null,和Null比较其运行结果可以是True,也可以是Null,但不能是False。使用Imp的运算情况如表3-11所示。
表3-11 Imp运行结果
3.4.5 运算符的优先顺序
在一个表达式中可能会同时出现多种运算符,就好比数学中的四则混合运算中一个运算式中有多个运算符。当一个表达式中同时存在多个运算符时,就会存在运算的先后顺序问题。按照运算符运行的优先顺序来排列分别是算术运算符、比较运算符和逻辑运算符。比较运算符中没有先后顺序,总是从左到右按照出现的先后作为运算的优先顺序。
算术运算符和逻辑运算符内部还有先后顺序,其运算顺序安排情况如表3-12所示。在表格中处于上端的行其运行的优先顺序高于下端的各行。
表3-12 运算符
如果要更改运算的优先顺序可以为优先运行的代码添加括号,括号内的表达式将会被优先运行。