第6章 数据类型与运算符
程序由算法和数据构成,算法描述的是程序所要进行的操作,数据是程序的处理对象。数据在程序中是以变量或常量的形式存在。本章将学习的主要内容有:
❑ 掌握VBA中的常量、变量的使用方法。
❑ 掌握VBA常用数据类型的使用方法。
❑ 掌握各种VBA运算符的使用方法。
❑ 掌握各种表达式的运算方法。
6.1 VBA的数据类型
对于任何一门计算机编程语言而言,数据类型是其最基本的组成元素。在VBA中,基本的数据类型多达12种,并且还允许用户运用基础数据类型自定义数据类型,自定义数据类型丰富了VBA中原有的数据类型,并且拓展了VBA数据类型的应用范围。本节将介绍与数据相关的基本概念。
6.1.1 理解数据
数据是信息的一种载体,数据本身没有任何意义,数据的意义在于数据所表达的信息。从计算机科学的角度讲,数据是能被计算机识别、存储、处理的元介质的总称,例如数列求和时所用到的各个数字;记录某一事情或描述某一事件时,所记录的文本字符;随着计算机软硬件的发展和计算应用领域的推广,数据的范畴已不再局限于数字和字符,还包括声音、视频、图像、图形等,此类数据在计算机科学中统称为多媒体数据。
数据类型从计算机处理数据的角度看是具有相同性质的数据集合及在此集合上的一组操作,例如将数字中的整数划为整数(Integer)型,带小数点的实数划为Double型,将字符数据组成的集合划为字符串(String)类型。利用VBA语言的机制,用户也可以任意自定义数据类型。
6.1.2 VBA数据类型
VBA中存在多种数据类型,现将各种数据类型介绍如下。
6.2 使用常量与变量
常量与变量是程序的基本构成要素,在将算法转化为计算机语言描述时,其中有一些数据是固定不变的,还有一些数据只需要记录一下处理过程中的中间值,此类数据在处理的过程中不断变化,表示此类数据就需要用到常量和变量。本节将介绍常量与变量的基本理论和使用方法。
6.2.1 使用常量
从命名的角度看,常量就是指在程序运行过程中不会发生变化的量,其是变量的一种特例。使用常量可以供程序在计算过程中多次使用而不发生改变,同时在程序中使用常量还可以增加程序的可读性,例如在计算圆的周长时,所用到的圆周率3.1415926,可以将其定义为pi(π 的谐音)。在VBA中,常量分为数值常量、字符串常量、符号常量、用户自定义变量等。
数据值常量就是程序中所直接使用的1、2、3、……98等数值类型的常量;字符串常量指由多个字符组成的字符串构成的量。其表示形式是用“”包含的文本字符,例如,“hello Excel 2007 VBA!”;符号常量指在程序中使用符号来代替常量的出现,例如用pi来代替3.1415926的出现,用tariff表示关税的税率,使用符号常量特别适合于表示以后会发生改变的量,例如关税在一段时间内不会发生变化,但以后会发生变化,这样只需要在程序的定义处更改数值即可,程序内部引用此符号的地方就不需要修改。
逻辑常量指“True”和“False”两个值,分别用于表示真和假;日期常量指用两个#括起来的字符串,例如#9/19/2008#、#10/17/2008#就是日期常量。如果在程序中声明了日期型的量a,令a=#10/17/2008#,则a的值就是2008年10月17日。
系统常量指VBA系统内部定义的常量,一般都以Vb为前缀开头。例如在程序中引用VbRed代替抽象的0xFF表示红色,用VbCr表示回车符,用VbLf表示换行符,增强了程序的可读性。
对于上述常量的应用可直接将其值赋予变量即可。例如将布尔型变量Flag的值初始化为False,对应的程序语句如下所示。
Flag =False
用户自定义常量指用户可以根据设计程序的需要设定常量,声明常量时,需要用到Const语句,其定义方法如下所示。
Const常量名as数据类型 = 值 常量在声明时就需要赋值,且赋值以后,在程序中,不能再对该常量做任何修改。在VBA中所有的基本数据类型 都可以声明常量。
Tips
在声明常量时,常常将常量名的字母全部用大写,这样有助于区分常量与变量。
6.2.2 使用变量
变量是用于存放临时数据的工具,其保存的数据是计算过程中的中间值,变量值会随着程序的执行而不断发生变化。在计算机语言中,通常要求所使用的变量要先声明,然后才能使用,但在VBA中,对此条件可以进行设定,如果采用默认设置,则可以在不声明的条件下使用变量,因此在VBA中,变量的声明分为隐式声明和显示声明。
隐式声明指在不声明变量的情况下,可直接使用变量。在VBA中,当遇到没有声明的名称时,VBA编译系统会首先用此名称创建一个与该名称相同的变量名,然后将此变量名作为显式声明的变量名使用。尽管使用隐式声明很方便,可随手拿来使用。但是因为有隐式声明的变量,当程序出错时,很难找到其出错的位置。
显示式声明指在使用变量之前,首先声明变量。声明变量时需要用到Dim语句,其声明语法如下所示。
Dim变量名As数据类型 在声明特定类型的变量时,必须指明其数据类型。变量名必须是以字母或汉字开头,由字母、下画线、汉字组合而 成。例如语句“Dim a As Integer”就声明了一个整型变量为a。
Tips
变量名最长不能超过255个字符,并且变量名不能与关键字同名,如Dim、Do等;另外Dim语句也可以同时声明多个变量,例如下述语句中,声明了3个变量a、b、c,其中只有c是一个日期型变量,a、b都不是日期型变量,而是Variant类型的变量。
Dim a,b,c As Date
6.2.3 强制声明变量
强制声明变量指变量必须先经过声明,然后再使用。启用强制声明变量后,隐式声明变量将会被禁用,有2种方法可以进行强制声明变量。
1.使用Option Explicit强制声明变量
在各个程序模块的顶部添加“Option Explicit”语句,语句使用如下。
Option Explicit
2.使用工具选项强制声明变量
通过设置Visual Basic编辑器的工作环境。其操作步骤如下所述。
(1)选择“工具”→“选项”命令后,弹出如图6.1所示的对话框。
(2)在“编辑器”选项卡下有“代码设置”组,勾选“要求声明变量”复选框。
图6.1 强制声明变量
(3)单击“确定”按钮。完成设置强制声明变量。
Tips
此方法仅会对此设置以后添加的代码起作用,对于设置以前就存在的代码还需要通过用户手动添加“Option Explicit”语句。
6.2.4 使用类型标识符定义变量
类型标识符是每种数据类型的符号表示方法,例如字符串类型的标识符为“$”,整型的标识符为“%”,长整型的标识符为“&”,单精度浮点型的标识符为“!”,双精度浮点数标识符为“#”,货币型标识符为“@”。例如在程序语句中使用如下赋值语句,就相当于声明了一个整型变量s,其初始化值为6。
s% = 6
6.2.5 定义公共变量
公共变量是可以供应用程序内部所有的过程、函数及模块共同使用的变量。此变量的声明位于标准模块的顶部,声明时使用Public语句,其语法描述如下所述。在程序中使用公共变量时,常将所有要使用的公共变量保存到一个模块中,方便在使用过程中集中查看变量的声明及意义。
Public变量名As数据类型
6.2.6 使用模块级变量
模块级变量指仅能由模块内部的过程、函数使用的变量。此变量的声明位于某一模块顶部,声明时使用“Dim或Private”语句,其语法描述如下所示。模块级变量在使用过程中,只能供本模块内部访问,其他模块对此变量没有访问权限。
Dim变量名As数据类型 Private变量名As数据类型
Tips
使用Dim语句和Private语句在效果上是等效的,两者声明的都是模块内部使用的变量,只是使用Private语句时,增加了程序的可读性,表示声明的是供本模块内部使用的私有变量。
6.3 理解VBA常用数据类型
VBA语言提供了丰富的数据类型,每种数据类型都是具有相同性质的数据集合,每种数据类型都针对不同的具体应用,例如对于金融领域的应用有货币型,对于计算的应用有整型和浮点型。本节将介绍常用的数据类型。
6.3.1 使用Boolean型数据
Boolean型变量用于表示只有2种状态的变量,其取值只有2种即True或者false。在数据存储时占用2个字节即16位的存储空间。在相容的数据类型之间可以相互转换,由其他相容数据类型转换为Boolean型时,依据其值进行转换,如果其值为0,则转换为false值,如果其值为非0,则转换为True。同样的Boolean型也可以转变为与其相容的数据类型,在转换时,false值会转换为0,True值转换为-1。在程序设计过程中,常使用Boolean型变量表示两种状态,或作为某种标志。
Dim flag As Boolean flag = True
Tips
计算机中只有0和1两种状态,存储数据时,是以二进制的形式存储的,其中每一个二进制数据即0或1占据一位的存储空间。
6.3.2 使用Byte型数据
Byte型变量是一种无符号单精度整数,其表示范围在0~255之间,在存储数据时占据1个字节即8位的数据存储空间,所以Byte型变量非常适合于存储二进制数据。Byte型在VBA中是占用存储空间最少的数据类型,其他数据类型向Byte型转变时,截取低位;Byte型向其他相容数据类型转变时,高位补0,低位按照原有的值填充进去即可。
6.3.3 使用Date型数据
Data型是一种日期类型的数据,主要用于声明、存储日期型数据。在数据存储时日期型数据占据8个字节64位的存储空间。其表示的日期范围从100年1月1日到9999年12月31日,表示的时间的范围从0:00:00到23:59:59。任何可识别的日期都可以赋予Date型变量。在书写日期型常量时,要用“#”将其日期文字括起来。
Date型变量会根据计算机的日期和时间格式自动转换日期显示;当其他数据类型之间相互转换Date型数据时,小数点左边的值转换为日期值,小数点右边的值转换为时间值,小数部分为0,表示午夜时间,小数部分为0.5表示中午时间,即一天已过了一半,1899年12月30日之前日期是一个负整数,其后的日期是一个正数。其示例代码如下。
Dim mytime As Date mytime = #9/3/2001 11:35:00 AM#
6.3.4 使用Double型数据
Double型数据表示一种双精度浮点数,在数据存储时,Double型数据占据8个字节即64位存储空间,其表示范围分为两类,对于负数数据是从 -1.79769313486231E308 到 -4.94065645841247E-324,而正数数据是从4.94065645841247E-324 到1.79769313486232E308。其类型标识符为“#”。
Tips
数据表示范围中的“E”后的数据308,表示的是10的308次方。
6.3.5 使用Integer型数据
Integer型数据表示整数,在数据存储时,Integer型数据占据2个字节即16位的存储空间,表示范围在-32768 到32767 之间,其类型标识符为“%”。因此Integer数据类型适合于表示较小的整数,对于范围比较广的整型数据,建议使用Long型数据。例如在例6-9中计算10的阶乘就用Long型数据,如果在此例中使用Integer型数据,会出现如图6.2所示的运行错误。
图6.2 运行错误
6.3.6 使用Long型数据
Long型数据也用于表示整数,与Integer型数据相比,Long型数据的表示范围比较大,存储空间占用比较多。在数据存储时,Long型数据占据4 个字节即32 位,其表示范围从-2147483648 到2147483647。其类型数据标识符为“&”。
6.3.7 使用Object型数据
Object型数据表示对象的引用,其数据存储时,Object型数据会占据4个字节32位的存储空间,其中存储的内容是一个对象的地址,对于一个Object型变量赋值时,不能直接采用赋值语句,而应当利用Set语句为其赋值。Set语句的使用方法如下例代码所示。
Dim sheet As Object Set sheet = Worksheets("sheet1")
Tips
Object型变量可以引用各种对象,但绑定到变量引用的对象总是在运行时才可绑定。如果要在编译时绑定,必须将对象的引用赋值给用特定类名称声明的变量。
6.3.8 使用String型数据
String型数据用于表示字符串数据,字符串分为2 种即变长字符串与定长字符串,变长字符串最多可包含大约20亿个字符,定长字符串可包含大约64KB的字符串,字符串中包含的数据类型不表示字符串表示的数值,仅表示字符本身,例如“23”表示的是一个文本值23,而并不表示数字23。String型的数据的类型标识符是“$”。
Tips
每个字符串中字符的取值范围是从0~255。字符取值的0~127表示的字符与ASCII字符表中定义的相同。128~255所表示的字符都是一些特殊字符,例如货币符号、重音符号等。
6.3.9 使用Variant型数据
Variant型数据存储的是当定义某一变量时,数据类型没有被显式声明为某一类型变量的数据,其是一种特殊的数据类型,除了定长String数据及用户自定义的类型外,可以包含各种类型的数据,并且Variant中的数据也可以是Empty、Error、Nothing及Null等特殊数值;还可以用VarType函数或TypeName函数来处理Variant中的数据。对于数值型数据可以是任何整型数据或实型数据。在数据计算的过程中,Variant型数据还可以实现一定程度的自动转换,但是其转换能力是有限的,建议使用专门的转换函数。
6.3.10 使用自定义数据类型
当已有基本数据类型不足以描述用户的需求时,用户可以利用VBA的数据类型扩展机制自定义数据类型。在存储用户自定义数据类型时,所占用的存储空间取决于所定义的数据类型中包含的数据元素的长度,其内部各个数据类型所占用存储空间的和,即为用户自定义数据类型占用的存储空间。用户自定义数据类型需要使用Type语句。Type语句只能在模块中使用,如果要在类模块中使用,则必须在Type语句前添加Private关键字。用户自定义数据类型的使用如例6-1所示。
【例6-1】在生活中,为了方便与亲戚朋友的联系,常常要制作一个通讯录,用于记录所有联系人的姓名、性别、年龄、联系方式、家庭住址、工作单位等基本信息。如果要表示通讯录中的每个人lianxiren,显然在VBA中没有lianxiren这种数据类型。此时可自定义lianxiren数据类型。此程序,定义了一个lianxiren类型的数据来描述联系人信息,然后将一个联系人的信息存入lianxiren类型的变量中,并将联系人的信息输出。其操作步骤如下所述。
(1)在工程资源管理器中单击鼠标右键,弹出快捷菜单。
(2)选择“插入”→“模块”命令,工程资源管理器中出现新建的模块1。
(3)在工程资源管理器中,双击模块1对象,弹出代码窗口。
(4)在代码窗口中,编辑下述代码。
01 Type lianxiren ' 02 name As String 03 sex As String 04 age As Integer 05 phone As String 06 address As String 07 department As String 08 End Type 09 Sub通讯录() 10 Dim record As lianxiren '声明了一个lianxiren类型的变量 11 '录入联系人的姓名 12 record.name = InputBox("请输入联系人姓名 : ", "记录联系人信息") 13 '录入联系人的性别 14 record.sex = InputBox("请输入联系人的性别 : ", "记录联系人信息") 15 '录入联系人的年龄 16 record.age = InputBox("请输入联系人的年龄 : ", "记录联系人信息") 17 '录入联系电话 18 record.phone = InputBox("请输入联系人的电话 : ", "记录联系人信息") 19 '录入联系人的家庭住址 20 record.address = InputBox("请输入联系人的地址 : ", "记录联系人的信息") 21 '录入联系人的工作单位 22 record.department = InputBox("请输入联系人的工作单位 : ", "记录联系人信息") 23 '输出联系人的信息 24 MsgBox "姓名 : " & record.name & vbLf & "性别 : " _ 25 & record.sex & vbLf & "年龄 : " & record.age & vbLf & _ 26 "联系电话 : " & record.phone & vbLf & "联系地址 : " _ 27 & record.address & vbLf & "工作单位 : " & record.department, vbOKOnly, "联系人基 本信息" 28 End Sub
(5)单击标准工具栏上的“运行”按钮,弹出对话框,在其文本框中输入“高阳”,如图6.3所示。
(6)单击“确定”按钮,弹出下一个对话框,在其文本框中输入“男”,如图6.4所示。
图6.3 输入联系人姓名
图6.4 输入性别
(7)单击“确定”按钮,弹出下一个对话框,在其文本框中输入“24”,如图6.5所示。
(8)单击“确定”按钮,弹出下一个对话框,在其文本框中输入“13774410858”,如图6.6所示。
图6.5 输入年龄
图6.6 输入联系电话
(9)单击“确定”按钮,弹出下一个对话框,在其文本框中输入“河南省郑州市二七区”,如图6.7所示。
(10)单击“确定”按钮,弹出下一个对话框,在其文本框中输入“上海交通大学通信工程学院”,如图6.8所示。
图6.7 输入联系人地址
图6.8 输入人联系人工作单位
(11)单击“确定”按钮,弹出如图6.9所示的对话框。
【代码解析】第1~8行自定义了一个数据类型,第10行声明了一个自定义数据类型的变量,第11~22行用于输入所定义的变量值,第24~27行用于输出自定义的数据类型。
从例6-1中,可以声明和使用用户自定义类型的方法,其中InputBox是一个输入函数,用于从键盘录入联系人的信息,在用户录入了联系人的姓名、性别、年龄、联系电话、家庭住址、工作单位后,在程序的最后输出联系人的所有详细信息。从程序中还可以看到,在使用用户自定义数据类型时,声明同于普通的变量,但在程序中访问时,需要逐个赋值其内部结构中的每一个变量,并且对于所声明数据类型的内部元素的访问要使用“.”运算符。还有一种方便的输入简化代码的方法,就是使用With语句。
图6.9 输出联系人的详细信息
6.4 使用运算符
在VBA语言中,运算符表示执行某种运算的符号。运算符的命名与正常使用的符号或语言相近,在使用过程中识别方便,本节将介绍VBA中的赋值运算符、算术运算符、关系运算符、逻辑运算符和连接运算符。
6.4.1 使用赋值运算符
赋值运算符是指完成赋值运算的符号,其符号表示为“=”。在VBA中赋值运算符用来给变量、数组成员或对象的属性成员赋值,其赋值的形式是赋值号“=”的左边是变量名、数组成员名或对象属性名,赋值号“=”右边是所赋的值。其语法描述形式如下所示。
变量名 = 值 对象.属性名 = 值
在例6-1中就使用了对象赋值,如第12~22行。普通变量的赋值如下所示。
Dim sum As Integer sum = 0
Tips
对象属性的访问需要用到对象名和“.”,然后再加上属性名。
6.4.2 使用算术运算符
算术运算符是描述算术运算的符号。在VBA中提供了完整的算术运算符号,可以完成各种复杂的算术运算。其各种运算符号包括加(+)、减(-)、乘(*)、除(/)、整除(\)、求余(Mod)、指数(^)。其中加减乘除与数学中所使用的符号相同,减法运算符还可以作为“负号”使用。整除运算符是在两个数做整除运算后仅获取商的整数部分,舍弃小数部分。求余运算符用于获取两数做除法运算后所得到的余数。指数运算符用于描述数学中的幂运算。其语法描述如表6-1所示。
Tips
数值数据类型表达式的单纯加法,Result的数据类型通常与其中最精确的表达式的数据类型相同。精确度由最低到最高的顺序是Byte、Integer、Long、Single、Double、Currency和Decimal。
表6-1 算术运算符功能及语法描述表
Tips
表6-1中expression表示数字或表达式。
一个算术运算式子中可以包含多个运算符。在数学运算中,运算顺序为先乘除后加减,在VBA中,同样有算术运算符运算的先后顺序,其运算的先后顺序如表6-2所示。如果需要在运算的式子中改变运算的先后顺序,可以将需要先运算的式子用括号“()”括起来,在运算时,就会按照从左到右的顺序将“()”内的算式作为一个整体运算后,将运算结果与前后的式子进行运算。算术运算符的使用如例6-2所示。
【例6-2】此例中包含“除法运算符”、“整除运算符”、“求余运算符”、“指数运算符”的使用方法,并在一个混合的式子使用“()”来改变运算的优先级。
01 Sub算术运算符的使用() 02 Dim sum As Integer '存储两数的和 03 Dim chengji As Integer '存储两数据乘积 04 Dim shang As Integer '存储两数整除的商 05 Dim result As Double '存储两数的商 06 Dim yushu As Integer '存储两数求余的余数 07 Dim hunhe As Integer '存储混和算式的结果 08 Dim mi As Double '存储幂运算 09 sum = 5 + 3 '加法运算符 10 chengji = 3 * 20 '乘法运算符 11 shang = 9 \ 2 '整除运算符 12 result = 9 / 2 '除法运算符 13 yushu = 9 Mod 7 '求余运算符 14 mi = 2 ^ 3 '指数运算符 15 hunhe = (3 + 2) * (5 + 4) '混合式子用括号改变运算优先级 16 MsgBox "5 + 3 = " & sum & vbLf & "3 * 20 = " & chengji _ 17 & vbLf & "9 \ 2 = " & shang & vbLf & "9 / 2 = " & result 18 & vbLf & "9 Mod 7 = " & yushu & vbLf & "2 ^ 3 = " & mi 19 & vbLf & "(3 + 2) * (5 + 4) = " & hunhe, vbOKOnly, "算 术运算符的使用" 20 End Sub
图6.10 算术运算符的使用
【代码解析】第2~8 行声明了各个变量用于保存各种运算的结果,第9~15行用于实现两数的加、乘、整除、除法、求余、指数、混合运算等各种运算方法。第16~19行用于输出各种运算的结果。
单击标准工具栏上的运行按钮,执行结果如图6.10所示。
表6-2 算术运算符优先级
Tips
表6-2 中,优先级数值越大,优先级越高。优先级数值相同表示优先级相同,等级相同的运算符在算式中按自左向右的顺序依次计算即可。
6.4.3 使用关系运算符
关系运算符是表示两个数据关系的符号。两个数据之间的关系有大于、小于、大于等于、小于等于、不等于等多种关系。表达数据之间的关系可以用关系运算符,在VBA中,共有8种关系运算符,其各个运算符的符号、功能和语法描述如表6-3所示。其示例代码如下所述。
Dim flag As Boolean '声明一个布尔型变量 flag = 7 < 8 'flag的值为True
表6-3 关系运算符功能及语法
Tips
在Select Case语句中不能把Is和Like当做比较运算符来使用。Null是一个值,指示变量不含有效数据。Null是将Null显式赋值给一变量的结果,或者是包含Null的表达式之间的任何运算。
当一个式子中包含多个关系运算符时,在计算时,也有一个先后顺序,关系运算符的先后顺序如表6-4所示。掌握了关系运算符的运算顺序后,可以更好地构造条件控制语句。例如为选择结构的程序构造判定条件,为循环结构程序构造判定条件。同样地,也可以运用“()”或嵌套“()”来更改运算过程中的先后顺序,同一级别的运算符号在运算时按自左向右的顺序运算。
表6-4 关系运算符优先级
Tips
在VBA关系运算符中,有些运算符在键盘上没有正好与其对应的键,需要在键盘上按组合键来完成关系运算符的输入。例如“不等号<>”,在输入不等号时,必须将输入法调整为英文输入法,如果在中文输入法下,输入的不等号会变为-“《》”,在程序中会引起编译错误。同时,在VBA中的“>=”和“<=”不同于数学符号中的“≥”和“≤”。
6.4.4 使用连接运算符
连接运算符在运算的过程中将两个表达式连接起来。在VBA中,连接运算符分为2种即强制字符连接运算符和混合连接运算符。强制字符连接运算符为“&”,其能够将两个表达式强制性地作为字符串连接,即将两个表达式的值作为字符串连接在一起,构成一个新的字符串。如果两个表达式的值的类型都是字符串类型,则结果字符串也是String型,否则,计算结果为String变体。其语法描述如下所示。
Result = expression 1 & expression 2
在语法描述式子中,Result表示连接的字符串结果,expression是作为连接运算的表达式,两个表达式对于连接运算符而言,都是必不可少的构成要素。如果两个表达式中有一个结果为Null,在执行连接运算时,将此表达式作为长度为零的字符串与另一字符串连接;如果两个表达式都为Null,则计算结果为Null。同时对于任何Empty类型的表达式也可作为长度为零的字符串处理,如下述代码所示。
str = “re” & “name” 'str的值为rename
连接运算符中的混合连接符是“+”,混合连接符连接的实际意义需要依据实际的表达式来确定。其语法描述如下所示。其中Result是任何类型的数值表达式,expression1与expression 2都是任何类型的表达式。
Result = expression 1 + expression 2
混合连接符在实际的连接运算中运用非常灵活,其结果值和运算的实际含义依赖于所参与运算的表达式,如果两个表达式中有一个运算结果不是Variant类型,运算的规则如表6-5所示。如果两个表达式运算结果都是Variant,类型运算规则如表6-6所示。如果两个表达式中有一个是Null表达式,则result为Null。如果两个表达式都是Empty,则result是Integer。但是,如果只有一个表达式是Empty,则另一个表达式作为运算结果返回。
表6-5 对于表达式中存在非Variant类型的函数的运算规则
表6-6 两个表达式均为Variant表达式时的运算规则
6.4.5 使用逻辑运算符
逻辑运算符是用于完成逻辑运算的符号。VBA提供了丰富的逻辑运算符,包括And、Eqv、Imp、Not、Or、Xor 6种。本节将详细介绍各个运算符的运算规则。
And运算符用于完成合取运算,其语法描述如下。Result是任何数值型变量,expression 1和expression 2可以是任何类型的表达式。对于关系表达式,如果两个表达式的值都是True,则Result是True。如果其中一个表达式是False,则Result的是False。如果存在表达式Null的类型,则要依据另一表达式的值来确定运算结果,若另一表达式为False,则计算结果为False,若另一表达式为Null,则结果为Null。
Result = expression1 And expression2
Tips
And运算符还可以用于两个数值型数据的计算。对两个数值型表达式中位置相同的位进行逐位比较,按表6-7所示的规则设置Result中各个位的值。
【例6-3】此程序声明了两个Byte型变量,并将其赋予初值,通过此例可以看到数值型数据的逻辑运算过程,其计算过程如图6.11所示。先将变量a的值转变为二进制数,再将b的值转变为二进制数,然后将两个二进制数位按位对齐,按表6-7所示的规则计算得一个二进制数转变为十进制数。
表6-7 And运算符数值数据的逻辑运算规则
图6.11 数值逻辑运算
01 Sub数值逻辑运算() 02 '声明3个整数a,b,c 03 Dim a As Integer 04 Dim b As Integer 05 Dim c As Integer 06 '将a,b赋予初值 07 a = 75 08 b = 65 09 c = a And b '逻辑运算 10 '输出计算结果 11 MsgBox "c = a And b = 75 And 65 = " & c, vbOKOnly, "数值数据逻辑运算" 12 End Sub
【代码解析】第3~5行用于声明变量,第7~8行用于变量赋值,第9行实现数值的逻辑运算,第11行用于输出数值逻辑运算的结果。
图6.12 数值数据逻辑运算结果
执行结果如图6.12所示。
Or运算符用于表示两个表达式的或运算,其语法描述如下所示,其语法描述式中各个元素的含义同于And运算符。其运算规则如下所述,如果两个表达式中至少有一个为True,则Result为True,如果两个表达式中有Null值,则计算结果取决于另一表达式,若其值为True,则运算结果为True,否则,运算结果为Null;当表达式为数值表达式时,可按位进行逐位比较,计算规则为,只要两个相同的“位元素”中有一个为“1”,则该位计算结果为“1”;计算方法同于例6-2。
Result = expression 1 Or expression 2
Not运算符用于完成逻辑否定运算。其表达式如下所示。Result为任何类型的数值变量,expression为任何表达式。其运算规则为,当表达式的值为True时,Result值为False,当表达式的值为False时,Result值为True,当表达式的值为Null时,Result值为Null。如果参与运算的为数值表达式,则将该数值的相应位取反后,将其值赋予Result。
Result = Not expression
如下述代码所示。
Dim flag As Boolean flag = Not false 'flag的值为True
在VBA中,And、Or、Not运算符是最基本的逻辑运算符,当表达式中出现多个逻辑运算符时,也需要按逻辑运算符的优先级按自左向右的顺序进行计算。其运算符优先级如表6-8所示。
表6-8 逻辑运算符优先级
6.5 使用表达式
表达式是指由关键字、运算关键字、运算符、变量、常量、字符串常数、数字或对象组合而成的式子。其可用来执行运算、操作字符或测试数据等,是程序设计语言的基本组成部分。本节将介绍算术表达式、关系表达式、逻辑表达式等。
6.5.1 算术表达式
算术表达式用于表示算术运算的式子,其由算术运算符、变量、常量、函数或过程的调用组成。其计算结果为数值型数据。在同一算术表达式中出现多个运算符时,会按照自左向右的顺序,结合算术运算符的优先级计算表达式的值。例如下面就是一个算术表达式。
01 Dim a As Integer 02 Dim b As Integer 03 Dim c As Integer 04 a = 75 05 b = 65 06 c = a + b + 3 '算术表达式
【代码解析】第1~3行用于声明变量,第4~5行用于赋值,第6行是一个算术表达式,用于求和。
Tips
程序设计语言中的表达式与数学中使用的算术式稍有不同,特别是在某些式子的表示方法上有很大不同,例如 +ca×b d转化为VBA程序中的算术表达式就表示为a*b+(c/d),a5+b5转化为VBA程序中的算术表达式就表示为a^5+b^5,2 2a +bc d× 算式转化为(a^2+b^2)/(c*d),a[x+b(x+c)]算式转化为VBA程序中的算术表达式就是a*(x+b*(x+c))。
6.5.2 使用关系表达式
关系表达式是包含关系运算的式子,其是由算术运算符、关系运算符、逻辑运算符、变量、常量、函数或过程的调用组合而成的式子,其计算结果是一个布尔型的变量,当关系表达式中包含多个关系运算符号时,按自左向右的顺序结合关系运算符的优先级的先后顺序依次计算关系表达式的值。例如下面就是一个关系表达式。
(7 > 8)and(9 < 10)
6.5.3 使用逻辑表达式
逻辑表达式指包含逻辑运算符的式子,如果使用逻辑运算符的表达式是非数值型表达式,则其计算结果为布尔型数据,即True或False;如果使用逻辑运算符的表达式是数值型数据,则计算结果为数值型数据类型。例如下面就是一个逻辑表达式。
a and b
6.5.4 使用其他表达式
日期表达式指任何可解释成日期的表达式,包含日期文字、可看做日期的数字、可看做时间的字符串及从函数返回的时间。日期表达式限于数字或字符串,可表示从1899 年1 月1 日到9999 年12月31 日的日期。可将日期作为实数的一部分来存储。小数点左边的数值表示日期,小数点右边的数值表示时间。负的数值表示在1899 年12 月30 日 之前。
时间表达式指任何可转换成时间的表达式。包括任何时间文字的组合、看起来类似时间的数字、看起来类似时间的字符串及从函数返回的时间等。可将时间作为实数的一部分存储起来。小数点右边的数值表示时间。例如,中午(12:00 P.M.)可表示为0.5。
Variant表达式其值为数值、字符串或日期数据及特殊数值Empty和Null。字符串表达式指任何其值为一连串字符的表达式。字符串表达式的元素可包含返回字符串的函数、字符串文字、字符串常数、字符串变量、字符串Variant或返回字符串Variant (VarType 8) 的函数。
6.6 习题
1. 什么是数据?
2. VBA常用的数据类型有哪些?
3. 赋值运算符如何使用?
4. Variant表达式和字符串表达式有何区别?