Visual Basic第一章
visual basic简介
发展史
- 1991年微软推出1.0,之后几年退出2.0~5.0
- 1998年推出了6.0,加入了数据库管理,网络编程模块
- 2001年推出了跨版本升级.net
编程语言排行

版本分类
- 学习版(包含所有内部控件,网络,选项卡和数据绑定控件)
- 专业版(在学习版的基础上加入了activeX控件,ISS应用程序设计器,集成了可视化数据工具和数据环境,Active数据对象和DHTML页设计器)
- 企业版(在专业版的基础上加入了Back Office工具,例如SQL Server****、Microsoft Transaction Server、IIS、Visual SourceSafe等。)
语言特点
- 可视化编程(类似于scratch模块拖动编程)
- 事件驱动机制(不同组件有相对应的事件触发机制)
- 面向对象的程序设计语言(每个控件属性自我封装)
- 支持多数据库访问机制
如何学好vb
- 兴趣和坚持
- 实践出真知
- 恰当的提问
vb启动
- 通过开始菜单启动
- 快捷方式打开
vb退出
- 点击关闭按钮
- 点击文件---->退出
- 快捷键Alt+Q
工具介绍
- 工具栏
- 属性窗口
管理工程
- 新建保存工程
- 新建工程
- 保存工程
- 新建窗体
- 新建工程
- 生成可执行文件
第一个应用程序的开发
开发步骤
-
创建应用程序界面
-
设置控件属性
-
编写代码
-
调试运行程序
工具模式
- 开发模式:修改控件,属性及代码
- 运行模式:只能看不能修改
- 中断模式:检查,调试,重置,单步执行或继续执行程序
vb工程组成
-
跟踪所有部件的工程文件(.vbp)
-
窗体文件(.frm)
-
窗体所对应的二进制文件(.frx)
Visual Basic第二章
类和对象
名词 | 解释 | 类比 |
---|---|---|
类 | 模板 | 电话机图纸 |
对象 | 根据模板生成的实际存在的个体 | 电话机 |
属性 | 个体的各项参数 | 重量,价格… |
方法 | 所能执行的功能 | 打电话,接电话 |
事件 | 触发的条件 | 电话铃响 |
属性值的修改
-
静态修改:通过程序窗口设置的方式进行修改
-
动态修改:使用代码的形式对控件的属性进行修改
Text1.text = "Hello world" '将Text1文本框中的内容修改为Hello World'
事件和方法
- 事件(触发条件):不同控件拥有不同的触发机制,例如按钮可以单机双击,文本框可以监听内容修改获取焦点等事件。
- 方法:事件出发后要执行的操作,例如单击按钮(事件)后文本框内容修改(方法)
窗体
-
组成
-
标题栏:标题内容,最小化,最大化,关闭按钮
-
窗体主体:自定义各种控件
-
-
窗体常见属性
属性名 说明 caption 修改窗体标题 name 窗体名称(编写代码查找窗体使用) MaxButton 最大化按钮 ControlBox 系统菜单栏 BackColor 背景颜色 BorderStyle 窗体边框样式 Height 窗体高度 -
窗体常用事件
事件 触发时机 Click 鼠标单击 DbClick 鼠标双击 Load 窗体打开后触发 Unload 窗体关闭时触发
控件与焦点
- 焦点:控件被选中的状态
- 获得焦点的方式
- 通过Tab键切换
- 通过鼠标选择
- 通过代码设置(控件名.setFocus)
控件的绘制
- 鼠标单击---->绘制控件(配合Ctrl可以实现重复绘制)
- 鼠标双击控件------>在窗体中间自动生成一个默认大小的控件,如果同时添加多个控件会出现控件重叠的情况。
控件大小调整
- 选择对应的控件,通过设置属性(height,weight)的方式该表大小
- 鼠标拖动周围小点的方式改变控件大小
控件位置调整
- 1.使用left,top属性设置控件位置
- 使用鼠标拖动改变控件位置
- Ctrl+方向键修改控件位置
布局调整
- 选中调整的控件,点击格式调整对齐方式。(配合Shift选中所有控件或通过鼠标框选)
- 格式中的对齐,统一格式,水平间距,垂直间距调整布局。
控件常用属性
属性名 | 说明 |
---|---|
caption | 标题/显示内容 |
name | 控件名称(编码时定位控件使用) |
enabled | 控件是否可用(置灰状态) |
visible | 控件是否可见(隐藏控件) |
font | 设置字体样式 |
height/width | 设置控件尺寸 |
top/left | 设置控件位置 |
forecolor | 设置前景色(窗体中小点的颜色,控件中文字颜色) |
backcolor | 设置背景颜色 |
标题栏—lable
-
常见属性
属性 说明 alignment 设置标题内容在控件中的位置
left 靠左
right 靠右
center 居中autosize 设置控件尺寸跟随文字内容自动调整 wordwrap 控件宽度固定,高度跟随文字变化子自动调整 ❤使用wordwrap前autosize属性值必须为true
文本框
-
常用属性
属性 说明 locked 锁定文本框内容(光标闪动,文本内容无法编辑) enabled 设置文本框是否可用 passwordchar 设置文本加密(输入字符为加密显示字符) multilint 设置文本内容最大32kb scrollbars 设置文本框滚动条 0:没有(默认值) 1:水平方向滚动条 2:垂直方向滚动条 3:水平垂直都有(只在一行显示,需要回车换行) ❤先将multiline设置为true,scrollbars属性才能生效。
-
常用事件
事件 说明 Change 文本框内容发生修改时触发 GotFocus 文本框获得焦点时触发 LostFocus 文本框失去焦点时触发 -
通过代码使文本框获得焦点
Text1.SetFocus
-
文本框常用方法
方法 说明 selStart 光标此刻所处的位置 selLength 选中字符的长度 selText 选中字符
按钮
-
常用属性
属性 说明 Caption 设置按钮显示内容 Default 值为True时,回车键控制按钮点击 Cancel 值为True时,Esc键控制按钮点击 -
设置按钮图标
- 将Style属性设置为1–Graphical
- 设置picture属性选择图片(默认\Common\Graphics\Icons目录下有系统提供的图标)
-
按钮增加动态提示
ToolTipText 设置提示内容 -
按钮常见事件
Click 鼠标单击
通用模块(重写sendkeys)
Public Sub Sendkeys(text$, Optional wait As Boolean = False)
Dim WshShell As Object
Set WshShell = CreateObject("wscript.shell")
WshShell.Sendkeys text, wait
Set WshShell = Nothing
End Sub
Visual Basic第三章
模块—vb程序中的容器
- 窗口模块:程序有不同多个窗体组成,每个窗体包含不同的控件及代码
- 标准模块:程序代码的共享,可以包含全局变量、常量及外部过程
- 类模块:创建对象的模板
过程
概念:具有特定功能的代码集合
分类 | 说明 |
---|---|
事件过程 | 触发某个事件执行的代码 |
通用过程 | 所有窗体和控件可共享的代码 |
代码窗口
代码窗口的使用
- 双击控件
- 工程资源管理器
- 选择控件鼠标右击
代码窗口的查看
-
过程查看(单模块查看)
-
全模块查看(所有控件及通用代码)
代码窗口的智能化编辑
- 自动语法检查
- 自动格式排版
- 语法提示
编码规则
- 不区分大小写
- 同一行可书写多条语句,使用:分割(不提倡)
- 每行最多1024个字符,续行符“_”
- 数字除了可以用默认的十进制表示外,还可以用其他进制: &H9A、 &O76
- 代码要有缩进
注释
概念:有利于程序的阅读,维护和调试,不影响代码运行,使用单引号
- 在代码尾部添加,有续行符的不可以
- 添加多行注释时可使用工具栏下的注释块功能
关键字
visual basic中保留的字母作为程序中固有含义的标识符,不能被重新定义。
标识符
-
定义:标识符是用户在编程时定义的名称,包括常量,变量,过程,函数和类等,在实际操作这些变量的时候我们需要给每个变量起一个名字以表示区分。这就像在日常生活中每一个人,每一个商店都会有一个名字一样。
-
命名规则:
- 由大小写英文,数字,下划线(_)组成,且以字母开头(可使用汉字,不推荐)
- 长度不能超过255
- 不能使用关键字,不能与当前模块中已有方法和属性名重复
- VB不区分变量名的大小写,一般变量名首字母用大写,其余用小写字母表示;常量全部用大写字母
-
示例
-
Const PI = 3.141592653 #PI为常量标识符,代表圆周率 Dim Name as String #Name为变量标识符,表示姓名
-
数据类型
数据类型 | 关键字 | 类型符 | 前缀 | 占字节数 | 应用 |
---|---|---|---|---|---|
字节型 | Byte | 无 | byte | 1 | 存储二进制数据,范围较小,不能存放负数 |
逻辑型 | Boolean | 无 | bln | 2 | 只有 True 和 False 两种取值,用于逻辑判断 |
整型 | Integer | % | int | 2 | 保存整数,取值范围小,用于不带小数的数据 |
长整型 | Long | & | Ing | 4 | 取值范围大于整型,其余同上 |
单精度型 | Single | ! | sng | 4 | 保存浮点实数,运算可能会产生误差 |
双精度型 | Double | # | dbl | 8 | 取值范围大于单精度型,其余同上 |
货币型 | Currency | @ | cur | 8 | 保存定点实数,主要用于货币计算 |
日期型 | Date | 无 | dtm | 8 | 保存日期与时间数据 |
字符型 | String | $ | str | 可变 | 保存字符串数据,分为定长与变长两种 |
对象型 | Object | 无 | obj | 4 | 存储32位的地址数据,该地址可引用应用程序中的对象 |
变体型 | Variant | 无 | vnt | 可变 | 可以保存所有系统定义的数据类型,主要是用于未定义变量的默认数据类型,其数据类型的处理完全取决于上下文 |
常量
在程序运行过程中不变的量,例如圆周率
-
直接常量
-
符号常量
Const 常量名 [AS 类型] = 值 | 表达式
Const PI = 3.14159
-
系统常量
变量
在程序运行中其存储的值可以改变
命名规则
- 必须以字母或汉字开头,由字母、汉字、数 字或下划线组成,长度小于等于255个字符
- 不能使用VB中的关键字
- VB不区分变量名的大小写,一般变量名首字母用大写,其余用小写字母表示;常量全部用大写字母
非法变量名
- 3xy ’ 数字开头
- y - z ’ 不允许出现减号
- Wang Ping ’ 不允许出现空格
- Dim ’ VB.NET的关键字
- Cos '标准函数名
声明变量
-
显式声明
Dim 变量名 [As 类型]
Dim m As Integer '定义整型变量m' Dim m,n As Integer, x,y As Single '创建了变体型变量m、x,整型变量n和单精度型变量y
强制显示声明:**工具→选项→编辑器→ **要求变量声明
-
隐式声明
x = "123" '定义变体型变量x'
-
类型声明符
strName$ = "张三" '定义一个字符型变量strName' Dim age% '定义一个整型变量age'
运算符与表达式
- 运算符分类
- 算数运算符
- 字符串运算符
- 关系运算符
- 逻辑运算符
算数运算符(设ia=3)
❤注意❤
算数运算符两边应是数值型,若是数字字符(“123”)或逻辑型,则自动转换为数值型后再运算
30-True '结果为31 True转为数值-1
False + 10 + "4" '结果为14,False转换为0'
字符串运算符
操作符 | 说明 |
---|---|
+ | 1)数值型:则进行算术加运算 2)一个为数字字符,另一个为数值,自动将数 字字符转换为数值后进行算术加 3)一个为非数字字符,另一个为数值型,出错 4)两边必须都为字符型才能进行拼接 |
& | 将两边转换为字符串后进行拼接 |
12 + 12 '数值型24'
12 + "12" '数值型24'
"中国" + 12 '报错'
"123" + "456" '字符型123456'
12 & 12 '字符型1212'
12 & "True" '字符型12True'
关系运算符
也叫比较运算符,双目运算符,结果为布尔型数据。
字符类型数据比较时只比较相同位数的ASCII值
运算符 | 例 | 结果 |
---|---|---|
= | " ABCDE " = " ABR " | False |
> | " ABCDE " > " ABR " | False |
>= | 32>=12 | True |
< | 23<3 | False |
<= | 3<=23 | True |
<> | " abc" <> "abcde " | True |
逻辑运算符
除Not是单目运算外,其余都是双目运算。
Eqv | 等价 | 5 | 两个操作数相等时才为真 | (3>2)Eqv (“a”>“b”) | F |
---|---|---|---|---|---|
Imp | 蕴涵 | 6 | 第一个操作数为真,第二个操作数为假,结果才为假,其余为真 | (3>2)Imp(“a”>“b”) | F |
运算符的优先级
算术运算符 > =字符运算符>比较运算符 > 逻辑运算符
数组
具有相同名字,下标值不同的一组变量称为数组变量,简称数组
数组必须先声明,后使用
❤数组下标默认从0开始❤
分类
-
静态数组
数组的维数与下标的范围在声明时确定
声明:Dim 数组名(下标上界) As 数据类型
Dim sngCj(45) As Single '具有46个元素的一维数组' Dim intA(3,4) As Integer '声明一个二维数组,共有20个元素' Dim BirthDay(1 To 10) As Date '声明下标从1到10的数组'
-
动态数组
声明数组时不指明下标的大小(省略括号中的下标),当需要使用时,再用ReDim语句重新定义其大小
声明:Dim 数组名() As 数据类型
重新分配:ReDim 数组名(下标数)
Dim intRs() As Integer
ReDim intRs(12)
intRs(0) = 1
intRs(1) = 2
print intRs(0) '# 1'
print intRs(1) '# 2'
'使用Presever源数据得以保留'
ReDim Preseve intRs(6)
print intRs(0) '# 1'
print intRs(1) '# 2'
'使用ReDim改变数组大小会使原数组的内容丢失,使用Preserver关键字可保留原数组内容,不能改变源数据类型
ReDim intRs(6)
print intRs(0) '# 0'
print intRs(1) '# 0'
二维数组
定义:Dim 数组名(行数,列数) As 数据类型
Dim MyArry(2,4) As Integer
'二维数组元素个数为3*5个,行数下标0~2,列数下标0~4'
修改数组下标起始值
Option base 0|1 '设置下标起始值'
'该语句必须放置在模块所有过程和所有数组声明之前,而且一个模块中只能出现一次'
'LBound(数组名) 返回数组指定维的下标下限'
'UBound(数组名) 返回数组指定维的下标下限'
Dim Lower, Uower '定义变量显示下标上下界
Dim MyArray(20), TwoArray(3, 4) '声明数组
Dim ZoreArray(0 To 5) '定义数组下标从0开始
'使用LBound函数查看数组下标下限值'
Lower = LBound(MyArray) '返回0'
Lower = LBound(TwoArray) '返回0'
Lower = LBound(ZoreArray) '返回1'
'使用UBound函数查看数组下标上限值'
Uower = UBound(MyArray) '返回20'
Uower = UBound(MTwoArray) '返回4'
Uower = UBound(ZoreArray) '返回5'
数组的使用
访问:数组名(下标值)
赋值:数组名(下标值) = 表达式|值
'通常数组配合循环联合使用
Private Sub Form_Click()
Dim intA(10) As Integer
Dim i As Integer
For i = 0 To 10
intA(i) = 1 '对每个数组元素赋初值1
Print intA(i) '输出数组元素的值
Next i
End Sub
❤数组的访问不能超过数组下标上界,否则会报数组越界错误
Dim intA(10) As Integer
Print intA(11) '访问下标不存在
标准(内部)函数
概念
实现某种特定功能或能实现某种运算的代码块,例如计算平均值,求和等操作
分类
-
数学函数
函数名 含义 示例 结果 Abs(N) 取绝对值 Abs(-3.5) 3.5 Cos(N) 余弦函数 Cos(0) 1 Exp(N) 返回e的N次幂,e取值约2.7 Exp(2.3) 10 Fix(N) 取整 Fix(-3.5) -3 Log(N) 自然对数 Log(10) 2.3 Int(N) 取小于或等于N的最大整数(向下取整) Int(-3.5 -4 Rnd[(N)] 产生随机数 Rnd [0,1)之间的数 Round(N) 四舍五入取整 Round(3.5) 4 Sin(N) 正弦函数 Sin(0) 0 Sgn(N) 符号函数 Sgn(-3.5) -1 Sqr(N) 平方根 Sqr(9) 3 Tan(N) 正切函数 Tan(0) 0 -
转换函数
函数名 功能 示例 结果 Asc© 字符转换成ASCII码值 Asc(“A”) 65 CDate 转换成日期型 CDate(“2003/11/13”) 2003-11-13 Chr(N) ASCII码值转换成字符 Chr$(65) “A” Hex(N) 十进制转换成十六进制 Hex(100) 64 Lcase© 大写字母转为小写字母 Lcase$(“ABC”) “abc” Oct](N) 十进制转换成八进制 Oct$(100) “144” Str(N) 数值转换为字符串
首位保留一个空格Str$(123.45) " 123.45" Ucase© 小写字母转为大写字母 Ucase$(“abc”) “ABC” Val© 数字字符串转换为数值 Val(“123AB”) 123 -
字符串函数
函数名 功能 示例 结果 Right(C,N) 取字符串右边n个字符 Right(“ABCD”,3) “BCD" RTrim© 去掉字符串右边空格 RTrim(“ABCD”) “ABCD” Space(N) 产生n个空格的字符串 Space(3) “" Split(C[,D]) 将字符串分隔成字符数组。与Join作用相反 S=Split(“123,ab”,“,”) S(0)=“123” S(1)=“ab" String(N,C) 重复首字符n次 String(3,“ABC”) “AAA” StrReverse© 将字符串反序 StrReverse(“ABCD”) “DCBA” InStr([N,]C1,C2[,M]) 从n开始,在C1中找C2 InStr(2,“EFABCDEFG”,“EF”) 7 Left(C,N) 取字符串左边n个字符 Left(“ABCDE”,3) “ABC” Len© 字符串长度 Len(“AB教育”) 4 Trim© 去掉字符串两边空格 Trim(“ABCD”) “ABCD” Mid(C,N1[,N2]) 取字符子串 Mid(“ABCDE”,2,3) “BCD” Replace(C,C1,C2) 用C2替代C1 Replace(“ACDABCD”,“CD”,“3”) “A3AB3” -
日期函数
函数名 功能 示例 结果 Date[()] 返回系统日期 Date Day(C|N) 返回日期代号(1~31) Day(“2003,05,01”) Hour(C|N) 返回小时(0~24) Hour(#1:12:56PM#) Minute(CN) 返回分钟(0~59) Minute(#1:12:56PM#) Month(CN) 返回月份代号(1~12) Month(“2003,05,01”) Now 返回系统日期和时间 Now Second(CN) 返回秒(0~59) Second(#1:12:56PM#) Time[()] 返回系统时间 Time Year(CN) 返回年代号(1753~2078) Year(365)
-
Shell函数
作用:调取应用程序
格式:Shell(应用程序.exe|.bat|.com)
i=Shell( "calc.exe") '打开计算器' '调用成功返回任务表示ID,失败返回0'
输入与输出
数据输入
-
语法:InputBox(提示文字,[标题–可不写],[文本框默认内容–可不写])
-
'示例代码 Dim msg as String '定义变量接收键盘输入的值' msg = InputBox("请输入要查找的姓名:","输入") '键盘输入的值存储到变量中' '接受值默认为字符类型 '输入值要使用变量接受
-
❤注意❤
-
接受数据为字符串类型,没有输入直接Enter返回空字符串
-
每次只能输入一个值,如需输入多个值需要重复执行该函数
-
点击取消或者键盘Esc键输入的值作废,返回空串
-
提示内容换行显示需要配合系统常量vbCrLf实现
数据输出
-
MsgBox
-
语法:MsgBox(提示语,[按钮类型],[消息框标题])
按钮类型:按钮数目值+图表类型值+默认按钮值+模式值
-
Dim status as Integer '定义变量' status = MsgBox("继续吗?",VbYesNoCancel+VbQuestion,"询问") '将选择结果赋值给变量' status = MsgBox("继续吗?",3+32,"询问") '实现效果与上方一直
按钮名 内部常量 返回值 确定 VbOk 1 取消 VbCancel 2 中止 VbAbort 3 重试 VbRetry 4 忽略 VbIgnore 5 是 VbYes 6 否 VbNo 7 3.使用函数直接使用
MsgBox "继续?", 3 + 32
-
-
Print
-
语法:[object].Print [Spc(n) | Tab(n)] [expression][,|;]
-
object:输出目标,如立即窗口(Debug),指定窗体,相片框或打印机
-
expression:输出内容或表达式
-
Spc(n):输出的空格
-
Tab(n):输出到指定列
-
,|;:,表示前后内容输出的两个标准分区 ;前后内容紧凑输出
-
-
示例代码
Debug.Print "欢迎使用vb" '在立即窗口输出' Form1.Print "2+3";2+3 '在指定窗体中以紧凑方式输出' Print '输出一个空行' Print Tab(12),"welcome to vb" '在窗体12列输出'
-
-
格式输出
-
语法:Format [$] (Expression[format])
-
$:返回值为字符型,省略返回值为变体型
-
expression:输出表达式
-
format:格式字符串
'# 表达一个数字位,决定显示区段的长度 Print format $ (25634,"########") '25634' Print format $ (25634,"###") '25634' '0 与#相同,多余的位用0补齐 Print format $ (25634,"00000000") '00025634' Print format $ (25634,"000") '25634' '. 显示小数点,多余的数字按四舍五入处理 Print format $ (256.345,"##.####") '256.345' Print format $ (256.345,"###.##") '256.35' Print format $ (256.345,"00.0000") '256.3450' Print format $ (256.345,"000.00") '256.35' ', 分位作用,小数点左边开始每3位用一个逗号分开,逗号不要放在头部和靠经小数点 Print format $ (12345.78,"##,##.#") '12,345.78' Print format $ (256.345,"###,#.#") '12,345.8' '% 字符串尾部加% Print format $ (256.345,"00.0000%") '25634.5000%' '$ 字符串前边加$' Print format $ (256.345,"$00.####") '$256.345' '+ 字符串前加正号' '- 字符串前加负号' 'E+(E-) 用指数形式显示数值'
-
-
程序流程控制
分类
- 顺序结构
- 分支结构
- 循环结构
顺序结构
各语句按照先后顺序依次执行,从上往下依次执行每行代码。
流程图:
示例:
Dim x as Integer '第一步执行'
x = 20 '第二步执行'
print x '第三步执行'
选择结构1
-
单分支语句
-
块结构语法:
If 表达式 Then
语句块(一条或多条语句)
End If
-
单行结构语法:
If 表达式 Then 语句
❤表达式结果为逻辑值,如果表达式结果为数值类型,表达式值按非零为True,0为False进行判断
❤使用单行结构时,语句块中多条语句使用:分隔
-
执行流程
能
-
示例代码
'小明的考试成绩及格了就奖励一顿大餐 '块语句结构实现' Dim score as double '定义变量存储成绩' score = inputBox("请输入本次考试成绩:") '将键盘输入的值赋值给变量' if score>=60 Then '判断分数是否及格' MsgBox("吃大餐") '判断结果为真执行的语句块' End If '结束判断语句' '行语句结构实现' If score>=60 Then MsgBox("吃大餐"):MsgBox("看电影"):Msgbox("电玩城") '多条语句用:分割'
-
2.双分支结构
-
块状结构语法:
If 表达式 Then
语句块1
Else
语句块2
End If
-
行状结构语法:
If 表达式 Then 语句块1 Else 语句块2
-
执行流程:
-
-
示例代码:
'小明考试成绩及格就奖励一个蛋糕,不及格抄写试卷' '块语句结构实现' Dim score as double '定义变量存储成绩' score = inputBox("请输入本次考试成绩:") '将键盘输入的值赋值给变量' if score>=60 Then '判断分数是否及格' MsgBox("吃大餐") '判断结果为真执行的语句块' else MsgBox("抄写试卷") '判断结果为假执行的语句块' End If '结束判断语句' '行语句结构实现' If score>=60 Then MsgBox("吃大餐") else MsgBox("抄写试卷")
3.多分支结构
-
语法:
If 判断条件 Then 语句块1 ElseIf 表达式2 Then 语句块2 ... Else 语句块n End If
2.执行流程:
3.示例代码:
'小明考试成绩90分以上属于优秀,60~90之间良好,60以下需要努力'
Dim score as double '定义变量存储成绩'
score = inputBox("请输入本次考试成绩:") '将键盘输入的值赋值给变量'
if score>=90 Then '判断分数是否大于90分'
MsgBox("优秀") '判断条件1结果为真时执行的语句'
ElseIf score>=60 and score <90 '判断分数是否位于60~90区间内'
MsgBox("良好") '判断条件2结果为真时执行的语句'
Else
MsgBox("需要努力") '上边条件都不满足执行最后一项'
End If
4.IIf函数
语法:IIf(表达式,表达式为真执行的语句块,表达式为假执行的语句块)
示例:
IIf(5>3,"True","False") '结果为真,输出True'
选择结构2
Select Case语句
-
语法:
Select Case 变量或表达式 Case 表达式列表1 语句块1 Case 表 达式列表2 语句块2 ... Case Else 语句块n *表达式列表与变量或表达式的类型必须相同 *表达式列表可以是一个固定值(88),也可以是多个值(88,99,66),也可以是范围值(60 to 90)或关系表达式(score>90),或者以上几类组合使用。
2.示例代码
Dim score as double '定义变量存储成绩'
score = inputBox("请输入本次考试成绩:") '将键盘输入的值赋值给变量'
Select Case score
Case 85 To 100
MsgBox ("成绩优秀")
Case 60 To 84
MsgBox ("成绩合格")
Case Else
MsgBox ("成绩较差")
End Select
输入年份和月份,输出对应的天数。
Dim year as Integert '定义变量存储年份'
Dim month as Integer '定义变量存储月份'
year = inputbox("请输入年份") '键盘输入年份'
month = inputbox("请输入月份") '键盘输入月份'
'方案1'
'判断年份'
if (year mod 4=0 and year mod 100 <> 0) or year mod 400 = 0
select case month
case 1,3,5,7,8,10,12
print "31天"
case 4,6,9,11
print "30天"
case 2
print "29天"
case else
print "输入有误"
end select
else
select case month
case 1,3,5,7,8,10,12
print "31天"
case 4,6,9,11
print "30天"
case 2
print "28天"
case else
print "输入有误"
end select
end if
'方案2'
'判断月份'
select case month
case 1,3,5,7,8,10,12
print "31天"
case 4,6,9,11
print "30天"
case 2
if (year mod 4=0 and year mod 100 <> 0) or year mod 400 = 0
print "29天"
else
print "28天"
end if
case else
print "输入有误"
end select
选择结构比较
结构 | 适用场景 | 举例 |
---|---|---|
if | 单一判断 | 判断是否成年 |
if…else… | 两极分化场景 | 考试及格奖励否则惩罚 |
if…else if…else | 钟可能划分 | 根据考试成绩划分等级 |
select case | 等值判断或范围判断 | 判断不同月份的天数 |
循环结构
一些重复执行的操作适合使用循环结构来完成
-
Do while…循环
语法1: Do {while|Until} <循环条件> 语句块 [Exit Do语句] loop 执行流程:先判断后执行,判断条件为真,循环执行语句块内容 Exit Do语句表示当遇到该语句是,退出循环,继续执行后边的程序
执行流程:
示例代码:
'计算1+2+3+4+...+99的和' Dim x as Integer '定义变量存储每次加的数' Dim s as Integer '定义变量存储相加的和' x = 1 'x初始值为1' s = 0 'sum初始值为0' Do while x<=99 '设置循环条件x<=99' s = s+x '求和' x = x+1 '自变量+1' Loop Print "1+2+3+4...+99=",s '练习:计算1+3+5+...+99的和' '练习:假设一张纸的厚度为0.36mm,纸的面积无限大,求对着多少次厚度能超过珠穆朗玛峰(8848000mm)'
-
Do…while循环
语法: Do 语句块 [Exit Do] Loop {while|Until} <循环条件> 先执行,后判断,先执行一次语句块,如果判断条件为真继续重复执行。
执行过程:
示例代码:
'计算1+2+3+4+...+100的和'
Dim x as Integer '定义变量存储每次加的数'
Dim sum as Integer '定义变量存储相加的和'
x = 1 'x初始值为1'
sum = 0 'sum初始值为0'
Do
s = s+x '求和'
x = x+1 '自变量+1'
Loop While x<=99 '设置循环条件x<=99'
Print "1+2+3+4...+99=",s
'练习:设计一个恋爱脑程序,窗口标题为 你爱我吗? 如果回答我爱你则显示我也爱你,否则一直询问 你爱我吗?'
-
while…Wend
语法: while <循环条件> 语句块 Wend 执行逻辑与do while类似,循环条件为真重复执行语句块
示例代码:
'求1~100之间能被7整除的整数和' '打印1~100所有整数' Dim i as Integer '定义变量储存自变量1~100的数值' i = 1 '初始值为1' While i<=100 print i i=i+1 Wend '练习:求100以内所有能被7整除的数字之和'
-
for循环
语法: For 循环变量 = 初始值 to 最终值 [Step 步长] 语句块 [Exit For] Next [循环变量] 循环变量:是一个数值型变量 初始值,最终值,步长(默认为1)均为数值或数值表达式 Next语句后的循环变量必须与For语句后的循环变量相同,可省略
执行流程:
示例代码:
'计算1+3+5+7...+99' Dim sum as Integer '定义求和变量' Dim i as Integer '定义循环变量' sum = 0 '初始值为0' for i=1 to 99 step 2 sum =sum+i Next Print "1+3+5+7+...+99=";sum '练习:求1000以内所有的水仙花数 '水仙花的各位是为个位、十位、百位的数字立方和等于原数 '例如: '123是1³+2³+3³=1+8+27=123,就不是水仙花数 '371是3³+7³+1³=27+343+1=371是水仙花数 '猜数字游戏,随机生成一个1~100的随机数,键盘输入一个数字,如果输入的数字和随机生成的数字相同提示中奖,否则提示输入的数大于或小于目标数字'
-
循环结构比较
结构 特点 适用场景 do while… 先判断后执行 重复执行某个代码块,但不确定具体执行次数时,可以使用while循环。 do…while 先执行后判断 循环程序至少需要执行一次时可选用do…while循环 for 先判断后执行 按照固定次数重复执行某个代码块时使用for循环
结构嵌套
-
循环结构与选择结构可以随意嵌套,但是必须保证结构完整
循环嵌套
-
概念:简单来讲就是循环结构中嵌套循环结构
-
执行流程:外层执行一次,内层执行一遍
使用嵌套实现99乘法表
'实现下列图形 '***** '***** '***** '***** '***** Dim i As Integer Dim j As Integer For i = 1 To 5 For j = 1 To 5 Print "*"; Next Print "" Next '实现下列图形 '* '** '*** '**** '***** Dim i As Integer Dim j As Integer For i = 1 To 5 For j = 1 To i Print "*"; Next Print "" Next '实现99乘法表' Dim i As Integer Dim j As Integer For i = 1 To 9 For j = 1 To i Print Str(i) & "*" & Str(j) & "=" & Str(i * j) & " "; Next Print "" Next '实现下列图形 '***** '**** '*** '** '* Dim i As Integer Dim j As Integer For i = 1 To 5 For j = i To 5 Print "*"; Next Print "" Next '实现下列图形 ' * ' *** ' ***** ' ******* '********* '空格数=总行数-当前行数 '*数 = 当前行数*2-1' Dim i As Integer Dim j As Integer For i = 1 To 5 For j = 1 To 5 - i Print " "; Next For j = 1 To i * 2 - 1 Print "*"; Next Print "" Next
第四章 过程
过程:能完成某种特定功能,且能被反复调用的一组程序代码
分类:
- 事件过程
- 子过程
- 函数过程
- Property过程
- Event过程
事件过程
事件过程由VB自行声明,用户不能增加和删除,是当用户对某个对象发出一个动作时系统会通知VB产生一个事件,VB会自动调用该事件,例如按钮的点击,文本框内容的修改等等都属于事件过程。
语法格式:
private Sub 控件名_事件名(形参列表)
语句组
end Sub
子过程
当有几个不同的事件过程中需要执行相同的操作时,为了简化程序,可以将公共的语句放入分离开的子过程中(通用过程),并由事件过程调用它,这样不需要重复编写代码,维护也跟家容易。子过程不与任何事件过程相联系,只能由别的过程来调用。
创建子过程
-
视图方式
-
代码编辑(代码编辑器中选择通用)
-
语法:
[private|public] Sub 过程名称 (形参列表) 语句组 end Sub
作用范围:
static:静态的,每次调用时局部变量值保持不变
private:私有的,只能被当前模块所调用
public:公共的,可以被任意程序调用
**过程名:**长度不能超过255的字符类型的变量名 ,不能重复
**参数列表:**表示调用过程传入的参数的类型和个数,不能为定长字符串变量
-
-
特点
- end sub标志着子过程的结束。
- sub过程不能嵌套
调用子过程
-
使用call语句
Call 过程名(实参列表)
-
直接使用过程名
过程名 实参列表 '参数不加括号'
示例
定义子过程(无参过程)
public Sub dayin()
print "遥遥领先"
end Sub
事件过程调用子过程
private Sub Command1_Click()
call dayin()
'dayin() 效果相同
end Sub
点击按钮,界面打印“遥遥领先”
定义有参过程
Private Sub sub_jc(ByVal x As Integer, y As Long)
Print x
Print y
End Sub
事件过程调用有参过程
Private Sub Command1_Click()
Call sub_jc(3, 5)
End Sub
练习:计算一个求矩形面积的子过程。
函数过程
函数过程是另一种形式,当执行完过程需要返回一个值时,使用函数更方便,可以参考VB中的内部函数,例如sum(),str()等,只需传入参数就能的到函数值。内部函数不能满足我们的需求,可以自己编写function函数。
定义函数
-
对话框添加
-
编辑窗口添加
-
语法
[private | public | static] Function 函数名(形参列表)as type 语句组 函数名=表达式 end Function 'as后边时返回值类型,如果不指定给的话返回值为变体型 '函数的返回值通过"函数名=表达式"来赋值,如果取默认值,则返回类型对应的默认值,例如数值类型返回0,字符串类型返回空串
-
函数的调用
-
直接调用
函数名(实参列表)
-
使用Call调用
Call 函数名(实参列表)
-
无参函数的话直接使用函数名即可
‘定义函数 function a() a="Hello World" end function '调用函数' print a
练习:使用function编写一个判断输入的整数是奇数还是偶数。
参数分类
-
形式参数
定义过程或函数时规定的参数格式,可以是变量名和数组名,不能是定长字符串。
-
实际参数
调用过程或函数时实际传入的值,可以是变量名,数组名,常数或表达式调用时实参与形参按顺序一一对应。
传值与传址
按地址传送:形参默认使用按地址传送,或形参前加ByRef标识。简单来讲按地址传送就是形参是空架子,调用过程时实际使用实参,如果调用过程中值发生变化那么就会作用到实参。
'事件过程'
private sub Command1_Click()
Dim a as Integer,b as Integer
a = 10
b = 20
call test(a,b)
print a,b
end sub
'自定义子过程'
sub test(ByRef x as Integer,ByRef y as Integer)
x = x+10
y = y*2
print x,y
end sub
'运行结果:20 40
' 20 40
按值传送:形参前加ByVal标识,形参单独在内存 中开辟空间创建变量,然后将实参的值复制过来,所以调用过程时对参数值的修改不会影响到实参本身。调用结束后释放形参空间。
'事件过程'
private sub Command1_Click()
Dim a as Integer,b as Integer
a = 10
b = 20
call test(a,b)
print a,b
end sub
'自定义子过程'
sub test(ByVal x as Integer,ByVal y as Integer)
x = x+10
y = y*2
print x,y
end sub
'运行结果:20 40
' 10 20
指名传递
显式指出与形参结合的实参,把形参用” := “与实参连接起来。使参数不受位置限制。
sub test(first as Integer,second as Integer,third as Integer)
c = (first+second)*third
print c
end sub
'传统传值'
test 4,6,8
'指名传递'
test first:=4,second:=6,third:=8
test second:=6,first:=4,third:=8
test third:=8,second:=6,first:=4
数组作为参数
如果要传递的参数太多可以考虑使用数组,如果使用数组作为参数的话,那么形参中数组不能指定长度,调用过程或函数时,数组只写名称即可。
'定义数组参数
public fucntion sum(score() as single)
'调用
sum (score) 'score为数组名'
变量与过程的作用域
作用域:变量或过程的作用范围。程序中能够访问过程或变量的代码范围。
过程:
窗体/模块级:局部过程,指在定义过程时加上private关键字。这种过程只能被本窗体或本模块内的其他过 程调用,所有的事件过程都是局部的。
公用级:定义过程时用public修饰,这种过程可以被程序内的所有窗体或模块中的其他过程所调用。
变量:过程级变量:使用Dim声明的变量,变量只能在当前过程中使用。
窗体,模块级变量:在通用模块下使用dim或private修饰的变量,当前模块下的所有过程都可以使用。
全局变量:在通用模块下使用public修饰的变量。一经声明到处可以使用。(浪费内存,不建议使用)
过程的嵌套与递归(了解)
嵌套调用
过程定义不能嵌套,过程的调用可以嵌套。
private sub Commond1_click()
dim x as Integer
x = 18
print f(f(x,(f(x,x-1))),x-1)
end sub
function f(ByVal a as Integer,b as Integer) as integer
dim c as Integer
c = a-b : c = c+a : f =t+b
end function
'函数f共调用了三次,第一次调用的返回值作为下一次调用的参数。由内向外,运行结果为17'
递归算法
分为直接递归和间接递归,直接递归为在过程中调用过程本身,间接递归为调用另一个过程,另一个过程反向调用第一个过程。
private sub Command1_Click()
test 3
end sub
private sub test(x as integer)
dim i as integer
if x<>0 then
call test(x-1)
for i=1 to x
print x
next
end if
end sub
'点击事件调用test过程,test过程又多次调用其自身。
'运行结果:
'1
'2 2
'3 3 3
第五章 设计界面
窗体
-
初始窗体
-
窗体常见属性
-
属性名 说明 name 窗体名称 autoredraw 设置窗体是否重绘,调整窗体大小遮盖内容是否显示 backcolor 设置窗体的背景颜色 forecolor 设置窗体中显示图片和文本的前景颜色 caption 设置窗体标题 enable 设置窗体可用性 font 设置再窗体中显示文字的字体及大小 height、width 设置窗体的宽度和高度 icon 设置窗体图标 top、left 设置窗体距离容器的距离,单位为twip(缇) visible 设置窗体是否可见 -
属性的设置
- 通过视图设置
- 使用代码设置:窗体名.属性名 = 值
-
窗体的事件
-
click事件:窗体单击事件
示例:实现点击窗体,窗体位置发生变化功能
private Sub Form_Click() Form1.left = form1.left+300 From1.top = form1.top+300 end Sub
-
dbclick事件:规定事件内双击窗体
示例:实现双击窗体背景颜色随机变化功能
private Sub Form1_DbClick() dim r as integer,g as integer,b as integer '定义代表颜色的三个变量' r = int(rnd()*256) '随机生成红色的值' g = int(rnd()*256) '随机生成绿色的值' b = int(rnd()*256) '随机生成蓝色的值' Form1.BackColor = RGB(r,g,b) '利用RGB()函数为窗体的BackColor属性赋值' end sub
色值常数 颜色 vbblack 黑色 vbred 红色 vbgreen 绿色 vbblue 蓝色 vbcyan 青色 vbmagenta 紫红色 vbyellow 黄色 vbwhite 白色 -
initialize事件:当应用程序创建一个窗体时,将触发initialize事件。
-
load事件:窗体被加载时触发的事件。
示例:分别给窗体的initialize事件和load事件添加代码,运行程序观察两事件触发的先后顺序。
private Sub Form1_Initialize() MsgBox "窗体的Initialize事件被触发" end Sub
private Sub Form1_Load() MsBox "窗体的Load事件被触发" end Sub
程序解读:窗体的Initaialize事件先被触发,点击确定后Load事件被触发,再次确定后,窗体显示回来。
因为这两个事件是在窗体显示前被触发,因此在此事件中不可使用print方法输出,而要使用MsgBox函数输出。
-
unload事件:当窗口被关闭时,Unload事件被触发。
-
-
示例:
Private Sub Form_Unload(Cancel as Integer) msgbox "窗体的unload事件被触发~" end Sub
Cancel:非零值可以阻止该窗体从屏幕中删除,如果取值为0,则该窗体将被删除。
-
Activate事件和Deactivate事件
当一个窗体成为活动窗体时会触发Activate事件。(显示/获得焦点)
当一个窗体变为非活动窗体时就会触发Deactivate事件。
示例:
添加两个窗体,Form1和Form2,通过点击窗体上的按钮切换两个窗体为活动窗体和非活动窗体。观察Activate和Deactivate事件的触发情况。
步骤一:界面设计
步骤二:给窗体Form1的Activate事件和Deactivate事件添加如下代码:
private Sub Form_Activate() print "窗体1的Activate事件被触发!" end Sub private Sub Form_Deactivate() print "窗体1的Deactivate事件被触发!" end Sub
步骤三:给窗体Form2的Activate事件和Deactivate事件添加如下代码:
private Sub Form_Activate() print "窗体2的Activate事件被触发!" end Sub private Sub Form_Deactivate() print "窗体2的Deactivate事件被触发!" end Sub
步骤四:给按钮窗体1添加点击事件
private Sub Command1_Click() Form2.Show end Sub
步骤五:给按钮窗体2添加点击事件
private Sub Command1_Click() Form1.Show end Sub
步骤六:运行程序,观察结果。
窗体显示时或者获得焦点时触发Activate事件,失去焦点时触发Deactivate事件。
-
Resize事件:窗体尺寸发生变化时触发
-
-
窗体的方法
方法是用来定义窗体的各种行为的。可以使窗体进行哪项操作。
语法:窗体名称.方法
-
窗体的加载与卸载方法
- load:加载窗体,将窗体加载到内存中,并不代表显示窗体
- unload:卸载窗体,将窗体从内存中删除。
-
窗体的显示与隐藏方法
- show:让窗体显示
- hide:让窗体隐藏
-
窗体的清除方法
- cls:清楚窗体中的显示的文本或图形。
-
移动窗体的方法
-
move:移动窗体,并可改变其大小
使用:窗体.Move left,top,width,height
left参数不可省略
-
refresh:重绘窗体
-
-
-
多个窗体的工程
-
设置启动窗体
工程---->工程属性------->启动对象
-
动态设置启动窗口
动态设置启动窗口需要将Sub Main子过程设置为启动程序
添加标准模块,在模块中编写如下代码:
Sub Main() Dim n as Integer n = inputBox("请输入0或1,以设置启动窗体!") if n=0 then Form1.show else Form2.show end if end Sub
-
-
-
控件
-
控件的分类
- 内部控件:内部控件是由VB本身提供的,在工具箱中显示的控件。
- ActiveX控件:控件箱的扩充部分,使用之前需要手动添加至工具先内。
- 鼠标右键点击工具箱。
- 选择“部件”命令。
- 在“控件”选项卡中单机控件复选框,选择需要添加的ActiveX控件。
- 单击确定按钮,添加成功。
- 插入对象:可插入BMP图片、PPT幻灯片等对象。
-
控件的公共属性
- name:控件名称
- left/top:调整距离顶部和左边的距离
- width/height:控件的宽的和高度
- enable:控件是否可用
- font:设置控件文字的字体,字形,大小和效果
- index:索引标识,常见于控件数组中
- visible:设置控件是否可见
-
控件的公共方法
- move:移动控件
- refresh:刷新控件
- setfocus:为控件设置焦点
-
控件的公共事件
- click
- dbclick
- gotfocus
- lostfocus
- change
-
访问键
命令按钮,复选框,选项按钮都可以创建访问键(快捷键)
控件caption属性中加入&符号即可创建访问键
-
标签(Lable)控件
-
功能说明
显示在程序运行中不能编辑的文字信息
-
常用属性
caption:显示内容
alignment:设置文本内容对齐方式,0:左对齐 1:右对齐 2:居中
autosize:设置标签根据文本内容自动改变长度
wordwrap:设置标签根据文本内容自动改变高度
-
-
文本框(TextBox)控件
-
功能说明
显示文本信息,接受用户输入的文本信息
-
常见属性
text:设置文本框中显示的内容
alignment:设置文本框中文本的对齐方式
maxlength:设置文本框中最多可容纳的字符数
multiline:设置文本框能否输入多行文本
passwordchar:设置文本框中内容加密
selstart:设置文本在文本框中的插入位置
sellength:设置返回选中文本的字符数
seltext:设置或返回选中的文字
-
常用方法
refresh:刷新文本框内容
setfocus:使文本框获得焦点
-
常用事件
change:文本框内容修改
gotfocus:文本框获得焦点
lostfocus:文本框失去焦点
-
-
命令按钮(commandbutton)控件
>
> lostfocus:文本框失去焦点
- 命令按钮(commandbutton)控件