Visual Basic 6.0编程基础[下学期]

文档属性

名称 Visual Basic 6.0编程基础[下学期]
格式 rar
文件大小 478.6KB
资源类型 教案
版本资源 通用版
科目 信息技术(信息科技)
更新时间 2007-11-02 09:22:00

图片预览

文档简介

(共331张PPT)
第3章 Visual Basic 6.0编程基础
本章将全面介绍Visual Basic 6.0编程基础,其主要内容有:
数据类型
常量和变量
变量的作用域
运算符和表达式
Visual Basic 基本控制结构
数组
3.1 数据类型
数据是程序的必要组成部分,也是程序处理的对象。
在高级语言中,程序处理的一切数据都有其确定的数据类型。数据的类型决定了该数据在计算机内的存储方式、取值范围以及它所能参与的运算类型。正确的区分和使用不同的数据类型,能使程序运行时节省内存,确保程序运行的正确性和可靠性。 Visual Basic的数据类型可以分为标准类型(基本类型)和复合类型(用户自定义类型)两大类。
3.1.1 标准类型(基本数据类型 )
Visual Basic提供的基本数据类型主要有数值型数据和字符串型数据,此外,还提供了字节、货币、对象、日期、布尔和变体数据类型等。
1.数值型数据
数值型数据是用来表示数值的,有大小和正负之分。
Visual Basic的数值型数据分为整型数和实型数两类。其中,整型数分为整型和长整型,在计算机术语中也叫定点整数,实型数分为单精度型和双精度型,在计算机术语中也叫浮点数。
(1)整型数
整型数是指不带小数点和指数符号的数,可分为整型和长整型,在计算机内部以二进制补码表示。
例如,整数5,-5分别以下面的形式存放:
5
整型(Integer)(2字节)
整型以两个字节(16位)的二进制码表示和参加运算,其取值范围为-215~215-1,即-32 768~32 767。整型数占用存储空间少,运算速度快,可用来表示不太大的整数。
0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1
-5
长整型(Long)(4字节)
长整型以带符号的四个字节(32位)的二进制数存储,其取值范围为-231~231-1,即-2147483648~+2147 483647。长整型可用来表示较大的整数。
例如,长整数5,-5在计算机内部的存放形式为:
5
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
高字
低字
-5
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1
高字
低字
(2)实型数
实型数也称浮点数或实数,可分为单精度型和双精度型,是带有小数部分的数值。它由三部分组成: 符号、指数及尾数。单精度型和双精度型的指数分别用“E”(或“e”)和“D” (或“d”) 来表示。例如 :
123.45E+3或123.45e+3是单精度数,相当于123.45×103 。
123.45678D+3或123.45678d+3是双精度数,相当于123.456 78×103 。
注意:这里123.45或123.456 78是尾数部分,指数部分是E+3或D+3。
单精度型(Single)
用4个字节(32位)存储,其中符号占1位,指数占8位,其余23位表示尾数,此外,还有一个附加的隐含位。单精度数表示的精度是7位有效数字,表示的数的范围为 -3.402 823E+38~3.402 823E+38。
双精度型(Double)
用8个字节(64位)存储,其中符号占1位,指数占11位,其余52位用来表示尾数,此外,还有一个附加的隐含位。与单精度型数相比,双精度数有着更高的表示精度和更大的表示范围,其表示精度可高达15有效数字,表示范围为-1.797 693 134 862 316D+308~1.797 693 134 862 316D+308。
浮点数与整型数相比:单精度型数和双精度型数表示范围更大,但运算速度比整型数要慢,且在运算过程中可能会产生极小的误差。
2.串型数据(String)
字符串型数据用来表示字符串,字符串是一个字符序列,它包括标准的ASCII字符和扩展ASCII字符及汉字等。在Visual Basic中,字符串是放在双引号内的若干个字符。长度为0(即不含任何字符)的字符串称为空字符串。例如:
"Hello"
"123.5"
"Visual Basic程序设计"
"" (空字符串)
" "(空格字符串)
注意:空字符串和空格字符串是有区别的,前者长度为0,后者长度不为0。
Visual Basic中的字符串分为两种:即变长字符串和定长字符串。其中变长字符串的长度是不确定的,可以在0~231的范围内,占用的存储空间的字节数是10加上字符串需要的实际空间。而定长字符串含有的字符个数是确定,最多可包含216个字符,占用的存储空间是存储字符串需要的实际空间。
3.货币型数据(Currency)
货币数据类型是为表示钱款而设置,主要用于货币计算。该类型数据以8个字节(64位)整型数值的形式存储,然后除以10000给出一个定点数,其小数点前有15位数字,小数点后有4位数字(在小数点后4位以后的数字将被舍去),共计可有19位有效数字。其取值范围为:
- 922337203685477.5808~922337203685477.5807。
浮点数中的小数点是“浮动”的,即小数点可以出现在数的任何位置。货币类型数据的小数点是固定的,因此称为定点数据类型。
与浮点数相比,货币数据的表示范围虽然小了一些,但表示精度要高;与整型和长整型相比,表示精度要高得多,但占用存储空间大,运算速度慢。
4. 字节型数据(Byte)
字节型数据实际上是一种无符号整型数,以1个字节的无符号二进制数存储。其取值范围为0~255。字节型数据在存储二进制数据时很有用,在进行ANSI和Unicode码之间得格式转换时,数据不会丢失。如果要对字节型数据进行一元减法运算时,Visual Basic先要将字节型数据转换成整型数据。
5.布尔型数据(Boolean)
布尔型数据也称为逻辑型数据,该数据没有大小和正负之分,只有两个逻辑值True(真)或False(假)。可用来表示只有两种状态的数据,如婚否、性别等。
布尔型数据用16位(2 Byte)的数值形式存储,只有0和-1两个值,分别表示False(假)和True(真)。布尔型数据的值当使用Write#方法的时候显示为#False#或#True#,而当使用Print方法的时候显示为False或True。
当把数值型数据转换为布尔型数据时,0被转换为False,非0的值一律转换为True。反之,当把布尔型数据转换为数值型数据时, False被转换为0,而True被转换为-1。
6.日期型数据(Date)
日期型数据用来表示日期和时间,如:1998年5月1日15点25分20秒,也可以只表示日期或时间,如1998/5/1 或 15:25:20。
日期型数据在计算机内存中存储为IEEE 64位(8个字节)浮点数值形式,可以表示的日期范围从公元100年1月1日~9999年12月31日,其格式为mm/dd/YYYY或mm-dd-YYYY,而可表示的时间范围从00:00:00~23:59:59,其格式为HH:MM:SS。
任何可辨认的文本日期都可以赋值给日期变量,但日期文字必须用数字符号(#)括起来,例如: #January 5,2004#。
当把数值型数据转换为日期型数据时,小数点右边的数据表示时间信息,午夜为0,中午为0.5。小数点左边的为日期信息,负整数表示1899年12月30日以前的日期,正整数则表示以后的日期。
注意:当前的Visual Basic版本中,输出年份时通常只输出最后2位,对于2000年以后的年份,其输出将为“00”、“01”等,故在输出2000年以后的年份时,需要作适当处理(比如在前面加上“20”)。
7.变体型数据(Variant)
变体数据类型是一种特殊的数据类型,也称之为可变数据类型或通用类型,它是一种没有用Dim等语句显式说明为其他类型数据的数据类型。
变体数据类型可以表示任何值,如数值、字符串、日期/时间以及Empty、Null、Error等特殊值。
Empty用来进行标记尚未初始化的变体型变量。包含Empty值的变体型变量在数值计算时表示0,而在字符串运算时表示空串。
Null值一般用于数据库应用程序,用来表示变体型变量含有一个无效数据或丢失的数据。一般而言,若函数的参数中包含Null值,函数总是返回Null值;若表达式中包含Null值,表达式的值总是返回Null值。
Error值是用来指示在过程中出现错误时的特殊值。
当变体型数据包含数值型数据时,占用的存储空间为16Byte,表示范围可以达到双精度的数据范围;当变体型数据包含字符型数据时,占用的存储空间为22Byte加上字符串的长度,表示范围可以达到变长字符串型数据的范围。
该类型数据的用法参见3.2.2节“变体类型变量”。
8.对象型数据(Object)
对象型数据用来表示图形、OLE对象或其他对象,用32位(4Byte)存储。利用Visual Basic提供的Set语句,声明为对象型数据的变量可以引用应用程序所识别的任何对象。但在声明变量时,要使用特定的类,如TextBox(文本框),而不要使用一般的对象,如Control(控件)。这样Visual Basic在运行程序之前可以决定引用特定类型对象的属性和方法,以加快程序的运行速度。
9.Decimal数据类型
Decimal变量存储为96位(12Byte)无符号的整型形式,并除以一个10的幂数,称为变比因子。这个变比因子决定了小数点右面的数字位数,其范围为0~28。在有28个小数位的情况下,最大值为+/-7.9228162514264337593543950335,最小的非零值为+/-0.0000000000000000000000000001。当变比因子为0(没有小数位)时,最大的可能值为+/-79228162514264337593543950335。
使用Decimal的方法是用函数CDec( )将表达式转换为Decimal类型的变体型变量。
注意:在Visual Basic 6.0中,Decimal数据类型只能在Variant数据类型中使用。也就是说,不能把一个变量声明为Decimal类型。但在Visual Basic.NET中,Decimal数据类型可以和其他基本数据类型一样使用。
以上介绍的数据类型都是Visual Basic中预先定义好的基本数据类型,它们经常被用来定义本身不能再被分解的简单数据项。另外,在Visual Basic中,还允许用户根据需要用简单的数据项构造复合数据类型,如自定义数据类型(见3.1.2节)、枚举类型( 见3.1.3节)、数组( 见3.6节)等。
Visual Basic基本数据类型参见表3-1。
3.1.2 用户自定义类型
在Visual Basic中,用户自定义的数据类型与Ada,Pascal语言中的记录类型在概念上是相同的,故把用户自定义的数据类型也称为“记录类型”。用户可以使用Type语句定义自己的数据类型。其格式如下:
[Public | Private]Type<数据类型名>
<元素名1> As <类型名1>
<元素名2> As <类型名2>

<元素名n> As <类型名n>
End Type
格式中:
关键字Public和 Private都是可选项,其中前者表示该用户自定义数据类型可以在所有工程的全部模块的任何过程中使用,后者表示该用户自定义数据类型只能在定义该数据类型的模块中使用。在标准模块中,若省略关键字Public,用户自定义数据类型默认是公有的。而在类模块和窗体模块中,用户自定义数据类型只能是私有的,且必须在Type语句前加上关键字Private。
“数据类型名”是要定义的数据类型的名字,是必需的,其命名规则与变量的命名规则相同(见下一节);“元素名1” …“元素名n”也遵守同样的规则,且不能是数组名,“类型名”可以是Visual Basic的任何基本数据类型,也可以是用户定义的类型。当用户自定义数据类型作为数据库记录使用时,元素名就是字段名。例如:
Type Score_Rec
Chinese As Integer
Math As Integer
English As Integer
End Type
Type Student
Num As Integer
Name As String *20
Sex As Boolean
Birthday As Date
Score As Score_Rec
End Type
Score_Rec它由三个元素组成: Chinese,Math,English,分别代表中文、数学和英语,全为整型。
Student由五个元素组成:Num,Name,Sex,Birthday,Score,分别代表学号、姓名、性别、生日、成绩。其中,Num是整型,Name是定长字符串,由20个字符组成,Sex是布尔型,Birthday是日期型,Score是用户自定义数据类型。
Student的结构如图3-1所示 。
Num Name Sex Birthday Score
Chinese Math English
图3-1 Student的结构
用户自定义数据类型定义好后,就可以像使用标准数据类型一样来定义这种类型的变量。定义格式为:
Dim <变量名> As <自定义类型名>
例如:
Dim stu1 As Student
如果要使用自定义数据类型变量中的某个元素的数据,可使用如下格式:
<自定义变量类型名>.<自定义元素类型名>
和使用普通变量一样,可以将一个值赋给自定义数据类型变量中的某个元素,也可以将自定义数据类型变量中某个元素的值赋给其他变量。
如果将自定义数据类型作为数组元素的数据类型,则此数组称为记录数组,可以用Dim等语句建立这种数组,其建立格式为:
Dim <数组名(数组维数)> As <自定义类型名>
如果要使用记录数组中的某个元素,可使用如下格式:
<记录数组元素>.<自定义数组类型元素名>
在使用Type语句时,应注意以下几点:
(1) 用户自定义类型必须先定义,后使用。
(2)在Type…EndType块中不允许使用行号和行标签。
(3) 记录类型中的元素可以是字符串,但必须是定长
字符串,其长度用类型名称加上一个“*”和常数指
明,一般格式为:
String*常数
这里的“常数”是字符个数,它指定长字符串的长度。
如上例中:Name As String*20 。
(4)在使用记录类型之前,必须用Type语句加以定义。
记录类型在标准模块中定义,其变量可以出现在工
程的任何地方。
(5)在记录类型中不能含有数组。
(6)在随机文件操作中,记录类型数据有着重要的作用。
( 参见4.6.4节中的介绍。)
3.1.3 枚举类型
在程序设计中,有些数据无法直接用基本数据类型来表示,为此,Visual Basic提供了枚举数据类型。所谓“枚举”,是指将变量的值一一列举出来,将来使用时,变量的值仅限于列举出来的值的范围以内。故当一个变量只有几种可能的值时,可以定义为枚举类型。使用枚举类型能使一组常数值和另一组名称相关联,从而使得这些相关常数的处理变得简单、方便。例如,可以为与星期相关联的一组整型常数声明一个枚举类型,然后在代码中使用星期的名称而不使用其整数数值。
与用户自定义类型相似,枚举类型也必须先定义,后使用。枚举类型放在窗体模块、标准模块或公用模块中的声明部分,用Enum语句来定义,其格式如下:
[Public | Private] Enum类型名称
成员名[=常数表达式]
成员名[=常数表达式]

End Enum
(1) Enum语句以Enum开头,以End Enum结束。
各参量含义如下:
Public可选。表示所定义的Enum类型在整个工程中都是可见的。
Private可选。表示所定义的Enum类型只在所声明的模块中是可见的。
在默认情况下,Enum类型被定义为Public。
说明:
“类型名称”,必选。表示所定义的Enum类型的名称。
“类型名称”必须是一个合法的Visual Basic标识符,在 定义Enum类型的变量或参数时用该名称来指定类型。
“成员名”, 必选。是一个合法的Visual Basic标识符,用来指定所定义的Enum类型组成元素的名称。
“常数表达式” 可选。表示元素的值(Long类型),可以是其他Enum类型。
(2) 格式中的 “常数表达式” 可选。若省略“常数表达式”,则默认第一个枚举成员的值为0,其后的枚举成员的值比其前面的成员的值大1。例如:
Public Enum Days
Sunday
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
End Enum
定义了一个枚举类型Days。它包括7个成员,都省略了“常数表达式”,因此常数Sunday的值为0,常数Monday的值为1,…,常数Saturday的值为6。
(3) 若不省略“常数表达式”,则赋给枚举成员的值可以是任何长整数,包括负数。如果希望用小于0的常数代表出错条件,则可以给枚举常数赋一个负值。例如:
Public Enum WorkDays
Saturday
Sunday = 0
Monday
Tuesday
Wednesday
Thursday
Friday
Invalid = -1
End Enum
在该例中,枚举成员Invalid被显式赋值为-1, Sunday被赋值为0。由于Sunday是枚举中的第一个元素,所以也被赋值为0。Monday的值为1(比Sunday的数值大1),Tuesday的值为2,依次类推。
(4) Visual Basic将枚举中的常数看作长整数。如果将一个浮点数赋给一个枚举成员,则Visual Basic将会把该浮点转化为最接近的长整数。
(5) 当引用单个常数时,为了避免模糊引用,应在常数名称前冠以枚举名。下列代码引用 Days 和 WorkDays 枚举中的 Saturday 常数,并在立即窗口中显示它们的不同的数值。
Debug.Print "Days.Saturday = " & Days.Saturday
Debug.Print "WorkDays.Saturday = " & WorkDays.Saturday
(6) 当向一个枚举中的常数赋值时,也可以使用另一个枚举中的常数的数值。例如,下述 WorkDays 枚举的声明与前述的声明是等同的。
Public Enum WorkDays
Sunday = 0
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday = Days.Saturday – 6
Invalid = -1
End Enum
枚举类型Days必须在本枚举类型之前定义否则,将出现编译错误
(7) 定义枚举类型后,就可以声明枚举类型变量,然后使用该变量来存储枚举常数的数值。但必须注意:不能用模块名来限定枚举类型。类模块中的公有枚举类型虽然被写入到类型库中,但它们并不是该类的成员。但在标准模块中定义的枚举类型,则不会写到类型库中。
例3-1 下面的程序代码就是使用 WorkDays 类型的变量存储与 WorkDays 枚举中的常数相关联的整数数值。
Private Sub Form_Click()
Dim MyDay As WorkDays
MyDay = WorkDays.Saturday 'Saturday 的数值为 0
If MyDay < WorkDays.Monday Then 'Monday 的数值为 1
'所以Visual Basic显示一个消息框
MsgBox "It's the weekend. Invalid work day!"
End If
End Sub
If语句的详细介绍参见3.5.2节“选择结构”;MsgBox过程的用法参见3.6.1节“用户交互函数和过程”。运行结果如图3-2所示。
图3-2
因为在定义枚举类型WorkDays时,枚举成员Sunday的值也被设置为0,所以将上述程序代码中的
MyDay = WorkDays.Saturday
改写成:
MyDay = WorkDays. Sunday
运行结果一样。
注意:当在代码窗口中键入上例中的第二行代码为MyDay =时,Visual Basic将自动列出MyDay枚举变量所对应的枚举类型WorkDays中的枚举元素,供用户选择输入。如图3-3所示。
图3-3 WorkDays的枚举元素
(8) 具有相同名字的公有枚举类型不能在类模块和标准模块同时定义,原因是它们共享相同的命名空间。如果不同的类型库中有两个同名的枚举类型,但其成员不同,则对此类型的变量的引用,将取决于哪一个类型库具有更高的引用优先级。
以下定义一个变量weekend并赋值:
Dim weekend As WorkDays
weekend = Fri
3.2 常量和变量
常量是指在程序运行期间其值是不发生变化的量,而变量是指在程序运行期间其值可以发生变化的量,它代表内存中指定的存储单元。在程序中,凡是可以使用表达式的地方,都可使用常量和变量。
3.2.1常量
Visual Basic常量
普通常量
符号常量
系统常量
1.普通常量
普通常量也称直接常量,这类常量可从字面形式上直接分辨其类型。如:-9、3、0等都是整型常量,3.14、-2.7、123.456等都是实型常量,“abc”、 “123”、 “汉字”等都为字符串常量。
普通常量
整型常量
实型常量
字符串常量
逻辑型常量
日期型常量
(1) 整型常量
十进制整数
由带有正号(可省略)或负号一个或几个十进制数字(0~9)组成。例如-624,436,+256等。
十六进制整数
以&H(或&h)开头,后跟一个或几个十六进制数字(0~9及A~F或a~f)组成,其取值(绝对值)范围为&H0~&HFFFF。例如&H1A,&H32等。
八进制整数
以&O(或&o) 开头,后跟一个或几个八进制数字(0~7)组成,其取值范围为&O0~&O177 777。例如&O354,&O1200。
说明:
上面是整型常量的三种表示形式。如果要表示上述三种进制形式的长整型常量,则只需在三种进制的整型常量后加上表示长整型的类型符号“&”。例如:23&、&O23&、&H23&分别是十进制、八进制、十六进制的长整型常量23、(23)8和(23)16。
注意:23和23&是不同的。
(2) 实型常量
Visual Basic中实型常量有单精度型和双精度型两种,因它们在内存中以浮点数形式存放,故又称为浮点实数。
十进制小数形式
指数形式
它有正负号(+,-)、数字(0~9)和小数点(.)或类型符号(!,#)组成。其基本格式有:±n.m,±n!,±n#,其中m,n是0~9的数字。
例如:-2.3,234!,234.5#等都是十进制小数。
表示形式有如下几种:±nE±m,±n.mE±a, ±nD±m,±n.mD±a其中m,n,a是0~9的数字。
例如:1.234E-05,1.234D-5都是指数形式。它们相当于1.234×10-5。
实型常量
说明:
①、指数符号E(单精度)或D(双精度)的含义为“乘以10的幂次”。当幂为正数时,正号可以省略。
②、同一个实数可以有多种表示形式,例如:1354.0,可以表示为1.354E3, 13.54E2, 0.1354E4, 135400E-2等。一般将1.354E3称为“规范化的指数形式”。
(3) 字符串常量
字符串常量由字符组成,用双引号“””括起来的一串字符,其长度不能超过65535个字符(定长字符串)或20亿个字符(变长字符串)。
例如: " Visual Basic程序设计" , " Hello! " ," ABC" ," 521.78"都是字符串常量。
说明:
① 、字符串中的字符可以是ASCII字符及汉字。
②、空字符串("")和空格字符串(" ")是有区别的,串长不等。
③、对于字符串中的单引号,如ABC"DEF,可用两个连续的双引号表示,即"ABC""DEF"。
(4) 逻辑型常量
又称布尔常量,它只有两个逻辑值True(真)或False(假)。当把数值型数据转换为布尔型数据时,0被转换为False,非0的值一律转换为True。反之,当把布尔型数据转换为数值型数据时, False被转换为0,而True被转换为-1。
(5) 日期型常量
任何一种从字面上可辨认的日期和时间字符,都可以赋值给日期变量,但日期文字必须用号码符(#)括起来,都可以作为日期型常量。例如: #January 5,2004#,#2004-9-26 15:36:25 PM#等都是合法的日期型常量。
Visual Basic能自动判断常量类型。
例如,在默认情况下,Visual Basic将选择需要内存容量最小的表示方法,值3.14通常被作为单精度数处理。为了显式地指明常数的类型,可以在常数后面加上类型说明符。这些说明符分别为:
? % 整型;
? & 长整型;
? ! 单精度浮点数;
? # 双精度浮点数;
? @ 货币型;
? $ 字符串型。
字节、布尔、日期、对象及变体类型没有类型说明符。
2.符号常量
在进行Visual Basic程序设计时,经常遇到某个常量在程序中多次使用的情形。此时,可通过设置符号常量的方法解决。定义了符号常量后,凡程序中使用到该常量的地方,都用相应的符号常量来代替,这样不仅书写方便,而且在提高程序可读性的同时,增强了程序的可维护性。
Visual Basic中使用关键字Const定义符号常量。一般格式为:
Const 常量名[ As 类型|类型符号]=<表达式> [, 常量名[As 类型|类型符号]=<表达式>]… ]
其中:
“常量名”是一个名字,其构成规则与变量相同。
关键字As是可选的,用它来定义常量的数据类型。常量的数据类型可以是数值型、日期型、字符串型、逻辑型等。
“表达式”是必选的,由普通常量、其他符号常量和算术运算符(指数运算符除外)、逻辑运算符组成,也可以是字符串,但不能使用含字符串连接运算符(+或&)的字符串表达式、变量及用户定义的函数或内部函数。
例如:
Const Pi=3.14159,TwoPi=2*Pi
下面两种写法是等价的:
Const Pi#=3.14159
Const Pi As Double=3.14159
两种写法都声明Pi是双精度符号常量,其值为3.14159
说明:
(1) 在声明符号常量时,如果不使用“As 类型”或“类型符号”,则根据表达式值的结果确定常量类型。字符串表达式总是产生字符串常数。对于数值表达式,则按最简单(即占字节数最少)的类型来表示这个常数。
(2) 当在程序中引用符号常量时,通常省略类型说明符。此时常量的类型取决于Const语句中表达式的类型。
(3) 声明符号常量时,还要避免循环引用,即在声明A的表达式中引用了B,而在声明B的表达式中又引用了A,这将导致程序在运行时出现错误。
(4) 习惯上,符号常量一般用大写字母定义。
(5) 和变量声明一样, Const 语句也有范围,也使用相同的规则:
为创建仅存在于过程中的常数,请在这个过程内部声明常数。
为创建一常数,它对模块中所有过程都有效,但对模块之外任何代码都无效,请在模块的声明段中声明常数。
为创建在整个应用程序中有效的常数,请在标准模块的声明段中进行声明,并在 Const 前面放置 Public 关键字。在窗体模块或类模块中不能声明 Public 常数。
(6) 由于常数可以用其他常数定义,因此必须小心,在两个以上常数之间不要出现循环或循环引用。当程序中有两个以上的公用常数,而且每个公用常数都用另一个去定义时就会出现循环。
例如:
'在 Module1 中:
Public Const conA = conB * 2 '在整个应用程序中有效
'在 Module 2:
Public Const conB = conA / 2 '在整个应用程序中有效
如果出现循环,在试图运行此应用程序时,Visual Basic 就会产生错误信息。不解决循环引用就不能运行程序。为避免出现循环,可将公共常数限制在单一模块内,或最多只存在于少数几个模块内。
(7) 类型说明符不是符号常量的一部分,定义符号常量后,在定义变量时要慎重,符号常量名不能与变量名同名,符号常量也不允许重新定义。
例如,假定如下声明:
Const Num=45
则Num!,Num#,Num%,Num&,Num@不能再用做变量名或常量名。
3.系统常量
系统常量是系统内部定义的符号常量存放于系统的对象库中,可在“对象浏览器”中的Visual Basic和Visual Basic for Applications(VBA)对象库中找到,这类常量用户随时可以使用,其前缀是“vb”。例如:vbblack、vbred、vbMaxmized等都是系统常量。
在程序中使用系统常量,一方面可使程序变得容易阅读和编写,另一方面,低版本中的系统常量在高版本中可能会改变,灵活使用系统常量可使程序保持更好的兼容性。
例如:窗口状态属性WindowsState可取0,1,2等3个值,分别对应最小化、正常、最大化等3种不同状态。在程序中使用WindowsState=vbMaxmized和WindowsState=2都能将窗口最大化,但很显然,使用前者比使用后者更容易阅读和理解。
常见的变体类型常量如下表所示 。
常 量 值 描 述
vbVEmpty 0 空值(未初始化)
vbVNull 1 Null(无有效的数据)
vbVInteger 2 整数型数据类型
vbVLong 3 长整数型数据类型
vbVSingle 4 单精度浮点型数据类型
vbVDouble 5 双精度浮点型数据类型
vbVString 8 字符串型数据类型
vbVDate 7 日期型数据类型
vbVCurrency 6 货币型(变比的整数)数据类型
3.2.2 变量
变量必须有名字和相应的数据类型,在程序中通过变量名来使用变量,变量的数据类型则决定了该变量的存储方式和在内存中占据的内存单元。变量名实际上是一个符号地址,在Visual Basic的程序中,可以用变量名表示内存位置,Visual Basic在解释或编译成执行程序时,会将这种名字转换成内存单元的地址。
在Visual Basic的中,变量有属性变量和用户自定义变量两种。属性变量是创建对象时由Visual Basic系统自动为之创建的一组变量,每一个属性变量都有其默认值,用户可以直接使用。用户自定义变量又称内存变量,也就是通常所说的变量。下面主要介绍这种变量。
变量名和变量值是两个不同的概念,应注意区分,如图3-4。从变量中取值的过程,实际上就是通过变量名首先找到相应的内存地址,然后再从其存储单元取数据的过程。
每个变量有三个要素:
1、变量名 通过变量名来指明变量,即内存中的位置。
2、变量类型 变量的数据类型,决定了变量的数据结构和存储方式,也决定了它能参与的运算。
3、变量的值 指内存中的变量所存储的值,随着程序的执行可以发生改变。在程序中,一般通过赋值语句来改变变量的值。
此外,变量还有作用域及生存期,这两个概念将在3.3节中进行介绍 。
1. 变量的命名规则
变量都有名字。在Visual Basic中,给变量命名时应遵循以下规则:
(1) 变量名只能由字母、数字和下划线组成。且它的第一个字符必须是英文字母或汉字,最后一个字符可以是类型说明符。
(2) 变量名的最大有效长度为255个字符,且不区分变量名中字母的大小写,如Num,NUM,num指的都是同一个名字。
(3) 不得用Visual Basic的保留字作为变量名。例如,变量Print是非法的。
(4) 组成变量名的各字符之间必须并排书写,不能有上下标。
(5) 命名变量名尽量做到“见名知义”,且在作用域内必须是惟一的。
在Visual Basic中,变量名以及过程名、符号常量名、记录类型名、元素名等都称为名字,它们的名称统称为“标识符”,它们都必须遵循上述规则。
例3-2 合法变量和不合法变量举例。
A,X1,X_2,Room3,工资,成绩等等都是合法的变量。

下列变量名都是不合法的:
5st 不能以数字开头
Exp 不能用系统函数名作变量名
If 不能用系统保留字作变量名
Vbred 不能用系统常量名作变量名
Ab.xy 名字中有非法字符
注意:当使用某些系统函数或系统常量作变量名时,系统虽不会出错,但在程序中就不能使用同名的系统函数或系统常量了。
2. 变量的类型和定义
任何变量都属于一定的数据类型,包括基本数据类型和用户定义的数据类型。在使用变量前,最好根据需要定义相关变量极其类型。在定义变量时,通常将定义变量的语句放在模块或过程的开始处。在Visual Basic中,可以用下面几种方式来规定一个变量的类型。
(1) 用类型说明符来标识
把类型说明符放在变量名的尾部,可以标识不同的变量类型。其中:%表示整型,&表示长整型,!表示单精度型,#表示双精度型,@表示货币型,$表示字符串型。例如:
all%,Amount#,Addr$
(2) 在定义变量时指定变量类型
格式:
定义词 <变量名>[ As 类型][, <变量名>[ As 类型]]…
说明:
“定义词”可以是关键字Public,Static,Dim,Redim,Private,Global;“As”是关键字,可选;“类型”可以是Visual Basic中的一切数据类型(包括用户定义的类型)。
① Dim 用于在标准模块(Module)、窗体模块(Form)或过程(Procedure)中定义变量或数组。当用于窗体时,程序代码窗口中的“对象”框应选“通用”,“过程”框应为“声明”。当用于过程中时,它位于Sub与End Sub之间。
例如:
Dim VarA As Integer (把VarA定义为整型变量)
Dim X As Double (把X定义为双精度变量)
Dim Name As String (变长字符串,长度取决于赋给它的字符串常量的长度)
Dim MyName As String*100 (定长字符串,长度为100个字节)
也可以将上面(1)~(4)用一个Dim来定义,但每个变量都必须有As子句(除非为Variant型),例如:
Dim VarA As Integer,X As Double,Name As String,MyName As String*100
注意:
1、对定长字符串变量,若赋予的字符少于其指定长度,则尾部用空格补足;若赋予的字符超过其指定长度,则多余空格被系统自动截掉。
2、用一个Dim语句定义多个变量时,如果省略了某个变量后的As子句,且该变量在模块中没有被其他定义变量数据类型的语句指定其数据类型,则该变量被定义为变体类型。因此,若将上面的语句改为:Dim VarA,X,Name,MyName As String*100
则变量VarA,X,Name都被定义为变体类型,只有变量MyName被定义为定长字符串。千万别认为该语句将所有变量都定义为定长字符串,这是错误的。当用Public,Static或Redim定义变量时,情况完全一样。
下面两个语句是等价的:
Dim VarA As Integer,X As Double,Name As String
Dim VarA%,X&,Name$
下面的写法是错误的:
Dim VarA% As Integer,X& As Double,Name$ As String
② Redim 主要用于定义数组,将在3.6.2节介绍。
③ Public用来在标准模块中声明变量或数组,不能在过程或窗体模块中使用。用Public声明的变量称为全局变量,它在所有模块的过程中都有效,可以被所有的过程使用,其值不会随过程的结束而消失。例如:
Public VarA,X,Name,MyName As String*100
④ Static 用来在过程中声明变量或数组,用Static声明的变量称为静态变量。用Dim声明的变量称为动态变量。与Dim不同的是,用Static声明的变量,其值在过程运行结束后依然保留,下次再调用此过程时引用该变量时,上次的终值便是本次的初值,这类变量和包含该过程的模块具有相同的生命周期。而引用Dim声明的变量时,其值会重新设置(数值变量重置为0,字符串变量重置为空)。
⑤ Private 用来在模块的声明部分声明模块级变量,因此,用它声明的变量被称为模块级局部变量。这类变量只能在声明它的模块中使用。
⑥ Global 仅用于在标准模块中声明全局变量,不能在其他模块或过程中使用。
(3) 用DefType语句定义
对于变量名确定的变量类型,可以用上面两种方法定义。但如果想定义以某个字母打头的一批变量,则可用DefType语句定义。该语句可以在标准模块、窗体模块的说明部分定义变量。其格式为:
DefType 字母范围
这里的Def是保留字,Type是类型标志,可以是Int(整型),Lng(长整型),Sng(单精度型),Dbl(双精度型),Cur(货币型),Str(字符串型),Byte(字节型),Bool(布尔型),Date(日期型),Obj(对象型),Var(变体型)。
注意:
在Def和类型标志之间不能有空格,“字母范围”用“字母-字母”的形式表示,其中“字母”可以是A~Z中的任一个字母(不分大小写)。
例如:
DefInt X-Z '表示以X,Y,Z开头的变量都可以作为整型变量。
Define A-Z '表示该语句所在的模块中的变量全部为整型变量。
使用上述三种方法来声明变量,通常称为显式说明。当用户在编写程序时,如果不声明而直接使用变量,这在Visual Basic中是允许的。此时,系统临时为这些变量分配存储单元并允许用户使用,这就是隐式说明(也称默认声明)。所有隐式说明的变量,全是Variant数据类型。Visual Basic根据程序中赋予变量的值来自动调整变量的类型。详细介绍参阅3.3.2节。
说明:
使用显式说明定义变量时,应注意以下几点:
(1) 用DefType语句定义的变量只对它所在的模块起作用。类型说明符(%,&,#,!,@,$)总是比DefType语句优先起作用。
(2) 在实际应用中,应根据实际需要设置变量类型。这样做即可以节省内存空间,又可以提高处理速度。
(3) 使用TypeName(变量名)可以获得变量的类型名。
(4) 当声明变量之后,在变量首次赋值之前,Visual Basic系统就为这些变量赋予一个默认值。具体情况如下:
· 数值型 0(或0.0)
· 逻辑型 False
· 日期型 #0:00:00#
· 定长字符串 空格字符串,长度为定长字符串的字符个数
· 变长字符串 空串
· 对象型 Nothing
· 变体型 Empty
记录型 其中的每个元素作为各自独立的变量进行初始化
3. 记录类型变量
定义记录类型变量时,首先须定义记录类型,然后才能定义记录类型变量。事实上,一旦定义好记录类型,定义记录类型的变量与基本数据类型变量的定义相似,没有什么区别。例如,假定有如下的记录类型:
Type Student
Num As Integer
Name As String *20
Sex As Boolean
Birthday As Date
Score As Single
End Type
则可用下面的语句定义Student的变量:
Dim stu1 As Student
以后就可以用“变量名.元素名”的格式引用记录中的各个成员。
例如:
Student. Num
Student. Name
Student. Score
注意: 在一般情况下,记录类型应在标准模块中定义;如果在窗体模块中定义,则必须在“Type”关键字前面加上“Private”。
例如,当在窗体模块中定义上面的记录类型时,应改为:
Private Type Student
Num As Integer
Name As String *20
Sex As Boolean
Birthday As Date
Score As Single
End Type
4. 变体类型变量
Visual Basic提供了变体数据类型(Variant)。和其他基本数据类型一样,用户也可以定义变体类型的变量,这种变量的使用十分灵活。
(1) Variant变量的定义
Variant变量可以用普通数据类型变量的格式定义,也可以使用默认定义。例如:
是等价的,都把X定义为Variant变量。如果一个变量未经定义而直接使用,则该变量为Variant类型变量。
Dim X As Variant
Dim X
在Variant变量中可以存放任何类型的数据,而且向Variant变量赋值时不必进行任何转换,一切转换都由Visual Basic自动完成。例如:
X=″1000″(存入字符串1000)
X=X-100(SomeValue变为数值900)
X=″ABC″ & X(SomeValue变为字符串ABC900)
由此可见,随着所赋值的不同,变量的类型在不断发生变化,这就是“变体数据类型”的含义。
Variant变量的使用十分灵活,因为在对它赋值时不必考虑类型转换的问题。但是,这种灵活性同时也带来一定的“隐患”,主要有以下两个方面:
① 如果对Variant变量进行算术运算,则必须确保变量中存放的是某种形式的数值,包括整数、浮点数、定点数或可以解释为数值的字符串。如果Variant变量中的内容是XYZ90,则不能对其进行算术运算,因为XYZ90不是有效的数值。类似地,可以对“+10”或“-2E3”进行算术运算,但不能对“123EX”进行这种操作。
② 运算符“+”既可以用于数值相加,又可以用于字符串连接(见3.4.2 节)。当在两个Variant变量之间使用“+”运算时,其结果可能出乎意料,具体结果取决于两个变量中的内容。为了避免出现这种情况,在进行字符串连接时,最好使用运算符“&”。注意在运算符“&”前后应加空格。
(2) Variant变量值的内部表示
Variant变量所存放的值都有一个内部表示。在执行比较等操作时,Variant变量根据其内部表示确定如何操作。向Variant变量赋值时,Visual Basic以最紧凑(需最小存储空间)的表示方式存储该值,并可根据需要改变表示方式。在大多数情况下,不必考虑Variant变量的内部表示。如果需要,可以用VarType函数获取内部表示。例如:
A=VarType(X)
这里X是一个Variant变量名,返回的内部表示赋给变量A。
如果在Variant变量中存入十进制小数,Visual Basic总是以Double类型作为内部表示。如果应用程序不需要如此高的精度,则可通过类型转换函数转换。例如:
If VarType(X)=5 Then X=CSng(X)
上述语句的含义是: 如果变量X的内部表示为5,即Double类型,则用CSng函数(见第4章)把它转换为单精度数。
(3)Variant变量中的数值
在Variant变量中存放数值时,Visual Basic以尽量紧凑的方式存储。如果是较小的整数,则以Integer类型存储,而较大的或带有小数部分的数值则用Long类型或Double类型存储。
如果需要用指定的类型来存储Variant变量的值,则必须用类型转换函数(见4.1.2节)转换。例如,用下面的语句可以把Variant转换为Currency类型的值: PayperWeek=CCur(Hours * Hourlypay)
这里的CCur是类型转换函数。
如果Variant变量中存放的不是数值或可以解释为数值的内容(如日期/时间或含有数字的字符串),则对其进行算术运算或函数运算时会发生错误。因此,应当在运算前对Variant变量中的值进行判断,这可以通过IsNumeric函数来实现。例如:
If IsNumeric(X) Then X=X+5
上述语句的含义是: 如果Variant变量X是一个数值,则执行X=X+5。
(4)Variant变量中的字符串
在对存放字符串的Variant变量进行操作时可能会产生歧义。当用“+”运算符对两个Variant变量进行运算时,如果两个变量都是数值,则执行数值相加运算;如果两个变量中存放的都是字符串,则执行字符串连接操作。如果一个变量中是数值而另一个变量中是字符串,则情况就复杂了。Visual Basic先试着将字符串转换为数值,如果转换成功则进行相加运算,不成功则把另一个数值转换成字符串,然后对两个字符串进行连接,形成一个新的字符串。
为了避免出现上述情况,最好对数值运算使用“+”运算符,而对字符串连接使用“&”运算符。
(5) Variant变量中的空值(Empty)
Variant变量在被赋值前为空值(内部表示为Empty或0),它不同于数值0,不同于空字符串(″″),也不同于Null(见下)。通过IsEmpty函数可以测试一个变量自建立以来是否被赋过值。例如:
If IsEmpty(Z) Then Z=0
当一个Variant变量为空值时,可以用在表达式中,Visual Basic将根据具体情况将其解释为数值0或空字符串。如果将一个空值Variant变量赋给一个非空值的Variant变量,则使后者变为空值。
一旦Variant变量被赋值,空值即不复存在。
(6) Variant变量中的Null值
Variant变量可以取一个特殊值Null,该值通常在数据库应用程序中用来指出未完成或漏掉的数据。
① Null值具有漫延性。如果表达式中任一部分为Null,则整个表达式的值即为Null;如果向函数传送Null、值为Null的Variant变量或结果为Null的表达式,则会使大多数函数返回Null值。
② 通过IsNull函数可以判断一个Variant变量的值是否为Null。
③ Null只适用于Variant变量。如果把Null值赋给其他非Variant变量,则会产生错误。
3.3变量的作用域
Visual Basic的应用程序由窗体模块(Form)、标准模块(Module)和类模块(Class)三种模块构成。窗体模块包括 (General Procedure)和事件过程(Event Procedure),标准模块由声明部分和通用过程组成。参见4.5.1节程序模块概述。
变量的作用域就是变量的有效范围。定义了一个变量后,为了能正确地使用变量的值,应当明确可以在程序的什么地方访问该变量,或者说变量的作用域决定了哪些过程可以访问它。
3.3.1 局部变量与全局变量
在Visual Basic中,按定义位置和所使用的变量定义语句的不同,变量可以划分为局部变量(Local)、窗体和模块变量(Form and Module)及全局变量(Public) 三类 。
1. 局部变量(过程级变量)
在过程体(事件过程或通用过程)内定义的变量叫做局部变量,其作用域是它所在的过程。过程的形参也可以看作是该过程的局部变量。局部变量通常用来存放中间结果或用做临时变量。由此可见,在不同的过程中可以定义同名的局部变量,它们之间互不影响。
局部变量在过程内用Dim,Static定义,例如:
Sub Commandl_Click()
Dim A1 As Integer
Static W1 As Double
End Sub在上面的过程中,定义了两个局部变量,即整型变量A1和双精度型静态变量W1。有关Static的详细讨论见3.3.3节。
2. 窗体/模块级变量
在窗体或模块的通用说明部分使用Dim语句或Private语句定义的变量,可以被本窗体或模块中的任何过程使用,这种变量称为窗体或模块级变量。窗体或模块级变量不能被其他窗体或模块使用。模块级变量包括窗体变量和标准模块变量。模块级变量在整个模块运行期间都有效,用于存放模块中各过程公用的数据。
在声明模块级变量时,用Private或Dim都可以,本质上没有什么区别。但用Private 更好一些,主要是为了把它和声明全局变量的Public区别开来,使代码变得更容易理解。
例如: Private Temp As Integer
或 Dim Temp As Integer 二者是等价的。
3. 全局变量(工程级变量)
在窗体或模块中的通用声明部分使用Public语句或Global语句定义的变量,可以被本工程中的任何模块和过程使用,这种变量称全局变量或工程级变量。全局变量用于存放整个应用程序公用的数据。
如果在模块中定义了全局变量,则可在任何过程中通过变量名直接进行访问;如果在窗体中定义了全局变量,在其他窗体或模块中可以用“(该全局变量所在的)窗体名.变量名”形式来访问此全局变量。全局变量的作用域最大。
通过模块级变量和全局变量可以在不同过程之间共享数据,这在一定程度上方便了编程,但同时也存在极大的副作用。这是因为:如果在一个过程中改变了变量的值,当其他过程再访问该变量时,都将使用改变后的值,而共享数据的值是不允许改变的。因此,除特殊情况外,应尽量少用模块级变量和全局变量,多使用局部变量,尽量缩小变量的作用域,以便于大的应用程序的开发设计和调试。而对过程之间的共享数据也尽量通过参数传递来实现。
如果在程序中出现全局变量、模块级变量和过程级变量同名时,Visual Basic系统会自动隐藏作用域较大的变量,使用作用域较小的变量。由此可见其优先顺序按从高到低的顺序依次是:过程级变量、模块级变量、全局变量。当在过程中使用没有显式说明的变量,而这些变量又和全局变量、模块级变量同名时,这些变量会被当作全局变量和模块级变量来使用。因此,在过程使用的局部变量一定要显式说明,以避免这种冲突的发生。
在Visual Basic中允许不同的模块中有名字相同的全局变量,在使用这些名字相同的全局变量时,须在变量名前加上模块名以便区分。
例如:
Module1.x1和Module2.x1分别表示两个标准模块中的不同全局变量x1。
在非标准模块中定义的全局变量,在其他模块中使用时也必须加上模块名。
在同一个过程或同一个模块中,作用范围相同的变量是不能同名的。否则,一旦出现错误将很难查找。在窗体模块中,窗体的属性、控件和过程都被看作窗体模块级变量,因此,在窗体模块级声明的变量,不能和窗体的属性、控件、过程同名。在过程内部声明的变量和窗体的属性、控件、过程最好也不要同名,否则,要用窗体名对窗提属性、控件加以限定才能使用,比较罗嗦,而对同名的过程则会隐藏起来,不能使用。
不能在过程中声明公用变量,只能在模块的声明段中声明公用变量。
不同变量作用域的使用规则如下表 :
名称 声明位置 作用域 使用语句
局部变量 过程中 过程 Dim或Static
模块变量 模块的声明部分 窗体模块或标准模块 Dim或Private
全局变量 标准模块的声明部分 整个应用程序 Public或Global
例3-3 建立具有相同名字的全局变量、模块级变量、局部变量,观察他们的变化情况。
在本例中,可建立两个窗体。在第一个窗体Form1中添加两个命令按钮,并将a2声明为模块级变量,编写通用过程如下:
Dim a2 As Date
Private Sub test1()
Dim a2 As Date
Dim a3 As String
a1 = 300
a2 = #11/8/2004#
a3 = "VB程序设计"
Print "a1="; a1, "a2="; a2, "a3="; a3
End Sub
再分别编写命令按钮Command1、Command2的单击事件过程如下:
Private Sub Command1_Click()
Call test2
a1 = 200
a2 = #9/15/2002#
a3 = "VC程序设计"
Print "a1="; a1, "a2="; a2, "a3="; a3
Call test1
Print "a1="; a1, "a2="; a2, "a3="; a3
End Sub
Private Sub Command2_Click()
Form2.Show
End Sub
在第一个窗体Form1中添加一个命令按钮,并编写其单击事件过程如下:
创建标准模块,并在其中定义全局变量和全局过程如下:
Private Sub Command1_Click()
Print "a1="; a1, "a2="; a2, "a3="; a3
End Sub
Public a1 As Integer
Public a2 As Date
Public a3 As String
Sub test2()
a1 = 100
a2 = #10/1/1998#
a3 = "vfor程序设计"
Form1.Print "a1="; a1, "a2="; a2, "a3="; a3
End Sub
运行时单击窗体上1的Command1按钮,输出如下:
分析:上述结果中第一行,是Command1_Click()过程调用标准模块中的全局过程test2时输出的;第二行是在本过程中给全局变量a1、a3,模块级变量a2(全局变量a2被隐藏起来)重新赋值后输出的结果;第三行是在本过程中调用窗体1中的模块级过程Test1,给全局变量a1、给过程局部变量a2、a3(全局变量a2、a3和模块级变量a2被隐藏起来)重新赋值后输出的结果;第四行是调用模块级过程Test1结束后输出的结果,只有a1的值发生了变化,a2、a3又恢复到调用前的值(全局变量a2被隐藏)。
a1= 100 a2=1998-10-1 a3=vfor程序设计
a1= 200 a2=2002-9-15 a3=VC程序设计
a1= 300 a2=2004-11-8 a3=VB程序设计
a1= 300 a2=2002-9-15 a3=VC程序设计
单击窗体1上的Command2按钮,调出窗体2,单击窗体2上的Command1按钮,输出如下:
a1= 300 a2=1998-10-1 a3=VC程序设计
只有a2的值保持未变,而a1、a3的值在窗体中已修改。
3.3.2 默认声明
在Visual Basic中,当用户在编写程序时,不声明变量而直接使用,系统临时为其分配存储空间并允许使用,这就是默认声明(又称“缺省声明”)。所有默认声名的变量都是Variant数据类型的局部变量,所以,将一个变量声明为Variant类型和不声明变量而直接使用以及用Dim关键字声明但不指定类型,效果是一样的。Visual Basic根据程序中赋予变量的值来自动调整变量的类型。
默认声明一般只适用于局部变量,模块级变量和全局变量必须在代码窗口中用Dim或Public语句显式声明。
默认定义的变量不需要使用Dim语句,因而比较方便,并能节省代码,但有可能带来麻烦,而且较难查出错误。为了安全起见,最好能显式地声明程序中使用的所有变量。一般而言,良好的编程习惯应该是对变量“先声明,后使用”,这样可以提高程序的效率,同时也使程序容易调试。
Visual Basic中可以强制显式声明,其实现方法是:在窗体模块、类模块和标准模块的通用声明段中加入Option Explicit语句。如果希望在新建模块时自动插入该语句,则可执行“工具”菜单中的“选项”命令,在打开的选项对话框中选择“编辑器” 选项卡,并复选“要求变量声明”选项即可,如图3-5所示。(但当前现有模块中Option Explicit 语句必须在工程中通过手工加入)。
当新建模块中都加入了Option Explicit语句时,如果运行含有默认声明变量的程序,将产生一个“变量未定义”的提示框,如图3-6所示。
图3-5 强制变量声明
图3-6 强制显式声明下使用默认声明变量的出错提示
2.静态变量:
窗体/模块级变量、全局变量在整个程序运行期间都可以被其作用域范围内的过程访问,因此,它们的生存期就是程序的运行期。
另外,在有的情况下,当过程执行结束时,可能希望将该过程中有关局部变量中的值保留下来。如果把变量声明为全局变量或模块级变量,则可解决这个问题,但这会改变该变量的作用域。如果不希望通过改变该变量的作用域来达到上述目的,则可在过程中使用Static语句将其定义为静态变量,其格式如下:
Static变量 [()] [As类型][,变量[()]…
Static语句只能出现在事件过程、Sub过程或Function过程中。过程中的Static变量,在过程首次调用时,系统为其分配存储空间,当过程执行结束后,系统并不收回为其分配的存储空间,所以,过程结束后,其值仍能保留。但是,它只有局部的作用域,即只在本过程中可见;下次再调用该过程时,上次的终值便是下次的初值。
当数组作为局部变量放在Static语句中时,在使用之前标出其维数。
用Static语句定义的变量,可以和在模块级定义的变量或全局变量同名,但不会发生冲突。因为Static变量优先于同名的模块级变量或全局变量。
在定义过程时,如果将Static放在任何Sub过程或Funtion过程头的前面(包括事件过程和声明为Private的过程),则该过程体中的所有局部变量都变为静态变量,而不论它们是用Static、Dim或Private声明的还是隐式声明的。
例3-4 设有如下过程:
Sub Test()
Static Varl As Integer
Varl=Varl+l
End Sub

则每调用一次Test过程,静态变量Varl累加1;而如果改为:
Sub Test()
Dim Varl As Integer
Varl=Varl+1
End Sub
则每次调用Test过程时,动态变量就初始化为0。

静态变量在解决统计次数、反复开关等问题上很有效。
例3-5 编写一个记录单击窗体次数的程序。
程序代码如下:
Private Sub Form_Click()
Static counter As Integer
counter = counter + 1
MsgBox "This has been pressed " & counter & " times"
End Sub

思考:
用Dim代替Static,则程序执行情况如何?
例3-6 编写一个用于控制文本框内容显示/关闭的切换程序。
在窗体上添加两个控件:文本框和命令按钮。编写窗体的Form_Load( ) 事件过程和命令按钮的Command1_Click( )事件过程如下:
Private Sub Form_Load( )
Command1.Caption = "开始"
Text1.Text = “请按开始键测
试文本框的Visible属性"
End Sub
Private Sub Command1_Click( )
Static flag As Boolean
flag = Not flag
If flag Then
Text1.Visible = True
Else
Text1.Visible = False
End If
End Sub
此外,关键词Static还可以用于过程定义行中。在这种情况下,该过程内的局部变量都默认为Static。
3.4 运算符和表达式
运算符是指定某种运算的操作符号。将常量、变量、函数用运算符连接而成的有意义的式子称为表达式。单个的常量、变量、函数也可以看作是最简单的表达式。Visual Basic提供了5种运算符,即算术运算符、连接运算符、日期运算符、关系运算符和逻辑运算符,与此相对应,Visual Basic的表达式也有5种,即算术表达式、字符串表达式、日期表达式、关系表达式和逻辑表达式。每种表达式的值对应于一种数据类型。
3.4.1 算术运算符与算术表达式
1.算术运算符
算术运算符是最常用的运算符,用来完成简单的算术运算。Visual Basic提供了9个算术运算符,分别是 :
加(+)、减(-)、乘(*)、除(/)、整除(\)、求余(Mod)、指数(^)、取负(-)。
说明:
1、在算术运算符中,除了取负(-)是单目运算符外,
其余都是双目运算符。
2、算术运算符的优先级按从高到低的顺序依次是
指数(^)、取负(-)、乘(*)、除(/)、整除(\)、
求余(Mod)、加(+)、减(-)。其中,乘和除、加
和减是同级运算符。另外,如果表达式中含有
括号,则先计算括号内;如果有多层括号,则
先计算内层括号。
3、对于整除(\)和求余(Mod) 运算符,要求其操作数
为整数,如果不是整数,系统会自动将操作数
四舍五入成整数后再进行相应运算。求余结果
的正负号始终与第一个操作数相同。
4、 除(/)与整除(\)是有区别的。除法运算符(/)运算符与数学
中的除法一样,运算结果为浮点数。而整除运算符(\)
的运算结果为整数(注意,结果不会四舍五入)。
例如:5/2的结果为2.5,而5\2的结果为2。
5、 对指数运算当底数是负数时,指数必须为整数,当底数
时是0时,指数不能是负数。另外,当指数是一个表达
式时,必须加上括号。例如:A的X+Y次方,应该写成
A^(X+Y),而不能写成A^X+Y
6、 在算术运算中,如果操作数的数据类型不同时,运算结
果以表达式中精度最高的数据类型为准,但也有几种特
殊情况:
① Long型数据与Single型数据的运算结果为Double
型数据。
② 除法(/)和指数运算的结果都为Double类型。
2.算术表达式
用算术运算符和括号将运算对象(即操作数)连接而成的、符合Visual Basic语法规则的式子,称为Visual Basic的算术表达式。运算对象包括常量、变量、函数等。书写Visual Basic的算术表达式时一定要注意:
① 表达式中的所有运算符和操作数都必须平写,不能出现上标、下标和分数线。
② 数学表达式中省略的乘号,在Visual Basic表达式中不能省略。
③ 在一般情况下,不允许两个运算符相连;但有一个例外,方次符号(^)和负号(-)可以相邻,其运算时负号优先。例如:
4^-2 '结果为0.0625
④ 为保证运算顺序,必要时可适当添加括号( )。
例3-7 将下列代数式写成Visual Basic的算术表达式。

应写成:(a+b)/(x-4)

(2)(4πr2+e-3)sin35 应写成:
(4*3.14*r*r+Exp(-3))*sin(35*3.14/180)
Visual Basic字符串运算符也称字符串连接符,有 “&”和“+” 两个,它们都是双目运算符,其作用是把两个字符串连在一起,生成一个较长的字符串。由字符串运算符与运算量构成的表达式称为字符串表达式。
3.4.2 字符串运算符与字符串表达式
说明:
(1) 当连接符两侧的操作数都是字符串时,“&”和“+”的功能是等价的。
例如:设A=" Visual ",B=" Basic ",则执行
C=A & B
或 C=A + B
后,C的值都是"Visual Basic"。
“&”运算符用来强制将其两侧的表达式作为字符连接,也就是说,该运算符的两个操作数既可以为字符型也可以为数值型,当是数值型时,系统自动将其转换为数字字符,然后进行连接操作。而“+” 运算符是当两个操作数为字符串数据时,才能将两个字符串连接成一个新字符串。否则,两个操作数若其中一个为数字字符串,另一个为数值型数据,则系统自动将数字字符串转化为数值,然后进行加法运算;若其中一个为非数字字符串,另一个为数值型数据,则出错。
(2) “&”和“+”在用法上也是有区别的:
例3-8 “+”和“&”运算符举例。
"1000"+234 '结果为1234
"1000"+"234" '结果为"1000234"
"ABC"+234 '出错
"1000" & 234 '结果为"1000234"
"1000" & "234" '结果为"1000234"
"ABC" & "234" '结果为"ABC234"
"ABC" & 234 '结果为"ABC234"
33 & 22 '结果为“3322”
在做字符串连接运算时,用“&”要比用“+” 更安全。
注意:
使用运算符“&”时,前后应加一个空格。这是因为符号“&”还是长整型的类型定义符,如果变量与“&”接在一起,Visual Basic系统就会将“&”当作类型定义符处理,因而就会出现语法错误。
在使用字符串连接运算符连接两个表达式时,如果两个表达式都是Null,则结果也是Null;如果一个表达式的值是Null或Empty,那么在与别的表达式连接时,都将其作为长度为零的字符串处理。
3.4.3 关系运算符和关系表达式
关系运算符也称比较运算符,用来比较两个表达式的关系。Visual Basic的关系运算符有<(小于)、<=(不大于)、>(大于)、>=(不小于)、=(等于)、<>(不等于)、Like(字符串匹配)、 Is(对象比较)等8个,关系运算符都是双目运算。
用关系运算符连接两个算术表达式所组成的式子叫做关系表达式。关系表达式的结果是一个Boolean类型的值,若关系成立,结果为True,若关系不成立,结果为False。Visual Basic把任何非0值都认为是“真”,但一般以-1表示“真”,以0表示“假”。
用关系运算符既可以进行数值的比较,也可以进行字符串的比较。在进行比较运算时,当运算符两边的数据类型一致时,可直接进行比较;当运算符两边的数据类型不一致时,则按一定的规则对数据类型进行转换后再进行比较。关系运算的规则如下:
(1) 当两个操作数都为数值时,按数值大小进行比较。但数值比较通常是对两个算术表达式的比较。例如在对单精度数或双精度数使用比较运算符时,应特别小心,因为运算可能会给出非常接近但并不相等的结果。例如:
1.0/3.0*3.0=1.0
在数学上,上式是恒等的,但在计算机上作为关系式判相等(=)时,其逻辑值可能为假。因此,应尽量避免对两个浮点数做“相等”的判别,但可以用一种变通的办法:
Abs(x - a) < 1E-6(Abs是求绝对值函数)
只要它们的差的绝对值小于一个很小的数(这里是1E-6),就可以认为x与a是相等的。
(2) 当两个操作数都为字符串时,按字符的ASCII码值从左到右依次进行比较,即首先比较两个字符串的第一个字符,其中ASCII码值较大的字符所在的字符串较大,如果第一个字符相同,则比较第二个字符,依次类推,直到出现不同的字符为止。对于汉字按照区位码顺序(常用汉字的编码与汉语拼音顺序相同)。
例如:
“this”>“that” "i">"a"
结果为True。
等价于
(3) 数值型与可转换为数值型的数据比较时,按数值进行比较。
例如:
35>"135" '结果为False

(4) 数值型与不能转换为数值型的字符串比较时,不能比较,系统出错。
例如:
35>"XYZ" '系统出错
(6) Like运算符是Visual Basic 6.0新增的,可用来:
① 比较字符串表达式。其格式为
string1 Like string2
其中,string1 和string2可以是任何字符串常量、变量和表达式。如果两者匹配,结果为True;如果不匹配,结果为False。另外,string2可以使用字符序列表、通配符或字符区间的任何组合来匹配字符串。具体见表3-4。
匹配
字符 含义 例子 结果
? 代表任何一个字符 "BCDE" Like "?CDE" True
* 代表零个或多个字符 "BCDE" Like "*CD*" True
# 代表任何一个数字字符(0~9) "12XYZ"Like "##XYZ" True
[char-list] char-list中的任何一个字符 "5" Like "[0-9]" True
[! char-list] 不在char-list中的任何一个字符 "5" Like "[! 0-9]" False
表3-4 匹配字符及其含义
② 在SQL语言中,主要用于对数据库的模糊查询。
例3-9 查找姓名变量中所有姓张的学生,可以表示为:
姓名 Like "张*"

例3-10 查找姓名变量中所有不姓张、王、李的学生,可以表示为:
Left(姓名,1) Like "[!张, 王, 李]"
(7) Is运算符用是对象引用的比较运算符,主要用于对象操作,但它并不是将对象或对象的值进行比较,而只是确定两个对象引用是否参照了相同的对象。此外,Is运算符还在Select Case语句中使用(在3.6.2节介绍)。
3.4.4 逻辑运算符与逻辑表达式
逻辑运算也称布尔运算。用逻辑运算符将两个或多个关系式连接而成的式子称为逻辑表达式。逻辑表达式的运算结果为逻辑值。Visual Basic的逻辑运算符有以下六种:
1. Not(逻辑非)
逻辑非运算也叫逻辑反运算,它是逻辑运算符中惟一的单目运算符(其余都是双目运算符),且优先级最高。其运算规则是:当操作数为True时,结果为False;当操作数为False时,结果为True。
例如: 13>8的值为True,而Not (13>8)的值为False。
逻辑与运算也叫逻辑乘法,其运算规则是:两个操作数的值均为True时,结果为True,否则为False。
例1、(13>8) And (5<16) ′结果为True
例2、在数学上,判断X是否在区间(a,b)上时,可写成aa<=x And x<=b
例3、如果想在程序中判断输入给变量A$的是不是大写字母,则要用到的逻辑表达式是:
A$>="A" And A$<="Z“
与运算的例子在数据库的操作中经常用到。例如:在某档案数据库中查找一名具有博士学位且为高级工程师职称的干部,则博士学位、高级工程师职称这两个条件就是与的关系,要查找的人必须同时满足这两个条件才可以。
2. And(逻辑与)
逻辑或运算也叫逻辑加法,其运算规则是:两个操作数的值均为False时,结果为False,否则为True。
例1、 (13>8) Or (5<16) ′结果为True
例2、如果想在程序中判断输入给变量A$的是不是英文字母,如果不用转换函数,则要用到的逻辑表达式是:
A$>="A" And A$<="Z" Or A$>="a" And A$<="a“
这里重点是想说明一下Or的用法。如果使用转换函数,则上面的逻辑表达式将变得更为简单,可以是:
Ucase(A$)>="A" And Ucase(A$)<="Z"

Lcase(A$)>="a" And Lcase(A$)<="z" 3. Or(逻辑或)
3. Or(逻辑或)
或运算的例子在数据库的操作中也经常用到。例如:在某档案数据库中查找一名具有博士学位或高级工程师职称的干部,则对这一条件而言,博士学位或高级工程师职称就是或的关系,即只要满足这两个条件中的一个条件或者两个条件同时满足都可以。
4. Xor(逻辑异或)
逻辑异或也叫逻辑互斥运算,其运算规则是:如果两个操作数的布尔值不相同时,结果为True,否则为False。
例如:
(13>8) Xor (5<16) ′结果为False
当有多个变量参加逻辑异或运算时,变量的值为True的个数为奇数时,结果为True,否则,结果为False。异或运算用来表达一种可能性或另一种可能性,但二者不能同时存在的情形。例如:王敏是一个医生或者是一名教师。
逻辑同或运算也叫逻辑等价运算,其运算规则是:如果两个操作数的布尔值相同时,则结果为True,否则为False。
例如:(13>8) Eqv (5<16) ′结果为True
逻辑同或运算和逻辑异或运算刚好相反。
5. Eqv(逻辑同或)
6. Imp(逻辑蕴含)
逻辑蕴含运算的运算规则是:当第一个表达式为True,且第二个表达式为False时,结果为False,否则为True。
逻辑蕴含运算主要用于逻辑命题的判断。A Imp B表示“如果A,则B”这样一种逻辑运算。例如:“如果张三学日语,则李四学德语”,就属于这种逻辑运算。
说明:
(1)六种逻辑运算符的优先顺序按从高到低依次是:
Not→And→Or→Xor→Eqv→Imp。
(2)六种逻辑运算符的真值表见表3-5。
表3-5 逻辑运算真值表
A B Not A A And B A Or B A Xor B A Eqv B A Imp B
True True False True True False True True
True False False False True True False False
False True True False True True False True
False False True False False False True True
(3) 逻辑运算通常用于boolean型的数据。当对数值进行逻辑运算时,只要数值的范围最大应保证在长整型数的取值范围内,则将以数值的16位(整数)或32位(长整数)二进制值按位进行逻辑运算(0为False,1为True)。如果操作数是负数,则把它变成相应的补码形式。
例如: 12 And (-27)
首先,将操作数转换成16位二进制数:
12的补码 00000000 00001100
-27的补码 11111111 11100101
进行运算:
00000000 00001100
And 11111111 11100101
00000000 00000001
结果为00000000 00000001因此,12 And (-27)的结果为1。该结果不等于0,用于逻辑判断(如If语句中)时相当于True。
3.4.5 日期型表达式 
日期型型数据是一种特殊的数值型数据,日期型型数据的运算符只有加(+)和减(-)两种。日期型表达式是由算术运算符(“+”、“-”)、算术表达式、日期型常量、日期型变量和函数组成,能进行的运算只有下面三种:
(1) 两个日期型数据相减,运算结果是一个整数,表示两个日期之间相差的天数。
例如:#09/08/2004#-#09/01/2004# '其结果为7
(2) 一个日期型数据与一个数值型数据相加,其结果仍然是一个日期型数据。
例如:#09/01/2004#+7 '其结果为#09/08/2004#
(3) 一个日期型数据与一个数值型数据相减,其结果也仍然是一个日期型数据。
例如:#09/08/2004#-7 '其结果为#09/01/2004#
3.4.6 运算符的执行顺序
当一个表达式种有多种运算符时,如何确定运算次序呢?关于这一点,在不同的计算机语言系统中不尽相同。在Visual Basic中,运算次序是由运算符的优先级决定的。优先级高的运算符先运算;优先级相同的运算符按从左向右的顺序进行运算;如果希望表达式中的某些部分优先运算,可以用括号来改变运算的优先级,因为括号内的运算总是优于括号外的运算。在表达式中只能使用圆括号,不能使用方括号或花括号。
当表达式有多种运算符时,先处理算术运算符,接着处理比较运算符,然后再处理逻辑运算符。所有比较运算符有相同的优先级,即按它们出现的顺序从左到右进行处理。算术运算符和逻辑运算符按表3-6规定的优先级进行处理:
表3-6 运算符及其优先级
算术 比较 逻辑
指数运算 (^) 相等 (=) Not
负数 (-) 不等 (<>) And
乘法和除法 (*, /) 小于 (<) Or
整除 (\) 大于 (>) Xor
求余运算 (Mod) 小于或等于 (<=) Eqv
加法和减法 (+, -) 大于或等于 (>=) Imp
字符串连接 (&) Like,Is
当乘法和除法同时出现在表达式中时,按照从左到右出现的顺序处理每个运算符。同样,当加法和减法同时出现在表达式中时,也按照从左到右出现的顺序处理每个运算符。
字符串连接运算符 (&) 不是算术运算符,但是就其优先级而言,它在所有算术运算符之后,而在所有比较运算符之前。Is 运算符是对象引用的比较运算符,它并不比较对象或对象的值,而只判断两个对象引用是否引用了相同的对象。
如果有函数,首先进行函数运算。
3.5 Visual Basic 基本控制结构
面向对象的编程尽管采用事件驱动机制,调用功能相对简单的过程,但在设计过程的程序代码时,仍然需要对过程的流程进行有效控制。和结构化程序设计一样,程序流程有三种最基本的结构,即顺序结构、选择结构和循环结构。任何复杂的程序都是由这三种基本结构嵌套组合而成的。
3.5.1 顺序结构
顺序结构是程序设计中最常用、最简单的基本结构。在该结构中,只有一个入口和一个出口,计算机按照先后顺序依次执行程序中的各条语句,它是程序的主体结构,在选择结构和循环结构中,也常常以顺序结构作为其子结构。顺序结构的流程图如图3-7。
1.赋值语句 
赋值语句是Visual Basic中使用最多的语句之一,使用该语句可以把指定的值赋给某个变量或某个对象的属性。其一般格式为:
[Let]变量=<表达式>
[Let]对象.属性=<表达式>
功能:将“=”号右边表达式的值赋给左边的变量或对象的属性。如:
Sum=0
Text1.text="欢迎使用本系统!"
说明:
(1) 关键字Let可以省略。
(2) 这里的“=”叫赋值号,与数学上的等号不同。例如:
X=Y+Z在数学上可以写成Y+Z=X,但在Visual Basic中这样写不符合上面的规定,是错误的。
数学上,X=X+1是不成立的,但在程序设计中是经常用到的,其作用是将X单元的值加1后的结果再保存到X单元中。其执行过程如图3-8。
X
X
5
6
X=X+1
图3-8 X=X+1的执行过程
(1)表达式可以是常量、变量、函数、对象的属性和各种表达式(数值表达式、字符串表达式或逻辑表达式)。
(2)赋值语句具有计算和赋值双重功能,它首先计算赋值号右边表达式的值,然后把计算结果赋给赋值号左边的变量或对象的属性。
(3)赋值号“=”两边的数据类型,在一般情况下应一致。如果不一致时,则以左边变量或对象属性的数据类型为准。即若右边表达式结果的数据类型能够转换成左边变量或对象属性的数据类型时,则先(强制)转换,后赋值。若不能转换,则系统提示出错信息。具体转换原则如下:
例如:
Y!=123 '执行后Y的值为123.0
X%=2.71828 '执行后X的值为3
Z%=3.7182 '执行后X的值为4
① 当赋值号两边都是数值型但精度不同时,则以左边变量或对象属性的数据精度为准进行强制转换。
②当赋值号左边是数值型变量,而右边表达式是数字字符串时,则将此数字字符串转换成数值类型数据后,再按上述原则赋值;但当右边表达式不是纯数字字符串时,将出错。
例如:
X%="1234.5" '执行后X的值为1234
Y!= “1234ABC” '出错,系统给出错误信息:“类型不匹配”
Z%=" " '出错,系统给出错误信息:“类型不匹配”
③任何非字符类型数据都可以转换成字符类型赋值给字符串变量。
例如:
Str1$=1234 '执行后 Str1$的值为"1234"
Str2$=False '执行后 Str2$的值为"False"
例如:
  X%=True '执行后X的值为-1
  Dim A As Boolean
  A=-123.5 '执行后X的值为True 
④ 当逻辑量赋给数值型时,True转换为-1,False转换为0;反之,当数值型量赋给逻辑型时,非0转换为True,0转换为False。
⑤ 任何类型的表达式都可以赋给Variant变量。
(6) 利用赋值语句可以完成两个变量值的交换。
例如:
方法1 方法2
T=A T=B
A=B B=A
B=T A=T
上述两种方法均可实现变量A和变量B的值的互换。
在Visual Basic中书写语句时,应遵守如下规定:
每个语句占一行,以回车键结束;多个语句写在同一行时,各语句之间用冒号(: )隔开;但语句行的长度最多不能超过1 023个字符。
一个语句可以写在多行,各行(除最后一行)末尾用下划线(_)表示续行;续行符(即下划线)与它前面的字符之间至少要有一个空格
语句中的命令词、函数、变量名、对象名等不必区分大小写。
Visual Basic具有“自动语法检测”功能(用“工具”菜单“选项”命令中的“编辑器”选项卡)。(见图3-5 强制变量声明).在输入语句的过程中,Visual Basic将自动对输入的内容进行语法检查。如果发现了语法错误,则弹出一个信息框,提示出错的原因。
Visual Basic按自己的约定对语句进行简单的格式化处理。例如将命令词的第一个字母大写,运算符前后加空格等。
2.数据的输出—Print方法
在Visual Basic中,可以通过Print方法、用户交互函数和过程、文本框控件(TextBox)和标签框控件(Label)来输出数据。下面主要介绍通过Print方法、用户交互函数和过程来输出数据的方法,用文本框控件和标签框控件来输出数据的用法请参阅5.2节的相关内容。
在早期BASIC版本中语句,Print被称为语句,而在Visual Basic中,Print被称为方法。尽管叫法不同,但格式和功能与BASIC语言中的PRINT语句相似。都可以用来进行输出操作。
使用Print方法输出数据是Visual Basic中最基本的数据输出方法,可以将数据输出到窗体上(Form)、图片框(PictureBox)、立即窗口(Debug)和打印机上。其格式如下:
[对象名称.]Print[{Spc(n)| Tab(n)};][表达式列表][,|;]
说明:
“对象名称”可以是窗体(Form)、图片框(PictureBox)或打印机(Printer)。如果省略对象名称,则在当前窗体上输出。例如:
Picture1.Print"Visual Basic 6.0" '在图片框Picture1上显示字符串
Debug.Print"Visual Basic 6.0" '在立即窗口中显示字符串
Print"Visual Basic 6.0" '在当前窗体中显示字符串
Printer.Print“Visual Basic 6.0” '在打印机上打印字符串
注:如何在打印机上输出数据或图象,请参阅10.3.4节
(2) Spc(n)、Tab(n)是一些与Print方法有关的函数。
(3) “表达式列表”是一个或多个表达式数值表达式或字符串。对于数值表达式,打印出表达式的值;对于字符串,则“原样照印”。
(4) 当“表达列式”中的内容多于一项时,各项可以用逗号(,)或分号(;)隔开。如果用分号分隔,则按紧凑格式输出。如果用逗号分隔,则按标准格式(分区输出格式) 输出。在这种情况下,以14个字符位置为单位把一个输出行分为若干个区段,逗号后面的表达式在下一个区段输出(又称为制表位)。
例3-11 写出下列程序段的运行结果。
X=1:y=2:z=3
Print x,y,z, "xyz"
Print
Print –x,-y; "xyz";"abc";
Print
Print x,y,z, "xyz"
End
1 2 3 xyz
空行
-1 -2 xyzabc
1 2 3 xyz
输出结果为
注意:
用Print方法输出数值型数据时,其后自动输出一个尾随空格,对于字符型数据不留空格,正数前面有一个空格(符号位)。
对于一个省略“表达式表”的Print方法,如果它的前一个Print方法的最后没有逗号或分号,则此Print方法将输出一个空行。否则,此Print方法将不能输出一个空行,即其作用是抵消前一个Print方法的最后没有逗号或分号,达到换行的作用。如本例。
(5) 若“表达式列表”最后无分隔符(逗号或分号),则该Print方法执行结束后自动换行;若“表达式列表”最后有分隔符,则该Print方法执行结束后不换行,下一个Print方法的输出项仍在本行的后面输出(即如果末尾是逗号,下一输出项按标准格式输出,如果是分号,则按紧凑格式接着输出)。例如:
Print "x+y=",
Print 3*50
Print "x+y=";
Print 3*50
x+y= 150
x+y= 150
输出结果为:
为了将信息按用户指定的格式输出,提高输出的灵活度,Visual Basic提供了几个与Print配合使用的函数。这些函数可以作为Print方法的一部分,最常用的有Tab,Spc和Format等。其具体用法如下:
(1) Tab函数
格式: Tab(n)
作用:对输出的数据确定位置。
说明:
① 参数n是值为整型的数值表达式,它是下一个输出位置的列号,表示在输出时先把光标(或打印头)移到该列,然后再输出。通常最左边的列号为1。
②当在一个Print方法中有多个Tab函数时,每个Tab函数对应一个输出项,各输出项之间用分号隔开,且各个Tab函数的参数n要依次增大,不能忽大忽小。
③在Visual Basic中,对参数n的取值范围没有具体限制。当n比行宽大时,显示位置为n Mod行宽;如果n<1,则把输出位置移到第一列。
例如:
Print Tab(5);"Total:";Tab(15);20
输出结果为:
Total: 20
↑ ↑
第5列 第16列
注意:"Total:"中的字母T输出在第5列开始的位置上,而整数20分别输出在第16和第17列上,因为20是正数,其符号位要占一个空格。
(2)Spc函数
格式: Spc(n)
作用:是跳过n个空格。
说明:
① 参数n是取值范围在0~32 767之间的整型数值表达式,Spc函数与输出项之间也用分号隔开。
② Spc函数与Tab函数的用法相似,可以互相代替。但必须注意,Tab函数中的参数n是从对象的左端开始计数的,而Spc函数中的参数n只表示两个输出项之间的间隔。也就是说,Tab函数中的参数n是从1开始计数的绝对定位,而Spc函数中的参数n是从当前位置开始计数的相对定位。
例如:
Print Spc(5);"Total:";Spc(15);20
输出结果为:
Total: 20
↑ ↑
第6列 第28列(读者自己考虑一下,这个位置是如何计算出来的)
注意:"Total:"中的字母T输出在第6列开始的位置上,而整数20分别输出在第28和第29列上。
3.格式输出函数
格式输出函数Format$可以指定数值型、日期型或字符串型数据的输出格式。
格式: Format$(数值表达式,格式字符串)
功能:按“格式字符串”指定的格式输出“数值表达式”的值。
说明:
“数值表达式”值可以是数值型、字符串型或日期型数据; “格式字符串”可以是一个字符串常量或变量,它由专门的格式说明字符构成。 当格式字符串为常量时,必须放在双引号中。数据项的显示格式(包括显示区段的长度)就是由这些格式字符决定。具体用法请参阅4.1.2节。
4.用户交互函数和过程
在Visual Basic中,实现输入输出的用户交互函数和过程有: MsgBox函数、MsgBox过程(语句)和InputBox函数。
(1) MsgBox函数
MsgBox函数用于输出数据,它会在屏幕上显示一个对话框。等待用户单击按钮,并返回一个整数告诉系统用户单击了哪个按钮,以此作为程序流程的选择控制依据。其调用格式如下:
变量[%]=MsgBox(msg [,type] [,title] [,helpfile,context])
说明:
该函数的五个参数中,除第一个参数msg是必选的外,其余参数都是可选的。各参数的含义如下:
① msg是一个长度不超过1024个字符的字符串,如果超过,则多余的字符将被截掉。该字符串的内容作为提示信息显示在MsgBox函数产生的对话框内。当字符串太长在一行内显示不完时,系统将自动换行,并能自动调整信息框的大小。当然,如果需要的话,用户也可以用“Chr(13)+Chr(10)”或“Chr(13)&Chr(10)”或“vbCrLf”来控制强制换行。
② type是一个整数值或符号常量,用来控制对话框样式。其值最多由四类数值相加而成,其形式如下
<按钮类型>[+<图标类型>][+<默认按钮>][+<模式>]
其中,按钮类型的值指定对话框内命令按钮的类型和数量(7种);图标类型的值指定对话框所显示的图标(4种);默认按钮的值指定哪个是默认活动按钮(活动按钮中文字的周围有虚线,按回车键可执行该按钮的操作,效果与单击该按钮作用相同;用Tab键可以把其他按钮变为活动按钮);模式的值指定强制返回的方式(应用程序或系统)。具体的取值和含义参见教材,此略。
需要指出的是:每一个参与构成type参数的四种类型(按钮类型、图标类型、默认按钮和模式)的值,都有相应的符号常量,其作用与数值相同。不过,使用符号常量可以提高程序的可读性。
如果省略type参数值,则默认值为0。对话框中只显示一个OK(确定)按钮,并将其置成活动按钮,不显示任何图标。
如果对话框中显示“取消”按钮,则按下键与单击“取消”按钮,效果相同。
③ title是一个字符串,用来显示对话框的标题。如果省略该参数,则对话框的标题为当前工程的名称。如果希望标题栏中没有任何内容,则应把title参数设置为空字符串。
④ helpfile,context helpfile是一个字符串变量或字符串表达式,用来表示帮助文件的名字;context是一个数值变量或表达式,用来表示相关帮助主题的帮助目录号。这两个参数必须同时提供或同时省略。当带有这两个参数时,将在对话框中出现一个“帮助”按钮,单击该按钮或按F1键,可以得到有关的帮助信息。
⑤ MsgBox函数的返回值是一个整数。由于MsgBox函数所显示的对话框有7种命令按钮,故其返回值与这7种按钮相对应,分别为1~7的整数,参见教材表 3-8。在应用程序中,用户可以根据MsgBox的不同返回值,来实现程序的流程控制。
例3-12 编写程序,用MsgBox函数判断是否继续执行打印操作。
程序代码如下:
Private Sub Form_Click( )
Yn=MsgBox("请确认打印机是否准备好?",vbYesNo+vbQuestion,"打印提示")
If Yn=7 Then
Print"请接通打印机"
Else
Print“打印机已接通”
End If
End Sub
程序运行后,首先将产生一个对话框,如图3-9所示。对话框中只有“是(Yes)”和“否(No)”两个按钮。如果用户单击“否”,MsgBox函数返回的值为7,则上面的IF语句条件成立,在窗体上打印"请接通打印机";如果用户单击“是”,MsgBox函数返回的值为6,则上面的IF语句条件不成立,在窗体上打印"打印机已接通"。
这里,如果将判断条件Yn=7改为Yn=vbNo,则程序的可读性更好一些。
运行结果
(2) MsgBox过程
MsgBox过程也称MsgBox语句,其功能与MsgBox函数相同,但MsgBox过程没有返回值,因而经常用来较显示一些简单的信息,而不能进行程序流程的选择控制。其调用格式如下:
MsgBox(msg [,type] [,title] [,helpfile,context])
例如:
m= MsgBox(“数据输入错误”,2+vbExclamation,“错误提示”)
或 MsgBox "数据输入错误",2+vbExclamation,"错误提示"
执行后的界面都是相同的,如右图所示0。所不同的是,函数有返回值且保存在变量m中,而过程没有返回值。
从上面的例子可以看出:MsgBox函数或MsgBox过程所显示的信息框都有一个共同的特点就是:在出现信息框后,用户必须做出选择,即单击框中的某个按钮或按回车键,否则不能执行其他任何操作。在Visual Basic中,把这样的窗口(对话框)称之为“模态窗口”(Modal Window),这种窗口在Windows中经常见到。
在程序运行时,模态窗口挂起了应用程序中其他窗口的操作。一般而言,当屏幕上出现一个窗口(或对话框)时,如果需要在响应该窗口中的提示后才能进行其后的操作,则应使用模态窗口。
与模态窗口相反,非模态窗口(Modaless Window)允许对屏幕上的其他窗口进行操作。换句话说就是它可以激活其他窗口,并把光标移到该窗口。MsgBox函数和MsgBox过程强制所显示的信息框为模态窗口。在多窗体程序中,可以把某个窗体设置为模态窗口。关于多窗体程序的介绍,请参阅7.3节。
(3) InputBox函数
InputBox函数用于输入数据。它相当于其他版本BASIC语言中的INPUT语句。其格式为:
变量=InputBox[$](prompt [,title][,default][,xpos,ypos][,helpfile,context])
该函数的作用是产生一个对话框,等待用户输入数据,当用户按下回车或单击“确定”按钮时,被输入的内容将以字符串数据的形式返回给函数。
例如:用InputBox函数给变量age赋值时,可用下面的赋值语句完成:
age=InputBox("请输入你的年龄","数据输入框",20)
该语句执行后,打开的对话框如右图。
说明:
该函数的七个参数中,除第一个参数prompt是必选的外,其余参数都是可选的。各参数的含义如下:
① prompt参数是一个字符串。它是在对话框内显示的信息,用来提示用户完成输入。其他用法与MsgBox 函数或MsgBox过程中的参数msg相同。
② title参数与MsgBox 函数或MsgBox过程中的title参数相同。
③ default参数是一个字符串,输入文本框中的默认值。也就是说,该参数是在没有其他输入时显示在文本框中的字符串。如果用户不想用这个默认字符串作为输入值,则可在输入文本框中直接键入数据,以取代默认值。如果省略该参数,则相当于空字符串,对话框的输入区为空白,等待用户键入信息。
④ xpos,ypos是两个整数值,分别相当于X坐标和Y坐标,用来确定对话框在屏幕上的显示位置,屏幕左上角的坐标为(0,0),向下为Y轴的正方向,向右为X轴的正方向,其单位为twip。这两个参数必须全部给出,或者全部省略。如果省略这一对位置参数,则对话框显示在屏幕中心线向下约1/3处。
⑤ helpfile,contexthelpfile参数的作用用法与MsgBox 函数或MsgBox过程中的helpfile,contexthelpfile参数相同。
注意:
(1) InputBox函数中的所有参数中,除第一个参数prompt是必选的外,其余参数都是可选的。但处于中间位置上的参数省略时,其后的逗号不能省略。例如:
age=Inputbox("请输入你的年龄!",,20)
(2) InputBox函数的返回值是一个字符串。如果要得到数值类型的数据时,必须Val函数进行转换。例如:
age=Val(Inputbox("请输入你的年龄!",,20))
(3) InputBox
同课章节目录