当前位置: 首页 » 中职教育 » VB笔记

VB笔记

▲ VB程序设计步骤:

    1 新建工程

2 设计界面

3 设置属性

4编写代码

5 运行调试

6 保存、生成

 

▲ VB工程的相关文件

  .frm    窗体文件

  .vbp    工程文件

.vbw    工作区文件

  .frx     数据文件

  .bas     标准模块文件

  .cls     类模块文件

  .vbg    工程组文件

  .res    资源文件

※注意:一个VB工程必须包含窗体文件(.frm) 和工程文件(.vbp)。

 

▲ 如何将VB程序保存到另一个位置

  1、*.frm另存为(另存窗体文件)

  2、文件→工程另存为(另存工程文件)

※注意:必须先另存窗体文件再另存工程文件,否则保存后打开vbp工程文件会提示“找不到路径……”。

(如果报“找不到路径……”错误,可以用记事本打开vbp文件,将第二行“Form=”后面的路径部分去掉只留文件名Form=Form1.frm就可以解决)

 

▲ 如何添加窗体

  (工程资源管理器中)右键单击工程名→添加→添加窗体

 

▲ 如何设置启动对象

  右键单击工程名→工程属性→通用→启动对象→选择启动窗体

 

▲ 窗体(Form)的常用属性、事件、方法

 

1常用属性

Name      名称

BorderStyle   边框类型(Fixed dialog与Fixed single的区别是前者不可以设置最大最小化按钮)

Caption   标题

Icon         图标

Left   左边距

Top 上边距

Width   对象宽度(窗体还有个ScaleWidth属性,其值不含边框尺寸)

Height   对象高度(窗体还有个Scale Height属性,其值不含边框尺寸)

AutoRedraw      自动重绘

Enabled   对象是否可用 (True 是False 否)

Visible   控件是否可见

Picture   图片属性

Font          字体  

FontName     名称

FontSize     大小

FontBold     加粗

FontItalic    倾斜

FontStrikethru    删除线

FontUnderline    下划线

ForeColor         前景色

BackColor         背景色

MaxButton 是否显示最大化按钮

MinButton 是否显示最小化按钮

WindowState 窗口状态  0:正常 1:最小化 2:最大化

 

※注意:Name属性只能通过属性窗口修改,不能在程序运行时通过代码修改。

 

2常用事件(选择方法:在代码窗口左边下拉列表中选择要操作的对象,右边下拉列表中选择相应的事件)

Load            加载(默认)

Activate 激活(标志:窗体可见)

ULoad     卸载

MouseDown     鼠标按下(Button参数:三键鼠标:0左键 1右键 2中建 两健鼠标:1左键2 右键)

MouseUp        松开鼠标

Click     鼠标单击

DblClick 鼠标双击

GotFocus 获得焦点

LostFocus 失去焦点

MouseMove     鼠标移动(参数X、Y返回鼠标坐标)

KeyDown       键盘健按下(KeyCode参数返回按键扫描码,不区分上下档(有上下档的统一返回上档健字符扫描码; Shift参数返回值:1代表按下shift键,2代表按下 ctrl键,4代表按下alt键,7代表同时按下了三键))

KeyUp          键盘健弹起

KeyPress 按键时触发(KeyAscii参数返回所按健的ASCII码值;如果在KeyPress事件过程中执行KeyAscii = 0语句,则阻止输入按键字符)

DragOver        在窗体内用鼠标拖动其他控件

DragDrop 在窗体内用鼠标拖动其他控件后释放鼠标

 

※注意:

① 鼠标事件的相应顺序:MouseDown → MouseUp → Click → DblClick

    按键事件的相应顺序:KeyDown → KeyPress → KeyUp

  ② Ctrl、F1等非字符健只能通过KeyDown和KeyUp事件捕获。

  ③要触发窗体的DragOver和DragDrop事件,窗体内被拖动的控件其DragMode属性必须设为1(即自动拖动模式),或者在其MouseDown事件过程中通过执行Drag方法手动启动拖动,如:Text1.Drag

 

3常用方法

Show 显示

Hide 隐藏

Move 移动控件    

格式:Object.Move(Left As Single,[Top],[Width],[Height])

  例:  Me.move  6000,4000     ‘将窗体移动到(6000,4000)点位置

  注:如果省略Object(控件名称),则移动当前对象。

Print 在窗体上显示字符串和表达式的值

Cls 清除Print方法显示的内容

SetFocus 设置焦点(使成为活动窗体)

 

▲ 标签(Lable)的常用属性、事件、方法

 

1常用属性

Caption 标题

Alignment      对齐方式 (0 左对齐1 右对齐2 中间对齐)

AutoSize 控件对象的大小是否随标题内容的大小自动调整

BackStyle 设置标签背景是否透明: 0 透明1 不透明

BorderStyle      边框样式:0 无边框  1 固定单线框

DragMode 拖动模式 (0 手动  1 自动)

 

※注意:BackStyle 设为透明后BackColor属性设置无效。

 

2 常用事件

Click     鼠标单击(默认)

DblClick 鼠标双击

 

3 常用方法

Drag              手动拖动

例:Label1.Drag   1 ‘开始拖放(1为Drag方法默认参数,可省略)

参数说明:

参数常量 值 含义

vbDragCancel 0 放弃拖放

vbDragBeginDrag 1 开始拖放(默认)

vbDragEndDrag 2 完成拖放

 

※注意:标签控件不能接收焦点,因此它没有GotFocus、LostFocus事件和SetFocus方法。

 

 

▲ 文本框(TextBox)的常用属性、事件、方法

 

1常用属性

Alignment 对齐方式 (0 左对齐1 右对齐2 中间对齐)

Locked 是否允许编辑。(设为False时能接收焦点但是不能编辑)

Text 显示的文本内容

MaxLength    允许输入的最大字符数(最多允许输入65535个字符)

MultiLine 是否可以输入多行文字(若该属性为False时,文本框控件对象的Alignment属性和ScrollBars属性无效)

PasswordChar    设置/返回控件的显示字符(常用于隐藏密码)

例:Text1.PasswordChar = “*”        ‘字符以”*”形式显示

Text1.PasswordChar = “”         ‘取消隐藏

ScrollBars   设置滚动条模式(0 无滚动条1 水平滚动条2 垂直滚动条3 水平和垂直滚动条)

SelStart 设置选中字符的开始位置,第一个字符的位置为0。

SelLength 设置选择字符个数

SelText 返回选中文本

 

※注意:

①SelStart 、SelLength和SelText只能通过编写代码设置属性值。
②通过设置SelStart、SelLength来选中文本时,文本框必须获得焦点才能显示选中效果。

 

2常用事件

Change         内容改变时触发(默认)

Validate        文本框失去焦点前触发

KeyPress        用户敲击键盘时触发

 

说明:

(1) Validate事件早于LostFocus事件触发,常用于校验输入数据是否符合要求;(参见P65)。只有在下一个即将获得焦点的控件的CausesValidation属性值设置为True时,Validate事件才发生。

(2) 如果在KeyPress事件过程中执行KeyAscii = 0语句,则会阻止输入按键字符。

 

3常用方法

SetFocus 获取输入焦点

4事件应用例子:

(1)限制Text1文本框内容只能是数字字符

方法1:Private Sub Text1_Change()

    For i = 1 To Len(Text1.Text)

      x = Asc(Mid(Text1.Text, i, 1))

      If x < 48 Or x > 57 Then

        MsgBox “请输入数字”, , “输入”

        Text1.Text = “”

        Text1.SetFocus

        Exit For

      End If

    Next i

End Sub

方法2:Private Sub Text1_Change()

           If Not IsNumeric(Text1.Text) Then

               MsgBox “请输入数字”, , “输入”

               Text1.Text = “”

               Text1.SetFocus

           End If

End Sub

(2)限制Text1文本框只接收数字键和退格键

Private Sub Text1_KeyPress(KeyAscii As Integer)

     If (KeyAscii < 48 Or KeyAscii > 57) And (KeyAscii <> 8) Then    ‘退格键码值为8

         KeyAscii = 0

     End If

End Sub

(3)设置文本框内容为选中

 Text1.SetFocus

     Text1.SelStart = 0                 ‘设置选中开始位置

     Text1.SelLength = Len(Text1.Text)      ‘指定选中长度

※说明:设置SelStart和SelLength属性后, Text1.SelEext属性值即为文本框选中的字符。

 

 

▲ 框架控件(Frame)的常用属性、事件、方法

 

1 常用属性

Caption 标题

Enabled 对象是否可用 (True 是False 否)

Visible  控件是否可见

 

2 常用事件

DragOver 在框架内用鼠标拖动其他控件

DragDrop 在框架内用鼠标拖动其他控件后释放鼠标(默认)

 

3 常用方法

Move 移动

