第三章 VB语言程序
设计基础
本章要点
本章将对 Visual Basic 6.0中文版的语言
作一个简单的介绍 。 与传统的 Basic语言相
比, Visual Basic继承了 Basic语言的简单,
易学, 易用等特点, 同时作为一种现代编
程语言, 它支持面向对象的程序设计思想,
并在其智能编辑器的支持下, 实现了可视
化 ( Visual) 编程 。
Visual Basic中的数据类型
Visual Basic的变量、常量、运算符和表达式
Visual Basic的常用函数
Visual Basic的基本语句及结构
Visual Basic中的数据及字符串的使用
本章主要内容
3.1 编码规则
3.2 数制及数据类型
3.3 常量和变量
3.4 运算符和表达式
3.5 常用内部函数
3.6 基本语句
3.7 数组及应用
? VB对用户程序代码中关键字的首字母总被转换成大
写字母,其余字母一律转换为小写字母。提高了程序的可读
性。
? VB将关键字中每个单词的首字母自动转换成大写字
母 。
? 对于用户自定义的变量名、过程名、函数名,VB以
第一次定义的为准,以后输入的自动转换成首次的形式。
1、在 VB代码中,字母不区分大小写
3.1 编码规则
2、语句书写自由
? VB 在同一行上可以书写一条语句或多条语句。如果多条
语句写在一行上,语句间用冒号,,, 隔开。例如:
Form1.width = 300, Form1.caption = "您好 ", Temp =
Form1.width
为了方便阅读, 最好一行写一条语句 。
? 一条语句如果在一行内写不下,VB允许将单行语句分若干
行书写,在行后加入续行符(一个空格后面跟一个下划线
,_‖。)将长语句分成多行。
Addresses = ―天津市河北工业大学, & _
―现代化教学中心, & _
―计算机技术基础教研室,
原则上,续行符应加在运算符的前后,续行符不应将变量名
和属性名分隔在两行上。
注释可以和语句在同一行, 并写在语句的后面, 也可占据一
整行 。 例如:
ˊ 这是从屏幕左边
ˊ 开始的注释 。
Text1.Text = ―Hi!‖ ˊ 在文本框中放欢迎词 。
3、在 VB中可以使用注释
注释有三种情况:
? 用 Rem开头引导注释行 。
? 用撇号, ˊ, 开始引导语句后的注释 。
? 使用, 设置 /取消注释块, 命令将若干语句行或文字设置
/取消为注释块 。
注意,在同一行内, 续行符之后不能加注释 。
规定:
? 组成标识符的字符有,A~ Z,a~ z,0~ 9或下划线 _。
? 标识符必须是以字母或下划线开始, 后跟字母, 数字或下划
线组成的字符串 。
? 标识符不能分行书写 。
4,VB中的标识符
例如:以下是 Visual Basic 6.0中合法的标识符
Dim MyString As String
Const Pi=3.1415926535897932
Public Function getValue () As Integer
3.2.1.数制
十进制 八进制 十六进制
9 &O11 &H9
15 &O17 &HF
16 &O20 &H10
20 &O24 &H14
255 &O377 &HFF
3.2 数制及数据类型
数制
主要数制,十进制数, 是 VB中的默认数制
辅助数制,八进制数 ( &O) 和十六进制数 ( &H),
个别情况使用, 如屏幕和颜色的设置 。
3.2.2 数据类型
Visual Basic提供了许多基本数据类型,
如,Integer(整型 ),String(字符型),
Boolean(逻辑型),Currency(货币型)等,
每种数据类型占用一定的内存,允许存储一
定范围的值。
数据类型
标准数据类型
自定义数据类型
数值型
( numeric)
日期型( Date)
逻辑型( Boolean)
字符型( String)
对象型( Object)
变体型( Variant)
整型( Integer)
长整型( Long)
货币型( Curency)
字节型( Byte)
浮点型 单精度( Single)
双精度( Double)
1、标准数据类型
⑴ 数值 ( Numerice) 数据类型
有整型 ( Interger) 长整型 ( Long)
单精度型 ( Single) 双精度型 ( Double)
货币型 ( Currency) 字节型 ( Byte)
① 整型 ( Interger) 和长整型 ( Long) 用于保存整数
可以是正整数, 负整数或者 0。
整型数用两个字节存储, 表示数的范围为,-32768~ +32767
长整型数用 4个字节存储, 表示数的范围为,-2147483648~
+2147483647
例如,123,-123,+123,123%均表示整数, 而 123.0就不是整数 。
123&,1234567&均表示长整数 。
123,456则是非法数 。
② 单精度型 ( Single) 用来表示带有小数部分的实数
4个字节存储
单精度浮点数最多有 7位有效数字,
单精度浮点数有多种表示形式:
± n.n(小数形式 ) ± n!(整数加单精度类型符 ) ± nE± m(指数
形式 ) ± n.nE ± m (指数形式 ) 例如:
123.45,0.12345E+3,123.45!都是同值的单精度数。
如果某个数的有效数字位数超过 7位, 当把它赋给一个单精度
变量时, 超出的部分会自动四舍五入 。
例如:把 213456.2567赋给单精度变量 aa,
在内存中 aa的值为 213456.3。
③ 双精度型 ( Double)
用 8个字节存储。
科学记数法格式, ± aD± c或 ± ad± c
例如 314.159265358979D-2表示 3.14159265358979。
双精度浮点数最多可有 15位有效数字 。
④ 货币型( Currency)是一种专门为处理货币而设计的数
据类型,是一种特殊的小数。
保留小数点右边 4位和小数点左边 15位。
用 8个字节存储
如果变量已定义为货币型,且赋值的小数点后超过 4位,那
么超过的部分自动四舍五入。
例如,将 3.12125赋给货币型变量 aa,在内存中 aa的实际值
是 3.1213。
⑤ 字节型( Byte)用来存储二进制数。
如果变量包含二进制数,则将它声明为 Byte 数据类型。
Byte 是从 0-255 的无符号类型,不能表示负数。
⑵ 日期( Data)数据类型
用 8个字节的浮点数存储,表示从公元 100年 1月 1日到公元 9999
年 12月 31日的日期,时间范围则从 0点 0分 0秒到 23点 59分 59秒即 0:
00,00~ 23,59,59。表示方法有两种:一种是以,#‖括起来的
字面上被认为是日期和时间的字符;另一种是以数字序列表示。
例如,#03/10/2000#,#2000-03-10#,#March 1,2000#,#2000-
3-15 13,30,15#。
以数字序列表示时,小数点左边的数字代表日期 (Date),小数
点右边的数字代表时间( Time)。其中,0为午夜 0点,0.5为中午
12点;负数代表 1899年 12月 31日之前的日期和时间。
⑶ 逻辑( Boolean)数据类型
逻辑数据类型用于逻辑判断,只有两个值:真 (True),假 ( False)
若变量的值是, true/false‖、,yes/no‖、,on/off‖ 信息,则可
将它声明为 Boolean 类型。
缺省值,False
逻辑数据转换成整型数据时,真 转换为 -1,假转换为 0;其他
类型数据转换为逻辑数据时,非 0数转换为 真,0转换为 假。
⑷ 字符( String)数据类型
是一组由计算机字符组成的序列,每个字符都以 ASCII编码表
示。用一个字节表示。在 VB中,字符串要用双引号括起来。
例如:,Visual Basic‖、“中国天津”、,123.456‖
有两种字符串:变长字符串和定长字符串。变长字符串的最
大长度为 231-1个字符;定长字符串的最大长度为 65535个字符 。
⑸ 对象( Object)数据类型
用 4个字节来存储,该 32位地址可以引用应用程序中的对象。
⑹ 变体( Variant)数据类型
变体型数据是一种可以随时改变数据类型的数据。如:
Dim SomeValue As Variant ˊ 定义 SomeValue为变体型变量
SomeValue = ―17‖ ˊSomeValue 包含, 17‖(双字

的串)
SomeValue = SomeValue - 15 ˊ 现在 SomeValue 包含数值 2
SomeValue = "U" & SomeValueˊ 现在 SomeValue 包含 "U2"
(双字符的串)
2、自定义类型
形式,Type自定义类型名
元素名 [(下标 )]As 类型名
? ?
[元素名 [(下标 )]As 类型名 ]
End Type
其中,元素名 ? 表示自定义类型中的一个成员
下 标 ? 表示该成员是一个数组
类型名 ? 该成员的标准数据类型
例如, 定义班级中学生的基本情况的数据类型如下:
Type Students ˊ 声名 Students是自定义类型名
Name As String * 8 ˊ Name是 Students类型中的成员之一
Age As Integer ˊ Age是 Students类型中的成员之一
Address As String * 20 ˊ Address是 Students类型中的成员之一
End Type
声明变量,Dim Student1 As Students
要表示 Student1变量中的某个元素, 可使用下列方式:
变量名,元素名
例如:
Student1.Name="李萍 "
Student1.Age=19
使用自定义类型应注意的问题:
?自定义类型必须在标准模块 (,Bas) 中定义, 默认是 Public。
? 自定义类型中的元素类型是字符串型时, 该字符串必须是定
长字符串 。
? 要分清自定义类型名和具有该类型的变量名 。 前者表示的是
一种数据类型, 如同 Integer,Single等一样;后者是一个具有某
种类型的变量, VB根据变量的类型分配必要的存储空间 。
VB中标准数据类型表见课本 P36页
常量
普通常量
符号常量
数值常量
字符串常量
逻辑常量
日期常量
3.3.1 常量
在程序运行过程中,其值始终保持不变的量称为常量
1,普通常量:
⑴ 数值常量:字节型、整型、长整型、定点及浮点常量。
字节型、整型、长整型都是整型常量,例如,50,480085、
-123,&O123,&H14等。
定点常数是带小数点的正数或负数,如,3.12436、
123.123,-0.456等。
3.3 变量和常量
浮点常数又分为单精度浮点常数和双精度浮点常数, 他
们都由尾符, 尾数, 指数符号和指数四部分组成, 其中尾符
代表了浮点数的正负, 指数是整数 。
例如,-3.7856E-2,78D3所表示的值分别为 -0.037856和
78000。
⑵ 字符串常量:是用双引号括起来的一串字符,每个字符占
用一个字节,如果是汉字,占用两个字节,但在 VB中汉字被认为
是一个字符。
,abcd” ˊ 长度为 4的字符串
,VB5.0中文版” ˊ 长度为 8的字符串
⑶ 逻辑常量:逻辑真 True,逻辑假 False
⑷ 日期常量
#January 1,2000#,#5/12/98#,#1999-6-30#,#99-9-10 8:
30,00#都是正确的日期常量。
功能:设置符号常量为表达式的值 。
举例:下面的语句分别定义了四个符号常量 。
Const NAME As String =―LiLin― ? 定义 NAME是符号
常量, 其值是字符串, LiLin―
Const NUM As Integer= 4450 ? 定义 NUM是符号常量,
其值是整型数 4450
const 符号常量名 [As 类型 ] = 表达式 [,符号常量名 =表达式 ? ]
2,符号常量 ( 用户声明常量 )
用户声明常量是用一个符号名来代替数值或字符串, 称为
符号常量 。
命名规则:符号名必须是以字母开头, 由字母, 数字, 下划线
组成的长度不大于 40的字符串 。
格式:
Const Pi=3.14159 ? 定义 PI是符号常量,其值是单精度数
3.`4159
Const MAX As Integer=&O155 ? 定义 MAX是符号常量,
其值是八进制数 155
使用符号常量的规则:
? 符号常量不能修改, 也不能对符号常量赋新值 。
? 符号常量名不能是 Visual Basic中的保留字, 如 Case、
EndDo,If等 。
? 符号常量名必须以字母开头 。 通常, 为了区别于其他变量,
符号常量用大写字母表示 。
? 符号常量应先定义后使用, 在整个模块中只需定义一次 。
? 由于 VB应用程序的结构层次分全局级, 窗口级和模块级,
相应地一个符号常量也有不同的作用域 。
1 变量和变量名
变量是指在程序运行期间其值可以变化的量 。
命名规则:
? 变量名必须以字母 A~ Z( 或 a~ z) 开头 。
? 构成变量名的字符串由英文字母, 数字, 下划线符号组成 。
? 变量名中间不允许有空格 。
? Visual Basic的保留字不能作为变量名 。
? 在 Visual Basic语言中, 变量名不区分大小写 。 如 ABC,abc、
aBc都认为是一个相同的变量名 。 为了便于区分, 一般变量名
首字母用大写字母, 其余用小写字母表示, 而符号常量全部用
大写字母表示 。
3.3.2 变量
2 变量的声明及类型
⑴ 用 Dim关键字声明变量
格式,Dim变量名 [As 类型 ]
其中,[As 类型 ]为可选项 。 当该部分省略时, 所建立的变量类
型默认为变体类型 。
用途,在模块过程中或窗体级的通用过程中定义变量 。
例子,Dim Age As Integer ?定义 Age为整型变量
Dim StrTemp As String ?定义 StrTemp为不定长字符型变量
Dim StrName As String * 10 ?定义 StrName为定长 (10)字符变量
Dim Number As Single,Count As Single
?定义 Number和 Count都是单精度变量
dim Number,Count As Single
?定义 Number为变体变量, Count为单精度变量
从上面的例子可知:
★ 字符串变量有定长和不定长两种形式;
★ 在一个 Dim语句中定义多个变量时类型声明不能共用 。
⑵ 用 Static关键字声明变量
格式,Static 变量名 As 类型名
用途,在过程中定义静态变量和静态数组 。
说明,该变量的值在函数或过程执行结束后能保存下来,
所以, 下一次执行时, 该值不再初始化 。
例子,Private Sub form_Click( )
Dim A1 As Integer
Static A2 As Integer
A1=A1+1
A2=A2+1
? ?
End Sub
该过程中 A1和 A2定义为不同类型的整型变量。 A1的值每调
用一次过程就自动加 1,过程调用一结束,其值就变为 0。 A2的
值每调用一次过程也自动加 1,过程调用结束时,A2的值等于调
用该过程的次数。
⑶ Public关键字声明变量
用途,在全局模块中使用, 定义的变量是全局变量, 作用域
为整个应用程序 。
声明的方式:
★ 单击, Project‖菜单上的, Add Module‖选项, 添
加一个新模块文件或打开现有的模块文件 。
★ 用 Public 语句定义变量, 格式为:
Public 变量名 As 类型名
例子,Public PI As Single
Public AA As Integer
⑷ 用类型说明符直接声明变量
格式,变量名 +类型说明符
类型说明符放有:
% 表示整型
& 表示长整型
! 表示单精度型
# 表示双精度型
@ 表示货币型
$ 表示字符型
例如,Name$ ˊ 定义字符型变量
Price! ˊ 定义单精度型变量
Age% ˊ 定义整型变量
⑸ 隐式声明变量
在 VB中, 对未进行声明就直接使用的变量叫做隐式声明,
其类型为 Variant类型 。 应避免使用 。
3 变量的作用域
① 局部变量 ——
☆ 用 Dim语句定义,只能在本过程中使用,其他过程不可
访问。
☆ 随过程的调用分配存储单元,进行变量的初始化,一
旦过程结束,变量的内容自动消失,并释放所占用的存储单元。
☆ 不同的过程中可使用相同的变量名。
②窗体 /模块级变量 ——
☆ 用 Dim语句或 Private语句定义,在“通用声明”段中
定义。放在一个窗体 /模块的任何过程外,可被本窗体 /模块的任
何过程访问。
③全局变量
☆ 用 Public语句声明,在“通用声明”段中定义,放在标
准模块的任何过程或函数外,可被应用程序的任何过程或函数访
问。
☆ 其值在整个应用程序中始终不会消失和重新初始化,
只有在整个程序结束时,才会释放。
④ 静态变量 ——
☆ 用 Static语句定义的局部变量,在程序运行过程中该类
变量的值可保留。
☆ 每次调用过程时,用 Static定义的静态变量保持原来的
值,而用 Dim定义的变量要重新初始化。
声明变量时作用域的规则:
? 在窗体, 模块中声明的变量是模块级的, 对整个模块
都有效 。
? 在过程内用 Dim语句声明的变量只在过程内有效 。
? 用 Public语句声明的变量是程序级的, 在整个程序中
起作用 。
? 用 Static语句声明的变量是静态变量, 即使在过程结束
后也一直保存着, VB在任何时候都不会去初始化静态变量 。
过程局部变量
函数局部变量
过程局部变量
函数局部变量
模块变量
窗体变量
全局变量
变量作用域的关系
3.3 运算符和表达式
运算符是代表 Visual Basic某种运算功能的符
号。 Visual Basic程序会按运算符的含义和运算规
则执行实际的运算操作。 Visual Basic中的运算符
包括:
? 算术 运算符
? 关系运算符
? 逻辑运算符
? 字符串 运算符
1 算术运算符
运算符 功能 优先级 运算符 功能 优先级
^ 指数 1 \ 整除 4
- 负号 2 Mod 取余 5
* 乘 3 + 加 6
/ 除 3 - 减 6
功能:
对诸如整型数、长整型数、单精度浮点数、双精度浮点
数及货币型数进行操作。
说明:
☆ 算术运算符中,除负号,-‖是单目运算符外,其余都是
双目运算符。
☆ +、-,× 的概念和代数中的概念相同。
☆ 除法运算有两种:
/ —一般除法,运算结果一般为单精度数。如果操作数有
一个为双精度数,则结果为双精度数。如,7/3=2.33333333333
\ —整除,整数除法,结果为整数。如,7\3=2
☆ Mod运算符是求两数相除后的余数。例如:
23 Mod 7 ?结果为 2
8.6 Mod 3 ?结果为 0
11.4 Mod 5.2 ?结果为 1
☆ 算术运算符两边的操作数应为数值型。若是数字字符
或逻辑型,则自动转换为数值型再运算。
先按四舍五入的原则对小数点后部分
进行处理,然后运算
2 关系运算符
运算符 功 能 例 子 结 果
> 大于 "1234">"129" False
>= 大于等于 "ab c">="abc" False
< 小于 34<67 True
<= 小于等于 "23"<="3" True
= 等于 150=150 True
<> 不等于 "xyz"<>"XYZ" True
功能:对两个操作数进行大小比较,若关系成立,返回 True,
否则返回 False.
说明:
☆ 关系运算符是双目运算符,操作数可以是数值型或
字符型。
☆ VB中 True用 -1表示; False用 0表示。
☆ 如果两个操作数是数值型,则按其大小比较;如果
两个操作数是字符型,则按字符的 ASCII值从左到右一一比较。
☆ 汉字字符大于西文字符。
☆ 关系运算符中的等于,= ‖是判断两边的值是否相等。
3 逻辑运算符
运算符及功能:
Not —逻辑非,当操作数为假时,结果为真。
Not F 为 T
Not T 为 F
And —逻辑与,两个操作数都为真时结果为真。
T And T 为 T T And F 为 F
F And T 为 F F And F 为 F
Or —逻辑或,两个操作数只要有一个为真,结果就为真。
T Or T 为 T T Or F 为 T
F Or T 为 T F Or F 为 F
Xor —逻辑异或,两个操作数不同时,即一个为真,一个
为假时,结果为真,否则为假。
T Xor T 为 F T Xor F 为 T
F Xor T 为 T F Xor F 为 F
Eqv —逻辑等,两个操作数相同时,结果为真。
T Eqv T 为 T T Eqv F 为 F
F Eqv T 为 F F Eqv F 为 T
Imp —蕴含,第一个操作数为真,第二个操作数为假时,
结果为假,其余情况为真。
T Imp T 为 T T Imp F 为 F
F Imp T 为 T F Imp F 为 T
说明:☆ 逻辑运算符中最常用的是 Not,And,Or,其中 And、
Or用于将多个关系表达式进行逻辑判断。若有多个条件,And
必须全部条件都为真才为真;而 Or只要有一个条件为真则为真。
如:某单位选拔年轻干部,条件为:年龄小于等于 35岁、
职称为高级工程师、政治面目为中共党员。表示为:
年龄 <=35 And 职称 =― 高级工程师” And 政治面目 =―中共党员”
若表示为:
年龄 <=35 Or 职称 =― 高级工程师” Or 政治面目 =―中共党员”
表示三个条件只要有一个成立即可。
☆ 如果逻辑运算符对数值进行运算,则进行数字的二进
制逐位操作。如,12 And 7 表示对 1100( 12)与 0111( 7)进
行逐位与操作。 1 1 0 0? 0 1 1 1
————0 1 0 0
这种特殊运算符用途如下:
① And运算用来屏蔽某些位。如键盘事件中判断是否按了 shift、
ctrl,alt键。例如:
cl=cl And 7 ?仅保留 cl中的最后三位,其余位置
零。这里的,=‖是赋值号。
② Or运算用来把某些位置 1。例如:
cl=cl Or 7 ?把 cl 中的最后三位置 1,其余位保
持原值不变。
③ 对一个数连续进行两次 Xor操作,可恢复原值。如设计动画
时,用 Xor模式可恢复原来的背景。
4 字符运算符
运算符,& +
功能,& —连接符两边的操作数不管是字符还是数值型,进
行操作前,系统先将操作数转换成字符型,然后再连接。
+ —两个操作数应均为字符型,若均为数值型,则进行
算术加运算;若一个为数字字符,另一个为数值型,则自动将
数字字符转换为数值,然后进行算术加运算;若一个为非数字
字符型,另一个为数值型,则出错。例如:
,12000‖+12345 结果为,24345‖ 进行的加运算
,12000‖+―12345‖结果为,1200012345‖ 两个字符串连

,abcde‖+12345 结果为错
,abcdef‖&12345 结果为,abcdef12345‖
―12000‖&‖12345‖结果为,1200012345‖
12000&12345 结果为,1200012345‖
12000+―123‖&100结果为,12123100‖
说明:
在字符串变量后使用,&‖运算符时,变量和运算符之间
应加一个空格。因为,&‖既是字符串连接符,也是长整形类型
符,当变量名和符号,&‖连在一起时,VB把它作为类型符号处
理,这时将报错。
5 表达式
组成,由常量、变量、运算符、函数和圆括号按一定的规则
组成。表达式通过运算后有一个结果,结果的类型由数据和
运算符共同决定。
表达式的书写规则:
☆ 乘号不能省略。例如,x乘以 y应写成 x*y
☆ 括号必须成对出现,均使用圆括号;
☆ 表达式从左到右在同一基准上书写,无高低大小之分。如:
数学式子,写成 VB的表达式为
sqr((3*x+y)-z)/(x*y)^4
6 不同数据类型的转换
在算术运算中, 如果操作数采用不同的数据精度, 则 VB
规定, 运算结果的数据类型采用精度高的数据类型 。
Integer < Long < Single < Double <Currency
整型 < 长整型 < 单精度 < 双精度 < 货币型
7 运算符的优先级
算术运算符 > 字符运算符> 关系运算符> 逻辑运算符
运算符和数据类型举例
例,lx-3-2 关系运算符例子。 例,lx-3-3 字符数据例子。
3.4 常用内部函数
内部函数
数学函数
转换函数
字符串函数
日期函数
约定:
N —数值表达式
C —字符表达式
D —日期表达式
$ —函数名后有该字符,表示返回值为字符串
函数名 含义 示例 结果
Abs(N)
Cos(N)
Exp(N)
Log(N)
Rnd[(N)]
Sin(N)
Sgn(N)
Sqr(N)
Tan(N)
取绝对值
余弦函数
e为底的指数函数, 即 ex
以 e为底的自然对数
产生随机数
正弦函数
符号函数
平方根
正切函数
Abs(-3.5)
Cos(0)
Exp(3)
Log(10)
Rnd
Sin(0)
Sgn(-3.5)
Sqr(9)
Tan(0)
3.5
1
20.086
2.3
0-1之间的数
0
-1
3
0
1 数学函数
说明:☆ 在三角函数中,以弧度表示; sqr的自变量不能是负数
☆ Log 和 Exp是一对互为反函数,即
Log(Exp(N)),Exp(Log(N))结果还是原来各自变量的值。
☆ Rnd函数返回小于 1,大于等于 0的单精度随机数。
VB用于产生随机数的公式取决于称为种子( seed)的初始值。
默认情况下,每次运行一个应用程序,VB提供一相同的种子,
即 Rnd产生相同序列的随机数。为了每次运行时,产生不同序
列的随机数,可执行 Randomize语句,格式如下:
Randomize [number]
用 number将 Rnd函数的随机数生成器初始化,该随机数生成
器给 number一个新的种子值。如果省略 number,则用系统计
时器返回的值作为新的种子。
例子:
① 将数学表达式 x2+|y|+e3+sin30o-?xy
x*x+abs(y)+exp(3)+sin(3.14*30/180)-sqr(x*y)
② 要产生 30~ 50之间的随机数(包括 30和 50)
int(Rnd*21+30)
例,lx-3-4 随机函数的使用
2 字符串函数
☆ Mid( ) 函数
格式,Mid(String,n,m)
功能:从 String字符串中从第 n 个字符开始连续取 m个字符。
例子,Mid(―VisualBasic6.0‖,7,5) 函数返回值是,Basic‖
☆ Len( )函数
格式,Len(String)
功能:计算字符串的长度。
例子,Len(―VisualBasic‖) 函数返回值为 11
☆ InStr( )函数
格式,InStr([n,]string1,string2)
功能;在 string1 中从 n开始查找 string2,如果存在,函数值
为 string2在 string1中的位置值;找不到时函数的值为 0。 n是可选参
数。为数值表达式,设置每次搜索的起点。如果省略,将从第一个
字符的位置开始。
例子,InStr(2,‖ efabcdefg‖,‖ef‖) 函数返回值为 7
3 转换函数
1,Asc( )
格式,Asc(String)
功能:将字符串转换成 ASCII值 。
示例,a=Asc(―C‖) a的值为 67。
2,Chr( )
格式,Chr(x)
功能:将 ASCII码值转换成字符串 。
示例,a=Chr(66) a的值为字符, B‖。
3,Val( )
格式,Val(String)
功能:将字符串量转换成数值量 。
示例,a=Val(―-13.456‖) a的值为 -13.456
b=Val(―13-456‖) 出错
4,Str( )
格式,Str(Number)
功能:将数值型量转换成字符型量 。
说明,Number为一个数值型量, 返回一个字符型量 。
示例,a=Str(12345) a的值为字符, 12345‖。
说明,※ Chr和 Asc函数是一对互为反函数, 即 Chr(Asc(n))、
Asc(Chr(c) 的结果为原来各自自变量的值, 如 Chr(Asc(122))
的结果还是 122。
※ Str函数将非负数值转换成字符类型后, 会在转换
后的字符串左边增加空格, 即数值的符号位 。 如 Str(123)的
结果为, 123‖,而不是, 123‖。
※ Val将数字字符串转换为数值, 当字符串中出现非
数值字符时, 停止转换, 函数返回的是停止转换前的结果 。
如 Val(―–123.45ty‖)结果为 -123.45。
3.5.4 日期函数
1,Date
格式,Date
功能:提取计算机系统的当前日期 。
说明:该函数是无参函数, 返回日期的格式为, 月 -日 -年,
示例:如果今天是 2000年 3月 10日, 则 a$=Date的值为
,03-10-2000‖
2,Now
格式,Now
功能:提取计算机系统的当前的时间和日期 。
说明:该函数是无参函数, 返回由当前系统时间和日期组
成的一个数值序列 。
示例,a=Now a的值为 00-3-6 10:08:34,表示当前系统日
期为 2000年 3月 6日, 系统时间为 10点 8分 34秒 。
3,Time
格式,Time
功能:提取计算机系统的当前的时间 。
说明:该函数是无参函数, 返回由当前系统时间组成的
一个字符串 。
示例,a=Time a的值为, 10:08:34‖。 11
4,DateAdd函数
格式,DateAdd(要增减日期的形式, 增减量, 要增减的
日期变量 )
功能:对要增减的日期变量按日期形式做增减 。 要增减
的日期形式见下表:
日期形式 yyyy q m y d w ww h n s
意义 年 季 月 一年的天数 日 一周的天数 星期 时 分 秒
例如,DateAdd(―ww‖,2,#2/14/2000#)
表示在指定的日期上加 2周,函数的结果为 #2/28/2000#。
5,DateDiff函数
格式,DateDiff(要间隔日期形式,日期 1,日期 2)
功能:两个指定的日期按日期形式求相差的日期。
例子:计算现在离 2003年 6月 30日还有多少天。
DateDiff(―d‖,Now,#2003/6/30#)
5 Shell函数
在 VB中, 不但可以调用内部函数, 还可以调用各
种应用程序 。 这就是说, 凡是能在 DOS或 Windows下运行
的应用程序, 都可以在 VB中调用, 它是通过 Shell函数来
实现的 。 有关 Shell函数的详细使用, 请参阅附录 F。
3.6 基本语句
? Visual Basic语言作为结构
化程序设计语言,提供了三种控制流来
控制程序的流程,顺序,条件分支和循
环语句。
程序中的语句依照其在程序中的位置依次顺序地
执行,叫做语句的顺序执行。
3.6.1 顺序结构程序设计
1,数据输入
VB 可以通过赋值语句, InputBox函数,
MsgBox函数, MsgBox过程给程序提供初值 。
⑴ 赋值语句
格式,[Let] 变量名 /对象属性名 = 表达式
功能,将赋值号右边表达式的值赋给赋值号左边的
变量或对象属性 。
举例,Form1.width = 300
Form1.caption = "输入框 "
Temp = 20
说明,
① Let 是赋值语句的关键字, 是一个可选项, 通常省略 。
② 当表达式为数值型且与变量的精度不相同时, 强制转换
成左边变量的精度 。 例如:
iA% = 4.7 ˊ iA是整型变量, iA中的结果是 4。
③ 当表达式是数字字符串, 左边变量是数值类型时, 自动
转换成数值类型再赋值;但当表达式有非数字字符或空串时,
则出错 。 例如;
n%=―123‖ ?n中的结果是 123,与 n%=Val(―123‘)效果相同
n%=―1a23‖?出现, 类型不匹配, 的错误
④ 赋值语句中的, =‖与关系运算符中的, =‖的作用截然
不同 。
例如,A=7=9
其中, 第一个, =‖是赋值运算符, 第二个, =‖是关系运算符 。
赋值语句 a=b和 b=a是两个结果不同的赋值语句;而在关系
表达式中 a=b和 b=a是两种等价的表示方式。
赋值号左边只能是变量,不能是表达式、常量。如下面的
赋值语句是错误的:
sin(x)=x+y ?左边是表达式
5=sqr(s)+a+b ?左边是常量
x+y=a+b ?左边是表达式
⑤ 不能在同一语句中给多个变量赋值。例如:
a=b=c=1 我们的本意是给 a,b,c赋初值 1,书写上没有错
误。但 VB编译时,将右边两个,=‖作为关系运算符处理,先
进行 b=c的的比较,结果为 true(-1);接着进行 True=1的比较,
结果为 False(0);最后将 false的值赋给 a。
⑥ 当逻辑型赋值给数值型时,True转换为 -1,False转换为
0;反之,当数值型赋给逻辑型时,非 0转换为 True,0转换为
False.
⑦ 任何非字符类型的值赋给字符变量时,系统自动转换为
字符类型。
举例,li3-1 将 A和 B单元的内容互换。
⑵ InputBox( ) 函数
格式,InputBox[$]( prompt[,title][,default][,xpos,ypos])
InputBox[$](提示 [,标题 ][,默认 ][,x坐标位置 [],y坐标位
置 ])
功能,该函数的作用是打开一个对话框, 等待用户键入内容 。 当用
户单击, 确定, 按钮或按回车键时, 函数返回输入的值, 其值的类
型为字符串 。
说明,①, $‖:可选项 。 有此项时, 返回的数据类型是字符串型;
省略此项, 返回的数据类型是变体型 。
②, prompt( 提示 ),,字符串表达式, 必选项 。 在对话框中作
为提示信息, 可以是字符或汉字, 最大长度大约为 1024个字符, 由
所用字符的宽度决定 。 如果提示信息包含多行, 则必须在每行末用
回车符 ( Chr( 13)), 换行符 ( Chr( 10)) 或回车换行符的组合
( Chr( 13) &Chr(10)) 来分隔 。
③, title( 标题 ),,可选项 。 显示在对话框标题栏中的字符串
表达式 。 如果省略 title,则把应用程序名放在标题栏中 。
④ ―default( 缺省 ),,可选项, 显示文本框中的字符
串表达式 。 当在输入对话框中无输入内容时, 该缺省值作
为输入的内容 。 如果省略 default,则文本框为空 。
⑤, xpos,ypos( X坐标位置, Y坐标位置 ),,可选项,
整型表达式, 成对出现 。 xpos用来指定对话框的左边与屏
幕左边的水平距离, ypos用来指定对话框的上边与屏幕上
边的垂直距离 。 如果省略该项, 则对话框在水平方向居中,
在垂直方向距下边大约三分之一的位置 。
注意,函数中的各项参数次序必须一一对应,除了
,prompt‖一项不能省略外,其余各项均为可选项,如果
要省略某些参数,则必须加入相应的逗号分割符。
例 li3-2:在 InputBox函数的输入框中输入学校名称,按
“确定”按钮,窗体显示输入值,按“取消”按钮,返回
空字符。
⑶ MsgBox函数和 MsgBox过程
MsgBox函数格式,
变量 % = MsgBox (提示 [,按钮 ] [,标题 ])
MsgBox过程格式,
MsgBox (提示 [,按钮 ] [,标题 ])
MsgBox函数返回所选按钮整
数值的意义
内部常数 返回值 被单击的按

vbOk
vbCancel
vbAbout
vbRetry
vbIgnore
vbYes
vbNo
1
2
3
4
5
6
7
确定
取消
终止
重试
忽略


功能,打开一个
消息框, 等待用
户选择一个按钮 。
MsgBox函数返回
所选按钮对应的
整数值, 其数值
的意义见下表 。
若不需要返回值,
则可作为 MsgBox
过程使用 。
说明:
①,提示”和“标题”的含义与 InputBox()函数中
对应的参数相同。
②,按钮”:可选项,为整型表达式。用来设定要
显示的按钮的数目、类型和出现在消息框中的图标类型。
其设置见下表:
③,变量 %‖,返回值。当用户按下消息框按钮时,
系统将返回按键相对应的数值,利用这个返回信息,用户
可以在以后的程序中作出不同的响应。例如,在打印文件
时,如果选择“确定”按钮,那么程序就应该打印文件;
如果选择“取消”按钮,程序就不再打印文件;如果选择
“重试”,那么程序就应该能重新开始打印文件。
例 li3-3 利用 InputBox和 MsgBox函数设计一个文件名输入
对话框和提示对话框
分组 内部常数 按钮值 描 述




VbOkOnly
VbOkCancel
VbAboutRetryIgnore
VbYesNoCancel
VbYesNo
VbRetyCancel
0
1
2
3
4
5
只显示确定按钮
显示“确定”、“取消”按钮
显示“终止”、“重试”、“忽
略”按钮
显示“是”,“否”,,取消”
按钮
显示“是”,“否”
显示“重试”,“取消”按钮
图标
类型
VbCritical
VbQuestion
VbExclamation
VbInformation
16
32
48
64
关键信息图标,红色 STOP标志
询问信息图标?
警告信息图标 !
信息图标 I
默认
按钮
VbDefaultButton1
VbDefaultButton2
VbDefaultButton3
0
256
512
第 1个按钮为默认
第 2个按钮为默认
第 3个按钮为默认
模式
VbApplicationModale
VbSystemModal
0
4096
应用模式
系统模式
―按钮”设置值及意义
⒉ 数据输出
⑴ 标准显示输出语句
格式,Print [表达式 ] [{,|; }]
功能,在屏幕上显示数据 。
说明:
① 表达式:可选项 。 可以是一个或多个任意数值, 字符
串常量, 变量或表达式 。 当有多个表达式时, 要用分隔符 ( 逗
号, 分号 ) 隔开 。 显示的字符串内容要用双引号括起来 。 当表
达式缺省时, 则屏幕显示一个空行 。
② 标准显示输出语句的输出格式分为标准输出格式和紧
凑输出格式 。 VB把输出的每一行以 14个字符宽度划分为一个
区段, 每个数据项占一个区段的位置 。 这种输出格式排列整齐,
适用于数值显示的情况 。 紧凑输出格式在输出时, 对于数值型
数据, 前面有一个符号位, 后面有一个空格;对于每个字符串,
各个数据项之间没有间隔, 适用于用若干个字符串显示连续的
结果 。
③ 在标准显示输出语句中, 如果各数据项之间用逗号
隔开, 则按标准输出格式显示数据;若显示语句中各数据项
之间用分号或空格作为分隔符, 则按紧凑输出格式输出数据;
若 Print语句的末尾使用了逗号或分号, 则表明显示数据不换
行, 下一个 Print语句仍在该行输出;当输出的数据超过显示
行的宽度时, 多余的数据自动输出到下一行 。
④ Print语句既可以用定点格式显示数值数据, 也可
以用浮点格式显示数值数据 。 基本原则是:如果数字可以用
7位及其以下的位数表示, 则 Print语句就用定点格式显示该
数, 否则用浮点格式 。
例 li3-4 用 Print语句输出各种格式的数据。
⑵ Print方法
Print方法的作用是在对象上输出信息。
形式,[对象,]Print[Spc(n)/Tab(n)][表达式表 ]
其中,对象可以是窗体( Form)、图形框 (PictureBox)或
打印机( Printer)。如果省略了对象,则在窗体上输出。
Spc(n)函数:用于在输出时插入 n个空格。
Tab( n)函数:用于在输出表达式列表前向右移动 n列。
表达式表:要输出的数值或字符串表达式,其开始打印
的位置是由对象 CurrentX和 CurrentY属性决定的,缺省
时打印在对象的左上角 0,0处。
( 3) 格式输出函数
格式,Format$(表达式 [,格式字符串 ] )
功能,将数值型量转换为字符型量, 并根据格式字符串中的
结构将其格式化 。
说明:, 表达式, 是要格式化的数值, 日期和字符串类型表
达式 。, 格式字符串, 有三类:数值格式, 日期格式和字符
串格式 。 格式字符串一定要用引号括起来 。 下面分别说明三
种格式字符串的形式及使用方法 。
① 数值格式化
数值格式化是将数值表达式的值按“格式字符串”
指定的格式输出。
② 日期和时间格式化
将日期或数值表达式的值按“格式字符串”指定的
格式转换。
③ 字符串格式化
将字符串按指定的格式进行转换。
上述三种格式符请参考课本 P54,P55页表格。
有关 format函数的使用,结合后边例子再讲
3,Rem,Stop,End语句
⑴ Rem语句
格式,Rem 注释内容 或 ˊ 注释内容
功能,用来在程序中加入注释内容。
说明,① 注释内容可以是包含任何注释文本的内容。 Rem和注
释内容之间要加一个空格。
② 如果程序中使用了行号或者行标签,则可用 GoTo或
GoSub语句转到一个 Rem语句行,此时,程序从该 Rem语句下
面的第一条可执行语句继续执行。
③ 如果在其他语句后使用 Rem关键字,则必须使用冒号
(:)与语句分开。也可以用撇号, ˊ, 取代 Rem,但冒号要
省略。
这里顺便再讲一下注释块的使用:视图 工具栏 编辑
⑵ Stop语句
格式,Stop
功能,暂时停止语句执行 。
说明:
① Stop语句可以放在程序的任何地方, 它的作用相当
于在程序代码中设置的断点 。
② Stop语句只是暂停程序的执行, 不会关闭任何文件
或清除变量 。 但当 VB程序以编译后的可执行文件 (,ExE) 运
行时, 该功能失去 。
③ 执行 Stop语句, 程序暂停执行, 若要继续运行, 则
可用鼠标单击运行按钮 。
⑶ End语句
格式,End
功能, 在过程中关闭代码执行, 关闭以 Open语句打开的文件
并清除变量, 停止执行程序 。
说明:
① End语句可以放在过程中的任何位置 。
② End语句在执行时会重新设置所有模块级变量和所
有模块的静态局部变量 。 如果不想改变这些变量的值, 应将
End语句改为 Stop语句, 此时在保留这些变量值的基础上可以
恢复执行 。
③ End语句提供的是一种强迫中止程序的方法 。 VB程
序正常结束应该卸载所有的窗体, 只要没有其他程序引用该
程序公共类模块创建的对象并无代码执行, 程序将立即关闭 。
例 li3-5-1,li3-5-2,li3-5-3 设计一个顺序结构程序,求
一元二次方程的根。
Visual Basic 选择结构的实现:
? If… Then 语句 ( 单分支结构 )
? If...Then…Else 语句(双分支结构)
? Select Case 语句 ( 多分支结构 )
3.6.2 选择结构程序设计
1,If…Then 语句(单分支结构)
格式 1,If 〈 表达式 〉 Then 语句
格式 2,If 〈 表达式 〉 Then
语句块
End If
T
F
语句(块)
表达式
图 3.8 单分支结构
功能,当条件表达式的值为“真”
时,则执行 Then后面的语句或语句
块;否则不执行任何操作。
说明:
① 表达式都是逻辑表达式, 数值表达式和关系表达式被
视为逻辑表达式的特例 。 当表达式为数值表达式时, VB
将这个值解释为 True 或 False,一个为零的数值为 False,
而任何非零数值都被看作 True。
② 语句块可以是一条或多条语句 。 如果使用格式 1的简
单形式表示, 则只能是一条语句;或用冒号隔开的多条
语句, 但这些语句必须书写在一行上 。
③ 可以使用单行或多行语法有条件地执行一个语句 。 下
面两个例子是等价的:
If anyDate < Now Then anyDate = Now 和
If anyDate < Now Then
anyDate = Now
End If
④ If...Then 的单行格式不用 End If 语句 。
例 li3-7, lx-3-7求一元二次方程的两个实根
2,If…Then …Else 语句结构 (双分支结构)
格式 1:
If < 表达式 > Then
< 语句块 1>
Else
< 语句块 2>
End If
格式 2:
If < 表达式 > Then < 语句 1> Else < 语句 2>
FT
语句 (块 )1 语句 (块 )2
表达

图 3.9 双分支结构
(1) 用单分支语句实现
一条单分支语句,y=cos(x)-x^3+3*x
if x<>0 then y=sin(x)+sqr(x*x+1)
或 两条单分支语句,if x<>0 then y=sin(x)+sqr(x*x+1)
if x=0 then y=cos(x)-x^3+3*x
(2) 用双分支语句实现 if x<>0 then
y=sin(x)+sqr(x*x+1)
else
y=cos(x)-x^3+3*x
end if
说明,块结构的条件语句可以嵌套, 即把一个 If … Then …
Else 块放在另一个 If … Then … Else 块内 。 嵌套必须完全嵌
套, 也就是内层条件语句必须完全包含在外层条件语句之中 。
功能,当表达式的值为非 0( True)时,执行 Then后面的语句
块 1,否则执行 Else后面的语句块 2。
例 lx-3-8 求一元二次方程
的两个实根或两个虚根。
例如:计算分段函数 1s i n 2 ++ xx
xxx 3c o s 3 +-
Y=
x≠0
x=0
3,If…Then …Else If 语句(多分支结构)结构
语句格式,If 〈 表达式 1 〉 Then
〈 语句块 1〉
ElseIf 〈 表达式 2〉 Then
〈 语句块 2〉
… …
[Else
〈 语句块 n+1 ]
End If
F
T
TT
……
表达式 1
表达式 2
表达式
nn
语句块 11 语句块 2 语句块 nn 语句块 n+11
F…
图 3.10 多分支结构
说明:
① 不管有几个分支, 程序执行了一个分支
后, 其余分支不再执行 。
② ElseIf子句的数量没有限制, 可以根据
需要使用任意多个 ElseIf子句 。
③ 语句中的 ElseIf子句和 Else子句都是可
选项, 如果省略这些子句, 则成为单分支结构 。
④ If...Then...ElseIf 只是
If...Then...Else 的一个特例 。 注意, 可以使
用任意数量的 ElseIf 子句, 或者一个也不用 。
可以有一个 Else 子句, 而不管有没有 ElseIf
子句 。
例 li3-10 窗体标题的改变。
例 li3-9 求一元二次方程 ax2+bx+c=0的根。
4, If 语句的嵌套
If 语句的嵌套是指 if或 else
语句后面的语句块中又包
含 if语句。
语句形式为:
If <表达式 1> then
if < 表达式 11> then
……
endif
……
endif
例如,已知 X,Y,Z三
个数,比较他们的大小
并排序,使得 X>Y>Z。
If x< y then
t=x;x=y;y=t ?x与 y交换,使 x>y
Endif
If y<z then
t=y:y=z:z=t ?y与 z交换,使 y>z
if x<y then ?此时 x,y的值已变化
t=x:x=y:y=t
endif
endif
5,Select Case语句(多分支结构)


F
T
F
F
表达式表
n
语句块 n+1

语句块 n
T
表达式表 2 语句块 2
T
表达式表
1
语句块 1
图 3.11 Select Case 结构
格式,Select Case 测试变量或表达式
[Case 表达式表 1
[语句块 1]]
[Case 表达式表 2
[语句块 2]]
……
[Case 表达式表 n
[语句块 n]]
[Case Else
[语句块 n+1]]
End Select
功能,根据 Select Case <变量或表达式 >中的结果与各 Case
子句中的值比较,决定执行哪一组语句块。如果有多个 Case
短语中的值与测试值匹配,则根据自上而下判断原则,只执
行第一个与之匹配的语句块。
说明:
① 测试变量或表达式只能是数值表达式或字符串表达式,不
能是逻辑表达式。
② 语句块是由一行或多行 VB语句组成的。
③ 表达式表与测试变量或表达式的类型必须相同,每一个表
达式表是一个或几个值的列表。如果在一个列表中有多个值,
就用逗号把值隔开。表达式表有四种形式:
? 一个表达式 。 如,Case 6
? 一组用逗号隔开的枚举值 。 如,Case 1,3,5,7
? 表达式 1 TO 表达式 2。 如,Case 1 To 10
? Is <关系运算符 ><表达式 >。 如,Case Is>=80
另外, 在一个情况语句中, 上述四种形式可以混合使用 。
④ Select Case语句在执行时, 先求测试表达式的
值, 然后寻找该值与哪一个 Case子句的表达式值相匹配,
找到后则执行与该 Case语句有关的语句块, 之后自动转
到 EndSelect后的语句执行;如果没有找到与 Case子句中
的表达式相匹配的值, 则执行 Case Else子句有关的语句
块, 然后转到 End Select后面的语句执行 。
⑤ 当有多个 Case子句的取值范围和测试表达式的值
域相符时, 只执行符合要求的第一个 Case子句后的语句
块 。
⑥ Select Case语句只对单个表达式求值, 并根据
求值结果执行不同的语句块;而 If … Then … Else语
句可以对不同的表达式求值, 然后执行不同的操作 。 这
是两者的主要区别 。
例 li3-11 使用 case语句改变窗体标题。
转移语句就是程序执行到某一步后, 不再顺序执行下
一条语句, 而是转移执行其他语句 。
实现方法,Goto语句, On … Goto语句, GotoSub语句
5.转移语句
⑴, Goto 语句
格式,Goto 行标识符
功能,无条件转向行标识符(行号或标号)所在的程序行。
说明:
① Goto语句又叫作无条件转移语句,当程序执行到 Goto语句
时,程序无条件的进行跳转。
② 行标识符可以是字符串标号,也可以是行标号。如果是字
符串标号,则标号后面要有一个冒号(:)。
③ 行标识符必须在程序中确实存在,它可在 Goto语句之前,
也可在 Goto语句之后。
⑵, On … Goto 语句
格式,On 表达式 Goto 标号 1,标号 2,标号 3,……
功能,先对表达式进行计算, 然后根据计算结果转移到相应的标
号去执行 。
说明,表达式为任意的数值表达式 。 程序执行时, 先计算表达式
的值, 并将其四舍五入处理为一个整数, 然后根据该值决定转移
到第几个行号或标号去执行 。 例如, 当表达式的结果为 1时, 转
向第一个行号或标号所指定的语句执行;如果为 2,则转向第二
个行号或标号所指定的语句执行, 如此等等 。
如果表达式的值等于 0或者大于行标识表中的项数, 则程序跳过
本语句, 转向下一个语句;如果表达式的值小于 0或者大于 255,
则出现错误信息 。
⑶, GoSub 语句
格式,GoSub 标号
功能,执行 GoSub语句,程序跳转到标号处执行,直到遇到
Return语句才结束子程序的执行并返回调用处
6.选择结构程序设计举例
例 li3-12 输入 1900~ 1999年中的任意一个年份,
编写程序,计算该年的生肖。
3.6.3 循环结构程序设计
循环是在指定的条件下多次重复执行一组语句,这
可通过循环结构来实现。 VB中提供了两种类型的循环语句:
一种是计数循环语句;另一种是条件循环语句。 Visual
Basic 支持的循环结构有:
☆ Do…Loop ☆ For...Next
☆ While…Wend ☆ For Each...Next
1,Do...Loop循环
Do… Loop循环用于事先不知道循环次数的循环结构 。
此种语句四种语法格式:
⑴, Do While … Loop 语句
⑵, Do … Loop While 语句
⑶, Do Until …Loop 语句
⑷, Do …Loop Until 语句
格式,Do While 〈 条件表达式 〉
〈 循环体 〉
[Exit Do]
〈 循环体 〉
Loop
⑴, Do While … Loop 语句
T
F
条件
循环体
图 3.14 Do While … Loop
语句流程图说明:
① 条件表达式可以是一个逻辑表达式, 也可以是一个关系表
达式, 其值应是逻辑型 。
② Do While和 Loop应成对出现 。
③ 循环体中要有控制循环的语句, 以避免出现死循环 。
④ 由于该循环的特点是先判断条件, 然后再决定是否要执行
循环体里的语句 。 所以, 这种循环可以一次也不执行循环体 。
其流程图如图 3.14所示 。
⑤ Exit Do 表示当遇到该语句时, 强制退出循环, 执行 Loop
后的下一条语句 。
T
F
条件
循环体
图 3.15 Do… Loop While
语句流程图
格式:
Do
〈 循环体 〉
[Exit Do]
〈 循环体 〉
Loop While〈 条件表达式 〉
⑵, Do … Loop While 语句
说明:
① 至少要执行循环体一次 。
② 与 Do While循环的区别:
Do While循环先测试条件是否成立, 只有成立才执
行循环;而该循环先执行循环体, 后测试条件是否成立 。
格式:
Do Until〈 条件表达式 〉
〈 循环体 〉
[Exit Do]
〈 循环体 〉
Loop
⑶, Do Until …Loop 语句
图 3.16 Do Until … Loop
语句流程图
F
T
条件
循环体
⑷, Do …Loop Until 语句
格式,Do
〈 循环体 〉
[Exit Do]
〈 循环体 〉
Loop Until〈 条件表达式 〉
T
F条件
循环体
图 3.17 Do … Loop Until
语句流程图
2,For …Next 循环
循环体
Exit For
循环体
循环变量增加步长
循环变量获得初值
F
T
循环变量在终值

图 3.18 For循环的执行过程
格式,For 循环变量 = 初值
To 终值 [Step 步长 ]
<循环体 >
[ Exit For ]
<循环体 >
Next [循环变量 ]
记住了
说明:
① 格式中的参数说明:
☆ 循环变量必须为数值型 。
☆ 循环的初值, 终值和步长都是数值表达式, 其值不一
定是整数, 可以是实数, VB自动取整 。 其中, 增量参数可
正可负 。 如果增量为正, 则初值必须小于等于终值, 否则
不能执行循环体内的语句;如果增量为负, 则初值必须大
于等于终值 。 如果没有设置 step,则增量默认为 1。
☆ 在 For语句和 Next语句之间的语句序列称为循环体, 可
以是一个或多个语句 。
☆ Exit For为强行退出循环语句 。 当遇到该语句时, 退
出循环, 执行 Next的下一个语句 。
☆ Next是循环终端语句, 在 Next后面的循环变量与 For中
的循环变量必须相同 。 当循环是单层循环时, Next后面的
循环变量可以不写 。
② For循环语句的执行过程是:首先把初值赋给循环变量,
接着检查循环变量的值是否超过终值, 如果超过就不执行循
环体, 跳出循环, 执行 Next后面的语句;否则执行一次循环
体, 然后把循环变量增加步长, 再赋给循环变量, 重复上述
过程 。 见流程图 3.18。
③ 当初值等于终值时, 不管步长是正数还是负数, 都执行
一次循环体 。
④ 循环次数由初值, 终值和步长决定, 计算公式为:
循环次数 =INT(( 终值 – 初值 ) /步长 +1)
⑤ For语句和 Next语句必须成对出现, 不能单独使用 。
⑥ 如果要在循环变量到达终值前退出循环, 可用 Exit For
语句来实现 。 该语句可以在 For循环中出现多次, 且位置不
限 。
⑦ 在循环体中可以使用循环变量, 但一般不再对循环变量
赋值 。
格式,While 〈 条件表达式 〉
循环体
Wend
功能,当 While的条件表达式的值是 True时执行循环体内
的代码, 直到 While后的条件表达式的值为 False。
说明,它与 Do … Loop语句的差别是,While … Wend语句
中不能使用 Exit语句跳出循环 。
3,While … Wend 循环
特点,它对数组或对象集合中的每一个元素重复一
组语句, 而不是重复语句一定的次数 。
适用,不知道一个集合有多少元素
格式,For Each 元素 In 组
语句序列
[Exit For]
语句序列
Next [元素 ]
功能,针对一个数组或集合中的每个元素, 重复执
行一组语句 。
4,For Each...Next
说明:
① 元素,必需的 。 用来遍历集合或数组中所有元素的
变量 。 对于集合来说, 元素可能是一个 Variant变量, 一个
通用对象变量或任何特殊对象变量 。 对于数组而言, 元素
只能是一个 Variant变量
组,必需的 。 对象集合或数组的名称 ( 用户定义类型的
数组除外 ) 。
语句序列,可选的, 针对组中的每一项执行的一条或多
条语句 。
② 只要组中有一个元素, 就会进入 For...Each块执行 。
一旦进入循环, 便先针对组中第一个元素执行循环中的所
有语句 。 如果组中还有其它的元素, 则会针对它们执行循
环中的语句, 当组中的所有元素都执行完了, 便会退出循
环, 然后从 Next语句之后的语句继续执行 。
③ 在循环中可以在任何位置放置任意个 Exit For语
句, 随时退出循环 。 Exit For经常在条件判断之后使用,
并将控制权转移到紧接在 Next之后的语句 。
④ 可以将一个 For...Each...Next循环放在另一个
之中来组成嵌套式 For...Each...Next循环 。 但是每个循
环的元素必须是唯一的 。 注意如果省略 Next语句中的元
素, 就像元素存在时一样执行 。 如果 Next语句在它相对
应的 For语句之前出现, 则会产生错误 。
⑤ 不能在 For...Each...Next语句中使用用户自定
义类型数组, 因为 Variant不能包含用户自定义类型 。
5,循环结构程序举例
例 3.19 用辗转相除法求两个自然数 m,n的最大公约数
和最小公倍数。
例 3.20 求 1到 100之间所有自然数的平方和。 即
?
?
100
1
2
i
i
例 7.7 用牛顿迭代法求 3x3-4x2-5x+13=0在 x=3附近的一
个实根。
3.7 数组及应用
数组并不是一种数据类型,而是一组相同类型的变量的
集合。在程序中使用数组的最大好处是用一个数组名代表逻
辑上相关的一批数据,用下标表示该数组中的各个元素,和
循环语句结合使用,编写出的程序简洁精悍。
数组必须先声明后使用,声明数组名、类型、维数、数
组体积。按声明时下标的个数确定数组的维数。 VB中有一维
数组、二维数组 ……,最多 60维,按声明时数组的大小确定
与否分为静态(定长)数组和动态(可变长)数组。
3.7.1 静态数组
在声明时能够确定了大小的数组称作静态数组 。
⒈ 一维数组
只需要用一个下标就能确定一个数组元素在数组中的位置,
该数组称为一维数组 。
格式,Dim数组名 (下标 ) [As 数组类型 ]
功能,定义一个一维数组的大小, 并分配相应的存储空间 。
说明:
① 数组名与简单变量的命名规则相同 。
② 下标是数组的维数, 格式为 [下界 To ]上界 。 一般情况下,
当 [下界 To]缺省时, 默认值为 0。 一维数组下标的范围可以为 -
32768~ 32767,下界必须小于上界 。 一维数组的大小是:上界
-下界+ 1。
③ As 数组类型用来说明数组的类型, 如果缺省, 则与变
量的声明一样, 默认为是变体数组 。 例如:
Dim x (1 To 100 ) As Integer ˊ 声明 x数组的类型为整型, 下
标范围为 1~ 100。
Dim y (1 To 10 ) ˊ 声明 y是一个下标范围为 1到 10的
变体数组 。
④ 数组必须先定义后使用 。
⑤ Dim语句声明的数组, 为系统编译程序提供了数组名,
数组类型, 数组的维数和各维的大小 。 该语句把 数值数组中的
全部数组元素都初始化为 0,而把字符串数组中的全部数组元
素都初始化为空字符串 。
⑥ Dim语句中的下标可以是常数 。 下标全为常数时称为静
态数组, 数组的大小在编译时是确定的;下标为空时则为动态
数组, 数组的大小是可变的, 只有在程序运行时, 变量有确定
的值后, 数组的大小才能确定 。
⑦ 可以使用以下方法声明通用数组:
? 建立公用数组, 在模块的声明段用 Public 语句声明数组 。
? 建立模块级数组, 在模块的声明段用 Private 语句声明数
组 。
?建立局部数组, 在过程中用 Private语句声明数组 。
例如:
Dim Counters ( 1 To 14 ) As Integer
?定义 Counters为 14个元素的局部数组
Private Sums ( 1 To 20 ) As Double
?定义 Sums为 20个元素的模块级数组
Public Counters ( 14 ) As Double
?定义 Counters为 15个元素的公用数组
Dim Subs ( 20 ) As Double
?定义 Subs为 20个元素的局部数组
⒉ 多维数组
格式,Dim 数组名 ( 下标 1, 下标 2 [,下标 3 … ]) [As 数组类型 ]
功能,声明一个二维数组或多维数组, 并分配相应的存储单元 。
说明,下标的个数决定了数组的维数, 多维数组最大维数为 60。
每一维的大小为,上界-下界+ 1;数组的大小为 每一维大小的
乘积 。 例如:
Dim Array( 3,4) As Integer
ˊ 声明 Array是整型数组, 4行 5列, 共 20个元素 。
Dim MultiD (3,1 To 10,1 To 15)
ˊ 声明 MultiD是一个变体数组, 大小为 4 * 10* 15
注意,☆ 在其他语言中, 数组的下界一般从 1开始 。 为了方便用
户, 在 VB的窗体层或标准模块层可以用 Open Base 语句重新设
定数组的下界 。
格式,Open Base n
功能,改变数组下标的缺省下界 。
说明,n为数组下标的下界, 只能是 0或 1。 该语句在程序中
只能使用一次, 且必须放在数组声明语句之前 。
☆ 数组声明中的下标关系到数组每一维的大小, 它是一
个数组说明符, 说明了数组的体积 。
☆ 在数组声明时的下表只能是常数, 不可以是变量 。
3.7.2 动态数组
动态数组指在声明数组时未给出数组的大小(省略括
号中的下标),当要使用该数组时,随时用 ReDim语句重
新指出数组的大小。使用动态数组的优点是:用户根据需
要有效的利用存储空间,它是在程序执行到 ReDim语句时
分配存储空间。而静态数组是在程序编译时分配存储空间
的。
建立动态数组的方法是, 使用 Dim,Private,Public等
语句声明括号内为空的数组, 给数组赋予一个空维数表 。
如,Dim Dynarray( ) 。
然后在过程中 用 Redim语句指明该数组的大小 。
格式,Redim数组名 ( 下标 1 [,下标 2… ])
功能,声明动态数组的大小 。
说明,Redim语句声明只能用在过程中, 它是可执行语句 。
它可以改变数组中元素的个数, 但不能改变数组的维数, 例
如不能将一维数组改变为二维数组 。 每次用 Redim来配置数
组个数时, 数组中的内容全部被清为零 。 为了保留数组中的
数据, 可以在 Redim语句后加 Preserve参数, 该参数只能改变
最后一维的大小, 前面维的大小不能改变 。
例如,Dim sArray() As Single
Sub Form_Load
……
ReDim sArray(4,8)
……
End Sub
在窗体级声明了数组 sArray为
可变长数组,在 Form_Load()
事件函数中重新指明该数组的
大小是 5行 9列
1,数组元素的引用
要使用数组中的元素, 应使用这样的格式:
格式,数组名 ( 下标, … )
说明,① 下标的个数必须与数组定义时的维数一致 。 对于多
维数组元素, 下标之间用逗号隔开 。
② 下标可以是表达式, 如果表达式的值是实型数, 系
统自动取整 。 如 A( 1), T( 2*m%,n%), U( i,i+1,i+2)
都是合法的数组元素引用 。
③ 下标的值必须在数组定义的各维的上下界之内 。
④ 要严格区分数组声明中的下标和数组引用中的下标 。
两者的写法相同, 但意义不一样 。 例如:
3.7.3 数组的基本操作
Dim x(10) As Integer ?声明 x是数组,有 11个元素。 X(10)是
‘数组说明符
X(10)=100 ?对数组元素 x(10)赋值
2,数组元素初始化
利用循环结构
Dim TestArray ( 10) As Integer
Dim i As Integer
For i = 0 To 10
TestArray( i) =0 ?TestArray数组的每个元素值为 0
Next i
3,数组元素输入
⑴ 当数组元素较少或只给数组中的几个元素赋值时, 可
采用赋值语句 。
例如,Dim A( 10)
A( 1) = 3
A( 4) = 7
A( 7) = 11
A( 10) = 13
⑵ 如果要给数组中的所有元素都提供值, 可通过 For循环
实现 。
Dim A( 10,10)
For i = 0 To 10
For j = 0 To 10
A( i,j ) = InputBox (― 输入, & i & ―,‖ & j & ― 的
值, )
Next j
Next i⑶ 对于较大的数组,一般不用 InputBox函数,而使用 Array
函数为数组元素赋值。
格式,数组变量名 = Array ( arglist )
功能,把一组数据赋给一个数组。
说明,① 所需的 arglist参数是一个用逗号隔开的值表,这
些值用于给 Variant所包含的数组的各元素赋值。如果不提供参
数,则创建一个长度为 0的数组。例如:
Dim A As Variant
A=Array(10,20,30)
B=A(2)
② 使用 Array函数创建的数组的下界受 Option Base语句指定的
下界的限制 。
例如:
Option Base 1 ˊ 使数组下标从 1开始
Dim MyWeek,MyDay
MyWeek=Array("Mon","Tue","Wed","Thu","Fri")
MyDay=MyWeek(2) ˊ MyDay的值为 "Tue"。
MyDay=MyWeek(4) ˊ MyDay的值为 "Thu"。
注意,( 1) 利用 Array对数组各元素赋值, 声明的数组是可调
数组或连圆括号都可省略的数组, 并且其类型只能是 Variant。
( 2) 数组的下界默认为 0,也可通过 Open Base语句设
定;上界由 Array函数括号内的参数个数决定, 也可通过
Ubound函数获得 。 例如:
Dim b As Variant
b=Array(1,2,3,4,5)
For I=0 To Ubound(b) ?函数返回 b数组的最大下标值 5
Picture1.Print b(i);‖ ‖;
Next i
4,数组元素的输出
数组元素的输出可以使用 For循环和 Print语句来实现 。
例 3.22 用 Array函数给数组提供初值, 然后用 For循环将数
组的值输出 。
Static Number As Variant
Number = Array ( 1,2,3,4,5 )
For i % = 0 To 4
Print Number ( % i )
Next
5.数组应用举例
例 3.24 计算某班 6名学生的平均成绩及优秀率。
例 7.1 比较互换法排序。
例 7.2 利用选择法排序。
例 7.3 用顺序查找方法查找一个数。
例 7.4 把一个数插入到有序数列中,插入后的数
列仍然有序。
例 7.5 由素数的定义求素数。
例 7.6 用筛选法求素数。
例 7.9 用矩形法求数值积分。