Visual Basic 常用语句74条详解

更新时间:2024-03-29 00:29:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

Visual Basic

常用语句 74条详解

2

目 录

序号 语句 1 AppActivate语句 2 Beep语句 3 Call语句 4 5 6 7 8 9 ChDir语句 ChDrive语句 Close语句 Const语句 Date语句 Declare语句 10 Deftype语句 11 DeleteSetting语句 12 Dim语句 13 Do...Loop语句 14 End语句 15 Enum语句 16 Erase语句 17 Error语句 18 Event语句 19 Exit语句

描述 页码 激活其它应用程序。 7 通过计算机喇叭发出声音。 8 调用一个子程序或函数。 9 改变当前的路径(目录或文件10 夹)。 改变当前的驱动器。 10 关闭用Open语句打开的文件。 11 声明常量。 11 设置当前系统日期。 12 用于在模块或窗体中声明对动态链接库(DLL)中外部过程的13 引用,在引用API函数时经常用到。 在模块或窗体,为变量和传给过程的参数,设置缺省数据类型,以及为其名称以指定的字15 符开头的Function和PropertyGet过程,设置返回值类型。 删除指定的Windows注册表的16 子键。 声明局部变量并分配存储空17 间。 循环语句,有两种变形,一种是当条件为True时,重复执行一个语句块中的命令。另一种18 重复执行一个语句块中的命令,直到条件变为True时。 结束程序、过程或语句。 20 定义枚举类型。 21 重新初始化大小固定的数组的元素,以及释放动态数组的存23 储空间。 模拟错误的发生。 23 定义用户自定义的事件。 24 提前退出控制结构、循环或过26 程的语句体。 3

20 FileCopy语句 21 ForEach...Next语句 22 For...Next语句 23 Function语句 24 Get语句 25 GoSub...Return语句 26 GoTo语句 27 If...Then...Else语句 28 Input#语句 29 Kill语句 30 Let语句 31 LineInput#语句 32 Load语句 33 Lock,Unlock语句 34 LSet语句 35 Mid语句 36 MkDir语句 37 Name语句 38 On...GoSub、On...GoTo语句 39 OnError语句 复制一个文件。 针对一个数组或集合中的每个元素,重复执行一组语句。 以指定次数来重复执行一组语句。 声明Function过程的名称,参数以及构成其主体的代码。 将一个已打开的磁盘文件读入一个变量之中。 在一个过程中跳到另一个子程序中执行,执行后再返回。 无条件地转移到过程中指定的行。 条件语句,根据表达式的值有条件地执行一组语句。 从已打开的顺序文件中读出数据并将数据指定给变量。 删除磁盘文件。 将表达式的值赋给变量或属性。 从已打开的顺序文件中读出一行并将字符串变量指定给变量。 把窗体或控件加载到内存中。 锁定或解锁用Open语句打开的全部文件或一部分文件,控制其它进程是否可以修改文件。 将某字符串插入到另一字符串变量的最左边,或是将一用户定义类型变量复制到另一用户自定义类型变量。 用另一个字符串中指定数量的字符替换Variant或String变量中的字符。 创建一个新的目录或文件夹。 重新命名一个文件、目录或文件夹。 根据表达式的值,转到特定行执行。 启动一个错误处理程序并指定该子程序在一个过程中的位置;也可用来禁止一个错误处理程序。 4

27 28 29 30 32 34 35 36 39 40 40 41 42 43 44 46 47 47 48 50

40 Open语句 41 OptionBase语句 42 OptionCompare语句 43 OptionExplicit语句 44 OptionPrivate语句 45 Print#语句 46 Private语句 47 Public语句 48 Put语句 49 RaiseEvent语句 50 Randomize语句 51 ReDim语句 52 Rem语句 53 Reset语句 54 Resume语句 55 RmDir语句 56 RSet语句 57 SavePicture语句 58 SaveSetting语句 59 Seek语句

打开磁盘文件。 在模块或窗体级别中使用,用来声明数组下标的缺省下界。 在模块或窗体级别中使用,用于声明字符串比较时所用的缺省比较方法。 在模块或窗体级别中使用,强制显式声明模块或窗体中的所有变量。 强制声明某个模块为该模块所属工程的私有模块。 将格式化显示的数据写入顺序文件中。 在模块或窗体级别中使用,用于声明私有变量及分配存储空间。 在模块或窗体级别中使用,用于声明全局变量(公用变量)和分配存储空间。 将一个变量的数据写入磁盘文件中。 引发在一个类、窗体、或者文档中的模块级中声明的一个事件。 初始化随机数发生器。 在过程级别中使用,用于为动态数组变量重新分配存储空间。 注释语句。 关闭所有用Open语句打开的磁盘文件。 在On...Error的错误处理程序或On...GoSub的特定程序区段结束后,恢复原先的运行。 删除一个存在的目录或文件夹。 在一字符串变量中将一字符串往右对齐。 将窗体或控件中的图形保存到文件中。 在Windows注册表中保存或建立应用程序项目。 在Open语句打开的文件中,设置下一个读/写操作的位置。 5

52 54 55 55 56 56 57 59 60 62 63 64 65 66 66 67 68 69 70 71

60 SelectCase语句 61 SendKeys语句 62 SetAttr语句 63 Set语句 64 Static语句 65 Stop语句 66 Sub语句 67 Time语句 68 Type语句 69 Unload语句 70 While...Wend语句 71 With语句 72 Write#语句 73 VbSrcCopy语句 74 Shell语句

多分支语句。 将一个或多个按键消息发送到活动窗口,就如同在键盘上进行输入一样。 为一个文件设置属性信息。 将对象引用赋给变量或属性。 在过程级别中使用,用于声明变量并分配存储空间。在整个代码运行期间都能保留使用Static语句声明的变量的值。通俗的讲,就是声明静态变量。 暂停执行。 声明子过程的名称,参数,以及构成其主体的代码。 设置系统时间。 在模块级别中使用,用于定义包含一个或多个元素的用户自定义的数据类型。 从内存中卸载窗体或控件。 只要指定的条件为True,则会重复执行一系列的语句。 在一个单一对象或一个用户定义类型上执行一系列的语句。 将数据写入顺序文件。 复制图片并粘帖。 调用其他应用程序。 73 74 77 77 78 80 80 82 82 84 85 85 87 87 88 6

1.AppActivate语句

描述:激活其它应用程序。 一、语法:

AppActivate title[,wait]

AppActivate语句的语法具有以下几个命名参数: 部分 title 描述 必需的。字符串表达式,所要激活的应用程序的名称。常使用Shell函数返回的任务识别码来替换title,以激活应用程序 可选的。Boolean值,取值为True/False。说明在激活另一个应用程序之前调用的应用程序是否有焦点。如果为False(缺省),那么,即使调用的应用程序没有焦点,也直wait 接激活指定的应用程序。如果为True,则调用的应用程序会等到有焦点后,才激活指定的应用程序 二、说明:

AppActivate语句不能打开应用程序,只能激活应用程序(使其变成活动窗口)。在使用AppActivate语句时必须打开应用程序,否则程序会报错。所以通常先用Shell函数启动一个应用程序,然后使用AppActivate语句激活。 三、应用举例:

本例使用AppActivate语句来激活Microsoft Excel。建立一个标准工程,在窗体上添加一个命令按钮,将下面的程序粘贴过去。 Private Sub Command1_Click()

AppActivate \激活Microsoft Excel。 End Sub

首先打开Microsoft Excel,然后运行程序,单击命令按钮,你将看到Excel变成活动窗体。

下面示例用Shell函数启动Microsoft Excel,然后用AppActivate语句来激活Microsoft Excel。在运行程序前,首先找到Microsoft Excel的路径,并关闭Excel。 在上面的标准工程中,用下面的程序替换上面的程序,并把路径换成你电脑中Microsoft Excel的路径,然后运行程序,单击命令按钮,你将看到Excel被打开并被激活。 Private Sub Command1_Click() Dim MyAppID