Drag        手动拖动

 

※注意:

① 如果Enagled 为False,则框架内部的所有控件都不可用。
② 早于框架控件创建的其他控件必须通过剪切、粘贴的方式才可以放入到框架内部,无法直接拖入。

 

▲ 命令按钮(CommandButton)的常用属性、事件、方法

 

1常用属性

Caption 标题

Style 样式

Picture 背景图案

Default 设定是否为默认的确定按钮

Cancel 设定是否为默认的取消按钮

ToolTipText      鼠标悬停时的提示文本

 

※注意:

① Style属性设为Graphical(图形)时通过Picture属性设置背景色才有效。
② Default属性值为True时用户按下Enter键,就相当单击该按钮;Cancel属性值为True时按下“Esc”键相当单击该按钮。

 

2常用事件

Click        单击(默认)

※注意:命令按钮不支持DblClic鼠标双击事件。

 

3 常用方法

Drag 手动拖动

Move 移动

SetFocus 设置焦点

 

4设置按钮的快捷键(运行时按Alt+设定的快捷字母)

  格式:题 + & + 快捷字母(一般用大写)     

  例: 退出&E     ‘按快捷建Alt+E 相当与单击“退出”按钮

 

 

▲ 时钟控件(Timer)的常用属性、事件、方法

 

1常用属性

Enabled  对象是否可用 (True 是False 否)

Interval 获得或设置两次调用Timer控件的Timer事件间隔的毫秒数。

 

2常用事件

Timer           按设定的时间间隔自动触发的Timer事件(默认)

 

※注意:时钟控件没有预定义的方法。

 

 

▲ 水平滚动条控件(HScrollBar)和垂直滚动条控件(VScrollBar)的常用属性、事件

 

1常用属性

Value 设置或返回滑块当前位置值

Max   定义Value属性值的最大值

Min   定义Value属性值的最小值

LargeChange 设置单击滚动条中间区域时滑块移动的距离(值)。

SmallChange 设置单击滚动条两端箭头时滑块移动的距离(值)。

 

2常用事件

Change 当Value值发生变化时触发该事件(默认)

Scroll 拖动滑块时触发该事件

 

3 常用方法

Drag 手动拖动

Move 移动

SetFocus 设置焦点

 

※注意:

① 在拖动滑块释放鼠标、单击滑块两侧区域、单击箭头,或者通过代码修改了Value属性值,导致Value属性值发生变化,都会触发Change事件。

② 在拖动滑块时,Value属性值不会发生变化,只有在拖动后释放鼠标, Value属性值才变化。

 

 

▲ 单选钮控件(OptionButton)的常用属性、事件

 

1常用属性

Style 设置对象的外观形式    0:标准   1:图形界面

Value 获得或设置单选钮处在什么状态。    False: 未选中     True:选中

 

2常用事件

Click          单击(默认)

 

3 常用方法

Drag 手动拖动

Move 移动

SetFocus 设置焦点  (‘单选按钮获得焦点等同于被选中)

 

 

▲ 复选框控件(CheckBox)的常用属性、事件、方法

 

1常用属性

Style          设置对象的外观形式    0:标准   1:图形界面

Value 获得或设置单选钮处在什么状态。    0: 未选中  1:选中   2: 选中并置灰

 

2常用事件

Click          单击(默认)

 

3 常用方法

Drag 手动拖动

Move 移动

SetFocus 设置焦点 (复选框获得焦点并不等同于被选中)

 

▲ 列表框控件(ListBox)、组合框控件(ComboBox)的常用属性、事件、方法

 

1常用属性

List 项目列表(数组)

ListCount 返回列表框中项目的数目。(只读)

ListIndex 设置或返回控件中当前选中项目的索引(未选中时值为-1)

Style 样式

列表框样式: 0 Standard(标准)  1 Checkbox(复选框样式:开头带个方框)

组合框样式: 0 下拉式组合框(默认)  1 简单式组合框   2 下拉列表框

Text           当前选中项的内容

MultiSelect      是否可以多选(组合框没有该属性)

Selected 返回元素对应的列表框项是否被选中的逻辑数组(组合框没有该属性)

2常用事件

Click           单击(列表框默认事件)

Change         在上方文本框中手动输入,使内容发生变化时触发(组合框默认事件)

注意:组合框进行项的选择操作一般在单击事件过程内进行处理.

3常用方法

AddItem 添加列表项(参数是代表列表项内容的字符串型数据,还可以跟一个代表插入位置的整形可选参数)

例:List1.AddItem “游泳” , 3     ‘3是代表插入位置  

RemoveItem 删除列表项(参数是代表列表项位置的整形数据)

例:List1.RemoveItem  3 ‘删除第3项

Clear 清除所有列表项

例:List1. Clear

 

4 应用举例

(1)列表框、组合框的取消选中

①列表框取消选中

  A 单选的取消

List1.ListIndex=-1

  B 多选(MultiSelect属性为True)的取消

For  i = 0 To List1.ListCount – 1

        If List1.Selected( i ) = True  Then            ‘Selected为逻辑数组

            List1.Selected( i ) = False

        End If

Next i

②组合框的取消选中

方法1  Combo1.ListIndex=-1

方法2  Combo1.Text= “”

(2)列表框、组合框的删除选中

①列表框删除选中

  A 单选的删除

List1.RemoveItem  List1.ListIndex

  B 多选(MultiSelect属性为True)的删除

For  i =  List1.ListCount – 1  To  0  Step  -1   ‘必须从大到小循环

        If List1.Selected( i ) = True  Then

    List1.RemoveItem  i

        End If

Next i

②组合框的删除选中

Combo1. RemoveItem  Combo1.ListIndex

 

▲ 控件数组

 

1、什么是控件数组

控件数组是由一组相同类型的控件组成的控件组。

控件数组中的控件称为控件数组元素,所有控件数组元素共享相同的事件过程。

2、组成控件数组的条件

    名称必须相同

    类型必须相同

3、控件数组元素的命名:

名称(索引值)     

例:  Command1(0)    ‘这里的索引值即控件数组事件过程中的Index参数

4、控件数组的创建方法

方法1:  通过给控件重命名的方式创建

方法2:  通过复制粘贴的方式创建

※注:以上两种方法都会自动设置索引值(即Index属性)

5、控件数组的取消步骤

     (1)将名称(Name属性)改为不同的值

     (2)把索引值(Index属性)清空

 

 

▲ 坐标系(P168)

 

 1.分类 屏幕坐标系: 屏幕左上角为原点(0,0)

窗体坐标系: 窗体左上角为原点(0,0)

自定义坐标系: 可以自定义左上角坐标

 

 2.度量单位:缇(Twip)、像素、磅、英寸

   说明:VB默认的度量单位是缇;更改单位由Scalemode属性决定。  

          1英寸=1440缇

     1厘米=567缇

     1磅=20缇

 

 3.如何设置自定义坐标系

   方法1:用容器对象的Scale方法来定义。

格式:

Object.Scale(x1,y1)-(x2,y2)   ‘(x1,y1)为左上角坐标,(x2,y2)为右下角坐标

        例:

Picture1.Scale(100,50)-(400,300)

 

   方法2:设置容器对象的ScaleLeft、ScaleTop、ScaleWidth和ScaleHeight属性

       例:

         Picture1.ScaleLeft=100

Picture1.ScaleTop=100

Picture1.ScaleWidth=300

Picture1.ScaleHeight=200

 

▲ 图片框控件(PictureBox)的常用属性、事件、方法(P170)

 

1 常用属性

Picture 设置和清除图像

AutoRedraw     是否重绘(该属性值设为True时,还原最小化窗体时能重绘内容)

AutoSize 是否自动调整大小(该属性值设为True时,图片框会根据图像大小自动缩放)

DrawMode 设置线条颜色的产生方式,默认值是13,用前景色画线(P171表)

DrawStyle 设置线条类型(P172表)

样式: 0-实线(默认) 1-断线 2-点线  3-断点组合线 4-断点组合线  5-透明线  6-内部实线  

DrawWidth 设置线条宽度

FillColor 设置填充颜色

FillStyle 设置填充方式(P172表)( 填充样式中的线条颜色由FillColor属性决定 )

样式: 0-实心 1-空心(默认)2-水平线  3-垂直线 4-向右对角线  

5-向左对角线  6-十字交叉线  7-对角交叉线

CurrentX

CurrentY 设置或返回下一次绘图的起点坐标(设计时不可用)

2 常用事件

Click           单击(默认)

 

3 常用方法

Scale   自定义坐标系

格式:Scale (x1,y1) – (x2,y2)

例:  Picture1.Scale (-300, -200)-(300, 200) 

说明:x1,y1定义原点在新坐标系中的坐标值,x2,y2定义右下角在新作弊系中的坐标值。

 

Pset 画点

