第三章 VB语言程序
设计基础
本章要点
本章将对 Visual Basic 6.0中文版的语言
作一个简单的介绍 。 与传统的 Basic语言相
比, Visual Basic继承了 Basic语言的简单,
易学, 易用等特点, 同时作为一种现代编
程语言, 它支持面向对象的程序设计思想,
并在其智能编辑器的支持下, 实现了可视
化 ( Visual) 编程 。
Visual Basic中的数据类型
Visual Basic的变量、常量、运算符和表达式
Visual Basic的常用函数
Visual Basic的基本语句及结构
Visual Basic中的数据及字符串的使用
本章主要内容:
一个程序例子
1.程序要求:
解一元二次方程 2x2+5x+3=0,求两个根 x1,x2。
2.设计应用程序 步骤:
? 生成一个工程,将窗体的 Caption属性设为“计算
一元二次方程的程序例子” 。
? 在窗体上建立一个命令按钮,将其 Caption属性设
为“计算”。
? 在“计算”按钮的 Click事件中编写代码(事件过
程代码)。
3.运行程序,在窗体上显示结果。
3.1 编码规则
3.2 数制及数据类型
3.3 常量和变量
3.4 运算符和表达式
3.5 常用内部函数
3.6 基本语句
3.7 数组及应用
一,VB的编码规则
? VB对用户程序代码中关键字的首字母总被
转换成大写字母,其余字母一律转换为小写字母。
提高了程序的可读性。
? VB将关键字中每个单词的首字母自动转换成
大写字母 。
? 对于用户自定义的变量名、过程名、函数名,
VB以第一次定义的为准,以后输入的自动转换成首
次的形式。
1、在 VB代码中,字母不区分大小写
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
5.VB中使用的不同进制数字
十进制 八进制 十六进制
9 &O11 &H9
15 &O17 &HF
16 &O20 &H10
20 &O24 &H14
255 &O377 &HFF
VB中的默认数制是十进制数, 但在某些情况下
使用八进制或十六进制数可能会更方便 ( 如屏幕和
颜色的设置 ) 。 在表示八进制和十六进制数时, 需
要在数字前面加上特定的符号 。
二、变量
变量的概念
? 变量名必须以字母 A~ Z( 或 a ~ z) 开头 。
? 构成变量名的字符串由英文字母, 数字, 下划线符号组成 。
? 变量名中间不允许有空格 。
? Visual Basic的保留字不能作为变量名 。
? 在 Visual Basic语言中, 变量名不区分大小写 。 如 ABC,abc,aBc
都认为是一个相同的变量名 。 为了便于区分, 一般变量名首字母用
大写字母, 其余用小写字母表示, 而符号常量全部用大写字母表示 。
1.变量及变量名
所谓变量,是内存中保存信息(值)的内存
区域,它的内容在程序运行过程中是可变的。
变量的命名规则:
…...
a
b
c
? 在 VB中数据类型决定了如何将变量存储到内存中,每
种数据类型占用的内存空间是不一样的。
? 所有的变量都具有数据类型,数据类型决定了变量能
够存储哪种数据(能够处理哪种数据)。
? 在 VB定义的各种数据类型中,按照处理数据种类的不
同,可将起其分为如下几类
数值型数据类型:专门处理数值型数据。
非数值型数据类型:如字符数据、逻辑数据、日期数据
变体数据类型:可以随时改变数据类型的数据
2.变量的数据类型
数值( Numerice)数据类型
数值型数据类型用于处理数值型数据, 它包括:
? 整型 ( Interger)
? 长整型 ( Long)
? 单精度型 ( Single)
? 双精度型 ( Double)
? 货币型 ( Currency)
? 字节型 ( Byte)
数值( Numerice)数据类型
整型 ( Interger) 和长整型 ( Long)
? 用于保存整数, 可以是正整数, 负整数或
者 0。
? 整型数用两个字节存储, 可表示的数据范
围 -32768---+32767
? 长整型数用 4个字节存储, 可表示的数据
范围 -2147483648---+2147483647
单精度型 ( Single)
? 用来表示带有小数部分的实数
? 在计算机中占用 4个字节存储数据
? 用科学记数法表示,± aE± c或 ± ae± c
? 单精度浮点数最多有 7位有效数字, 如果某个数的有效数
字位数超过 7位, 当把它赋给一个单精度变量时, 超出的部
分会自动四舍五入 。
例如:把 213456.2567赋给单精度变量 aa,
在内存中 aa的值为 213456.3。
数值( Numerice)数据类型
双精度型( Double)
? 也 用来表示带有小数部分的实数
? 在计算机中占用 8个字节存储数据
? 用科学记数法表示,± aD± c或 ± ad± c
例如 314.159265358979D-2表示 3.14159265358979。
? 双精度浮点数最多可有 15位有效数字。如果某个数的
有效数字位数超过 15位,当把它赋给一个单精度变量时,
超出的部分会自动四舍五入。
数值( Numerice)数据类型
货币型 ( Currency)
? 是一种专门为处理货币而设计的数据类型, 保留小数点
右边 4位和小数点左边 15位 。
? 在计算机中占用 8个字节存储数据
? 如果变量已定义为货币型, 且赋值的小数点后超过 4位,
那么超过的部分自动四舍五入 。
例如, 将 3.12125赋给货币型变量 aa,在内存中 aa的实
际值是 3.1213。
数值( Numerice)数据类型
字节型 ( Byte)
? 用来存储二进制数 。
? 在计算机中占用 1个字节存储数据
? Byte 是从 0-255 的无符号类型, 不能表示负数
? 如果在程序中要使用二进制数值, 则将它声明为
Byte 数据类型
数值( Numerice)数据类型
日期( Data)数据类型
? 用来表示日期或日期时间的数据类型
? 在内存中 存储为 8个字节的浮点数值形式
? 表示日期范围:从公元 100年 1月 1日到公元 9999年
12月 31日;时间范围:从 0点 0分 0秒到 23点 59分 59秒
? 给 Data型变量赋值日期数据时采用如下形式:
#03/10/2000#,#2000-03-10#,#March 1,2000#等
? 其他数据类型转换为日期型数据,小数点左边的
数字代表日期( Date),小数点右边的数字代表时间
( Time)。其中,0为午夜 0点,0.5为中午 12点;负数代表
1899年 12月 31日之前的日期和时间。
非数值数据类型
逻辑( Boolean)数据类型
? 逻辑数据类型主要用于逻辑判断
? 在计算机中占用 2个字节存储数据
? 逻辑型数据只有两个值,真 (True),假 ( False),若变
量的值是类似,true/false‖、,yes/no‖、,on/off‖信息,则可
将它声明为 Boolean 类型。逻辑型数据的缺省值是 False。
? 当把逻辑数据转换成整型数据时,真 转换为 -1,假
转换为 0;当把其他类型数据转换为逻辑数据时,非 0数转换为
真,0转换为 假。
非数值数据类型
字符( String)数据类型
? 用来保存字符串数据
? 字符串数据 是一组由计算机字符组成的序列,每个
字符都以 ASCII编码表示。在 VB中,字符串要用双引号括起
来。
例如:,, Visual Basic‖、“中国天津”,“, 123.456‖
? 在计算机中一个字符占用 一个字节
? VB中的字符串有两种,变长字符串和定长字符串
变长字符串的最大长度为 231-1个字符
定长字符串的最大长度为 65535个字符
非数值数据类型
对象( Object)数据类型
? 用来保存对象引用的数据类型
? 在计算机中占用 4个字节,作为对象的引用,该 32位地
址可以引用应用程序中的对象
? 利用 Set语句,可以为声明为 Object的变量赋值为某个
对象的引用。
例如,Set Temp = Form1
非数值数据类型
? 变体型数据是一种可以随时改变数据类型的数据
Dim SomeValue As Variant ˊ 定义 SomeValue为变体型变量
SomeValue = ―17‖ ˊSomeValue 包含, 17‖(双字符的串)
SomeValue = SomeValue - 15 ˊ 现在 SomeValue 包含数值 2
SomeValue = "U" & SomeValue ˊ 现在 SomeValue 包含 "U2"(双字符的
串)
变体( Variant)数据类型
? 变体型包括四种特殊的数据:
空 (Empty),没有指定确定的数据
无效 (N ull),数据不合法
出错 (Error),说明过程中出现了一个错误条件
无指向 (Nothing ):说明数据还没有指向一个具体对象
? 在计算机中 变体型数据占用空间较大,一般在用户无法确定运算结
果类型时使用。在应用程序中应尽量少用变体型数据。
用 Dim关键字声明变量
格式,Dim变量名 [As 类型 ]
说明,
? 将给定的变量名声明为指定类型的变量
? 如果 [As 类型 ]部分省略, 所建立的变量类型默认为变体类型 。
? 在一个 Dim语句中可以定义多个变量, 但每个变量必须有自己的
类型声明 。
例子,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为单精度变