MyAppID = Shell(\ '运行Microsoft Excel。

AppActivate MyAppID '激活Microsoft Excel。 End Sub

7

2.Beep语句

描述:通过计算机喇叭发出声音。 一、语法: Beep

二、说明:

呼叫的频率与时间长短取决于硬件和系统软件,并随计算机不同而不同。 三、应用举例:

在调试程序时,有时需要在发生错误时发出音响。本例在程序运行时,如果某一步发生错误,则转到错误处理入口,使用Beep语句让计算机发出响声,同时MsgBox函数将提示错误。

建立一标准工程,在窗体上添加一命令按钮,将下面的程序粘贴过去。 Private Sub Command1_Click()

On Error GoTo ErrorHandler '发生错误转到错误处理入口 MsgBox \程序运行\

Exit Sub '程序运行完毕,没有错误退出程序 ErrorHandler: '错误处理入口 Beep '发出声响。 MsgBox \出错\End Sub

单击命令按钮,MsgBox显示\程序运行\。

现在加入一条错误的激活Microsoft Excel语句,程序如下: Private Sub Command1_Click()

On Error GoTo ErrorHandler '发生错误转到错误处理入口 AppActivate \错误语句。 MsgBox \程序运行\

Exit Sub '程序运行完毕,没有错误退出程序 ErrorHandler: '错误处理入口 Beep '发出声响。 MsgBox \出错\End Sub

单击命令按钮,MsgBox显示\出错\,计算机喇叭发出声音。

误区:有些教材用下面的示例使用Beep语句让计算机连续响三声,实际上计算机在运行下面的程序时只能响一声,原因是计算机的运行速度远比计算机喇叭发出声音的速度快。 Dim I

For I = 1 To 3 '循环3次。 Beep '发出一声。 Next I

8

3.Call语句

描述:将控制权转移到一个Sub过程,Function过程,通俗的讲就是调用一个子程序或函数。 一、语法:

[Call]name[argumentlist]

Call语句的语法包含下面部分: 部分 call name (过程名) 描述 可选参数;关键字。如果指定了这个关键字,则参数必须加上括号,例如:Call MyProc(0) 必要参数,要调用的过程名称 可选参数,传递给过程的变量、数组或表达式的列表,各参数间以逗号argumentlist(参数隔开。Argumentlist的每个参数都可以加上关键字ByVal或ByRef,来描列表) 述被调用的过程将如何处理这些参数。 二、说明: 调用一个过程时,并不一定要使用Call关键字。如果使用Call关键字来调用一个需要参数的过程,argumentlist就必须要加上括号。 Call name(argumentlist)

如果省略了Call关键字,那么也必须要省略argumentlis外面的括号。 Name argumentlist

如果需要函数的返回值,则应先定义一个变量,然后将函数的返回值赋予变量,这时虽然省略了Call关键字,但argumentlist也必须要加上括号。如下面的格式: Dim str As String

str = name(argumentlist)

若要将整个数组传给一个过程,使用数组名,然后在数组名后加上空括号。 有时为了方便,可用公有变量传递参数。 三、应用举例:

下列示例示范如何使用Call语句来调用子过程。建立一个标准工程,在窗体上添加一命令按钮和一个文本框,将下面的程序粘贴过去。 Private Sub Command1_Click() Call procedure End Sub

Private Sub procedure() Dim a '定义变量 a = Date '取日期 Text1.Text = a End Sub

单击命令按钮,Text1显示日期。

下列示例示范如何使用省略了Call关键字来调用函数,并根据返回值决定程序是否继续运行。还在上面的这个标准工程里,用下面的程序替换上面程序中的第一部分。 Private Sub Command1_Click() Dim str As String '定义变量

9

str = MsgBox(\是否继续运行\ If str = vbNo Then Exit Sub procedure End Sub

单击命令按钮后MsgBox函数提示“是否继续运行”,单击?否?退出程序,Text1无变化;单击?是?运行后面的程序,Text1显示日期。

4.ChDir语句

描述:改变当前的路径(目录或文件夹)。 一、语法: ChDir path

path(路径名)为必要参数,它是一个字符串表达式,指明将改变到哪个路径(目录或文件夹)。 二、说明:

如果改变的路径不在当前的驱动器上,则应输入包括驱动器在内的完整路径,如: ChDir \ 上移一层目录采用下面的格式: ChDir\

注意:path必须为有效路径,否则系统会报错。 三、应用举例:

本示例使用ChDir语句来改变当前路径,建立一标准工程,在窗体上添加一命令按钮,一个文本框和一个文件列表框(FileListBox),将下面的程序粘贴过去。 Private Sub Command1_Click() ChDir Text1.Text

File1.Path = Text1.Text End Sub

在文本框里输入一个完整路径,然后单击命令按钮,文件列表框将显示这个路径下的全部文件。

5.ChDrive语句

描述:改变当前的驱动器。 一、语法: ChDrive drive

drive(驱动器名)为必需参数,它是一个字符串表达式,指明将改变到哪个驱动器。如果使用零长度的字符串(\,则当前的驱动器将不会改变。 二、应用举例:

本示例使用ChDrive语句来改变当前的驱动器。建立一标准工程,在窗体上添加一命令按钮,一个文本框和一个目录列表框(DirListBox),将下面的程序粘贴过去。 Private Sub Command1_Click() ChDrive Text1.Text

10

Dir1.Path = Text1.Text End Sub

在文本框里输入一个完整路径,然后单击命令按钮,目录列表框将显示这个驱动器的名称,点击目录列表框右边的箭头,可以看到这个驱动器下的全部一级文件夹。

6.Close语句

描述:关闭用Open语句打开的输入/输出(I/O)文件。 一、语法:

Close[filenumberlist]

filenumberlist(文件号列表)为可选参数,它是一个或多个文件号,其中filenumber为任何有效的文件号。如果是多个文件号,个文件号之间用逗号隔开,语法如下: [[#]filenumber1][,[#]filenumber2]... 二、说明:

若省略filenumberlist,则将关闭Open语句打开的所有活动文件。文件被关闭后,相关联的缓冲区空间被释放,文件与其文件号之间的关联也将终结。 三、应用举例:

本示例使用Close语句来关闭为Output而打开的文件。建立一个标准工程,在窗体上添加一命令按钮,将下面的程序粘贴过去。 Private Sub Command1_Click()

Open \打开文件。

Print #1, \文件被打开。\将字符串写入文件。 Close '将已打开的文件关闭。 End Sub

运行程序,单击命令按钮。我们会发现程序新建了一个名为“a”的文本文件,“文件被打开。”已经写入导文本里。

7.Const语句

描述:声明常量。 一、语法:

[Public|Private]Const constname[As type]=expression Const语句的语法包含下面部分: 部分 public 描述 可选的。该关键字用于在模块级别中声明该常量为全局的(公用的),也就是说在所有模块和窗体中都可以使用的常量。该关键字在窗体中不能使用。 可选的。该关键字用于在模块或窗体级声明该常量为局部的,即只能在包含该声明的模块或窗体中使用的常量。不能在过程中使用。 private constname 必需的。有效的常量名;遵循标准的变量命名约定。

11

type 可选的。常量的数据类型;可以是VB变量的各种类型。所声明的每个常量都要使用一个单独的As类型子句。 必需的。文字,其它常量,或由除Is之外的任意的算术操作符和逻辑操作符所构成的任意组合。 expression 二、说明:

对于程序中多次出现的数值、文字等最好使用常量,这样在程序运行时不易出错。常量可以使程序更具可读性,以及易于修改。

在缺省情况下常量是局部的。在Sub、Function或Property过程中声明的常量都是该过程的局部常量,在类模块声明的常量也是局部的。在标准模块中,可以用Public关键字来声明常量为全局的。

可以在一行中声明若干个常量,使用逗号将每个常量赋值分开。用这种方法声明常量时,如果使用了Public或Private关键字,则该关键字对该行中所有常量都有效。 三、应用举例:

该示例使用Const语句来声明常量。Public常量在标准模块的通用部分声明,而不是在类模块中声明。Private常量可以在任何模块类型的通用部分声明。 Const Pai = 3.14 '缺省情况下常量是局部的。 Public Const MyStr = \你好\声明全局常量。

Private Const vbGrayed As Integer = 2 '声明局部的整数常量。

Const MyStr = \你好\在一行中声明多个常量。

8.Date语句

描述:设置当前系统日期。 一、语法: Date=date

Date的格式为#mm/dd/yyyy#,日期两边用#,不能用双引号(“”)。对于运行Microsoft Windows98的系统,要设置的日期必须介于1980年1月1日与2099年12月31日之间。对于运行Microsoft WindowsNT的系统,日期必须介于公元1980年1月1日到2079年12月31日之间。 二、应用举例:

本示例使用Date语句来设置系统日期。在开发环境中,日期原义会根据系统的地区设置,以短式日期格式显示。建立一标准工程,在窗体上添加一命令按钮,将下面的程序粘贴过去。

Private Sub Command1_Click()

Date = #11/6/2007# '设置系统日期。 End Sub

单击命令按钮,这时系统日期将改变到你指定的日期。

12

9.Declare语句

描述:用于在模块或窗体中声明对动态链接库(DLL)中外部过程的引用,在引用API函数时经常用到。 一、语法: 语法1

[Public|Private]Declare Sub name Lib\ [([arglist])] 语法2

[Public|Private]Declare Function name Lib\ [([arglist])][As type]

Declare语句的语法包含下面部分: 部分 Public 描述 可选的。用于声明其引用是全局的(公用的),也就是说该引用的过程在整个工程中都可以使用。Public只能在模块中声明。 可选的。用于声明其引用是局部的,也就是说只能在该声明所在的模块或窗体中使用。 Private Sub或可选的(但二者必须选其一)。Sub表示该过程没有返回值;Function表示该Function 过程会返回一个可用于表达式的值。 Name Lib Libname 必需的。为合法的过程名。 必需的。Declare的子句。 必需的。所声明过程的动态链接库名或代码资源名。 可选的。表示将被调用的过程在动态链接库(DLL)中还有另外的名称。当动态链接库的过程与同一范围内的公用变量、常数或任何其它过程的名称相同时,可以使用这个参数。 可选的。动态链接库或代码资源中的过程名。如果首字符不是数字符号(#),则aliasname是动态链接库中该过程的入口处的名称。如果首字符是(#),则随后的字符必须指定该过程的入口处的顺序号。 可选的。代表调用该过程时需要传递的参数列表。 可选的。Function过程返回值的数据类型;可以是VB变量的各种类型、用户定义类型或对象类型,不支持定长的String。 Alias Aliasname Arglist Type arglist参数的语法以及语法各个部分如下: [Optional][ByVal|ByRef][ParamArray]varname[()][As type] 部分 Optional 描述 可选的。表示参数不是必需的。如果使用该选项,则arglist中的后续参数都必需是可选的,而且必须都使用Optional关键字声明。 13

ByVal ByRef 可选的。表示该参数按值传递。 可选的。表示该参数按地址传递,是缺省选项。 可选的。只用于arglist的最后一个参数,表示最后的参数是一个Variant元素ParamArray 的Optional的数组。使用ParamArray关键字可以提供任意数目的参数。ParamArray关键字不能与ByVal、ByRef或Optional一起使用。 Varname () Type 必需的。代表传给该过程的参数的变量名;遵循标准的变量命名约定。 对数组变量是必需的。指明varname是一个数组。 可选的。传递给该过程的参数的数据类型;可以是VB变量的各种类型、用户定义类型或对象类型,不支持定长的String。 二、说明:

如果引用API函数,可以从API Text Viewer直接将声明复制过来,方法是在程序菜单里选择Microsoft Visual Studio 6.0——Microsoft Visual Studio 6.0 Tools——API Text Viewer,在API Viewer的File菜单里点击Load Text File,打开WIN32API。选择你需要的API函数,添加到Selectde Items里,但要注意根据需要选择Public或Private,然后单击复制。

对Function过程而言,过程的数据类型决定其返回值的数据类型。可以在arglist之后使用As子句来指定函数返回值的数据类型。在arglist中,可以使用As子句来指定任何传给该过程的参数的数据类型。

注意:在Declare语句的参数表中不能使用定长的字符串;只能用变长的字符串。 三、应用举例:

该示例演示如何在使用Declare语句来声明API函数,使某一窗体保持在前面。建立一标准工程,将窗体改名为FrmMain。在窗体上添加一命令按钮,将下面的程序粘贴过去。 Private Sub Command1_Click() FrmFore.Show '显示第二个窗体 End Sub

在工程上添加一个窗体,改名为FrmFore。在窗体上添加两个命令按钮,将下面的程序粘贴过去。 Option Explicit

Private Declare Function SetWindowPos Lib \(ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long '声明API函数 Private Sub Command1_Click() Dim rtn

rtn = SetWindowPos(FrmFore.hwnd, -1, 0, 0, 0, 0, 3) Me.Caption = \窗体在前\End Sub

Private Sub Command2_Click() Dim rtn

rtn = SetWindowPos(FrmFore.hwnd, -2, 0, 0, 0, 0, 3) Me.Caption = \活动窗体\End Sub

在工程(Project)菜单打开属性对话框,在对话框中的Starup Object选择FrmMain,然后

14

点击确定。

运行程序时,出现的是第一个窗体,单击显示辅窗体,第二个窗体出现,位于第一个窗体前面。我们分三步来演示这个程序:

一、单击第一个窗体,则第一个窗体到第二个窗体的前面,再单击第二个窗体,第二个窗体又到了前面。

二、这时单击第二个窗体的命令按钮1,然后单击第一个窗体,那么我们可以看到,第一个窗体只被激活,但第二个窗体始终在第一个窗体的前面。

三、最后单击第二个窗体的命令按钮2,此时的情况如同第一步。

10.Deftype语句

描述:在模块或窗体,为变量和传给过程的参数,设置缺省数据类型,以及为其名称以指定的字符开头的Function和PropertyGet过程,设置返回值类型。 一、语法:

DefType letterrange[,letterrange]

所需的letterrange参数遵循下述语法: letter1[-letter2]

letter1和letter2参数指定设置缺省数据类型的名称范围。每个参数都是指变量,参数和Function过程,或PropertyGet过程名称的首字母,且参数可以是字母表中的任意字母。letterrange中不区分字母的大小写。 二、说明:

Type可以换成下列缩写:

缩写 Bool Byte Int Lng Cur Sng Dbl Date Str Obj Var 数据类型 布尔型 字节型 整型(Integer) 长整型(Long) 货币型(Currency) 单精度型(Single) 双精度型(Double) 日期型(Date) 字符串型(String) Object 变体型(Variant) 语句的名字就确定相应的数据类型: 例如整型:DefInt

15

Deftype语句只能在模块或窗体使用(即不能在过程内使用)。Deftype语句只在使用该语句的模块或窗体中有效。而其它模块或窗体不受影响。如果不用Deftype语句显式地声明,则所有变量、参数、Function过程、以及PropertyGet过程的缺省数据类型都是Variant。 对于用Deftype语句声明的变量等,可以使用Dim语句重新声明,覆盖这种缺省数据类型。

三、应用举例:

该示例演示了Deftype语句的用法,来设置那些名称是以指定字符开头的变量。建立一标准工程,在窗体上添加一命令按钮,将下面的程序粘贴过去。

DefInt A-K'将名称以A至K开头变量的缺省数据类型设为Integer类型。 DefStr L-Z'将名称以L至Z开头变量的缺省数据类型设为String类型。 Dim Pai As Double '赋给一个Double类型。 Private Sub Form_Activate() Aint = 4

AVar = \错误\导致\错误。 MyString = \你好\

Pai = 3.14 '允许指定为一个Double数。 Text1.Text = Aint

Text2.Text = MyString Text3.Text = Pai End Sub

运行程序,首先提示“Type mismatch”错误,说明A开头的变量已被声明成整型(Integer),不能用字符串赋值。将AVar = \错误\删除,此时Text1.Text显示4,Aint为整型(Integer);此时Text2.Text显示你好,MyString为字符串型(String);Pai由于用Dim语句重新声明为双精度型(Double),Text3.Text显示3.14。

11.DeleteSetting语句

描述:删除指定的Windows注册表的子键。 一、语法:

DeleteSetting appname,section[,key]

DeleteSetting语句的语法包含下面部分: 部分 appname 描述 必需的。字符串表达式,包含要删除注册表项设置(子键)的应用程序或工程的名称。 必需的。字符串表达式,包含要删除注册表项设置(子键)的区域名称。如果只有appname和section,则将指定的区域连同所有有关的注册表子键都删除。 可选。字符串表达式,包含要删除的注册表项设置(子键)。 section key 二、说明:

如果不熟悉注册表,千万不要修改它,否则可能会使系统瘫痪。

如果提供了所有参数,则删除指定的注册表项设置(子键)。如果试图使用不存在的区域或注册表子键上的DeleteSetting语句,则发生一个运行时错误。

16

三、应用举例:

下列示例先使用SaveSetting语句,在注册区里建立试验应用程序的项目,然后使用DeleteSetting语句将之删除。因为没有指定key参数,整个区段都会被删除掉,包括区段名称及其所有的项设置(子键,key)。

建立一标准工程,在窗体上添加两个命令按钮,将下面的程序粘贴过去。 Private Sub Command1_Click() '在注册区中添加一些设置值。

SaveSetting appname:=\试验\ SaveSetting \试验\End Sub

Private Sub Command2_Click() '删除区段及所有的设置值。 DeleteSetting \试验\End Sub

单击命令按钮1,然后打开注册表,你可以在HKEY_CURRENT_USER\\Software\\VB and VBA Program Settings找到刚才添加的内容。关闭注册表。

单击命令按钮2,然后打开注册表,那么在HKEY_CURRENT_USER\\Software\\VB and VBA Program Settings已经删除了刚才添加的内容。关闭注册表。

12.Dim语句

描述:声明变量并分配存储空间。 一、语法:

Dim[WithEvents]varname[([subscripts])][As[New]type] Dim语句的语法包含下面部分: 部分 描述 可选的。关键字,只有在类模块中使用才是合法的。WithEvents说明本变量是WithEvents 一个用来响应由ActiveX对象触发的事件的对象变量。不能使用WithEvents创建数组。WithEvents不能和New一起使用。 varname subscripts 必需的。变量的名称;遵循标准的变量命名约定。 可选的。数组变量的维数。 可选的。可隐式地创建对象的关键字。如果使用New来声明对象变量,则在第一次引用该变量时将新建该对象的实例,因此不必使用Set语句来给该对象引用赋值。 可选的。变量的数据类型;可以是VB变量的各种类型、用户定义类型、或对象类型。所声明的每个变量都要一个单独的As type子句。 New Type subscripts参数使用下面的语法: [lower To]upper[,[lower To]upper]...

[lower To]upper意思为下界到上界。如果不显式指定lower,则数组的下界由Option

17

Base语句控制。如果没有Option Base语句则下界为0。

二、说明:

局部变量有两种,一种是模块或窗体级局部变量,另一种是过程级局部变量。在一个语句里可以声明多个变量。在模块或窗体级别中用Dim声明的变量,为模块或窗体级局部变量,对该模块或窗体中的所有过程都是可用的。在过程级别中用Dim声明的变量,为过程级局部变量,只在过程内是可用的。

用Dim语句可以在模块或窗体级或过程级中声明变量的数据类型。例如,下面的语句声明了String类型的变量。 Dim MyStr As String

也可以使用Dim语句来声明变量的对象类型。下面的语句为树型视图(TreeView)的新建项目(节点)声明了一个变量。 Dim nd As New Node

如果定义对象变量时没有使用New关键字,则在使用该变量之前,必须使用Set语句将该引用对象的变量赋值为一个已有对象。 Dim nd As Node

Set nd = TreeView1.Nodes.Add(Relative,Relationship,Key,Text,Image,SelectedImage)

也可以使用带空圆括号的Dim语句来声明动态数组。在声明动态数组后,可以在过程内使用ReDim语句来重新定义该数组的维数和元素。

注意:当在过程中使用Dim语句时,通常将Dim语句放在过程的开始处。 三、应用举例:

该示例演示使用Dim语句来声明变量,也演示了用Dim语句来声明数组。 Dim MyNum As Integer '声明整型变量

Dim AnyNum As Single, MyStr As String, MyValue As Double '一个语句里声明多个变量 Dim AnyValue '声明变体变量

Dim AnyStr As String * 20 '声明定长字符串变体变量

Dim MyWeek(7) As String '声明一维字符串数组,元素为七个

Dim MySeveral(6, 2, 3) As Double 'MySeveral是一个三维双精度数组

Dim AnySeveral(6 To 15, 10 To 19) As Integer 'AnySeveral是一个显式指定了上下界的二维整型数组。

Dim MyDevel() 'MyDevel是一个变体动态数组

13.Do...Loop(循环)语句

描述:循环语句,有两种变形,一种是当条件为True时,重复执行一个语句块中的命令。另一种重复执行一个语句块中的命令,直到条件变为True时。 一、语法:

Do[{While|Until}condition] [statements] [Exit Do] [statements] Loop

或者可以使用下面这种语法:

18

Do

[statements] [Exit Do] [statements]

Loop[{While|Until}condition]

Do...Loop语句的语法包含下面部分: 部分 While Until 描述 关键字,可选。当条件为True时,重复执行一个语句块中的命令。 关键字,可选。重复执行一个语句块中的命令,直到条件变为True时。While和Until只能选择一个。 可选参数。数值表达式或字符串表达式,其值为True或False。如果conditioncondition 是Null,则condition会被当作是False。当condition为True时,执行Do While循环或从Do Until循环跳出。 statements 一条或多条命令,它们将被重复执行。 Exit Do 可选。当statements包含条件且条件满足时退出循环。 二、说明: 一般来讲,While和Until只能而且必须选择一个。如果不选,将进入无限循环,这时只能用Exit Do语句跳出循环。

在Do…Loop中可以在任何位置放置任意个数的Exit Do语句,随时跳出Do…Loop循环。Exit Do通常用于条件判断之后,当满足条件后,Exit Do语句将控制权转移到紧接在Loop命令之后的语句。

Do…Loop也可以采用嵌套方式。如果Exit Do使用在嵌套的Do…Loop语句中,则Exit Do会将控制权转移到Exit Do所在位置的外层循环。 注意:两种Do…Loop语句运行方式是不同的。 Do[{While|Until}condition] [statements] Loop

采用这种循环,程序先判断条件,若条件满足,执行语句块中的命令,否则退出循环。 Do

[statements]

Loop[{While|Until}condition]

采用这种循环,程序先执行语句块中的命令,然后判断条件,若条件满足,重复执行语句块中的命令,否则退出循环。因此在此循环中,至少要执行一次语句块中的命令。 三、应用举例:

本示例示范如何使用Do...Loop语句。建立一个标准工程,在窗体上添加两个命令按钮,将下面的程序粘贴过去。 Private Sub Command1_Click()

Dim Check As Boolean, Counter As Integer Check = True: Counter = 0 '设置变量初始值。 Do '外层循环。

Do While Counter < 20 '内层循环。

19

Counter = Counter + 1 '计数器加一。 If Counter = 10 Then '如果条件成立。 Check = False '将标志值设成False。 Exit Do '退出内层循环。 End If Loop

Loop Until Check = False '退出外层循环。

MsgBox \End Sub

Private Sub Command2_Click()

Dim Check As Boolean, Counter As Integer, I As Integer Check = True: I = 0 '设置变量初始值。 Do Until Check = False '外层循环 Counter = 0

Do While Counter < 20 '内层循环。 Counter = Counter + 1 '计数器加一。 Loop I = I + 1

If I = 10 Then Check = False '如果条件成立。将标志值设成False。 Loop

MsgBox \End Sub

单击命令按钮1,内层的Do...Loop语句循环到第10次时将标志值设置为False,并用ExitDo语句强制退出内层循环。外层循环则在检查到标志值为False时,马上退出。MsgBox显示“Counter=10;Check=False。” 单击命令按钮2,内层的Do...Loop语句循环到第20次时退出内层循环。外层的Do...Loop检测I=10时退出外层循环。MsgBox显示“Counter=20;I=10;Check=False。”

14.End语句

描述:结束程序、过程或语句。 一、语法: End

End语句的语法有以下几种形式: 部分 End End Function End If End

描述 必要的,用于结束程序 必要的,用于结束一个Function过程 必要的,用于结束一个If…Then…Else语句块 必要的,用于结束一个PropertyLet、PropertyGet、或20

Property End Select End Sub End Type End With PropertySet过程 必要的,用于结束一个SelectCase语句 必要的,用于结束一个Sub过程 必要的,用于结束一个用户定义类型的定义(Type语句) 必要的,用于结束一个With语句 二、说明:

End语句提供了一种强迫中止程序的方法,它不调用窗体和类模块中的Unload、QueryUnload、Terminate事件或任何其它VisualBasic代码,只是生硬地终止代码执行。 三、应用举例:

本示例使用End语句,在用户输入错误密码时结束代码执行。建立一个标准工程,在窗体上添加一个命令按钮和一个文本框,将下面的程序粘贴过去。 Private Sub Command1_Click() Static I As Integer

If Trim(Text1.Text) = \ MsgBox \密码正确\ Else

MsgBox \密码错误\ I = I + 1

If I = 3 Then End End If End Sub

在文本框键入password,单击命令按钮,MsgBox显示“密码正确”;在文本框键入其他字符,单击命令按钮,MsgBox显示“密码错误”,当第三次键入错误字符,将退出程序。

15.Enum语句

描述:定义枚举类型。 一、语法:

[Public|Private]Enum Name

Membername[=Constantexpression] Membername[=Constantexpression] ...

End Enum

Enum语句的语法包含下面部分: 部分 Public private 描述 可选的。表示该Enum类型是全局的(公用的),在整个工程中都是可见的。Enum类型的缺省情况是Public。 可选的。表示该Enum类型是局部的,只在所声明的模块或窗体中是可 21

见。 Name 必需的。该Enum类型的名称。Name必须是一个合法的VisualBasic标识符,在定义该Enum类型的变量或参数时用该名称来指定类型。 必需的。用于指定该Enum类型的组成元素名称的合法VisualBasic标识符。 Membername 可选的。元素的值为Long类型,也/可以是别的Enum类型。如果没有Constantexpression 指定Constantexpression,则第一个Membername的值为0,其余Membername的值为序列数,后一个总比其前一个的值大1。 二、说明:

用Enum类型定义的变量叫枚举变量,枚举变量只能在模块或窗体中定义,其中的元素被初始化为Enum语句中指定的常数值。所赋给的值可以包括正数和负数,且在运行时不能改变。

在编程时,经常遇到一些数据,即不直观也不容易记忆,如果采用枚举变量可以使编程简单化。例如颜色,为六位十六进制数,为了使用方便,VB将常用颜色定义成枚举变量,在各个颜色的英文单词前面冠以vb,用以代替六位十六进制数,红色为vbRed,绿色为vbGreen,蓝色为vbBlue等。

注意:不能在With块中使用Enum类型作为目标。 三、应用举例:

下面的示例显示用Enum语句定义一个颜色常数的集合。建立一标准工程,在窗体上添加两个命令按钮和两个文本框,将下面的程序粘贴过去。 Private Enum MyColors Color1 = &HFF6347 Color2 = &HFC870E Color3 = &HF9F400 Color4 = &H9400FA Color5 = &H8B3EE3 Color6 = &H8B69F0 End Enum

Private Sub Command1_Click() Text1.BackColor = Color1 Text2.BackColor = Color2 Form1.BackColor = Color3 End Sub

Private Sub Command2_Click() Text1.BackColor = Color4 Text2.BackColor = Color5 Form1.BackColor = Color6 End Sub

分别单击两个命令按钮,你可以看到窗体和两个文本框的背景色发生变化。

22

16.Erase语句

描述:重新初始化大小固定的数组的元素,以及释放动态数组的存储空间。 一、语法: Erase arraylist

所需的arraylist参数是一个或多个用逗号隔开的需要清除的数组变量。 二、说明:

Erase根据是固定数组还是动态数组,来采取完全不同的行为。对于固定数组恢复内存。Erase按下表来设置固定数组的元素 数组类型 固定数值数组 固定字符串数组(长度可变) 固定字符串数组(长度固定) 固定Variant数组 用户定义类型的数组 对象数组 Erase对固定数组元素的影响 将每个元素设为0 将每个元素设为零长度字符串(\将每个元素设为0 将每个元素设为Empty 将每个元素作为单独的变量来设置 将每个元素设为特定值Nothing 对于动态数组,Erase释放动态数组所使用的内存。 其实对于我们来讲,不必知道Erase采取的行为。只需知道某一动态数组使用了Erase语句后,如果再次引用该动态数组之前,程序必须使用ReDim语句来重新定义该数组变量的维数。

三、应用举例:

该示例使用Erase语句释放动态数组存储空间,然后重新分配存储空间。 Dim DynamicArray() As Integer '声明动态数组。

ReDim DynamicArray(10) '定义动态数组的维数,并为其分配存储空间。 Erase DynamicArray '释放数组所用内存。

ReDim DynamicArray(5) '重新分配存储空间。

17.Error语句

描述:模拟错误的发生。 一、语法:

Error errornumber

必需的errornumber可以是任何有效的错误号。 二、说明:

在VB自带的函数里,也有一条Error函数。其含义是返回对应于已知错误号的错误信息,语法是Error[(errornumber)],errornumber为可选的。Error语句和Error函数在语法上的区别是:Error语句中的错误号是必需的,且不带小扩号;而Error函数中的错误号是可选的,

23

且必须用小扩号扩起来。其结果也是不同的,用Error语句可以人为的产生一个错误;而调用Error函数则返回错误信息。 三、应用举例:

本示例使用Error语句来模拟发生错误代号11的状况。建立一标准工程,在窗体上添加一命令按钮,将下面的程序粘贴过去。 Private Sub Command1_Click()

On Error Resume Next '发生错误后继续下一步 Error 11 '模拟\除以零\的错误

Debug.Print Err.Description '显示错误信息 End Sub

运行程序并单击按钮,我们可以在立即窗口如下的错误信息: Division by zero

18.Event语句

描述:定义用户自定义的事件。 一、语法:

[Public]Event procedurename[(arglist)] Event语句的语法包含下面部分: 部分 public 描述 可选的。指定该Event是全局的(公用的),在整个工程中都是可见的。缺省情况下Events类型是Public。应注意,事件只能在所声明的模块中产生。 procedurename 必需的。事件的名称;遵循标准的变量命名约定。 arglist参数的语法及语法的各个部分如下:

[ByVal|ByRef]varname[()][As type] 部分 byVal byRef 描述 可选的。表示该参数是按值传递的。 可选的,为缺省值。表示该参数是按地址传递的。 varname 必需的。代表要传递给过程的参数变量的名称;遵循标准的变量命名约定。 type 可选的。指传递给过程的参数的数据类型,可以是VB变量的各种类型、用户定义类型或对象类型,不支持定长的String。 二、说明: 这是一个高级话题,因为它涉及到了类模块的概念,而且由类模块产生事件,如果你不熟悉类的概念,就不要理它,因为这种情况不多见。

事件被声明之后,必须使用RaiseEvent语句才能激活该事件。 注意:

可以象声明过程的参数一样来声明事件的参数,但有以下不同:事件不能有带命名参数、Optional参数、或者ParamArray参数。事件没有返回值。

24

三、应用举例:

下面的示例是用事件来计算时间。建立一标准工程,在窗体(Form1)上添加一个命令按钮(Command1),两个标签(Label1)和(Label2)。第一个标签显示秒,第二个标签显示分。将下面的程序粘贴过去。 Option Explicit

Dim WithEvents TMR As TimerState '声明事件 Private Sub Command1_Click()

If Command1.Caption = \启动\ Command1.Caption = \停止\ TMR.StartCounting Else

Command1.Caption = \启动\ TMR.StopCounting End If End Sub

Private Sub Form_Load()

Set TMR = New TimerState Command1.Caption = \启动\ Label2.Caption = 0 Label1.Caption = 0 End Sub

Private Sub TMR_Sec(ByVal TimJump As Double) Label1.Caption = Str(Format(TimJump, \ DoEvents End Sub

Private Sub TMR_Minute() Label1.Caption = 0

Label2.Caption = Val(Label2.Caption) + 1 TMR.TimerTask (60) End Sub

建立一个类模块,改名为TimerState,将下面的程序粘贴过去。 Option Explicit

Dim Counting As Boolean

Event Sec(ByVal dblJump As Double) Event Minute()

Public Sub StartCounting() Counting = True TimerTask (60) End Sub

Public Sub StopCounting() Counting = False TimerTask (0) End Sub

Public Sub TimerTask(ByVal Duration As Double)

25

Dim TimStart As Double Dim TimSecond As Double Dim TimSoFar As Double If Not Counting Then Exit Sub TimStart = Timer TimSoFar = TimStart

Do While Timer < TimStart + Duration If Not Counting Then Exit Sub If Timer - TimSoFar >= 1 Then TimSoFar = TimSoFar + 1

RaiseEvent Sec(Timer - TimStart) '激活事件 End If Loop

RaiseEvent Minute End Sub

单击命令按钮后,第一个标签开始计时。每经过60秒之后,第二个标签则加一。如果再次单击命令按钮后,则停止计时。这个示例只是为了说明语句,在实际运行时将占用大量的时钟周期。

19.Exit语句

描述:提前退出控制结构、循环或过程的语句体。 一、语法: Exit Do Exit For

Exit Function Exit Property Exit Sub

Exit语句的语法包含下面部分: 部分 描述 在Do...Loop循环中使用,退出Do...Loop循环。当Exit Do用在嵌套的Do...Loop循环中时,Exit Do只能退出本层循环,即Exit Do所在的那层循环。 在For...Next或For Each...Next循环中,提供一种退出For循环的方法。当Exit For用在嵌套的For循环中时,Exit For只能退出本层循环。 在Function过程中,可以使用Exit Function退出过程。程序会从调用Function的语句之后的语句继续执行。 在Property过程中,可以使用Exit Property退出过程。程序会从调用Property过程的语句之后的语句继续执行。 Exit Do Exit For Exit Function Exit Property 26

Exit Sub 在Sub过程中,可以使用Exit Sub退出过程。程序会从调用Sub过程的语句之后的语句继续执行。 二、说明:

不要将Exit语句与End语句搞混了。End语句结束一个结构;Exit只是退出一个结构。 三、应用举例:

本示例使用Exit语句退出Do...Loop循环及子过程。建立一标准工程,在窗体上添加一个命令按钮,将下面的程序粘贴过去。 Private Sub Command1_Click() Dim I

Do '建立无穷循环。 I = I + 1

If I = 50 Then Exit Do '当I =50时,退出Do...Loop循环。 Loop

Debug.Print \在立即窗口显示I=50 For I = 50 To 1050 '循环1000次。 If I = 100 Then

Debug.Print \在立即窗口显示I=100 Exit Sub '当I =100时,退出子过程。 End If Next I

Debug.Print 2000 '在立即窗口显示2000 End Sub

20.FileCopy语句

描述:复制一个文件。 一、语法: FileCopy source, destination FileCopy 语句的语法含有以下这些命名参数: 部分 描述 必要参数。字符串表达式,用来表示要被复制的文件名。source 可以包含目录或文件夹、以及驱动器。 必要参数。字符串表达式,用来指定要复制的目地文件名。destination 可以包含目录或文件夹、以及驱动器。 二、说明:如果想要对一个已打开的文件使用 FileCopy 语句,则会产生错误。 三、应用举例:

本示例使用FileCopy语句来复制文件。建立一标准工程,在窗体上添加一个命令按钮和两个文本框,将下面的程序粘贴过去。 Private Sub Command1_Click() FileCopy Text1.Text, Text2.Text End Sub

在第一个文本框里输入源文件名,在第二个文本框里输入目标文件名,单击命令按钮。

27

source destination 注意:两个文件名都要包括扩展名。

21.For Each...Next语句

描述:针对一个数组或集合中的每个元素,重复执行一组语句。 一、语法:

For Each element In group [statements] [Exit For] [statements] Next[element]

For Each...Next语句的语法包含下面部分: 部分 element group statements Exit For 描述 必需的,用来遍历集合或数组中所有元素的变量。 必需的,对象集合或数组的名称。 可选的,针对group中的每一项执行的一条或多条语句。 可选的,用于中途退出循环。 二、说明: 当进入循环后,便先针对group中第一个元素执行循环中的所有语句。如果group中还有其它的元素,则继续执行循环中的语句,当group中的所有元素都执行完了,便会退出循环。

可以用Exit For语句随时退出For...Each...Next循环,Exit For应在条件判断语句之后。

For...Each...Next循环也可以组成嵌套式循环。但是每个循环的element必须是唯一的。 三、应用举例:

本示例使用For Each...Next语句搜寻树型视图中的所有节点的Text属性,查找“重庆”字符串。

建立一个标准工程,在Project(工程)菜单上点击Components,然后在Components对话框添加名为Microsoft Windows Common Controls 6.0的企业板控件。

在窗体上添加一个命令按钮、一个文本框、一个列表框和一个树状视图,将下面的程序粘贴过去。

Private Sub Command1_Click() Dim aNode As Node

For Each aNode In TreeView1.Nodes

If aNode.Text = \重庆\如果Text属性值等于\重庆\。 Text1.Text = aNode.Text Exit For '退出循环。 End If

List1.AddItem aNode.Text Next

28

End Sub

Private Sub Form_Activate()

TreeView1.Nodes.Add , , \中国\中国\

TreeView1.Nodes.Add \中国\北京\ TreeView1.Nodes.Add \中国\天津\ TreeView1.Nodes.Add \中国\上海\ TreeView1.Nodes.Add \中国\重庆\ TreeView1.Nodes.Add \中国\广州\ TreeView1.Nodes.Add \中国\沈阳\End Sub

22.For...Next语句

描述:以指定次数来重复执行一组语句。 一、语法:

For<循环变量>=<初值>To<终值>[Step步长] <循环体> [Exit For]

Next<循环变量>

功能:当循环变量的值在初值到终值范围内时,执行一次循环体中的语句块,并使初值增加一个步长。当循环变量的值不在初值到终值范围内时,就退出循环,执行Next后面的语句。For循环语句执行的流程图。 二、说明:

(1)<循环变量>:也称循环控制变量,它是一个数值变量,但不能是布尔或数组元素。 (2)<初值>、<终值>和<步长>:它们是一个数值表达式。 步长为正数时,表示递增循环;步长为负数时,表示递减循环,但不能为o.Step的缺省值为l.

(3)<循环体>:在For语句和Next语句之间的语句序列,可以是一个或多个语句。 (4)[Exit For]:如果有此可选项时,退出循环。

(5)Next:是循环终端语句,在Next后面的循环变量与For语句中的循环变量必须相同。当只有一层循环时,Next后面的循环变量可略去不写。

(6)For语句又叫做循环说明语句,用来指定循环变量的名称,以及循环变量的初值、终值和步长;循环体是被反复执行的部分(即循环工作部分),它可以由若干条语句所组成;Next,语句又叫做循环终端语句,其作用是改变循环变量的值(即增加一个步长)并控制是否再次执行循环体。

(7)循环执行的次数: n=Int((终值一初值)/步长)+1

(8)For—Next语句可以嵌套使用,嵌套的层数没有限制,其基本要求是:每个循环只有一个惟一的变量作为循环变量;内层循环变量的Next语句必须放在上层循环变量的Next语句之前。 三、应用举例:

本示例说明一个嵌套循环,内层循环使用For...Next语句创建一个字符串,其内容为由0到9中的5个偶数所组成的字符串,每个字符串之间用逗号隔开。外层循环使用一个变量当作循环计数器,每循环一次,变量值减一,其内容为由9到0十个数字所组成的字符串。建立一标准工程,在窗体上添加一个命令按钮,将下面的程序粘贴过去。

29

Private Sub Command2_Click()

Dim I As Integer, J As Integer, K As Double, MyString As String For I = 9 To 0 Step -1 '建立10次循环。 For J = 0 To 9 Step 2 '建立10次循环。

MyString = MyString & J '将数字添加到字符串中。 Next J

MyString = MyString & \,\添加一个逗号。 K = K & I Next I

MsgBox MyString & \。\End Sub

23.Function语句

描述:声明Function过程的名称,参数以及构成其主体的代码。 一、语法:

[Public|Private|Friend][Static]Function name[(arglist)][As type] [statements]

[name=expression] [Exit Function] [statements]

[name=expression] End Function

Function语句的语法包含下面部分: 部分 public private friend static name arglist type 描述 可选的。这个Function过程是全局的(公用的),整个工程都可以访问它。 可选的。这个Function过程是窗体的(私有的),只有这个窗体可以访问它。 可选的。只能在类模块中使用。表示该Function过程在整个工程中都是可见的,但对于对象实例的控制者是不可见的。 可选的。表示在调用Function过程结束后,该过程的局部变量值将保留。 必需的。Function的名称;遵循标准的变量命名约定。 可选的。调用Function过程时要传递的参数变量列表。多个变量应用逗号隔开。 可选的。Function过程的返回值的数据类型,可以是VB变量的各种类型,或任何用户定义类型,不支持定长的String。 statements 可选的。在Function过程中执行的语句组。 expression 可选的。Function的返回值。 其中的arglist参数的语法以及语法各个部分如下:

30

[Optional][ByVal|ByRef][ParamArray]varname[()][As type][=defaultvalue] 部分 Optional ByVal ByRef 描述 可选的。表示参数不是必需的。如果使用该选项,则arglist中的后续参数都必需是可选的,而且必须都使用Optional关键字声明。 可选的。表示该参数按值传递。 可选的。表示该参数按地址传递,是缺省选项。 可选的。只用于arglist的最后一个参数,表示最后的参数是一个Variant元素ParamArray 的Optional的数组。使用ParamArray关键字可以提供任意数目的参数。ParamArray关键字不能与ByVal、ByRef或Optional一起使用。 varname 必需的。代表参数的变量的名称;遵循标准的变量命名约定。 可选的。传递给该过程的参数的数据类型;可以是VB变量的各种类型,不支持定长的String。如果参数不是Optional,也可以是用户定义类型,或对象类型。 type defaultvalue 可选的。任何常数或常数表达式。只对于Optional参数时是合法的。 二、说明:

如果没有使用Public、Private或Friend显式指定,则Function过程缺省为全局(公用)。如果使用Static,则局部变量的值在调用之后会保留。 Function过程可以调用自己来完成某个特定的任务,也就是说可以实现有效而紧凑编程的强大技术——递归编程。在递归编程时,如果没有指定退出条件(即停止过程自我调用的语句),则程序将无法停止,形成死循环,最终导致堆栈上溢。一般来说Static关键字和递归的Function过程最好不要一起使用。

Function过程与Sub过程的不同之处是:可以在表达式的右边使用Function过程,从而得到该函数的返回值时,这与内部函数,诸如Abs、Rnd或Sin的使用方式一样。

在过程的任意位置都可以给函数名赋值。在Function过程的任何位置都可以用Exit Function语句退出这个过程。 三、应用举例:

该示例使用Function过程过滤非数字键,并限制小数点二次输入。建立一个标准工程,在窗体上添加一个文本框,将下面的程序粘贴过去。

Public Function MySingle(KeyAscii As Integer, MyStr As String) As Boolean Dim Key As String Key = Chr(KeyAscii) Select Case Key

Case \ MySingle = True Case \

'再次输入小数点无效 If InStr(MyStr, \ MySingle = False Else

MySingle = True

31

End If Case Else

MySingle = False End Select End Function

Private Sub Text1_KeyPress(KeyAscii As Integer)

If MySingle(KeyAscii, Trim(Text1.Text)) = False Then KeyAscii = 0 End Sub

下面是一个利用递归计算阶乘的例子。建立一个标准工程,在窗体上添加一个命令按钮和一个文本框,将下面的程序粘贴过去。

Private Function Multiplies(I As Integer) As Double If I = 0 Then Multiplies = 1 Else

Multiplies = Multiplies(I - 1) * I End If End Function

Private Sub Command1_Click() Dim Num As Integer

'请求用户输入一个数字。

Num = InputBox(\输入一个数据。\ Text1.Text = Multiplies(Num) End Sub

单击命令按钮,在输入框输入一个整数,文本框则显示计算结果。

24.Get语句

描述:将一个已打开的磁盘文件读入一个变量之中。 一、语法:

Get [#]fileNum,[recNum],varname 或

Get [#]fileNum,[position],varname Get语句的语法包含下面部分: 部分 fileNum recNum position varname 描述 必需的。任何有效的文件号。 可选的。随机文件的记录号,表示在此处开始读出数据 可选的。二进制文件的字节数,表示在此处开始读出字节。 必需的。一个有效的变量名,将读出的数据放入其中。 二、说明:

本语句用来读随机文件或二进制文件。对于随机文件,采用:

32

Get [#]fileNum,[recNum],varname 对于二进制文件,采用: Get [#]fileNum,[position],varname

如果不选recNum或position,必须将用于分界的逗号罗列出来。例如: Get #1,,MyString

语句中recNum或position可以使用数字,也可以使用数字变量。当其值为1时指第一条记录或第一个字节,其值为2时指第二条记录或第二个字节,依此类推。若省略recNum或position,则会读出紧随上一个Get或Put语句之后的下一个记录或字节。 三、应用举例:

本示例使用Get语句来将数据从文件读到变量中。建立一标准工程,在窗体上添加一个命令按钮和五个文本框,将下面的程序粘贴过去。 Dim MyRecord As MyCorrespondence '声明变量。 Private Sub Command1_Click()

Open \ Get #1, 2, MyRecord

Text1.Text = MyRecord.ID Text2.Text = MyRecord.Name Text3.Text = MyRecord.Unit Text4.Text = MyRecord.Address Text5.Text = MyRecord.Phone Close #1 End Sub

Private Sub Form_Load()

Open \ MyRecord.ID = \

MyRecord.Name = \王小川\ MyRecord.Unit = \汾西机器厂\

MyRecord.Address = \太原市解放路87号\ MyRecord.Phone = \ MyRecord.cr = Chr(13) + Chr(10) Put #1, 1, MyRecord MyRecord.ID = \

MyRecord.Name = \李志刚\ MyRecord.Unit = \太原机车厂\

MyRecord.Address = \太原市五一路7号\ MyRecord.Phone = \ MyRecord.cr = Chr(13) + Chr(10) Put #1, , MyRecord MyRecord.ID = \ MyRecord.Name = \郭娟\

MyRecord.Unit = \太原客运段\

MyRecord.Address = \太原市迎泽大街54号\ MyRecord.Phone = \ MyRecord.cr = Chr(13) + Chr(10)

33

Put #1, , MyRecord Close #1 End Sub

添加一个标准模块。将下面的程序粘贴到标准模块。 Type MyCorrespondence '创建用户自定义的类型。 ID As String * 4 '定义元素的数据类型。 Name As String * 10 Unit As String * 10 Address As String * 30 Phone As String * 12 cr As String * 2 End Type

25.GoSub...Return语句

描述:在一个过程中跳到另一个子程序中执行,执行后再返回。 一、语法: GoSub line ... line ... Return

必要的line参数可以是任何行标签或行号。 二、说明:

可以在过程中的任何地方使用GoSub和Return,但是GoSub和与之相应的Return语句必须放在同一个过程中。这样程序在碰到Return语句时,就会返回到紧接在刚刚执行的GoSub语句之后的语句继续执行。

由于line子程序一般放在过程的后部,而程序又是顺序执行的,为防止当过程结束时再次进入line子程序,常在line子程序前用Exit Sub退出过程。 三、应用举例:

本示例使用GoSub来调用子过程里的一段子程序来求圆的面积。建立一个标准工程,在窗体上添加一个命令按钮和一个文本框,将下面的程序粘贴过去。 Private Sub Command1_Click() Dim Num

Num = InputBox(\请输入一个正数。\请求用户输入一个数字。 If Num > 0 Then '如果用户输入一个正数,则使用子程序。 GoSub MyArea Text1.Text = Num Else

MsgBox \输入错误\ End If

Exit Sub '使用Exit命令退出过程 MyArea:

34

Num = Num * Num * 3.1416 '求圆的面积。 Return '将控制返回GoSub之后的语句。 End Sub

单击命令按钮后,在输入对话框输入一个正数,此时调用子程序来求圆的面积,然后Return语句则将执行返回到GoSub的下一个语句。如果输入负数,则提示输入错误。Exit Sub语句则是用来避免控制意外进入该子程序的情形发生。

26.GoTo语句

描述:无条件地转移到过程中指定的行。 一、语法: GoTo line

必要的line参数可以是任意的行标签或行号。 二、说明:

GoTo只能跳到它所在过程中的行。 注意:为了使程序便于阅读,在编程时,应尽可能使用结构化控制语句(Do...Loop、For...Next、If...Then...Else、SelectCase),而避免使用GoTo语句。 三、应用举例:

本示例用GoTo语句在一个过程内的不同程序段间作流程控制。当输入的正数大于或等于10时,计算周长;当输入的正数小于10时,计算圆面积。建立一个标准工程,在窗体上添加一个命令按钮和一个文本框,将下面的程序粘贴过去。 Private Sub Command1_Click() Dim Num

Num = InputBox(\清输入一个正数。\请求用户输入一个数字。 If Num < 10 Then

GoTo MyCircumference Else

GoTo MyWeekLong End If Exit Sub

MyCircumference:

Num = Num * Num * 3.1416 '求圆的面积。 GoTo Last MyWeekLong:

Num = Num * 2 * 3.1416 '求圆的周长。 Last:

Text1.Text = Num End Sub

35

27.If...Then...Else语句

描述:条件语句,根据表达式的值有条件地执行一组语句。 一、语法: 1、标准语法:

If condition Then [statements] [Else elsestatements] 或者,可以使用块形式的语法: If condition Then [statements]

[ElseIf condition-n Then [elseifstatements]] ... [Else

[elsestatements]] End If

2、中文语法:

IF 表达式 Then 语句1 [Else 语句2]

中文意思是如果表达式成立,执行语句1,否则执行语句2。 IF 表达式1 Then [语句组1]

[ElseIF 表达式N Then [语句组N]] …… [Else

[语句组N+1]] End IF

我们可以把表达式看成条件,用通俗语言来讲如果满足条件1那么执行语句组1;否则如果条件N成立那么执行语句组N;否则也就是说条件都不满足时执行语句组N+1。而在执行完Then或Else之后的语句后,程序会退出If...Then...Else语句,而从End If之后的语句继续执行。

第一种语法我们称为单行形式;第二种语法我们称为块形式。 If...Then...Else语句的语法包含下面部分: 部分 描述 必要参数。一个或多个具有下面两种类型的表达式:数值表达式或字符串表达式,其运算结果为True或False。如果表达式为Null,则表达式会视为False。 在块形式中是可选参数;但是在单行形式中,且没有Else子句时,则为必要参数。一条或多条以冒号分开的语句,它们在表达式为True时执行。 可选参数。与表达式同 表达式(condition) 语句组(statements) 表达式N(condition-n) 36

语句组可选参数。一条或多条语句,它们在相关的表达式N为True时执N(elseifstatements) 行。 语句组可选参数。一条或多条语句,它们在前面的表达式或表达式N都不N+1([elsestatements) 为True时执行。 二、说明:

单行形式(第一种语法)适用于简单程序。块形式(第二种语法)则提供了更强的结构化与适应性,并且通常也是比较容易阅读、维护及调试的。 在单行形式中,按照If...Then判断的结果也可以执行多条语句。所有语句必须在同一行上并且以冒号分开,如下面语句所示: If A>10 Then A=A+1:B=B+A:C=C+B

在块形式中,If语句必须是第一行语句,而且必须以一个End If语句结束。ElseIf和Else子句都是可选的。在If块中,可以放置任意多个ElseIf子句,但是都必须在Else子句之前。

为了方便理解,我们把块形式(第二种语法)分解成三种形式 1、IF 表达式 Then 语句组 End IF

这种形式比较好理解,通俗的讲就是如果表达式为真,那么执行语句组。 2、IF 表达式 Then 语句组1 Else

语句组2 End IF

这种形式也比较好理解,通俗的讲就是如果表达式为真,那么执行语句组1,否则执行语句组2。

3、IF 表达式1 Then 语句组1

ElseIF 表达式2 Then 语句组2 ……

ElseIF 表达式N Then 语句组N Else

语句组N+1 End IF

这种形式比第二种形式复杂一些,当程序运行到一个If块时,各部分的表达式会依次计算并加以测试。如果找到某个为True的条件时,则其紧接在相关的Then之后的语句会被执行。如果没有一个ElseIf条件式为True,则程序会执行Else部分的语句。 If块也可以是嵌套的。

提示:根据单一表达式来执行多种可能的动作时,采用Select Case语句更为方便。 三、应用举例:

在人事档案数据库中,职工编号和姓名是不可缺少的,为了避免忘了输入职工编号和姓名,本示例用 “区块格式”来检查这两项。Text1为编号,Text2为姓名,当这两项中的一项

37

没有输入时,MsgBox函数将提示相关信息,并退出程序。

建立一个标准工程,在窗体上添加一命令按钮和两个文本框,将下面的程序粘贴过去。 Private Sub Command1_Click() If Trim(Text1.Text) = \ MsgBox \编号不能为空\ Exit Sub

'当Text1为空时,显示“编号不能为空”并退出程序 ElseIf Trim(Text2.Text) = \ MsgBox \请输入姓名\ Exit Sub

'当Text1不为空时,而Text2为空时,显示“ 请输入姓名”并退出程序 Else

MsgBox \输入正确\

'当两个文本都不为空时,显示“输入正确” End If End Sub

两个文本框都不输入,单击命令按钮,此时MsgBox显示“编号不能为空”;在Text1输入数字,单击命令按钮,此时MsgBox显示“请输入姓名”;在Text2输入文字,单击命令按钮,此时MsgBox显示“输入正确”。

使用“If块嵌套”,将日期由windows格式转换成常用的格式(例如由2007-8-21转变成200708)在上面的标准工程中,用下面的程序替换上面的程序,然后运行程序。你将看到Text1显示的日期为windows格式,Text2显示的日期为常用的格式。 Private Sub Form_Activate() Dim a '定义变量 a = Date '取日期 Text1.Text = a

If Right(Left(a, 3), 1) = \日期的第3位为\,系统为98 a = Left(a, 5) '取日期的前5位

If Right(a, 1) = \日期的第5位为\,月份小于10 a = Left(a, 4) '取日期的前4位

a = \年代前面加20,月份前面加0 Else '否则月份大于10

a = \年代前面加20 End If '

Else '否则系统为2000或xp a = Left(a, 7) '取日期的前7位

If Right(a, 1) = \日期的第7位为\,月份小于10 a = Left(a, 6) '取日期的前6位

a = Left(a, 4) & \月份前面加0 Else '否则月份大于10

a = Left(a, 4) & Right(a, 2) '屏蔽\ End If End If

Text2.Text = a

38

End Sub

28.Input#语句

描述:从已打开的顺序文件中读出数据并将数据指定给变量。 一、语法:

Input#filenumber,varlist

Input#语句的语法包含下面部分: 部分 filenumber varlist 描述 必需。任何有效的文件号 必需。用逗号分界的变量列表,将文件中读出的值分配给这些变量。 其中的varlist参数的语法如下: var1[,var2[,var3[,...]]] var:变量名 二、说明:

该语句只能用于以Input或Binary方式打开的文件。由于Print#语句无法将各个单独的数据域正确分隔开,Input#语句在读出数据时,不能将文件的数据正确读入到变量中,因此常用来读出Write#语句写入的数据。在读出数据时,输入数据中的双引号符号(\将被忽略。 在输入数据项目时,如果已到达文件结尾,则会终止输入,并产生一个错误。 三、应用举例:

本示例使用Input#语句将文件内的数据读入两个变量中。建立一个标准工程,在窗体上添加一个命令按钮,将下面的程序粘贴过去。 Private Sub Command1_Click() Dim MyStr1, MyStr2

Open \打开输入文件。 Do While Not EOF(1) '循环至文件尾。

Input #1, MyStr1, MyStr2 '将数据读入两个变量。

Debug.Print MyStr1, MyStr2 '在立即窗口中显示数据。 Loop

Close #1 '关闭文件。 End Sub

Private Sub Form_Activate()

Open \打开输出文件。 Write #1, \姓 名\王晓刚\写入数据 Write #1, \手机\

Write #1, \工作单位\嘉华软件公司\ Write #1, \姓 名\李海燕\ Write #1, \手机\

Write #1, \工作单位\海淀中心小学\ Close #1 '关闭文件 End Sub

39

29.Kill语句

描述:从磁盘上删除指定文件,允许使用统配符。 一、语法: Kill pathname

必需的pathname参数是用来指定一个要删除的文件名的字符串表达式。文件名应是包括扩展名在内的完整文件名。pathname可以包含目录(文件夹)、以及驱动器。 二、说明:

Kill支持多字符(*)和单字符(?)的通配符来指定多重文件。 三、应用举例:

本示例使用Kill语句删除磁盘中的文件。建立一个标准工程,在窗体上添加一个命令按钮,将下面的程序粘贴过去。然后新建一个文本文件,起名为a。 Private Sub Command1_Click() On Error GoTo MyErr Kill \

MsgBox \文件已删除\ Exit Sub MyErr:

MsgBox \文件没找到\End Sub

30.Let语句

描述:将表达式的值赋给变量或属性。 一、语法:

[Let]varname=expression

Let语句的语法包含下面部分: 部分 let varname expression 描述 可选的。显式使用Let关键字也是一种格式,但通常都省略该关键字 必需的。变量或属性的名称;遵循标准变量命名约定 必需的。赋给变量或属性的值 二、说明:

为变量赋值,除了Variant变量外,表达式必须与变量具有相同的数据类型,否则,会在编译时出现错误。

如果将一种数值类型的表达式赋给另一种数值类型的变量时,会强制将该表达式的值转换为结果变量的数值类型。 三、应用举例:

该示例使用显式的Let语句将表达式的值赋给变量。 Private Sub Command1_Click()

40

Dim MyStr, MyInt, MyStr1, MyInt1 '下面的变量赋值使用了Let语句。 Let MyStr = \ Let MyInt = 15

'下面是没有使用Let语句的变量赋值。 MyStr1 = \你好!\ MyInt1 = 10

Debug.Print MyStr Debug.Print MyInt Debug.Print MyStr1 Debug.Print MyInt1 End Sub

31.LineInput#语句

描述:从已打开的顺序文件中读出一行并将字符串变量指定给变量。 一、语法:

Line Input#filenumber,varname

LineInput#语句的语法包含下面部分: 部分 filenumber varlist 描述 必需的。任何有效的文件号 必需的。有效变量或字符串变量名 二、说明:

Line Input#常用来读出Print#语句写入的数据。 三、应用举例:

本例使用Line Input#语句从一顺序文件读取线并赋值给一个变量。建立一个标准工程,在窗体上添加一个命令按钮,将下面的程序粘贴过去。 Private Sub Command1_Click() Dim TextLine

Open \打开输入文件。 Do While Not EOF(1) '循环至文件尾。 Line Input #1, TextLine Debug.Print TextLine Loop Close #1 End Sub

Private Sub Form_Activate()

Open \打开输出文件。

Print #1, Spc(5); \通信录\在字符串之前写入五个空格。 Print #1, '将空白行写入文件。

Print #1, \姓 名\手机\数据写入两个区。

41

Print #1, \王晓刚\

Print #1, \工作单位\嘉华软件公司\以空格隔开两个字符串。 Print #1,

Print #1, \姓 名\手机\

Print #1, \李海燕\ Print #1, \工作单位\海淀中心小学\ Close #1 '关闭文件 End Sub

32.Load语句

描述:把窗体或控件加载到内存中。 一、语法: Load object

object所在处是要加载的窗体或控件数组元素的名称。 二、说明:

在窗体还未被加载时,对窗体的任何引用都会自动加载该窗体。例如,我们常用Show方法显示窗体,Show方法在显示窗体前会先加载它,所以对于窗体一般不需要使用Load语句。如果某些窗体不需要显示,可以使用Load语句加载窗体时。

有时,事先并不知道窗体上需要某个控件的多少个实例,在这种情况下可以用Load语句来加载控件,建立一个动态窗体。 三、应用举例:

这个示例使用Load语句加载控件,建立一个标准工程,在窗体上添加一个标签和一个文本框。 1、 将这两个控件放在窗体顶部,标签在左,文本框在右,这两个控件对齐其它控间的标准。 2、 将这两个控件的Index属性设置为0,Visible属性设置为False。将下面的程序粘贴过去。 Private Sub Form_Load() Dim I As Integer

Dim MyStr(6) As String MyStr(1) = \编号\ MyStr(2) = \姓名\ MyStr(3) = \科室\ MyStr(4) = \职务\ MyStr(5) = \工资\ For I = 1 To 5 Load Label1(I) Load Text1(I)

Label1(I).Top = Label1(I - 1).Top + 1.5 * Label1(I).Height Label1(I).Left = Label1(0).Left Label1(I).Caption = MyStr(I) Label1(I).Visible = True

Text1(I).Top = Text1(I - 1).Top + 1.5 * Text1(I).Height Text1(I).Left = Text1(0).Left

42

Text1(I).Visible = True Next End Sub

33.Lock,Unlock语句

描述:锁定或解锁用Open语句打开的全部文件或一部分文件,控制其它进程是否可以修改文件。 一、语法:

Lock [#]filenumber[,recordrange] '锁定文件。 ...

Unlock [#]filenumber[,recordrange] '解锁文件。 Lock和Unlock语句的语法具有以下几个部分: 部分 filenumber recordrange 描述 必需的。任何有效的文件号 可选的。要锁定或解锁的记录范围 设置:

recordrange参数的设置如下: recnumber|[start]To end 设置 Recnumber Start End 描述 记录号(Random方式的文件)或字节数(Binary方式的文件),指定要开始锁定或解锁的位置 第一个要锁定或解锁的记录号或字节数 最后一个要锁定或解锁的记录号或字节数 二、说明:

在多个进程同时访问同一个文件时,为避免因同时修改文件某个部分而发生错误,可使用Lock与Unlock语句。

在使用Lock和Unlock语句时,若只指定一个记录,则只对该记录进行锁定或解锁。若指定某个范围内的记录,则从头(start)到尾(end)对此范围内的所有记录进行锁定或解锁。如果使用无recnumber的Lock,则会将整个文件都锁定;而使用无recnumber的Unlock则会将整个文件都解锁。对于以顺序输入或输出的方式打开文件,recordrange参数不起作用,也就是说无论start和end指定什么范围,Lock和Unlock都将影响整个文件。

Lock和Unlock语句总是成对出现,且参数也必须完全一致。如果只使用了Lock语句而没有使用Unlock语句,在关闭这个文件或退出程序以后,因为没有解除锁定,会产生无法预料的后果。 三、应用举例:

本示例示范如何使用Lock及Unlock语句。当用户锁定数据中某个记录时,其他过程不可以来修改这条记录。建立一标准工程,在窗体上添加两个命令按钮,将下面的程序粘贴过去。

43

Dim MyRecord As MyCorrespondence, RecordNumber As Integer '声明变量。 Private Sub Command1_Click()

'以随机访问的方式来打开文件。

Open \ RecordNumber = 1 '指定记录编号。 Lock #1, RecordNumber '锁住该记录。 End Sub

Private Sub Command2_Click()

Unlock #1, RecordNumber '当前记录解锁。 Close #1 '关闭文件 End Sub

Private Sub Form_Activate()

MyRecord.ID = \给一个元素赋值。 MyRecord.Name = \王小川\ MyRecord.Sex = \男\

MyRecord.birth = \ MyRecord.Unit = \汾西机器厂\ MyRecord.Job = \科长\

MyRecord.Address = \太原市解放路87号\ MyRecord.Phone = \

Open \ Put #1, , MyRecord '将记录写入文件中。 Close #1 End Sub

添加一个标准模块。将下面的程序粘贴到标准模块。 Type MyCorrespondence '创建用户自定义的类型。 ID As String * 4 '定义元素的数据类型。 Name As String * 10 Sex As String * 2 birth As String * 8 Unit As String * 10 Job As String * 10 Address As String * 30 Phone As String * 12 End Type

运行程序,先单击命令按钮一,打开TESTFILE文件修改后保存,因为文件被锁定,此时提示“进程无法访问文件,因为另一个程序已所定文件的一部分”;然后单击命令按钮二,同样修改TESTFILE文件后保存,由于已解锁文件修改成功。

34.LSet语句

描述:将某字符串插入到另一字符串变量的最左边,或是将一用户定义类型变量复制到另一用户自定义类型变量。

44

一、语法:

LSet stringvar=string

LSet varname1=varname2

LSet语句的语法包含下面部分: 部分 stringvar string varname1 varname2 描述 必需的。字符串变量名称 必需的。在stringvar内插入的字符串表达式 必需的。用户自定义类型变量名,内容将复制进来 必需的。用户自定义类型变量名,内容将复制出去 二、说明:

LSet会保留原stringvar内的字符串长度,如果string比stringvar内的字符串短,stringvar中多出的字符以空白替换;如果string比stringvar内的字符串长,LSet只在stringvar中放置长度为stringvar内的字符串长度的左边几个字符。

使用LSet将一用户自定义类型变量复制到另一用户自定义类型变量应当慎重,这种方法可能会造成不可预料的结果。

因为不同操作系统间对数据结构的做法不同,使用LSet的程序不能保证有很好的移植性。

三、应用举例:

建立一标准工程,在窗体上添加一个命令按钮,将下面的程序粘贴过去。 Private Sub Command1_Click()

Dim MyStr1 As String, MyStr2 As String

MyStr1 = \变量赋初值 LSet MyStr1 = \ MyStr2 = \

Debug.Print \ Debug.Print \ Debug.Print \ Debug.Print \

LSet MyStr1 = \ MyStr2 = \ Debug.Print \ Debug.Print \ Debug.Print \ Debug.Print \End Sub

在立即窗口显示: MyStr1Long=10 MyStr2Long=4 MyStr1=(Left ) MyStr2=(Left) MyStr1Long=10

45

MyStr2Long=26 MyStr1=(abcdefghij)

MyStr2=(abcdefghijklmnopqrstuvwxyz)

由显示结果可以看出,变量MyStr1和MyStr2的初值均为0123456789,然后两个变量均赋值Left,新值长度短于原变量长度,由于MyStr1用Lset赋值,其长度仍为原变量长度,缺少的部分以空白字符替换;最后两个变量均赋值abcdefghijklmnopqrstuvwxyz,新值长度长于原变量长度,由于MyStr1用Lset赋值,其长度仍为原变量长度,多出的部分被截掉。

35.Mid语句

描述:用另一个字符串中指定数量的字符替换Variant或String变量中的字符。 一、语法:

Mid(stringvar,start[,length])=string Mid语句的语法包含下面部分: 部分 stringvar start length string 描述 必需的。被更改的字符串变量名 必需的。stringvar中被替换的字符开头位置 可选的。被替换的字符数。如果省略,string将全部用上 必需的。字符串表达式,替换部分stringvar的字符串 二、说明:

被替换的字符数量总是小于或等于stringvar的字符数。

Mid语句也可以将一个Variant或String变量中的字符赋值给另一个Variant或String变量,语法为:

Stringvar1= Mid(stringvar2,start[,length])

可以使用MidB语句作用于包含在字符串中的字节数据。此时start指定stringvar中被替换的字节开头位置,而length为替换的字节数。 三、应用举例:

本示例使用Mid语句将某字符串中的几个字符替换为其他的字符。建立一标准工程,在窗体上添加一个命令按钮,将下面的程序粘贴过去。 Private Sub Command1_Click()

Dim MyString1 As String, MyString2 As String, MyString3 As String MyString1 = \设置字符串初值。 MyString2 = \设置字符串初值。 Mid(MyString1, 5, 3) = \ MidB(MyString2, 5, 3) = \ MyString3 = Mid(MyString1, 5, 3)

Debug.Print \ Debug.Print \ Debug.Print \End Sub

46

在立即窗口显示:

MyString1=ABCDUVWHIJK MyString2=ABUVEFGHIJK MyString3=UVW

36.MkDir语句

描述:创建一个新的目录或文件夹。 一、语法: MkDir path

必要的path参数是用来指定所要创建的目录或文件夹的字符串表达式。 二、说明:

path可以包含路径(即驱动器和已有的目录或文件夹)。如果没有指定路径,则MkDir会在当前路径上创建新的目录或文件夹。 三、应用举例:

本示例使用MkDir语句来创建目录或文件夹。建立一个标准工程,在窗体上添加两个命令按钮,将下面的程序粘贴过去。 Private Sub Command1_Click() On Error GoTo MyErr MkDir \

MsgBox \文件夹已建立\ Exit Sub MyErr:

MsgBox Err.Description End Sub

Private Sub Command2_Click() On Error GoTo MyErr MkDir \ MsgBox \文件夹已建立\ Exit Sub MyErr:

MsgBox Err.Description End Sub

运行时先单击命令按钮一,在当前路径建立一个名为“MyDir”的文件夹。然后单击命令按钮二,则在“MyDir”的文件夹里建立一个名为“Path”的文件夹。

37.Name语句

描述:重新命名一个文件、目录或文件夹。 一、语法:

47

Name oldpathname As newpathname Name语句的语法包含下面部分: 部分 oldpathname 描述 必要参数。字符串表达式,指定已存在的文件、目录或文件夹,可以包含目录或文件夹以及驱动器 必要参数。字符串表达式,指定新的文件、目录或文件夹。可以包含目录或文件夹以及驱动器。而由newpathname所指定的文件名不能存在 newpathname 二、说明:

Name语句不但可以重新命名一个文件,也可以重新命名一个目录或文件夹。当重新命名一个文件时,文件名应是包括扩展名在内的完整文件名。

Name语句可以将文件移动到不同驱动器的不同目录或文件夹中。但当newpathname和oldpathname都在同一路径下,只能重新命名已经存在的文件、目录或文件夹。Name不能创建新文件、目录或文件夹。

在改变名称之前,先关闭打开的文件,否则将会产生错误。Name参数不能使用多字符(*)和单字符(?)的通配符。 三、应用举例:

本示例使用Name语句来更改文件的名称。建立一个标准工程,在窗体上添加一个命令按钮,将下面的程序粘贴过去。然后新建一个文件夹,起名为MyDir。在MyDir文件夹里新建一个文本文件,起名为a。 Private Sub Command1_Click()

Name \更改文件名,并移动文件。 End Sub

38.On...GoSub、On...GoTo语句

描述:根据表达式的值,转到特定行执行。 一、语法:

On expression GoSub destinationlist On expression GoTo destinationlist

On...GoSub、On...GoTo语句的语法包含下面部分: 部分 描述 必需的。数值表达式,其运算结果应该是一个界于0到255之间的整数,包含0和255。如果expression的计算结果不是一个整数,则它会先四舍五入为一个整数 expression destinationlist 必需的。行号或行标签的列表,之间要以逗号隔开 二、说明:

expression的值会决定转到destinationlist中的哪一行。如果expression的值小于1或大于列表的项目个数,则会产生下面的结果之一:

如果表达式的值

则 48

等于0或大于列表的项目个继续执行On...GoSub或On...GoTo之后的语数 句 负数或大于255 会发生错误 在On...GoSub和On...GoTo中也可随意使用任意个行号和行标签,如果一行中放不下,

那么就必须在一行后使用续行符来衔接到下一行。但是,如果使用了太多的行标签或行号,使程序不易阅读,以至导致出错。若要执行多重分支程序,建议使用适应性更强的结构化控制语句Select…Case。 三、应用举例:

本示例使用On...GoSub及On...GoTo语句来完成不同的程序区段。建立一个标准工程,在窗体上添加一个命令按钮,将下面的程序粘贴过去。 Private Sub Command1_Click()

Dim MyNum As Integer, MyString As String For MyNum = 0 To 3 MyString = \

Debug.Print \ On MyNum GoSub Sub1, Sub2

'执行完Sub后,程序会回到此处来继续完成。 Debug.Print \ Next MyNum

For MyNum = 0 To 3

Debug.Print \ On MyNum GoTo Line1

'执行完Line后,程序不会回到此处来。 Next MyNum Exit Sub Sub1:

MyString = \Sub2:

MyString = \Line1:

MyString = \

Debug.Print \Line2:

MyString = \

Debug.Print \End Sub

运行程序后,在立即窗口显示: MyNum=0

MyString=NoSub MyNum=1

MyString=InSub1 MyNum=2

49

MyString=InSub2 MyNum=3

MyString= NoSub MyNum=0 MyNum=1

MyString=InLine1 MyString=InLine2

从上面的显示结果可以看出,第一个循环采用了On...GoSub语句,当MyNum=0时,MyString=NoSub,说明程序不转移,顺序执行On...GoSub之后的语句;当MyNum=1时,MyString=InSub1,说明程序已经跳转到Sub1中,执行相应程序;当MyNum=2时,MyString=InSub2,说明程序执行完Sub1程序又重新返回执行On...GoSub之后的语句,跳转到Sub2中,执行相应程序;当MyNum=3时,MyString=NoSub,由于大于列表的项目个数,顺序执行On...GoSub之后的语句。

第二个循环采用了On...GoTo语句,当MyNum=0时,说明程序不转移,顺序执行On...GoTo之后的语句;当MyNum=1时,MyString=InLine1,说明程序已经跳转到Line1中,执行相应程序;下面的MyString=InLine2,说明程序不能返回,顺序执行下面的语句。

39.On Error语句

描述:启动一个错误处理程序并指定该子程序在一个过程中的位置;也可用来禁止一个错误处理程序。 一、语法:

On Error GoTo line On Error Resume Nex On Error GoTo 0 On Error

On Error语句的语法包含下面部分: 部分 描述 On Error 启动错误处理程序,且该错误处理程序从必要的line参数中指定的lineGoTo line 开始。line参数可以是任何行标签或行号。访问对象时不使用这种形式 On Error 说明当一个运行时错误发生时,程序会忽略错误,继续运行发生错误的Resume Next 语句之后的语句。访问对象时使用这种形式 On GoTo 0 Error 禁止当前过程中任何已启动的错误处理程序 二、说明:

如果不使用On Error语句,则任何运行时发生的错误都是致命的;也就是说,程序会显示错误信息并终止运行。

在On Error GoTo line形式,只要在本过程里On Error语句的后面,不管在什么地方发生一个运行时错误,On Error语句均会使程序跳转到line,激活错误处理程序。注意:一个错误处理程序不是Sub过程或Function过程,它是一段用行标签或行号标记的代码,因此指定的line必须与On Error语句在同一个过程中,否则会发生编译时间错误。

50

本文来源:https://www.bwwdw.com/article/c8kr.html

Top