格式:PSet[Step] (x,y)[,颜色]     ‘颜色指线条颜色,颜色表示方法参见P39   

例:Picture1.PSet (1000, 1000)

 

Line 画直线和矩形

格式:Line[Step] [(x1,y1)]-(x2,y2)[,颜色][,B[F]]  

例:  Picture1.Line (0, 0)-(100, 100), vbGreen            ‘画线

 

Rem 画矩形必须带上线条颜色参数

Picture1.Line (-300, -200)-(-100, -100), , B   ‘画矩形(不指定线条色则由ForeColor属性决定)

Picture1.Line (-300, 200)-(-100, 100), vbGreen, B      ‘画矩形 (指定线条颜色vbGreen-绿色)

Picture1.Line (100, 100)-(300, 200), vbGreen, BF       ‘画矩形 (BF忽略FillColor由线条色填充)

 

Circle   画圆、椭圆、圆弧及扇形

格式:Circle[Step] (x,y),半径[,颜色][,起始角][,终止角][,长短轴比率]     

说明: ①(x,y)为圆心坐标

②起始角、终止角按逆时针方向

③起始角、终止角的值是弧度值

计算公式:  弧度=角度 * PI / 180         ‘PI为自定义常量(Const PI=3.1415926)

角度=弧度 * 180 /PI

④起始角、终止角前面加负号时画的是扇形

⑤长短轴比率,值1为正圆、小于1为水平椭圆、大于1为垂直椭圆,按值伸缩

例: Picture1.Circle (0, 0), 100, vbBlack            ‘画圆

Picture1.Circle (200, -100), 100, vbBlack, , , 0.9      ‘画椭圆

Picture1.Circle (0, 0), 200, vbYellow, 135 * 3.14 / 180, 225 * 3.14 / 180        ‘画圆弧

Picture1.Circle (0, 0), 150, vbMagenta, -135 * 3.14 / 180, -225 * 3.14 / 180     ‘画扇形

Print 打印文本(注意:在代码窗口输入时该方法不会有自动提示)

Point 返回指定点的颜色(返回值类型为Long)

Cls 清除绘制的图形和文本(清除之后,CurrentX和CurrentY值恢复为0)

ZOrder        设置控件的叠放顺序       ‘ZOrder 0 移到顶层 ,ZOrder 1 移到底层。

 

 

▲ 图像控件(Image)的常用属性、事件、方法(P174)

 

1 常用属性

Picture 设置和清除图像

Stretch 调整大小的方式   值为Ture是根据框的大小调整图像大小, 值为False是根据图像大小调整框的大小。

2常用事件

Click           单击(默认)

3 常用方法

ZOrder        设置控件的叠放顺序       ‘ZOrder 0 移到顶层 ,ZOrder 1 移到底层。

 

※ 给图片框/图像框控件设置图片(Picture属性)的两种方法(以图片框为例,图像框同理)

1  通过Picture属性栏设置

2  通过代码设置(使用LoadPicture函数)(P170例)

例:

Picture1.Picture = LoadPicture(“D:\花朵.jpg”)            ‘加载图片(绝对路径)

Picture1.Picture = LoadPicture(App.Path  &  “\ ”  &  “\风景.jpg”)    ‘加载图片(绝对路径)

Picture1.Picture = LoadPicture(“风景.jpg”)       ‘加载图片(相对路径,图片在程序当前目录下)

Picture1.Picture = LoadPicture             ‘清除图片(不带参数)

说明:1 App.Path代表当前应用程序所在目录;

      2 如果用App.Path拼接图片路径字符串,则在App.Path和图片文件名之间必须加一个代表目录分隔符的反斜杠”\ “;

 

 

▲ 形状控件(Shape)的常用属性

 

Shape 返回或设置形状    样式: 0-矩形 1-正方形2-椭圆  3-圆 4-圆角矩形  5-圆角正方形

BorderColor 边框颜色

BorderWidth 边框宽度

BorderStyle 边框样式    (注意与图片框控件的DrawStyle样式值的区别)

样式:  0-透明线1-实线(默认)2-断线  3-点线 4-断点组合线  5-断点组合线  6-内部实线

FillColor 填充颜色

FillStyle 填充样式(与图片框的FillStyle设置值相同)

DrawMode 线条颜色产生方式(与图片框的DrawMode设置值相同)

 

▲ 线形控件(Line)的常用属性

X1 起点横坐标

Y1 起点纵坐标

X2 终点横坐标

Y2 终点纵坐标

※注意

① 形状控件和线形控件都不支持任何事件!

② 如果先画图形控件,后画图片框控件,这时要把图形控件装入图片框容器,必须用剪切粘贴的方式而不能直接拖入。

③ 如果将窗体作为图形控件的容器,必须将窗体的ScaleWidth和ScaleHeight属性值设为窗体的宽度和高度值(即自定义坐标系),否则图形控件无法准确定位。

 

▲ 驱动器下拉列表框控件(DriveListBox)的常用属性、事件、方法(P186)

1 常用属性

Drive 运行时返回或设置所选定的驱动器名称

List 驱动器列表(数组)

ListCount 返回驱动器数目。

ListIndex 设置或返回当前选中驱动器的索引

2常用事件

Change 每次重新设置Drive属性都会引发Change事件

例:Private Sub Drive1_Change()

     Dir1.Path = Drive1.Drive    ‘将驱动器列表框的驱动器号赋给目录列表框

End Sub

3常用方法

ReFresh 刷新

 

▲ 目录列表框控件(DirListBox)的常用属性、事件、方法

 

1常用属性

Path 运行时返回或设置当前路径

List 当前驱动器下子目录列表(数组)

    说明: List(-2) 返回上级目录

List(-1) 返回当前目录

List(0) 返回当前目录下第一个子目录

List(1) 返回当前目录下第二个子目录

例: Dir1.Path = Dir1.List(-2)   ‘将上级目录设为当前目录

Dir1.Path = Dir1.List(0)        ‘将当前目录下第一个子目录设为当前目录

ListCount 当前目录下子目录数目

ListIndex 设置或返回当前选中目录的索引

2常用事件

Change 每次重新设置Path属性都会引发Change事件

例: Private Sub Dir1_Change()

     File1.Path = Dir1.Path      ‘将目录列表框的路径赋给文件列表框

End Sub

3 常用方法

ReFresh 刷新

※提示:双击目录列表框中的某个目录,就会显示出该目录下的所有子目录。

 

▲文件列表框控件(FileListBox)的常用属性、事件、方法

 

1常用属性

Path 返回文件列表框中显示的文件所在的路径。

Pattern 返回或设置文件列表框所显示的文件类型(可用使用通配符)。

FileName 返回或设置选中文件的文件名和路径(返回时只返回不带路径的文件名,设置时可用带路径。)

List 文件列表框中显示的文件列表(数组)

ListCount 文件数目。

ListIndex 设置或返回当前选中文件的索引

2常用事件

PathChange 每次重新设置Path属性都会引发PathChange事件

3常用方法

ReFresh 刷新

 

 

▲ VB颜色设置的四种表示方式

 

1、使用RGB(r,g,b)函数表示:r表示三原色里的红色分量,g表示三原色里的绿色分量,b表示三原色里的蓝色分量,各色取值范围都是0-255

   例:  RGB(255,0,0)    ‘表示红色

         RGB(0,0,255)    ‘表示蓝色