3.变量的声明
在使用变量前,最好先声明这个变量。所谓声明变量就是事先
将变量的有关信息通知程序。
模块级变量
如果希望在同一窗体的所有过程中分享同一个变量, 就
应把它声明为模块级变量 。 模块级变量要在通用过程中声
明 。
用 Public关键字声明模块级变量, 将使变量在整个应用
程序中有效, 因此也称公用变量 。
例如,Public a as Integer
用 Private关键字声明模块级变量,在本窗体模块中的
过程可以访问。
例如,Private b as Integer
说明:
在模块级,Private和 Dim之间没什么区别,但 Private
很容易与 Public 相区别,因此用 Private更好些。
在过程中不能使用 Public和 Private关键字声明变量。
用 Static 关键字在过程中声明局部变量, 即使过程结束了,
变量的值也仍然保留着 。
声明静态变量的格式:
Static 变量名 As 类型名
用途,在过程中定义静态变量和静态数组 。
说明,该变量的值在函数或过程执行结束后能保存下来,
所以, 下一次执行时, 该值不再初始化 。
与模块级变量相对,在过程中声明的变量称为 局部变量,即
变量只能在过程执行期间有效,其它过程中的代码不能使用。
使用 Dim声明的局部变量,在过程执行结束后,变量的值不
能保留下来。每一次过程重新执行时,变量的内容将被清除为 0。
静态变量
格式,变量名 +类型说明符
类型说明符放有:
% 表示整型
& 表示长整型
! 表示单精度型
# 表示双精度型
@ 表示货币型
$ 表示字符型
例如,Name$ ˊ 定义字符型变量
Price! ˊ 定义单精度型变量
Age% ˊ 定义整型变量
用类型说明符直接声明变量
变量的作用域
① 局部变量 ——
☆ 用 Dim语句定义,只能在本过程中使用,其他过程不可
访问。
☆ 随过程的调用分配存储单元,进行变量的初始化,一
旦过程结束,变量的内容自动消失,并释放所占用的存储单元。
☆ 不同的过程中可使用相同的变量名。
②窗体 /模块级变量 ——
☆ 用 Dim语句或 Private语句定义,在“通用声明”段中
定义。放在一个窗体 /模块的任何过程外,可被本窗体 /模块的任
何过程访问。
③全局变量
☆ 用 Public语句声明,在“通用声明”段中定义,放在标
准模块的任何过程或函数外,可被应用程序的任何过程或函数访
问。
☆ 其值在整个应用程序中始终不会消失和重新初始化,
只有在整个程序结束时,才会释放。
④ 静态变量 ——
☆ 用 Static语句定义的局部变量,在程序运行过程中该类
变量的值可保留。
☆ 每次调用过程时,用 Static定义的静态变量保持原来的
值,而用 Dim定义的变量要重新初始化。
声明变量时作用域的规则:
? 在窗体, 模块中声明的变量是模块级的, 对整个模块
都有效 。
? 在过程内用 Dim语句声明的变量只在过程内有效 。
? 用 Public语句声明的变量是程序级的, 在整个程序中
起作用 。
? 用 Static语句声明的变量是静态变量, 即使在过程结束
后也一直保存着, VB在任何时候都不会去初始化静态变量 。
过程局部变量
函数局部变量
过程局部变量
函数局部变量
模块变量
窗体变量
全局变量
变量作用域的关系
三、常量、符号常量
常量
在程序运行过程中, 其值始终保持不变的量称为常量
1、普通常量:
⑴ 数值常量:字节型、整型、长整型、定点及浮点常量。
字节型、整型、长整型都是整型常量,
例如,50,480085,-123,&O123,&H14等。
定点常数是带小数点的正数或负数,如,3.12436,123.123,-
0.456等。
浮点常数又分为单精度浮点常数和双精度浮点常数,他们都由
尾符、尾数、指数符号和指数四部分组成,其中尾符代表了浮
点数的正负,指数是整数。例如,-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#都是正确的日期常量。
用户声明常量是用一个符号名来代替数值或字符串, 称为符号常量 。
命名规则:符号名必须是以字母开头, 由字母, 数字, 下划线组成的长
度不大于 40的字符串 。
其格式为:
格式,const符号常量名 [As 类型 ] = 表达式 [,符号常量名 =表达式 ? ]
功能:设置符号常量为表达式的值 。
举例:下面的语句分别定义了四个符号常量 。
Const NAME As String="LiLin―
Const NUMAs Integer= 4450
Const Pi=3.14159
Const MAX As Integer=&O155
符号常量(用户声明常量)
说明:
? 符号常量是有意义的名字, 用来取代程序中永远不变的数
值或字符串 。 尽管和变量有点类似, 但不能象对变量那样修
改符号常量, 也不能对符号常量赋新值 。
? 符号常量名不能是 Visual Basic中的保留字, 如 Case、
EndDo,If等 。
? 符号常量名必须以字母开头, 即第一个字母必须是 A~ Z这
26个字母 ( 或小写字母 ) 中的一个 。 通常, 为了区别于其他
变量, 符号常量用大写字母表示 。
?符号常量应先定义后使用, 在整个模块中只需定义一次
? 由于 VB应用程序的结构层次分全局级, 窗口级和模块级,
相应地一个符号常量的作用范围 ( 作用域 ) 也有不同的层次,
使用时应特别注意 。
四、运算符和表达式
运算符是代表 Visual Basic某种运算功能的符
号,通过运算符和操作数组成各种形式的表达式,
实现程序编制中所需的计算或操作。 VB中的运算符
和表达式有如下几种:
? 算术 运算符与算术表达式
? 关系运算符与关系表达式
? 逻辑运算符与逻辑表达式
? 字符串 运算符 字符串 表达式
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
☆ 算术运算符两边的操作数应为数值型。若是数字字符
或逻辑型,则自动转换为数值型再运算。
先按四舍五入的原则对小数点后部分
进行处理,然后运算
由算术运算符连接起来的式子就是算术表达式, 算术表
达式的结果是数值 。 算术表达式运算时, 首先根据运算符的
优先级进行运算, 在优先级相同的情况下, 按由左至右的顺
序进行运算 。 如果需要改变运算次序, 可以通过增加括号的
方法 。 括号必须成对出现, 括号之中可以嵌套括号 。
例如:
- b + d / 2a
- b + d / 2 * a
- b + d / ( 2 * a )
( - b + d ) / ( 2 * a )
算术表达式
2.关系运算符与关系表达式
运算符 功 能 例 子 结 果
> 大于 "1234">"129" False
>= 大于等于 "ab c">="abc" False
< 小于 34<67 True
<= 小于等于 "23"<="3" True
= 等于 150=150 True
<> 不等于 "xyz"<>"XYZ" True
关系运算符
关系运算符对两个操作数的关系进行比较, 结果是逻辑值 。 其操作对
象可以是数值型数据, 也可以是字符串 。 关系运算符表如下:
由关系运算符连接起来的式子就是关系表达式,关系表
达式的结果是逻辑值,一般表示一个条件是否成立。
说明:
☆ 关系运算符是双目运算符,操作数可以是数值型或
字符型。
☆ VB中 True用 -1表示; False用 0表示。
☆ 如果两个操作数是数值型,则按其大小比较;如果
两个操作数是字符型,则按字符的 ASCII值从左到右一一比较。
☆ 汉字字符大于西文字符;小写字母大于大写字母。
☆ 关系运算符中的等于,= ‖是判断两边的值是否相等。
关系表达式
3.逻辑运算符与逻辑表达式
逻辑运算符
逻辑运算符对逻辑数进行逻辑运算, 其结果仍是逻辑值 。 逻辑运算符
大都是双目运算符, 只有 NOT是单目运算符 。 逻辑运算符表如下:
运算符 功能 优先级 说 明
逻辑非
逻辑与
逻辑或
异或
逻辑等价
蕴含
Not
And
Or
Xor
Eqv
Imp
1
2
3
3
4
5
当操作数为真时,结果为假
两个操作数都为真时,结果为真
两个操作数有一个为真,结果为真
两个操作数相反时,结果为真
两个操作数相同时,结果为真
只有第一个操作数为真,第二个操作数为假
时,结果才为假,其余结果为真
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 为 F T Imp F 为 T
F Imp T 为 T F Imp F 为 T
逻辑运算符运算规则
将逻辑量通过逻辑运算符连接起来,就组成了逻辑表达式。
逻辑表达式的结果仍是逻辑值,它表示一个复合条件。
说明:
☆ 逻辑运算符中最常用的是 Not,And,Or,其中 And,Or用
于将多个关系表达式进行逻辑判断。若有多个条件,And必须全
部条件都为真才为真;而 Or只要有一个条件为真则为真。
如:某单位选拔年轻干部,条件为:年龄小于等于 35岁、职
称为高级工程师、政治面目为中共党员。表示为:
年龄 <=35 And 职称 =― 高级工程师” And 政治面目 =―中共党员”
若表示为:
年龄 <=35 Or 职称 =― 高级工程师” Or 政治面目 =―中共党员”
表示三个条件只要有一个成立即可。
逻辑表达式
1 1 0 0
? 0 1 1 1————
0 1 0 0
☆ 如果逻辑运算符对数值进行运算,则进行数字的二进制逐
位操作。如,12 And 7 表示对 1100( 12)与 0111( 7)进行逐
位与操作。
这种特殊运算符用途如下:
① And运算用来屏蔽某些位。如键盘事件中判断是否按了 shift、
ctrl,alt键。例如:
cl=cl And 7 ?仅保留 cl中的最后三位,其余位置
零。这里的,=‖是赋值号。
② Or运算用来把某些位置 1。例如:
cl=cl Or 7 ?把 cl 中的最后三位置 1,其余位保
持原值不变。
③ 对一个数连续进行两次 Xor操作,可恢复原值。如设计动画
时,用 Xor模式可恢复原来的背景。
4.字符运算符与字符表达式
说明:
? & 连接符用来强制两个表达式作字符串的连接, 即不管两边的操作数
是字符还是数值型, 进行操作时, 将操作数转换成字符型, 然后再连接 。
? + 连接符进行运算时, 如果两个操作数均为字符串, 则将两个字符串
连接;如果一个为数字字符串, 另一个为数值型, 则自动将数字字符转换
为数值, 然后进行算术加运算;若均为数值型, 则进行算术加运算;若一
个为非数字字符型, 另一个为数值型, 则出错 。
? 在字符串变量后使用, &‖运算符时, 变量和运算符之间应加一个空
格 。 因为, &‖既是字符串连接符, 也是长整形类型符, 当变量名和符号
,&‖连在一起时, VB把它作为类型符号处理, 这时将报错 。
字符运算符只有两个,&和 +,用于将字符串连接起来,
也称为连接符 。 由连接符将两个字符串连接起来, 就构成了
字符表达式 。
5.算术表达式中数据类型的转换
在算术运算中, 如果操作数采用不同的数据精度, 则 VB规定, 运
算结果的数据类型采用精度高的数据类型 。
Integer < Long < Single < Double <Currency
整型 < 长整型 < 单精度 < 双精度 < 货币型
6.运算的优先顺序
在表达式中, 当运算符不止一种时, 要先处理算术运算符, 接着处理
关系运算符, 然后再处理逻辑运算符 。 对于同种运算符则按优先级处理 。
对于字符串连接运算符, 它应在所有算术运算符之后, 关系运算符之
前 。
算术运算符 > 字符运算符> 关系运算符> 逻辑运算符
x+y*2-z^2 > 3 and ―abcd‖ & ―xyz‖ = chr1 or name=―liyi‖ and age =21
五、常用内部函数
内部函数
数学函数
转换函数
字符串函数
日期函数
VB提供了大量的内部函数,用户可以直接调用这些函数,以完成特
定的功能。
内部函数的形式
函数名(参数,参数,… )
注意:即使函数没有参数,括号也不能省略。
内部函数的使用
内部函数的分类
一般用于表达式中,即函数参与表达式的计算
函数名 含义 示例 结果
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
说明:☆ 在三角函数中,以弧度表示; 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)
☆ 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
字符串函数
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。
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(要增减日期的形式, 增减量, 要增减的日期变量 )
功能:对要增减的日期变量按日期形式做增减 。 要增减的日期形式
见下表:
秒分时星期一周的天数日一年的天数月季年意义
snhwwwdymqyyyy日期形式
例如,DateAdd(―ww‖,2,#2/14/2000#)
表示在指定的日期上加 2周,函数的结果为 #2/28/2000#。
5,DateDiff函数
格式,DateDiff(要间隔日期形式,日期 1,日期 2)
功能:两个指定的日期按日期形式求相差的日期。
例子:计算现在离 2003年 6月 30日还有多少天。
DateDiff(―d‖,Now,#2003/6/30#)
在 VB中, 不但可以调用内部函数, 还可以调用各
种应用程序 。 这就是说, 凡是能在 DOS或 Windows下运行
的应用程序, 都可以在 VB中调用, 它是通过 Shell函数来
实现的 。 有关 Shell函数的详细使用, 请参阅附录 F。
shell函数
程序控制语句
Visual Basic语言作为结构化程序设
计语言,提供了三种控制流来控制程序
的流程,顺序,条件分支和循环语句。
程序中的语句依照其在程序中的位置依
次顺序地执行,叫做语句的顺序执行。
在一个简单的顺序结构程序中,一般包含
三种操作:
? 数据的输入
? 计算并赋值
? 数据的输出
一、顺序结构程序设计
有多种方法可以实现数据的输入, 如书中介绍的 InputBox( ) 函数 。
在 Windows程序设计中最常用的方法是使用文本框控件 。
文本框控件:
? 文本框控件用于接收输入的文本信息 ( 字符型 ), 它将接收的字符
串保存在文本框的 Text属性中 。
? 在使用 文本框时, 常见的形式为:
a = Text1.Text
即将 Text1文本框的 Text属性值 ( 输入的内容 ) 赋值给变量 a。 另外,
如果对文本框操作时只给出了文本框的名字, 系统默认为对 Text属性操
作, 因此在程序中也经常见到如下形式:
a = Text1
? 虽然 文本框控件接收的是字符型信息, 如果是数值型字符串, 将其
赋值给数值型变量后, 变量中得到的是数值 。
数据输入
赋值语句
格式, [Let]变量名 /对象属性名 = 表达式
? 将赋值号右边表达式的值赋给赋值号左边的变量或对象属性 。
举例,Form1.caption = "输入框 "
Temp = 20
? 在 赋值语句中通过表达式完成计算, 这是实现计算功能的最常见的形
式 。
变量的赋值
说明:
① Let 是赋值语句的关键字, 是一个可选项, 通常省略 。
② 表达式的类型应与变量名的类型一致, 当同时为数值型但精度不相同
时, 强制转换成左边的精度 。 例如:
iA% = 4.7 ˊ iA是整型变量, iA中的结果是 4。
③ 可以把字符串或数值表达式的值赋给 Variant变量, 但反过来不一定正
确 。 任何除 Null之外的 Variant都可以赋给字符串变量, 但只有当 Variant
的值可以解释为某个数值时才能赋给数值变量 。
④ 赋值语句中的, =‖与关系运算符中的, =‖的作用截然不同 。
例如,A=7=9
举例:例 3.1将 A和 B单元的内容互换 。
⑵ InputBox( ) 函数
格式,InputBox[$]( prompt[,title][,default][,xpos,ypos])
功能,该函数的作用是打开一个对话框, 等待用户键入文本或选择
一个按钮 。 当用户单击, 确定, 按钮或按回车键时, 函数返回文本
框中输入的字符 。
说明,①, $‖:可选项 。 有此项时, 返回的数据类型是字符串型;
省略此项, 返回的数据类型是变体型 。
②, prompt( 提示 ),,字符串表达式, 必选项 。 在对话框中作
为提示信息, 可以是字符或汉字, 最大长度大约为 1024个字符, 由
所用字符的宽度决定 。 如果提示信息包含多行, 则必须在每行末用
回车符 ( Chr( 13)), 换行符 ( Chr( 10)) 或回车换行符的组合
( Chr( 13) &Chr(10)) 来分隔 。
③, title( 标题 ),,可选项 。 显示在对话框标题栏中的字符串
表达式 。 如果省略 title,则把应用程序名放在标题栏中 。
④ ―default( 缺省 ),,可选项, 显示文本框中的字符
串表达式 。 当在输入对话框中无输入内容时, 该缺省值作
为输入的内容 。 如果省略 default,则文本框为空 。
⑤, xpos,ypos( X坐标位置, Y坐标位置 ),,可选项,
整型表达式, 成对出现 。 xpos用来指定对话框的左边与屏
幕左边的水平距离, ypos用来指定对话框的上边与屏幕上
边的垂直距离 。 如果省略该项, 则对话框在水平方向居中,
在垂直方向距下边大约三分之一的位置 。
注意,函数中的各项参数次序必须一一对应,除了
,prompt‖一项不能省略外,其余各项均为可选项,如果
要省略某些参数,则必须加入相应的逗号分割符。
⑶ MsgBox函数和 MsgBox过程
MsgBox函数格式,变量 %= MsgBox (prompt [,buttons] [,title])
MsgBox过程格式, MsgBox (prompt [,buttons] [,title])
功能,打开一个消息框, 等待用户选择一个按钮 。 MsgBox函数返回所
选按钮对应的整数值, 以便告诉用户单击哪一个按钮 。 若不需要返回
值, 则可作为 MsgBox过程使用 。
说明,①, prompt‖和, title‖的含义与 InputBox()函数中对应的参数
相同 。
②, buttons( 按钮 ),,可选项, 为整型参数 。 用来设定要显示的按
钮的数目, 类型和出现在消息框中的图标类型 。
③, 变量 %‖,返回值 。 当用户按下消息框按钮时, 系统将返回按键
相对应的数值, 利用这个返回信息, 用户可以在以后的程序中作出不
同的响应 。 例如, 在打印文件时, 如果选择, 确定, 按钮, 那么程序
就应该打印文件;如果选择, 取消, 按钮, 程序就不再打印文件;如
果选择, 重试,, 那么程序就应该能重新开始打印文件 。
⑴ 标准显示输出语句
格式,Print [表达式 ] [{,|; }]
功能,在屏幕上显示数据 。
说明,① 表达式:可选项 。 可以是一个或多个任意数值, 字符
串常量, 变量或表达式 。 当有多个表达式时, 要用分隔符 ( 逗
号, 分号 ) 隔开 。 显示的字符串内容要用双引号括起来 。 当表
达式缺省时, 则屏幕显示一个空行 。
② 标准显示输出语句的输出格式分为标准输出格式和紧凑输出
格式 。 VB把输出的每一行以 14个字符宽度划分为一个区段,
每个数据项占一个区段的位置 。 这种输出格式排列整齐, 适用
于数值显示的情况 。 紧凑输出格式在输出时, 对于数值型数据,
前面有一个符号位, 后面有一个空格;对于每个字符串, 各个
数据项之间没有间隔, 适用于用若干个字符串显示连续的结果 。
数据输出
③ 在标准显示输出语句中, 如果各数据项之间用逗号隔开,
则按标准输出格式显示数据;若显示语句中各数据项之间用
分号或空格作为分隔符, 则按紧凑输出格式输出数据;若
Print语句的末尾使用了逗号或分号, 则表明显示数据不换行,
下一个 Print语句仍在该行输出;当输出的数据超过显示行的
宽度时, 多余的数据自动输出到下一行 。
④ Print语句既可以用定点格式显示数值数据, 也可以用浮
点格式显示数值数据 。 基本原则是:如果数字可以用 7位及
其以下的位数表示, 则 Print语句就用定点格式显示该数, 否
则用浮点格式 。
⑵ Print方法
Print方法的作用是在对象上输出信息。
形式,[对象,] Print [Spc(n)/Tab(n)] [表达式表 ]
其中,对象可以是窗体( Form)、图形框 (PictureBox)或
打印机( Printer)。如果省略了对象,则在窗体上输出。
Spc(n)函数:用于在输出时插入 n个空格。
Tab( n)函数:用于在输出表达式列表前向右移动 n列。
表达式表,要输出的数值或字符串表达式,其开始打印
的位置是由对象 CurrentX和 CurrentY属性决定的,缺省
时打印在对象的左上角 0,0处。
( 3) 格式输出函数
格式,Format$(表达式 [,格式字符串 ] )
功能,将数值型量转换为字符型量, 并根据格式字符串中的结
构将其格式化 。
说明:, 表达式, 是要格式化的数值, 日期和字符串类型表达
式 。, 格式字符串, 有三类:数值格式, 日期格式和字符串格
式 。 格式字符串一定要用引号括起来 。
( 4) 通过 Label控件的 Caption输出
设计阶段:在窗体需要显示输出数据的地方放置 Label控件
在程序中:将需要输出的数据转换为字符型量, 然后赋值
给 Label控件的 Caption属性 。
① 数值格式化
② 日期和时间格式化
③ 字符串格式化
示例:
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程序正常
结束应该卸载所有的窗体, 只要没有其他程序引用该程序公
共类模块创建的对象并无代码执行, 程序将立即关闭 。
Visual Basic 选择结构的实现:
? If… Then
? If...Then… Else
? Select Case
二、选择结构程序设计
1,If…Then 结构
格式 1,If〈 表达式 〉 Then 语句
格式 2,If 〈 表达式 〉 Then
语句块
End If
T
F
语句(块)
表达式
图 3.8 单分支结构
说明:
① 表达式都是逻辑表达式, 当表达式是数值表达式时,
Visual Basic 将这个值解释为 True 或 False:一个为零
的数值为 False,而任何非零数值都被看作 True。
② 语句块可以是一条或多条语句 。 如果使用格式 1的
简单形式表示, 则只能是一条语句;或用冒号隔开的
多条语句, 但这些语句必须书写在一行上 。
③ 可以使用单行或多行语法有条件地执行一个语句 。
下面两个例子是等价的:
If anyDate < Now Then anyDate = Now 和
If anyDate < Now Then
anyDate = Now
End If
④ If...Then 的单行格式不用 End If 语句 。
例 3.6 求一元二次方程的两个实根 。
例 计算一元二次方程的两个实根。
Private Sub Command1_Click()
'计算 a*x^2+b*x+c=0 的两个根
Dim a As Integer,b As Integer,c As Integer
Dim x1 As Single,x2 As Single,d As Single
a = Text1.Text
b = Text2
c = Text3
d = b * b - 4 * a * c '计算△
If d >= 0 Then
x1 = (-b + Sqr(d)) / (2 * a)
x2 = (-b - Sqr(d)) / (2 * a)
Label5.Caption = Label5.Caption & Format(x1,"###.##")
Label6.Caption = Label6.Caption & Format(x2,"###.##")
End If
End Sub
2,If…Then …Else 结构
格式 1,If < 表达式 > Then
< 语句块 1>
Else
< 语句块 2>
End If
格式 2,If < 表达式 > Then < 语句 1> Else < 语句 2>
例 求一元二次方程的两个实根或两个虚根 。
FT
语句 (块 )1 语句 (块 )2
表达

图 3.9 双分支结构
Private Sub Command1_Click()
'计算 a*x^2+b*x+c=0 的两个根
Dim a As Integer,b As Integer,c As Integer
Dim x1 As Single,x2 As Single,d As Single
a = Text1.Text
b = Text2
c = Text3
d = b * b - 4 * a * c '计算△
If d >= 0 Then
x1 = (-b + Sqr(d)) / (2 * a)
x2 = (-b - Sqr(d)) / (2 * a)
Label5.Caption = Label5.Caption & Format(x1,"###.##")
Label6.Caption = Label6.Caption & Format(x2,"###.##")
Else
x1 = -b / (2 * a)
x2 = Sqr(-d) / (2 * a)
Label5.Caption = Label5.Caption & x1 & "+‖ & x2 & "i"
Label6.Caption = Label6.Caption & x1 & "-" & x2 & "i"
End If
End Sub
块结构的条件语句可以嵌套, 即把一个 If … Then … Else 块放在另一
个 If … Then … Else 块内 。 嵌套必须完全嵌套, 也就是内层条件语句必
须完全包含在外层条件语句之中 。
If结构的嵌套
格式,If < 表达式 > Then

If < 表达式 > Then

Else

End If

Else

If < 表达式 > Then

Else

End If

End If
Private Sub CmdCalcu_Click()
Dim a As Single,b As Single,c As Single,d As Single
Dim x1 As Single,x2 As Single,x As Single
a = text1
b = text2
c = text3
If a = 0 Then
x = -c / b
Label5.Caption = Label5.Caption + Format(x)
Label6.Caption = Label6.Caption + Format(x)
Else
d = b * b - 4 * a * c
If d >= 0 Then
x1 = (-b + Sqr(d)) / (2 * a)
x2 = (-b - Sqr(d)) / (2 * a)
Label5.Caption = Label5.Caption + Format(x1)
Label6.Caption = Label6.Caption + Format(x2)
Else
d = Abs(d)
x1 = (-b) / (2 * a)
x2 = Sqr(d) / (2 * a)
Label5.Caption = ―x1=― & x1 & "+‖ & x2 & "i"
Label6.Caption = ―x1=― & x1 & ‖-‖ & x2 & "i"
End If
End If
End Sub
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 子句 。
程序举例 1:计算函数的值 。
Private Sub Command1_Click()
Dim x As Single,y As Single
x = Text1
If x < 0 Then
y = 5
ElseIf x < 1 Then
y = x + 1
ElseIf x < 2 Then
y = x ^ 2 + 2
ElseIf x < 5 Then
y = -x - 3
Else
y = -2 * x + 6
End If
Label3.Caption = "y=" & y
End Sub
5 x<0
x+1 0≤ x<1
X2+2 1≤ x<2
-x-3 2≤ x<5
-2x+6 x≥5
y =
程序举例 2:按分数段显示成绩的级别
Private Sub Command1_Click()
Dim x As Single
x = Text1
If x >= 90 Then
Label3.Caption = ―优异 "
ElseIf x >=80 Then
Label3.Caption = ―优秀 "
ElseIf x >=70 Then
Label3.Caption = ―良好”
ElseIf x >=60 Then
Label3.Caption = ―及格”
Else
Label3.Caption = ―不及格”
End If
End Sub
4,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
功能, 根 据 测 试 变 量 或 表 达 式 的 值, 从
多个语句块中选择符合条件的一个语句块执行 。
说明:
① 测试变量或表达式只能是数值表达式或字符串表
达式, 不能是逻辑表达式 。
② 语句块是由一行或多行 VB语句组成的 。
③ 表达式表与测试变量或表达式的类型必须相同,
每一个表达式表是一个或几个值的列表 。 如果在一个列
表中有多个值, 就用逗号把值隔开 。 表达式表有四种形
式:
? 一个表达式 。 如,Case 6
? 一组枚举表达式, 即多个表达式, 表达式之间用逗号隔
开 。 如:
Case 1,3,5,7
Case "I","YOU","Then"
? 表达式 1 TO 表达式 2。 该形式指定某个数值范围 。 较小
的数值放在前面, 较大的数值放在后面;字符串常量则按
字母的 ASCII码顺序从低到高排列 。 如:
Case 1 To 10
Case "a " To "e"
? Is <关系运算符 ><表达式 >。 如:
Case Is>=80
Case Is<>"Y"
另外, 在一个情况语句中, 上述四种形式可以混合使用 。
④ Select Case语句在执行时, 先求测试表达式的
值, 然后寻找该值与哪一个 Case子句的表达式值相匹配,
找到后则执行与该 Case语句有关的语句块, 之后自动转
到 EndSelect后的语句执行;如果没有找到与 Case子句中
的表达式相匹配的值, 则执行 Case Else子句有关的语句
块, 然后转到 End Select后面的语句执行 。
⑤ 当有多个 Case子句的取值范围和测试表达式的值
域相符时, 只执行符合要求的第一个 Case子句后的语句
块 。
⑥ Select Case语句只对单个表达式求值, 并根据
求值结果执行不同的语句块;而 If … Then … Else语
句可以对不同的表达式求值, 然后执行不同的操作 。 这
是两者的主要区别 。
Private Sub Form_Click()
Static a As Integer
a = a + 1
Select Case a
Case 1
Label1.Caption = "aaa"
Case 2
Label1.Caption = "bbb"
Case 3
Label1.Caption = "ccc"
End Select
End Sub
Private Sub Form_Click()
Static a As Integer
Dim b As Integer
a = a + 1
b = a Mod 3
Select Case b
Case 1
Label1.Caption = "aaa"
Case 2
Label1.Caption = "bbb"
Case 0
Label1.Caption = "ccc"
End Select
End Sub
程序举例:按分数段显示成绩的级别
Private Sub Command1_Click()
Dim x As Single
x = Text1
Select Case x
Case Is >= 90
Label3.Caption = "优异 "
Case Is >= 80
Label3.Caption = "优秀 "
Case Is >= 70
Label3.Caption = "良好 "
Case Is >= 60
Label3.Caption = "及格 "
Case Else
Label3.Caption = "不及格 "
End Select
End Sub
转移语句就是程序执行到某一步后, 不再顺序执行
下一条语句, 而是转移执行其他语句 。
实现方法:
Goto语句
On … Goto语句
GotoSub语句
5.转移语句
格式,Goto 行标识符
功能:无条件转向行标识符 ( 行号或标号 ) 所在的程序行 。
说明:
① Goto语句又叫作无条件转移语句, 当程序执行到 Goto
语句时, 程序无条件的进行跳转 。
② 行标识符可以是字符串标号, 也可以是行标号 。 如果
是字符串标号, 则标号后面要有一个冒号 (, ) 。
③ 行标识符必须在程序中确实存在, 它可在 Goto语句之
前, 也可在 Goto语句之后 。
⑴, Goto 语句
格式, On 表达式 Goto 标号 1,标号 2,标号
3,……
功能,先对表达式进行计算, 然后根据计算结果转移
到相应的标号去执行 。
说明,表达式为任意的数值表达式 。 程序执行时, 先
计算表达式的值, 并将其四舍五入处理为一个整数, 然
后根据该值决定转移到第几个行号或标号去执行 。 例如,
当表达式的结果为 1时, 转向第一个行号或标号所指定的
语句执行;如果为 2,则转向第二个行号或标号所指定的
语句执行, 如此等等 。
如果表达式的值等于 0或者大于行标识表中的项数,
则程序跳过本语句, 转向下一个语句;如果表达式的值
小于 0或者大于 255,则出现错误信息 。
⑵, On … Goto 语句
格式,GoSub 标号
功能,执行 GoSub语句, 程序跳转到标号处
执行, 直到遇到 Return语句才结束子程序的执行
并返回调用处 。
⑶, GoSub 语句
6.选择结构程序设计举例
1、属相
Private Sub Command1_Click()
Dim year As Integer,name As Integer
year = Text1
year = year - 1972
If year >= 0 Then
name = year Mod 12
Else
year = Abs(year)
name = 12 - (year Mod 12)
End If
Select Case name
Case 0
Label2.Caption = "鼠 "
Case 1
Label2.Caption = "牛 "
Case 2
Label2.Caption = "虎 "
Case 3
Label2.Caption = "兔 "
Case 4
Label2.Caption = "龙 "
Case 5
Label2.Caption = "蛇 "
Case 6
Label2.Caption = "马 "
Case 7
Label2.Caption = "羊 "
Case 8
Label2.Caption = "猴 "
Case 9
Label2.Caption = "鸡 "
Case 10
Label2.Caption = "狗 "
Case 11
Label2.Caption = "猪 "
Case 12
Label2.Caption = "鼠 "
End Select
End Sub
6.选择结构程序设计举例
2、闰年
设 Y为年数,判断闰年的条件是:
Y不能被 4整除,则 Y不是闰年;
Y能被 4整除,不能被 100整除,则 Y
是闰年;
Y能被 4整除,能被 100整除,不能
被 400整除,则 Y不是闰年;
Y能被 4,100,400整除,则 Y是闰
年;
Private Sub Command1_Click()
Dim y As Integer,name As String
y = Text1
Label2.Caption = Str(y) + "年为,"
If y Mod 4 <> 0 Then
name = "不是闰年 "
Else
If y Mod 100 <> 0 Then
name = "闰年 "
Else
If y Mod 400 = 0 Then
name = "闰年 "
Else
name = "不是闰年 "
End If
End If
End If
Label3.Caption = name
End Sub
循环结构允许重复执行一行或数行代码。
Visual Basic 支持的循环结构有:
? Do...Loop
? For...Next
? While…Wend
? For Each...Next
三、循环结构程序设计
适用,事先不知道循环次数的操作
四种语法格式:
⑴, Do While … Loop 语句
⑵, Do … Loop While语句
⑶, Do Until …Loop 语句
⑷, Do …Loop Until 语句
1,Do...Loop循环
格式,Do While 〈 条件表达式 〉
〈 循环体 〉
[Exit Do]
〈 循环体 〉
Loop
⑴, Do While … Loop 语句
T
F
条件
循环体
图 3.14 Do While … Loop
语句流程图
说明:
① 条件表达式可以是一个逻辑表达式, 也可以是一
个关系表达式, 其值应是逻辑型 。
② Do While和 Loop应成对出现 。
③ 循环体中要有控制循环的语句, 以避免出现死循
环 。
④ 由于该循环的特点是先判断条件, 然后再决定是
否要执行循环体里的语句 。 所以, 这种循环可以一次也
不执行循环体 。 其流程图如图 3.14所示 。
⑤ Exit Do 表示当遇到该语句时, 强制退出循环,
执行 Loop后的下一条语句 。
格式:
Do
〈 循环体 〉
[Exit Do]
〈 循环体 〉
Loop While〈 条件表达式 〉
⑵, Do … Loop While 语句
T
F
条件
循环体
图 3.15 Do… Loop While
语句流程图
说明:
① 至少要执行循环体一次 。
② 与 Do While循环的区别:
Do While循环 ( 先测试条件是否成
立, 只有成立才执行循环 )
该循环 ( 先执行循环体, 后测试条
件是否成立 ) T
F
条件
循环体
图 3.15 Do… Loop While
语句流程图
格式:
Do Until〈 条件表达式 〉
〈 循环体 〉
[Exit Do]
〈 循环体 〉
Loop
⑶, Do Until …Loop 语句
图 3.16 Do Until … Loop
语句流程图
F
T
条件
循环体
格式:
Do
〈 循环体 〉
[Exit Do]
〈 循环体 〉
Loop Until〈 条件表达式 〉
⑷, Do …Loop Until 语句
T
F条件
循环体
图 3.17 Do … Loop Until
语句流程图
( 5) DO循环程序举例
1、打印 1~ 20的整数
Private Sub
Command1_Click()
Dim i As Integer
i = 1
Do While i <= 20
Print i
i = i + 1
Loop
End Sub
2、计算 1+2+…20 的和
Private Sub
Command1_Click()
Dim s As Single
Dim i As Integer
s = 0
i = 1
Do While i <= 20
s = s + i
i = i + 1
Loop
Print s,i
End Sub
( 5) DO循环程序举例
3、计算 5! =1x2x3x4x5的积
Private Sub
Command1_Click()
Dim f As Single,i As Integer
f = 1
i = 1
Do While i <= 5
f = f * i
i = i + 1
Loop
Print f,i
End Sub
循环变量:
用于控制循环次数,在循
环体内通过表达式赋值改变。
求和变量:
在循环体外通常赋初值 0,
在循环体内通常是 s = s + xx
的形式进行连续求和。
求积变量:
在循环体外通常赋初值 1,
在循环体内通常是 f = f * xx 的
形式进行连续求积。
格式,For 循环变量 = 初值 To 终值 [Step 步长 ]
<循环体 >
[ Exit For ]
<循环体 >
Next [循环变量 ]
2,For …Next 循环
循环体
Exit For
循环体
循环变量增加步长
循环变量获得初值
F
T
循环变量在终值内
图 3.18 For循环的执行过程
说明:
① 格式中的参数说明:
? 循环变量也叫做循环控制变量, 它是一个数值变量,
但不能是数组变量 。
? 循环的初值, 终值和步长都是数值表达式, 其值不
一定是整数, 可以是实数, VB自动取整 。 其中, 增量参数
可正可负 。 如果增量为正, 则初值必须小于等于终值, 否
则不能执行循环体内的语句;如果增量为负, 则初值必须
大于等于终值 。 如果没有设置 step,则增量默认为 1。
? 在 For语句和 Next语句之间的语句序列称为循环体,
可以是一个或多个语句 。
? Exit For为强行退出循环语句 。
? Next是循环终端语句, 在 Next后面的循环变量与
For中的循环变量必须相同 。 当循环是单层循环时, Next
后面的循环变量可以不写 。
② For循环语句的执行过程是:首先把初值赋给循环变
量, 接着检查循环变量的值是否超过终值, 如果超过就不执
行循环体, 跳出循环, 执行 Next后面的语句;否则执行一次
循环体, 然后把循环变量增加步长, 再赋给循环变量, 重复
上述过程 。 见流程图 3.18。
③ 当初值等于终值时, 不管步长是正数还是负数, 都执
行一次循环体 。
④ 循环次数由初值, 终值和步长决定, 计算公式为:
循环次数 =INT(( 终值 – 初值 ) /步长 +1)
⑤ For语句和 Next语句必须成对出现, 不能单独使用 。
⑥ 如果要在循环变量到达终值前退出循环, 可用 Exit
For语句来实现 。 该语句可以在 For循环中出现多次, 且位置
不限 。
⑦ 在循环体中可以使用循环变量, 但一般不再对循环变
量赋值 。
For循环程序举例
1、计算 1+2+…20 的和
Private Sub Command1_Click()
Dim s As Single
Dim i As Integer
Dim J As Integer
s = 0
J = Text1
For i = 1 To J
s = s + i
Next
Print s,i
End Sub
2、计算阶乘
Private Sub Command1_Click()
Dim f As Single
Dim i As Integer
f = 1
For i = 1 To 5
f = f * i
Next
Print f,i
End Sub
循环结构语句可以嵌套, 即把一个循环结构放在另一个循环结构内 。
嵌套必须完全嵌套, 也就是内层循环结构必须完全包含在外层循环结构
之中 。
循环结构的嵌套
格式,Do While < 表达式 >


FOR I= 初值 TO终值


Next


Do While < 表达式 >


LOOP


LOOP
格式,FOR I= 初值 TO终值


FOR J=初值 TO终值


Next J


Do While < 表达式 >


LOOP


NEXT I
循环嵌套程序举例
计算 1!+2!+…5!
Private Sub Command1_Click()
Dim i As Integer,j As Integer,s As Single,f As Single
s = 0
For i = 1 To 5
f = 1
For j = 1 To i
f = f * j
Next j
s = s + f
Next i
Print s
End Sub
格式, 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,循环结构程序举例
数组及应用
数组概念的引出
? 在科学计算和数据处理中,要用到成批数据,这些数
据类型相同,且彼此间存在一定的顺序关系
? 数组可以表现多种逻辑关系的数据形式。
一维数组
A(0) A(1) A(2) A(3) A(4) A(5)
数列
5 8 3 2 9 6
学期
第一学期
第二学期
第三学期
第四学期
数学 物理 化学 生物 外语
85 65 90 70 80
77 80 89 80 78
90 96 92 75 83
80 78 81 86 81
二维表
二维数组
A(1,1) A(1,2) A(1,3) A(1,4) A(1,5)
A(2,1) A(2,2) A(2,3) A(2,4) A(2,5)
A(3,1) A(3,2) A(3,3) A(3,4) A(3,5)
A(4,1) A(4,2) A(4,3) A(4,4) A(4,5)
?通常,数组是由 一组 具有 同一类型 的变量组成的,即一个数
组中的所有元素具有相同的数据类型。当然,当数据类型为变体
( Variant) 时,各个元素能够包含不同种类的数据(对象、字符
串、数值等)。
?在 VB中有两种类型的数组,固定大小的数组 —它总是保持
同样的大小;以及在运行时大小可以改变的 动态数组 。
?使用数组必须先声明,后使用。与变量一样,根据数组应用
的有效范围,可以采用以下三种方法进行声明:
?在模块的声明段用 Public 语句声明数组,建立公用数组。
?在模块的声明段用 Private或 Dim语句声明数组,建立模块级数组。
?在过程中用 Dim或 Static 语句声明数组,建立局部数组。
?声明 固定大小 数组应包含的信息:
? 数组名 ? 数组的维数
? 数组的大小(体积) ? 数组的类型
数组定义
一、固定大小的数组
在声明时能够确定了大小的数组称作 固定大小的数组 。
⒈ 一维数组
只需要用一个下标就能确定一个数组元素在数组中的位置, 那么
该数组称为一维数组 。 在使用数组前要先声明, 以开辟所需的空
间 。
格式,Dim数组名 (下标 ) [As 数组类型 ]
功能,定义一个一维数组的大小, 并分配相应的存储空间 。
说明:
① 数组名与简单变量的命名规则相同 。
② 下标是数组的维数, 格式为 [下界 To ]上界 。 一般情况下, 当
[下界 To]缺省时, 默认值为 0。 一维数组下标的范围可以为 -
32768~ 32767,下界必须小于上界 。 一维数组的大小是:上界-
下界+ 1。
③ As 数组类型用来说明数组的类型, 如果缺省, 则与变量的
声明一样, 默认为是变体数组 。 例如:
Dim a (12) As Single ˊ 声明 a数组的类型为单精度型, 下标范围为 0~ 12
Dim x (1 To 50 ) As Integer ˊ 声明 x数组的类型为整型, 下标范围为 1~ 50。
Dim y (1 To 10 ) ˊ 声明 y是一个下标范围为 1到 10的变体数组 。
④ 数组必须先声明后使用 。
⑤ Dim语句声明的数组, 为系统编译程序提供了数组名, 数组
类型, 数组的维数和各维的大小 。 该语句把数值数组中的全部
数组元素都初始化为 0,而把字符串数组中的全部数组元素都
初始化为空字符串 。
⑥ Dim语句中的下标可以是常数 。 下标全为常数时为 固定大小
的数组, 数组的大小在编译时是确定的;下标为空时则为 动态
数组, 数组的大小是可变的, 只有在程序运行时, 变量有确定
的值后, 数组的大小才能确定 。
⑦ 可以使用以下方法声明通用数组:
? 建立公用数组, 在模块的声明段用 Public 语句声明数组 。
? 建立模块级数组, 在模块的声明段用 Private 或 Dim语句
声明数组 。
? 建立局部数组, 在过程中用 Dim或 Static 语句声明数组 。
例如:
Dim Counters ( 1 To 14 ) As Integer
Private Sums ( 1 To 20 ) As Double
Public Counters ( 14 ) As Double
Dim Subs ( 20 ) As Double
⒉ 多维数组
格式,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
⒊ Open Base语句
格式,Open Base n
功能,改变数组下标的缺省下界 。
说明,n为数组下标的下界, 只能是 0或 1。 该语句在程序中
只能使用一次, 且必须放在数组声明语句之前 。
☆ 数组元素是带有下标的变量,其一般形式为:
数组名(下标表达式,…… ) 如,A(2) B(1,2) C(1,3,1)
数组元素是由数组名和圆括号中的下标表达式组成。下标
表达式是任意算术表达式,当其值为实型时,系统自动转换为
整型。
数组元素及下标
Dim a(5) as Integer Dim b(1,2) as Single
B(0,0)
B(0,1)
B(0,2)
B(1,0)
B(1,1)
B(1,2)
A(0)
A(1)
A(2)
A(3)
A(4)
A(5)
数组元素
带下标的变量
☆ 数组元素的下标,
数组元素在数组中的顺序号称为下标。下标的个数决定了
数组的维数,下标的乘积是数组的体积。
例如,Dim a(5) as Integer 元素个数 6个
Dim b(1,2) as Single 元素个数 2*3=6个
☆ 数组声明和数组元素的区别:
数组声明中定义的数组名(包括维数、大小说明),用来说明
数组的名字、维数、大小和类型。数组元素是数组中的一个成
员,只能放在可执行语句中。
例如 Dim b(1,2) as Single ‘声明 2行 3列的二维数组
b(1,2) = 3.2 ‘给数组元素 b(1,2)赋值
数组元素及下标
? 数组是由 一组 具有 同一类型 的变量组成的。
? 数组元素的 连续存放 。
..,A6,.,A1 A5,.,A3,.,A2,.,A4,..
普通变量:独立存放
数组元素变量:连续存放(带下标的变量)
A(1,1) A(2,1) A(1,2) A(2,2) A(1,3) A(2,3)
数组的物理存储和逻辑存储
一维数组的存储方式
按下标由小到大的顺序存放在一串连续的内存单元中。
Dim x(5) as Integer
X(0)
X(1)
X(2)
X(3)
X(4)
X(5)
存储结构逻辑存储结构
X(0) X(1) X(2) X(3) X(4) X(5)
二维数组的存储方式
二维数组的数组元素是,按行,的顺序存放的。
Dim b(1,2) as Single Dim b(2,1) as Single
A(0,0)
A(0,1)
A(0,2)
A(1,0)
A(1,1)
A(1,2)
第一行
第二行
逻辑存储结构
A(0,0) A(0,1) A(0,2)
A(1,0) A(1,1) A(1,2)
A(2,0) A(2,1)
A(0,0) A(0,1)
A(1,0) A(1,1)
逻辑存储结构 A(0,0)
A(0,1)
A(1,0)
A(1,1)
A(2,0)
A(2,1)
第一行
第二行
第三行
三维数组的存储方式
先页后行最
后列。是由
若干页组成
的二维数组
S(2,0,0) S(2,0,1) S(2,0,2)
S(2,1,0) S(2,1,1) S(2,1,2)
S(2,2,0) S(2,2,1) S(2,2,2)S(1,0,0) S(1,0,1) S(1,0,2)
S(1,1,0) S(1,1,1) S(1,1,2)
S(1,2,0) S(1,2,1) S(1,2,2)S(0,0,0) S(0,0,1) S 0,0,2)
S(0,1,0) S(0,1,1) S(0,1,2)
S(0,2,0) S(0,2,1) S(0,2,2)
S(0,0,0)
S(0,2,2)
S(0,0,1)
S(0,0,2)
S(0,1,0)…
S(1,2,2)
S(2,0,0)
S(2,2,2)


S(1,0,0)

0


1


2

3.7.2 动态数组
建立动态数组的步骤:
? 声明动态数组 。 用 Dim,Private,Public等语句声明数组, 给
数组赋予一个空维数表 。 例如,Dim Dynarray( ) 。
? 用 Redim语句配置实际的数组元素个数 。
格式,Redim数组名 ( 下标 1 [,下标 2 … ])
功能,声明动态数组的大小 。
说明,Redim语句声明只能用在过程中, 它是可执行语句 。 它
可以改变数组中元素的个数, 但不能改变数组的维数, 例如
不能将一维数组改变为二维数组 。 每次用 Redim来配置数组个
数时, 数组中的内容全部被清为零 。 为了保留数组中的数据,
可以在 Redim语句后加 Preserve参数, 该参数只能改变最后一
维的大小, 前面维的大小不能改变 。
1,数组元素的引用
要使用数组中的元素, 应使用这样的格式:
格式,数组名 ( 下标, … )
说明:
① 下标的个数必须与数组定义时的维数一致 。 对于多维数组元
素, 下标之间用逗号隔开 。
② 下标可以是表达式, 如果表达式的值是实型数, 系统自动取
整 。 如 A( 1), T( 2*m%,n%), U( i,i+1,i+2) 都是合
法的数组元素引用 。
③ 下标的值必须在数组定义的各维的上下界之内 。
④ 要严格区分数组声明中的下标和数组引用中的下标 。 两者的
写法相同, 但意义不一样 。
3.7.3 数组的基本操作
2,数组元素初始化
Dim TestArray ( 10) As Integer
Dim i As Integer
For i = 0 To 10
TestArray( i) =i
Next
例如, 在下面的例子中, 将产生下标越界错误 。
Dim TestArray( 10) As Integer
Dim i As Inetger
……
For i = 0 To 11
If TestArray( i) > 1500 Then Print TestArray( i)
Next
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
yWeek=Array("Mon","Tue","Wed","Thu","Fri","Sat","Sun")
MyDay=MyWeek(2) ˊ MyDay的值为 "Tue"。
MyDay=MyWeek(4) ˊ MyDay的值为 "Thu"。
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.数组应用举例