2、使用十六进制方式:&HFFFFFF  (&H开头,每两个FF代表一个颜色分量,从右到左分别是红、绿、蓝

   例:  &H0000FF     ‘表示红色(左边全是0的可以省略)简化为&HFF

         &HFF0000     ‘表示蓝色( 右边全是0的不能省略)

   ※注意:当左边蓝色分量值为0时,尾部必须加上字符“&”否则报错,如&HFF3D&

3、用常量表示:

   例:   vbRed      ‘表示红色

          vbBlue     ‘表示蓝色     

4、使用QBColor(color)函数表示(参见P39表)

   例:   QBColor(1)     ‘表示蓝色

  QBColor(4)     ‘表示红色

 

▲ 数据类型

 

1什么叫数据:数据是指所有能输入到计算机并被程序处理的符号的集合。

2数据类型的分类

  数据类型分标准类型(也叫基本类型)和用户自定义类型两种。

3常用数据类型

  整形:Integer (%)    

  长整形: Long  (&)    

  单精度型:Single (!)   

  双精度型:Double(#)    

  逻辑型:Boolean         

  日期型:Date           

  字符串型: String ($)   

  变体型:  Variant        

4 检测数据类型的相关函数(P74、P94)

VarType(N)          返回参数N数据类型对应的整形值

TypeName(N)         返回参数N数据类型对应的类型名称

    例: VarType(698) ‘返回2(代表整形)

TypeName(“中国名胜”) ‘返回String

 

▲ 变量与常量(本质是存放数据的一块内存空间)

 

1 变量命名

规则:变量名只能由字符、数字和下划线构成,而且不能以数字开头,不能超过255个字符

2变量声明

(1) 变量声明的两种方式:显式声明与隐式声明

显式声明:先声明再使用

隐式声明:未声明直接使用(默认为变体型)

(2) 变量声明

  格式  Dim 变量名[as 数据类型]

  例:  ‘定义一个名为str的字符串型变量

Dim  str as String         

  ‘定义一个名为str的字符串型变量和一个名为n1的整形变量

  Dim  str as String ,   n1 as Integer

  ‘定义一个名为str的变体型变量和一个名为n1的整形变量

Dim  str ,   n1 as Integer

※注意:一行可以定义多个变量(用逗号隔开);

  如果变量名后面不跟数据类型则默认为变体型3声明(定义)符号常量。

3声明(定义)符号常量

  格式  Const  常量名[as 数据类型] = 表达式

  例:  Const   PI As Single = 3.1415926

4 强制变量声明

语句:Option Explicit ‘写在代码顶部

作用:强制变量必须先声明再使用,可以降低因写错变量名而引起的麻烦。

 

▲ 运算符与表达式

 

1 什么叫运算符:实现某种运算的符号

2 运算符的分类及其常用运算符

   算术运算符:   ^ – * / \ Mod + –

   字符串运算符: & +

   关系运算符:   =  >  >=  <  <=  <>

   逻辑运算符:   Not  And   Or

3 运算符的优先级:算术运算符 > 字符串运算符  > 关系运算符  > 逻辑运算符

   ( 可以用圆括号()改变运算顺序 )

※注意:字符串运算符推荐用“&”;用“+”运算符连接字符串时,如果其中某个连接项是数值型数据会产生错误,解决方法是将该项用CStr()函数进行转换。

4 表达式:用运算符和圆括号将操作数(变量、常量、函数)连接起来的有意义的式子。   

例:(a + b) * h / 2            ‘计算面积

5 数学代数式与VB表达式

      数学代数式                              VB表达式

 10 x |(10 – 1 ÷ 2)+ |- 6 →    10 * Abs((10 – 1 / 2)+ 3^2)- 6

6 运算符与表达式应用例子

(1)如何判断一个数是否是另一个数的倍数

a / b = a \ b       ‘也可以用 a Mod b= 0判断

 

▲ 函数

 

1、 什么叫函数:函数是指能实现特定功能或完成某种运算的程序段

2、函数的分类

   函数分为内部函数和用户自定义函数两类

3、函数使用格式

   函数名 [(参数列表)]

4常用内部函数

  • 数学函数

Abs(N): 求N的绝对值

Sqr(N): 求N的平方根

Rnd(N): 求0和N之间(包括0、不包括N)的双精度随机数

    ( ※在使用该函数的代码前面必须加上初始化随机数生成器语句:Randomize )

Int(N): 求整(返回不大于N的最大整数)

CInt(N):转整(将N转为最接近的偶数整数)

Fix(N): 取整:截取N的小数部分求整数

※产生两个数之间(包含两个数)的随机整数的计算公式:  Int(Rnd*(大数-小数+1))+ 小数

 

(2) 字符串函数

Len(s) 求字符串的长度(字符个数)

Left(s,n) 从s字符串左边开始取n个字符

Right(s,n) 从s字符串右边开始取n个字符

Mid(s,n1,[n2]) 从s字符串左边第n1个位置开始向右取n2个字符

Instr([n1,]s1,s2) 返回字符串s2在字符串s1中的位置,如Instr(2,”DECDEF”,”DE”) = 4

InstrRev([n1,]s1,s2) 从右往左数,返回字符串s2在字符串s1中的位置

Asc(s) 求字符串s第一个字符的ASCII码值   如:  Asc(“a”)  →  97

Chr(N) 求SACII码值N的对应字符           如: Chr(65)   →  “A”

Str(N) 将N转换为字符串(如果N≥0则返回的字符串开头包含一个前导空格)

Cstr(N) 将N转换为字符串(返回的字符串开头不含前导空格)

Val(s) 将字符串s中开头数字字符转成数值型(Double)数据

Trim(s) 去掉s字符串两边的空格

LTrim(s) 去掉s字符串左边的空格

RTrim(s) 去掉s字符串右边的空格

UCase(s) 将s字符串中所有小写字母转换为大写

LCase(s) 将s字符串中所有大写字母转换为小写

String(n,s) 返回由n个首字符组成的字符串    如: String(3,”AB”) = “AAA”   

Space(n) 返回n个空格

 

 (3) 常用日期、时间串函数

Date 返回系统日期

Time 返回系统时间

Timer               返回午夜到当前经过的总秒数(含两位小数的单精度型)

Now 返回系统当前日期和时间

Year(D) 返回指定日期的年份

Month(D) 返回指定日期的月份

MonthName(N)    返回代表月份的N对应的中文月份

如:MonthName(Month(#2017-6-1#))        ‘显示“六月”

Day(D) 返回指定日期的日子

Weekday(D) 返回指定日期的星期几,如:Weekday(“2017-6-1”)返回值为5 (星期四)

WeekdayName(N) 返回代表星期几的N对应的中文星期

如:WeekdayName(Weekday(#2017-6-1#))     ‘显示“星期四”

Hour(T) 返回指定时间的时数

Minute(T) 返回指定时间的分数

Second(T) 返回指定时间的秒数

DateSerial(年,月,日) 返回一个日期(参数是数值型)    如:DateSerial(2016,10,9)

DateValue(C) 返回一个日期(参数是字符串型)  如:DateValue(”2016,10,9″)

DateAdd(时间单位,T,D) 返回日期D加上T之后的日期

DateDiff(时间单位,D1,D2)     返回D1和D2的间隔时间

如DateDiff(“d”,“2018,1,1”, “2018,3,1”)  ‘值为59

MonthName(Month(Now()))        ‘显示中文月份,如“九月”

WeekdayName(Weekday(Now()))     ‘显示中文星期,如“星期二” 

※说明:

①在VB中,中午12时为#12:00:00 PM#,午夜12时为#12:00:00 AM#

②如果将DateSerial和DateSerial函数的返回值赋值给一个数值型变量,则函数返回的是相对于1899年12月30日(为0)的天数值。

③时间单位”参数需要加英文引号

④时间单位参数取值及含义:

 

单位

yyyy

q

m

d

ww

h

n

s

y

w

含义

一年天数

一周天数

 

 (4) 常用数据类型转换函数

CStr() 将数值转换为字符串

Val() 将字符串中的数字转换成数值

CBool() 将数字字符串或数值转换成布尔型

CDate() 将有效的日期字符串转换成日期

CSng() 将数值转换成单精度型

CDbl() 将数值转换成双精度型

 

(5) 输入函数InputBox

格式:

InputBox(提示信息,[标题],[默认值],[坐标],[,帮助文件名,帮助主题目录号])

※说明:1 InputBox函数默认返回值是字符串类型;

        2 如果返回值是数字字符串直接用于数学运算,则必须加Val函数先转换为数值型数据,如:Val(InputBox(“请输入一个整数”, “速度参数”)) ;

3如果返回值赋值给已经定义为整形的变量,则返回值的类型自动转换为整形而不需要再用类型转换函数。

 

(6) 消息函数MsgBox

① 格式

MsgBox(提示信息[,按钮][,标题][,帮助文件名,帮助主题目录号])

例:

n = MsgBox(“确定是否继续运行程序!”, 3 + 32, “是否继续运行程序”)       ‘需要返回值

    MsgBox  “确定是否继续运行程序!”, 3 + 32, “是否继续运行程序”       ‘不需要返回值

※说明:1第二个参数按钮是按钮类型、图标样式、默认按钮和等待模式相应选项的相加值。

2如果不需要返回值, MsgBox后面不能加括号(以子过程方式调用)

② MsgBox按钮参数的取值:

按钮类型:

  0 只显示“确定”按钮       vbOKOnly

  1 只显示“确定”及“取消”按钮 vbOKCancel

  2 显示“终止”、“重试”和“忽略”按钮      vbAbortRetryIgnore

  3 显示“是”、“否”和“取消”按钮          vbYesNoCancel

  4 显示“是”和“否”按钮 vbYesNo

  5 显示“重试”和“取消”按钮 vbRetryCancel

图标样式:

  16 显示系统叉号图标 vbCritical

  32 显示系统问号图标 vbQuestion

  48 显示系统叹号图标 vbExclamation

  64 显示系统信息图标   vbInformation

默认按钮:

  0 第一个按钮为默认按钮

  256 第二个按钮为默认按钮

  512 第三个按钮为默认按钮

等待模式:

  0 应用程序暂停,等待用户响应

  4096 系统挂起,等待用户响应

③ 函数返回值:(返回值类型是长整型Long)

  1 选“确定”按钮

  2 选“取消”按钮

  3 选“终止”按钮   

  4 选“重试”按钮

  5 选“忽略”按钮         

  6 选“是”按钮  

  7 选“否”按钮

 

(7) 格式输出函数 Fromat

①格式:

Format(目标数据[,”格式”]) ‘格式要加双引号

   例:Print Format(1234.567, “00000.00”) ‘显示结果为01234.57

   Print Format(#5:06:18 PM#, “hh时mm分ss秒A/P”) ‘显示为05时06分钟18秒P

Print Format(“ABCDEFG”, “<“)                 ‘显示为abcdefg

②格式符(具体用法参见P90-92表)

数值型数据:0 # . , % $ + – E+ E-

日期和时间数据:d dd ddd dddd ddddd w ww m mm mmm mmmm y yy yyyy q h hh m mm s ss ttttt AM/PM(am/pm) A/P(a/p)

字符串数据:> < @ &

 

(8) 调用外部应用程序函数Shell

①格式:

N = Shell(”外部应用程序”[,窗口样式])        ‘窗口样式0 隐藏 1 正常 2 最小化 3 最大化

N = Shell(”外部应用程序” + ” ” + “要打开的文件”[,窗口样式])  ‘程序和文件要用一个空格隔开

例:

N = Shell (“calc.exe”, 1) ‘打开计算器(需要返回值)

Shell “notepad.exe” + ” ” + “D:\唐诗.txt”, 1    ‘用记事本打开D:\唐诗.txt(不需要返回值)

②返回值:

返回值N是代表程序运行的任务标识的一个双精度型数据。

※注意:

①如果外部应用程序或要打开的文件跟VB的exe可执行文件在同一个文件夹内,可以省略路径;

②如果不需要返回值,Shell后面不能加括号(以子过程方式调用)。

 

(9) 两个控制位置的内部函数:

Tab(n)         定位到第n列开始输出数据(默认每行开头列号为1)

Spc(n)         从当前位置跳过n列开始打印下一个数据

※Tab函数相关说明:

①如果当前的显示位置已经超过n,则自动下移一行(即下一行的n列);

②如果n<1,则把输出位置移到第一列。

 

(10) 判断函数IsNumeric(N): 判断N的值是否为数值型,返回值为布尔型(N为任何有效的表达式)

   例:

   IsNumeric(“123”) ‘返回Ture

IsNumeric(“123abc”) ‘返回False

 

(11) iif()函数:根据表达式的值为真或假返回对应部分

①格式IIf(表达式, 真值部分, 假值部分)

例:max = IIf(max < x, x, max)

等同于:

    If Max < x Then

        Max = x

    Else

        Max = Max

    End If

 

5 函数应用例子

 

(1) 判断一个数的平方根是否为整数

Sqr(N) = Int(Sqr(N))

(2) 判断一个字符a是否为数字

   方法1:If a >= “0” And a <= “9”

方法2:If Asc(a) >= 48 And Asc(a) <= 57

(3) 判断一个字符a是否为大写字母

   方法1:If a >= “A” And a <= “Z”

方法2:If Asc(a) >= 65 And Asc(a) <= 90

(4) 判断一个字符a是否为小写字母

   方法1:If a >= “a” And a <= “z”

方法2:If Asc(a) >= 97 And Asc(a) <=122

(5) 判断文本框内容是否为数字字符串

IsNumeric(Text1.Text)

(6) 判断某一天是一年中的第几天

T = DateDiff( “y”, “2018-1-1”, “2018-7-8” ) + 1      ‘189天  (“y”代表间隔天数)

T = Format( “2018-7-8”, “y” ) ‘189天 (“y”代表第几天)

(还有个最基本的方法:就是先算出前面几个月的总天数,然后加上当月的天数,参见2018东博模拟试题第6套试题三渔夫打渔例子)

(7) 计算经过时间(以秒为例)

方法1:

  Dim T_start As String, T_end As String

  Dim S_start As Long, S_end As Long, t As Long

  T_start = Str(Time())  ‘开始时间

  T_end = Str(Time())   ‘结束时间

  S_start = Hour(T_start) * 3600 + Minute(T_start) * 60 + Second(T_start)      ‘换算秒数

  S_end = Hour(T_end) * 3600 + Minute(T_end) * 60 + Second(T_end)

  t = S_end – S_start       ‘相差秒数

 

  方法2:

  T_start = Str(Time())  ‘开始时间

  T_end = Str(Time())   ‘结束时间

  t = DateDiff(“s”, T_start, T_end)

(8) 限制文本框输入必须是数字字符(Change事件中判断):

For i = 1 To Len(Text1.Text)

  x = Asc(Mid(Text1.Text, i, 1))

  If x < 48 Or x > 57 Then

    MsgBox “请输入数字”, , “输入”

    Text1.Text = “”

    Text1.SetFocus

    Exit For

  End If

Next i

(9) 产生一个随机色:

Text1.ForeColor = RGB(Int(Rnd * 256), Int(Rnd * 256), Int(Rnd * 256))

(10) 数字字符串倒序输出

     If IsNumeric(Text1.Text) Then

        x = Val(Text1.Text)

        Do

            t = x Mod 10

            x = x \ 10

            s = s * 10 + t

       Loop While x <> 0

       Text2.Text = s

    End If

 

▲ Print方法的使用规则(P32):

 

单独一个print                      打印空白行

最后一个打印对象后面不带符号       打印后自动换行

打印对象用分号”;”隔开              紧凑格式(后面接着打下一个打印区)

打印对象用逗号”,”隔开              分区格式:每隔14列开始一个打印区

注意:Print在打印数值和数字字符串时的注意点:

1 打印数值数据时,会在数值后面增加一个空格;如果是正数,还会在前面增加一个代表正数符号位的空格;例: Print 123    结果:   _123_      ‘这里的下划线代表空格

2 打印由Str()转换过来的数字字符串时,如果是正数,会在前面增加一个代表正数符号位的空格,但后面不会增加空格。  例: Print Str(123)    结果:   _123     

3 打印由CStr()转换过来的数字字符串时,前后都不会加空格;例:Print Str(123) 结果:123

4 打印数字字符串直接量,前后都不会加空格;例:Print  “123”    结果:123

 

▲ GoTo语句格式

 

BQ:                   ‘BQ为自定义标签名

[语句块]

GoTo BQ

 

※注意:GoTo语句的运用要避免出现死循环

 

▲ 多窗体程序设计

 

(1)如何添加窗体

方法1:通过菜单添加

“工程”→“添加窗体”

方法2:通过工程资源管理器添加

右键单击工程名称→“添加”→“添加窗体”

(2)如何设置启动窗体

方法1:通过菜单设置

“工程”→ “工程n属性” →“通用” →“启动对象”

方法2:通过工程资源管理器设置

右键单击工程名称→“工程n属性” →“通用” →“启动对象”

(3)打开、关闭窗体(Form2为例)

  • 打开

方法1: Form2.Show          ‘Show方法等同于方法2两行语句

方法2:     Load Form2 ‘加载Form2

Form2.Visible = True ‘使Form2 可见

  • 关闭

Unload Form2  ‘卸载Form2

 

▲ 如何让指定的文本框获得焦点(Text2为例)

   方法1:Text2.SetFocus

   方法2:步骤:(1)在该文本框前面放置一个Label控件,

(2)将Label控件的TabIndex属性值设为文本框控件TabIndex属性值减1(必需)

(3)给Label控件设置快捷建

        这样,按文本框前面的Label控件的快捷建,就相当于定位到文本框(因为Label控件不能接收焦点所以就跳到它后面的文本框了)

 

▲ 四舍五入,保留指定位数小数方法

1 用公式:

X = Int(X * 10 ^ n + 0.5) / 10 ^ n           ‘小数X保留n位小数

 

例:保留整数         X = Int(X + 0.5)

    保留一位小数     X = Int(X * 10 + 0.5) / 10

    保留两位小数     X = Int(X * 100 + 0.5) / 100

保留三位小数  X = Int(X * 1000 + 0.5) / 1000

 

※注意:如果仅保留指定位数小数而不要求四舍五入,去掉“+ 0.5”即可

 

2 用Format函数:

     X = Format(X, “.00″)        ‘格式化参数”.00″中小数点后面几个0就保留几位

例:12.3456= Format(12.3456, “.00”)     ‘保留两位小数,结果为12.35

 

※注意:如果用Format函数方式,保留指定位数小数的后一位自动按四舍五入处理。

 

▲ 基本算法

 

1、什么叫算法:算法是指解决一个特定问题采用的特定的、有限的方法和步骤。

2、算法的描述方法:自然语言法、流程图法、N-S图法、PAD图法

 

▲ 程序的三种控制结构

 

   顺序结构:按语句的先后顺序线性执行。

   选择结构:根据条件选择一条符合条件的路径执行相应的语句(块)。

   循环结构:满足某个条件时循环执行语句(块),直到条件不成立。  

 

1 选择结构

   选择结构语句的类型

   (1) If Then  Else  语句

 

    格式:  单行式:① If ……Then ……

                    ② If ……Then ……Else……

 

            区块式:①  If ……Then

             ……

          End If

 

            ② If ……Then

             ……

          Else

     ……

          End If

 

  (2) If Then  ElseIf  语句

 

    格式:  If …… Then

……

     ElseIf ……Then           ‘可以有多个ElseIf

         ……

            [Else

                ……]

            End If

 

  (3) Select Case 语句

    格式:   Select Case  表达式      ‘依据表达式的值选择执行哪个Case分支

                 Case  取值列表       ‘可以有多个Case分支

                    ……

                 [Case Else       

    ……  ]

             End Select

取值列表的三种格式(多个数据项用逗号隔开,三种格式可以混合使用):

  • 数值型或字符串型常量、变量或表达式,如10 , Asc(“n”)-5 , F , “E”

(‘字母常量要用引号括起来)

  • 用“To”表示的数值或字符串区间,如1 To 10 , “C” To “Y” ‘值小的放前面

③用“Is”表示的数值或字符串区间人,如Is >10  ‘不能用And连接两个Is

※注意:

① 有多个Case分支匹配时只执行最前面的一个分支;都不匹配则执行Case Else分支(如果有Case Else分支的话);

② 无论执行哪个Case分支,最后都接着执行End Select后面的语句(如果有的话)。

 

2  循环结构

   循环结构语句的三种类型

   (1) For Next语句

    格式: For 循环变量 = 初始值 To 终止值 [Step 步长值]

               [循环体语句块]

           Next [循环变量]

 

    例: For i = 1 To 9 Step 2     ‘循环变量为i,步长为2

               Print i;

           Next i

 

※注意:

① Step 步长值默认为1(即值为1时可以省略Step设置)

② 可以用Exit For 语句随时结束循环(Exit For 语句一般放在If语句中使用)

 

   (2) While Wend语句

    格式:While 条件

              [循环体语句块]

          Wend

 

    例:  i=1         ‘i作为循环变量

          While i<=9

              Print i;

              i=i+2   ‘必须向结束方向变化i的值,否则循环无法结束(死循环)

          Wend

 

   (3) Do Loop语句

    ① 当型 Do Loop语句(先判断,后执行)

      格式:Do [While|Until 条件]

               [循环体语句块]   

            Loop

 

       例:Do While…Loop 语句: (While 是条件成立时重复执行)

 

           i=1         ‘i作为循环变量

           Do While i<=9       

              Print i;

              i=i+2

           Loop    

 

       例: Do Until…Loop 语句:(Until 是条件不成立时重复执行)

 

           i=1

           Do Until i>9       

              Print i;

              i=i+2

           Loop   

 

  ② 直到型 Do Loop语句(先执行,后判断)

      格式:Do

               [循环体语句块]   

            Loop [While|Until 条件]

 

       例:Do Loop…While… 语句:

 

      i=1         ‘i作为循环变量

           Do

              Print i;

              i=i+2

           Loop While i<=9

 

  例: Do Loop…Until… 语句:

 

           i=1

           Do

              Print i;

              i=i+2

           Loop Until i>9

※注意:

①由于先执行后判断,直到型 Do Loop语句的循环体语句块至少会被执行一次!

②无论当型还是直到型Do Loop语句,都可以用Exit Do 语句随时结束循环(Exit Do 语句一般放在If语句中使用。         

 

▲ 数组与数组元素相关概念(P195)

 

数组是一组具有相同数据结构的元素组成的有序数据集合。

构成数组的各个元素叫做数组元素,也叫下标变量。

数组元素由数组名和括号内的下标组成;下标可以是常量、变量和数值型表达式。

数组用一个统一的名字来标识这些元素,这个名称就叫数组名

 

一、数组的分类

1按数组的大小(元素个数)是否可以改变来分为:

         定长数组、动态数组。

2按元素的数据类型可分为:

         数值型数组、字符串型数组、逻辑型数组、日期型数组、变体型数组等。

3按数组的维数可分为:

          一维数组、二维数组、多维数组。

 

二、一维数组的定义

1格式:   

      Dim 数组名 ( [ 下界 to ] 上界 ) [ As <数据类型> ]

或:  Dim 数组名 [ 数据类型符 ] ( [ 下界 to ] 上界 )

 

例1:    Dim a(1 to 10) As Integer      ‘声明了有10个元素,名称为a的整型一维数组

或: Dim a%(1 to 10)

 

例2(缺省下界):  Dim a(10) As String   ‘声明了有11个元素,名称为a的字符串型一维数组

或: Dim a$( 10)

 

2、几点说明

  • 数组中各元素在内存中占据一片连续的存储空间。
  • 下界和上界不能使用变量,必须是常量;常量可以是整形常量或符号常量。
  • 数组的元素个数的计算方法:上界-下界+1     

例: UBound(a)- LBound(a)+1      ‘获取一维数组a的元素个数

函数UBound返回指定数组第n维下标上界   

格式: UBound(数组名,[第n维])  

函数LBound返回指定数组第n维下标下界(一维数组第二个参数可以省略)  

   格式: LBound(数组名,[第n维])

  • 当下界为0时可以省略(即缺省下界为0)
  • 如果要将缺省下界设为1,可在模块的通用部分使用Option Base语句设为1。

格式:

   Option Base  1   ‘将数组声明中缺省下界设为 1 (Option Base后面的参数只能取0或 1)

  • 如果省略As子句,则数组的类型为变体型。

 

三、一维数组元素的引用与赋值

格式  数组名(下标) = 值   

例   a(5)=10      ‘表示将a数组中的第5个元素的值设为整数10

 

四、 动态数组

  1 概念  动态数组就是数组元素个数不固定的数组。

  2 定义  

格式1:   

Dim 数组名 () [ As <数据类型> ]

或: Dim 数组名 [ 数据类型符 ] ()

 

例:    Dim a() As Integer         ‘声明了名称为a的整型一维动态数组

或:Dim a%()

 

格式2:

ReDim [Preserve] 数组名 ([ 下界 to ] 上界) [ As <数据类型> ]

或:ReDim  [Preserve] 数组名 [ 数据类型符 ] ([ 下界 to ] 上界)

 

例1:   ReDim a(10) As Integer       ‘声明了有11个元素名称为a的整型一维动态数组

或:ReDim a%(10)

例2:   ReDim a(N) As Integer       ‘声明了有N+1个元素名称为a的整型一维动态数组

或:ReDim a%(N)

3、几点说明

  • 定义数组时,如果下界或上界是变量,必须定义为动态数组。
  • 用ReDim定义动态数组必须带下标(即数组名后面的括号不能为空);
  • 用ReDim定义时,如果用变量作为下标,则该语句只能位于变量被赋值的位置之后。
  • 用ReDim重新设置元素个数时不能改变数据类型
  • 用ReDim重新设置元素个数时,要想保留原数据要加上Preserve参数。

 

▲ 相关应用算法

 

(1)循环获取随机数时如何排除重复:在循环体里嵌套一个For循环进行判断

   例: Dim N%(1 To 10)                        ‘定义一维数组

Randomize

For i = 1 To 10

   N(i) = Int(Rnd * 90 + 10)                ‘获取随机数

     Rem 排除重复代码 ( ★注意该段代码的位置:N(i)获取一个新值之后 )

     For j = 1 To i – 1

       If N(i) = N(j) Then

          i = i – 1

         Exit For

       End If

     Next j

Next i

※说明:如果将内层循环中的判断条件改成N(i) Mod 2 = 0 ,即可产生全部随机奇数或偶数。

 

(2)如何循环输入数据:

例:     x = Val(InputBox(“请输入候选人编号”))

     Do Until x = -1                          ‘x = -1为循环结束条件

         a(x) = a(x) + 1    ‘处理数据的相关代码块

         x = Val(InputBox(“请输入候选人编号”))

     Loop

(3)一维数组求最值(数组中的最大数和最小数)的两种方法

方法一:将存放最大值的MAX变量初始值设为0,存放最小值的MIN初始值设为可能的最大值

例:   Rem 定义变量

     Dim a(2) As Integer

     Dim max, min As Integer             ‘max存放最大值 min存放最小值

 

     Rem 变量初始化

     max = 0: min = 100                  ‘将max赋为最小值,min赋为最大值

 

            Rem 用随机数给数组各元素赋值

     Randomize

     For j = 0 To 2

         a(j) = Int(Rnd * 100) + 1

     Next j

 

     Rem 判断

     For i = 0 To 2

         If max < a(i) Then max = a(i)

         If min > a(i) Then min = a(i)

     Next i

 

     Rem 显示结果

     Print “最大值是” & max

     Print “最小值是” & min

 

方法二:将存放最大值的MAX和存放最小值的MIN变量初始值都设数组第一个元素值

例:   Rem 定义变量

     Dim a(2) As Integer

     Dim max, min As Integer             ‘max存放最大值 min存放最小值

 

Rem 用随机数给数组各元素赋值

     Randomize

     For j = 0 To 2

         a(j) = Int(Rnd * 100) + 1

     Next j

 

     Rem 变量初始化

     max = a(0) : min = a0)               ‘max和 min都设为数组第一个元素值

 

 

     Rem 判断

     For i = 1 To 2

         If max < a(i) Then max = a(i)

         If min > a(i) Then min = a(i)

     Next i

 

     Rem 显示结果

     Print “最大值是” & max

     Print “最小值是” & min

 

※注意:①两种方法在判断时循环变量的起始值的区别

        ②用方法二时,max和 min变量初始化只能放在数组元素值初始化之后

 

(4)一维数组倒序(存放)

     例: Dim a(1 To 10)          ‘定义一个有10个元素的一维数组a

    Cls

     Print “原数组:”;

     Randomize               ‘初始化随机数发生器

     For i = 1 To 10

         a(i) = Int(Rnd * 20 + 1)        ‘产生1-20的随机整数

         Print a(i); ”  “;

     Next

      Print

     Print “调换后:”;

 

     Rem 调换

     For i = 1 To 5

         t = a(i)                ‘t是临时变量

         a(i) = a(11 – i)

         a(11 – i) = t

     Next

 

     For i = 1 To 10

         Print a(i); ”  “;

     Next

 

① 下界为1时的倒叙算法( Dim a(1 To 上界) )

   For i = 1 To 元素个数 / 2

        t = a(i)

        a(i) = a(上界 – i + 1)

        a(上界 – i + 1) = t

Next

 

② 下界为0时的倒叙算法( Dim a(上界) )

  ‘元素个数=上界-下界+1  (元素个数=UBound(a) – LBound(a) + 1)

For i = 0 To 元素个数 / 2 – 1

    t = a(i)

    a(i) = a(上界 – i )

    a(上界 – i) = t

Next

③ 任意下界到上界的倒叙算法( Dim a(下界 To 上界) )

    For i = 下界 To 元素个数 / 2 – 1 +下界

        t = a(i)

        a(i) = a(上界 – i +下界)

        a(上界 – i +下界) = t

    Next

(5)一维数组显示数据的定位与换行算法

打印前换行:  If (循环变量 – 下界 ) Mod 每行显示个数 = 0  Then  Print

定位:Print Tab(((循环变量 – 下界)Mod 每行显示个数) *间隔字符数 + 每行开头空格数);

打印后换行:  If (循环变量 – 下界 + 1) Mod 每行显示个数 = 0  Then  Print      

 

※注意:

①打印前换行开头比打印后换行多空了一行(如果加个分号写成Print;则不会多一空行);

②该换行算法只针对由Tab定位的情况。

 

例:

    Dim a(6 To 45) As Integer   ‘定义一个下界为6上界为45的有40个元素的一维数组a

Cls

Randomize               ‘初始化随机数发生器

For i = 6  To  45

     a(i) = Int(Rnd * 90 + 10)        ‘产生两位随机整数

Next

 

For i = 6  To  45

     If (i – 6) Mod 10 = 0 Then Print      ‘打印前换行

       Print Tab(((i – 6) Mod 10) * 10 + 2); a(i);

       ‘If (i – 6 + 1) Mod 10 = 0 Then Print      ‘打印后换行

Next

 

(6)一维数组排序

① 选择法排序

选择法排序从前往后固定已排定的数据,n个数据需比较n-1轮,每轮比较n-i次(i为第几轮)。

选择法排序一般算法   ( 假设有n个数据存放在一维数组a中进行从小到大排序 )

算法1:

    Rem 下界为1时:

    For i = 1 To n – 1             ‘需比较n-1轮

        For j = i+1 To n           ‘每轮比较n-i次

            If a(i) > a(j) Then

  t =a(i)  :  a(i)=a(j)  :  a(j)=t         ‘t为临时变量

End if

        Next j

Next i

 

Rem界为0时:

    For i = 0  To  n – 2

        For j = i + 1  To  n – 1

            If a(i) > a(j) Then

                t = a(i): a(i) = a(j): a(j) = t    ‘t为临时变量

            End If

        Next j

    Next i

 

算法2(使用标记变量p)

    For i = 1 To n – 1

        P=i

        For j = i+1  To  n

            If a(p) > a(j) Then p=j

        Next j

If p<>i then

           t =a(p)  :  a(p)=a(i)  :  a(i)=t

End If

Next i

② 冒泡法排序

冒泡法排序从后往前固定已排定的数据,n个数据需比较n-1轮,每轮比较n-i次(i为第几轮)。

冒泡法排序一般算法   ( 假设有n个数据存放在一维数组a中进行从小到大排序 )

Rem 下界为1时:

For i = 1 To n – 1          ‘需比较n-1轮

            For j = 1 To n –i          ‘每轮比较n-i次

                If a(j) > a(j + 1) Then

                    t = a(j)  :  a(j) = a(j + 1)  :  a(j + 1) = t

                End If

            Next j

Next i

 

Rem 下界为0时:

     For i = 0  To  n – 2

         For j = 0  To  n – i – 2

             If a(j) > a(j + 1) Then

             t = a(j)  :  a(j) = a(j + 1)  :  a(j + 1) = t

             End If

         Next j

Next i

 

▲ Array函数

 

功能:将数据列表赋值给一个变体型数组

例:  Dim a() ,b()        ‘或者   Dim a ,b

      a = Array(“A”, “B”, “C”, “D”, “E”)

b = Array(1, 2, 3, 4, 5)

※注意:

①Array函数的数据列表必须赋值给变体型(Variant)变量

②由Array函数赋值的a数组默认下界为0,如果要设为1,必须在首行加“Option Base 1”语句

 

▲自定义数据类型(P213)

 

1 什么是自定义类型?

自定义类型是由不同类型数据组成的集合,也叫记录类型。

2 如何定义一个自定义类型:通过Type语句实现

格式:  [Public|Private]Type 自定义类型名称

数据项名   As   类型名

  ……

    End Type

例:定义一个学生信息的自定义类型

Private Type student

    XH As String * 2    ‘学号       ‘自定义类型中的字符串型数据项必须是定长字符串

    XM As String * 4    ‘姓名

    XB As String * 1    ‘性别

    NL As Integer       ‘年龄

    DZ As String * 20    ‘地址

    DH As String * 12    ‘电话

End Type

3 如何声明一个自定义数据类型

格式:[Public|Private|Dim] 自定义型变量名称 As自定义类型名称

例:

Public XS As student        ‘声明一个全局student自定义类型的变量(也可以用Global)

Private XS As student       ‘声明一个模块级student自定义类型的变量(也可以用Dim)

Dim XS As student         ‘声明一个过程级student自定义类型的变量(不能用Private)

4 自定义数据项的引用与赋值

引用格式:自定义型变量名·数据项名称

例:

XS.XM = “郭小靖” ‘引用XS自定义型变量的XM数据项对其赋值

※注意

①自定义类型必须先定义再使用;自定义类型不能在过程内定义。

②如果不写作用域关键字,自定义类型默认为全局型(即前面的作用域关键字是Public)

③数据项类型为字符串型时,必须设为定长字符串

④全局自定义类型变量只能在标准模块中定义和声明

 

▲ 判断素数

 

1 什么是素数:素数又称质数,是指除了1和它本身以外,不能被其他任何整数整除的数。如2、11、37…

2 判断n是否为素数算法

(1)方法1(推荐):

    For i = 2 To n – 1    ‘终止值也可以是Sqr(n)或Int(Sqr(n)

        If n Mod i = 0 Then Exit For

    Next i

    If i = n Then   ‘上面的终止值如果是Sqr(n) 或Int(Sqr(n),这里判断条件要改为i > Sqr(n)

        MsgBox n & “是素数”

    Else

        MsgBox n & “不是素数”

    End If

(2)方法2:使用标记变量

    flag = True         ‘设flag的初始值为True(变量flag是判断n是否为素数的一个标记)

    For i = 2 To n – 1  ‘★注意i的起始值和终止值(终止值也可以改用n的平方根即Sqr(n) )

        If n Mod i = 0 Then

            flag = False

            Exit For

        End If

    Next i

    If flag Then

        MsgBox n & “是素数”

    Else

        MsgBox n & “不是素数”

    End If

※注意:判断n是否为素数的标记变量flag也可以定义为整形,用0和1判断是否为素数。

 

▲ 求最大公约数和最小公倍数 (P226)

 

1 求最大公约数算法(辗转相除法)

Dim a%, b%, c%, GYS%, GBS%     ‘定义相关变量

a = Val(Text1.Text)

b = Val(Text2.Text)

c = a Mod b                     ‘变量c存放余数

Do While c <> 0

     a = b

     b = c

     c = a Mod b

Loop

GYS = b                         ‘ 当余数为0时,b就是最大公约数

GBS = Val(Text1.Text) * Val(Text2.Text) / GYS    ‘求最小公倍数(注意不能是a * b / GYS)

“辗转相除法”说明:

先a Mod b求出余数c,如果c不为0,则b做被除数,c做除数继续取余,直到c为0,这时的除数b就是最大公约数。

 

2 求最小公倍数公式:

最小公倍数 = 数A * 数B / 两个数的最大公约数

 

▲过程 (P217)

 

1 什么是过程

  过程是指能实现某一特定功能的独立程序段。

2 过程的分类

 

3 通用过程

  • 什么是通用过程:用户自定义过程中的子过程和函数过程又称为通用过程。
  • 注意点: ① 定义通用过程的目的是为了代码复用,提高编程效率。

② 通用过程可以定义在窗体模块和标准模块中。

③ 通用过程不能嵌套定义。

④ 通用过程必须由其他过程调用。

  • 通用过程的定义和调用

  ①子过程(Sub过程)的定义和调用

  • 定义格式:

         [Static][Public|Private] Sub 子过程名称([形参列表])

[局部变量和常量声明]

[程序段]

               End Sub

例:自定义一个求最大公约数的子过程

Private Sub ZGC( ByVal  A  As  Integer, ByVal  B  As  Integer, GYS  As  Integer )      

   Dim R As Integer

   R = A Mod B         ‘R存放余数

   Do While R <> 0

     A = B

     B = R

     R = A Mod B

   Loop

    GYS = B             ‘当余数为0时,除数B就是这两个数的最大公倍数

End Sub

※注意:参数中的关键字ByVal是指按值传递参数

  • 调用方法:

方法1:子过程名 [实参列表] ‘实参列表不能加括号

例:  ZGC   a,b,GYS

方法2:Call子过程名 (实参列表) ‘实参列表必须加括号,如果没有实参可以省略括号

例: Call  ZGC ( a,b,GYS )

 

② 函数过程(Function过程)的定义和调用

  • 定义格式:

         [Static][Public|Private] Function 函数过程名称([形参列表])As [数据类型]

[局部变量和常量声明]

[程序段]

[函数名=表达式]    ‘如果省略则返回数据类型的缺省值

               End Function

例:自定义一个求最大公约数的函数过程

Private Function HSGC( ByVal  A  As  Integer, ByVal  B  As  Integer )      

   Dim R As Integer

   R = A Mod B         ‘R存放余数

   Do While R <> 0

     A = B

     B = R

     R = A Mod B

   Loop

    HSGC = B             ‘当余数为0时,除数B就是这两个数的最大公倍数

End Function

※注意:参数中的关键字ByVal是指按值传递参数)

  • 调用方法:

函数过程名 ([实参列表])    ‘实参列表必须加括号,如果没有实参可以省略括号

例: Q= HSGC ( a,b )      ‘Q是接收函数返回值的一个变量

        ※注意:如果不需要返回值,函数过程可以采用子过程的调用方法进行调用。

 

4 参数的传递方式

(1) 过程中参数的两种传递方式:

① ByVal         按值传递(传值)

② ByRef         按址传递(传址) ‘默认方式,传递方式关键字ByRef可以省略

(2) 两种方式的区别:    

按值传递(ByVal):将实参的值传给形参,实参不会发生变化。

按址传递(ByRef):将实参的地址传给形参,实参随形参的变化而变化。

※注意:

① 常量和表达式默认按值传递,变量默认按址传递;

② 如果不希望实参变量发生变化,应该将对应的形参前面添加ByVal关键字设为按值传递;

③ 形参的传递方式是按址传递但又不希望实参变量发生变化的处理方法:将实参变量添加括号变成表达式。

④ 当按址传递的形参指定了具体的数据类型时,如果实参是变体型或类型不匹配,会报” ByRef参数类型不符” 错误。

 

▲ 模块和变量的作用域 (P236)

 

1  VB的三种模块

窗体模块    .frm ‘文件扩展名

标准模块    .bas

类模块      .cls

2  变量的作用域

(1) 什么叫变量的作用域:

变量的作用域是指变量的作用范围,也叫变量的有效范围。

(2) 三种变量的作用域

①过程级变量(局部变量):

     在过程内部用Dim或Static关键字声明的变量,它只能在过程内部使用。

注意:

①Static关键字只能用在过程级的变量声明中;用Static关键字定义的过程,其内部的所 有变量都会变成静态变量。

用Static关键字声明的变量叫静态变量,变量的值在过程结束后任然会被保留直到程序退出。

②窗体级变量(私有变量):

在窗体或模块的通用声明段(即代码窗口的最前面位置)用Dim或Private关键字声明的变量,它只能在本窗体或模块中使用。

③全局变量(共有变量):

在窗体或模块的通用声明段用Public或Global关键字声明的变量,它在整个应用程序的任何位置都可以使用。

          注意:a 窗体中的定长字符串、数组和自定义类型变量不能声明为全局变量。

   b 在窗体中不能用Global关键字声明全局变量;

c 在标准模块中用Global关键字定义自定义数据类型以及通用过程会自动省略Global关键字。

 

三种变量的作用范围及使用规则

比较

过程级变量

模块级变量

全局变量

作用范围

所在过程

所在的窗体/模块

整个应用程序

声明关键字

Dim、Static

Dim、Private

Public、Global

声明的位置

过程中

窗体/模块通用声明段

窗体/模块通用声明段

被本模块其他过程存取

不可以

可以

可以

被其他模块的过程存取

不可以

不可以

可以

 

▲ 如何启动不加载任何窗体的VB应用程序 (P244)

 

  步骤1:添加一个标准模块,在其中创建一个Sub Main子过程添加相应代码。

  步骤2:在工程属性对话框中将启动对象设置为Sub Main。

          例:  Sub Main()

         Form1.Show

End Sub

 

▲ 判断是否按下回车键(以文本框为例)

 

Private Sub Text1_KeyPress(KeyAscii As Integer)

If KeyAscii = 13 Then           ‘判断是否按下回车键()

MsgBox “已按下回车键”

     End If

End Sub

(几个常用按键键值: 退格键 8  回车键 13 空格键 32 删除键  46 )

▲ 数字分离算法(例: x=1234.56)

 

    百分位:    Int(x * 100) Mod 10     →   6

十分位: Int(x * 10) Mod 10      →   5

个位: Int(x) Mod 10       →   4

十位: Int(x) \ 10 Mod 10      →   3

百位: Int(x) \ 100 Mod 10     →   2

千位: Int(x) \ 1000 Mod 10    →   1

注意:如果x是整数,则不需要Int()函数转换

 

▲ 穷举法

 

    穷举法是指将所有的方案都一一测试,找粗符合要求的方案的算法。如百钱百鸡、百马百瓦等经典问题。

例(百马百瓦):

题目:有100匹马驮100块瓦,每匹大马拖3块,每匹小马驮2块,两匹马驹驮1块。问大马、小马、马驹各有多少匹?

Print “大马”, “小马”, “马驹”

    For a = 1 To 34                  ‘思考,这里为什么是1 to 34 ?

        For b = 1 To 50

            For c = 1 To 200

                If a * 3 + b * 2 + c * 0.5 = 100 _

                 And a + b + c = 100 Then

                    Print a, b, c

                End If

            Next

        Next

    Next

 

▲ 打印图形一般算法 (案例参见《打印图形》资料)

 

For i = 1 To n ‘打印的行数

    Print Tab(); ‘每行打印的位置(注意语句结尾的分号)

    For j = 1 To m ‘每行打印的个数

Print内容 ;                       ‘打印内容(注意语句结尾的分号)

    Next j

    Print ‘换行

Next i

 

  • 补充:VB删除文件和文件夹方法

 

1删除文件:  Kill 目标文件路径 & “\” & 文件名

例:        Kill “D:\图片” & “\” & “花朵.jpg”                 ‘Kill函数删除指定文件

 

2删除空文件夹:RMDir (带完整路径的目标文件夹)

例: RMDir “D:\图片”

 

3删除非空文件夹:

        Dim fs

        Set fs = CreateObject(“Scripting.FileSystemObject”)

        On Error Resume Next                    ‘如果出错则忽略并继续执行后续代码

        fs.DeleteFolder (带完整路径的目标文件夹), True   ‘参数True可以删除只读文件夹