Vb常用语句解析
下面10条语句是最常用的语句,将指针移到上面按ctrl键单击可查看用法:包括功能、语法、参数、举例等。
1、Let(赋值语句即=)
3、Dim语句
7、If...Then...Else 语句
21、Select case
6、For...Next 语句
19、While...Wend 语句
15、Randomize 语句
16、Rem 语句
17、Static 语句
18、Unload 语句
1、Let(赋值语句即=)
功能:将表达式的值赋给变量或属性。
语法
[Let] varname=expression
Let语句的语法包含下面部分:
2、call语句
将控制权转移到一个Sub过程,Function过程,或动态连接库(DLL)过程。语法
[Call] name [argumentlist]
Call语句的语法具有以下几个部分:
说明
调用一个过程时,并不一定要使用Call关键字。如果使用Call关键字来调用一个需要参数的过程,argumentlist 就必须要加上括号。如果省略了Call
关键字,那么也必须要省略argumentlis 外面的括号。如果使用Call语法来调用内建函数或用户定义函数,则函数的返回值将被丢弃。
若要将整个数组传给一个过程,使用数组名,然后在数组名后加上空括号。3、Dim语句
声明变量并分配存储空间。
语法
Dim[WithEvents] varname[([subscripts])] [As[New] type] [, [WithEvents] varname[([subscripts])] [As [New] type]] . . .
Dim语句的语法包含下面部分:
说明
在模块级别中用Dim声明的变量,对该模块中的所有过程都是可用的。在过程级别中声明的变量,只在过程内是可用的。
可以使用Dim语句在模块级或过程级中声明变量的数据类型。例如,下面的语句声明了Integer 类型的变量。
NumberOfEmployees As Integer
也可以使用Dim语句来声明变量的对象类型。下面的语句为工作表的新建实例声明了一个变量。
X As New Worksheet
如果定义对象变量时没有使用New关键字,则在使用该变量之前,必须使用Set语句将该引用对象的变量赋值为一个已有对象。在该变量被赋值之前,所声明的对象变量有一个特定值Nothing,这个值表示该变量没有指向任一个对象实例。
也可以使用带空圆括号的Dim语句来定义动态数组。在定义动态数组后,可以在过程内使用ReDim语句来定义该数组的维数和元素。如果试图在Private,Public或Dim语句中重新定义一个已显式定义了大小的数组的维数时,就会发生错误。
如果不指定数据类型或对象类型,且在模块中没有Def type语句,则该变量按缺省设置是Variant类型。
当初始化变量时,数值变量被初始化为 0,变长的字符串被初始化为一个零长度的字符串 (""),而定长的字符串则用 0 填充。Variant变量被初始化为Empty。用户自定义类型的变量的每个元素作为各自独立的变量进行初始化。
注意当在过程中使用Dim语句时,通常将Dim语句放在过程的开始处。
4、Dim 语句示例
该示例演示使用Dim语句来声明变量,也演示了用Dim语句来声明数组。数组的缺省下界为0,可以在模块级使用Option Base语句来取代数组的缺省下界。
'AnyValue 和 MyValue 按缺省情况被声明为 Variant,
'同时值被设为 Empty。
Dim AnyValue, MyValue'显式声明一个 Integer 类型的变量。
Dim Number As Integer'在一行中声明多个变量。AnotherVar 为 Variant 类型,'因为它的类型被省略了。
Dim AnotherVar, Choice As Boolean, BirthDate As Date'DayArray 是一个有51 个索引(从 0 到 50)元素的 Variant 数组,
'假设在当前模块中 Option Base 被设为 0(缺省设置)。
Dim DayArray(50)'Matrix 是一个二维 Integer 数组。
Dim Matrix(3, 4) As Integer'MyMatrix 是一个显式指定了上下界
'的三维 double 数组。
Dim MyMatrix(1 To 5, 4 To 9, 3 To 5) As Double'BirthDay 是一个索引从1 到 10 的 date 数组。
Dim BirthDay(1 To 10) As Date 'MyArray 是一个 variant 动态数组。
5、Exit 语句
示例
退出Do...Loop、For...Next、Function、Sub 或Property代码块。
语法
Exit Do
Exit For
Exit Function
Exit Property
Exit Sub
Exit语句的语法有以下几种形式:
说明
不要将Exit语句与End语句搞混了。Exit并不说明一个结构的终止。
Exit 语句示例
本示例使用Exit语句退出For...Next循环、Do...Loop循环及子过程。
Sub ExitStatementDemo()
Dim I, MyNum
Do ' 建立无穷循环。
For I = 1 To 1000 ' 循环 1000 次。
MyNum = Int(Rnd * 1000) ' 生成一随机数码。
Select Case MyNum ' 检查随机数码。
Case 7: Exit For ' 如果是 7,退出 For...Next 循环。
Case 29: Exit Do ' 如果是 29,退出 Do...Loop 循环。
Case 54: Exit Sub ' 如果是 54,退出子过程。
End Select
Next I
Loop
End Sub
6、For...Next 语句
以指定次数来重复执行一组语句。For...Next
语法
For counter=start To end [Step step]
[statements]
[Exit For]
[statements]
Next [counter]
For…Next语句的语法具有以下几个部分:
说明
step参数可以是正数或负数。step参数值决定循环的执行情况,如下所示:
当所有循环中的语句都执行后,step 的值会加到counter 中。此时,循环中的语句可能会再次执行(基于循环开始执行时同样的测试),也可能是退出循环并从Next语句之后的语句继续执行。
提示在循环中改变counter 的值,将会使程序代码的阅读和调试变得更加困难。
循环中可以在任何位置放置任意个Exit For语句,随时退出循环。Exit For 经常在条件判断之后使用,例如If...Then,并将控制权转移到紧接在Next 之后的语句。
可以将一个For...Next循环放置在另一个For...Next循环中,组成嵌套循环。不过在每个循环中的counter 要使用不同的变量名。下面的体系结构是正确的:
For I = 1 To 10
For J = 1 To 10
For K = 1 To 10
...
Next K
Next J
Next I
注意如果省略Next语句中的counter,就像counter 存在时一样执行。但如果Next语句在它相对应的For语句之前出现,则会产生错误。
For...Next 语句示例
本示例使用For...Next语句创建一个字符串,其内容为由0 到9 的十个数字所组成的字符串,每个字符串之间用空格隔开。外层循环使用一个变量当作循环计数器,每循环一次,变量值减一。
Dim Words, Chars, MyString
For Words = 10 To 1 Step -1 ' 建立 10 次循环。
For Chars = 0 To 9 ' 建立 10 次循环。
MyString = MyString & Chars ' 将数字添加到字符串中。
Next Chars ' Increment counter
MyString = MyString & " " ' 添加一个空格。
Next Words
7、If...Then...Else 语句
根据表达式的值有条件地执行一组语句。
语法
If condition Then [statements][Else elsestatements] 或者,可以使用块形式的语法:
If condition Then
[statements]
[ElseIf condition-n Then
[elseifstatements] ...
[Else
[elsestatements]]
End If
If...Then...Else语句的语法具有以下几个部分:
8、Input # 语句
从已打开的顺序文件中读出数据并将数据指定给变量。
语法
Input#filenumber, varlist
Input #语句的语法具有以下几个部分:
说明
通常用Write #将Input #语句读出的数据写入文件。该语句只能用于以Input或Binary方式打开的文件。
在读出数据时不经修改就可直接将标准的字符串或数值数据指定给变量。下表说明如何处理其它输入数据:
输入数据中的双引号符号 (" ") 将被忽略。
文件中数据项目的顺序必须与varlist中变量的顺序相同,而且与相同数据类型的变量匹配。如果变量为数值类型而数据不是数值类型,则指定变量的值为零。
在输入数据项目时,如果已到达文件结尾,则会终止输入,并产生一个错误。
注意为了能够用Input# 语句将文件的数据正确读入到变量中,在将数据写入文件时,要使用Write #语句而不使用Print #语句。使用Write #语句可以确保将各个单独的数据域正确分隔开。
9、Input # 语句示例
本示例使用Input #语句将文件内的数据读入两个变量中。本示例假设TESTFILE文件内含数行以Write #语句写入的数据;也就是说,每一行数据中的字符串部分都是用双引号括起来,而与数字用逗号隔开,例如,("Hello", 234)。
Dim MyString, MyNumber
Open "TESTFILE" For Input As #1 ' 打开输入文件。
Do While Not EOF(1) ' 循环至文件尾。
Input #1, MyString, MyNumber ' 将数据读入两个变量。
Debug.Print MyString, MyNumber ' 在立即窗口中显示数据。
Loop
Close #1 ' 关闭文件。
10、Load 语句
把窗体或控件加载到内存中。
语法
Load object
objec 所在处是要加载的Form对象、MDIForm对象或控件数组元素的名称。
说明
除非在加载窗体时不需要显示窗体,否则对于窗体不需要使用Load语句。在窗体还未被加载时,对窗体的任何引用(在Set或If...TypeOf语句以外)会自动加载该窗体。例如,Show方法在显示窗体前会先加载它。一旦窗体被加载,不管它是否可见,它的属性及控件会被应用程序所改变。在某些情况下,也许需要在初始化时加载所有的窗体并在以后需要它们的时候显示它们。
当 Visual Basic 加载Form对象时,先把窗体属性设置为初始值,再执行Load事件过程。当应用程序开始运行时,Visual Basic 自动加载并显示应用程序的启动窗体。
在加载MDIChild属性为True 的Form(换言之,子窗体)时,而此时MDIForm还未被加载,那么会在子窗体前自动加载MDIForm。因为MDI 子窗体不能被隐藏起来,所以在Form_Load事件过程结束时马上可以见到MID 子窗体。
由 Visual Basic 函数产生的标准对话框,诸如MsgBox和InputBox,不需要加载、显示或卸载即可简单地直接调用。
Load 语句示例
这个示例使用Load语句加载Form对象。要试用此示例,在Form对象的声明部分粘贴以下代码,然后运行此例并单击该Form对象。
Private Sub Form_Click ()
Dim Answer, Msg as String ' 声明变量。
Unload Form1 ' 卸载窗体。
Msg = "Form1 has been unloaded. Choose Yes to load and "
Msg = Msg & "display the form. Choose No to load the form "
Msg = Msg & "and leave it invisible."
Answer = MsgBox(Msg, vbYesNo) ' 获得用户响应。
If Answer = vbYes Then ' 测试应答。
Show ' 如果回答 Yes,则显示窗体。
Else
Load Form1 ' 如果回答 NO,则仅加载窗体。
Msg = "Form1 is now loaded. Choose OK to display it."
MsgBox Msg ' 显示消息。
Show ' 显示窗体。
End If
End Sub
11、Mid 语句
在一Variant (String) 变量中以另一个字符串中的字符替换其中指定数量的字符。
语法
Mid(stringvar, start[, length]) =string
Mid语句的语法具有下面几个部分:
说明
被替换的字符数量总是小于或等于stringvar 的字符数。
注意MidB 语句作用于包含在字符串中的字节数据。在MidB 语句中,start 指定stringvar 中被替换的字节开头位置,而length 为替换的字节数。
Mid 语句示例
本示例使用Mid 语句将某字符串中的几个字符替换为其他的字符。
Dim MyString
MyString = "The dog jumps" ' 设置字符串初值。
Mid(MyString, 5, 3) = "fox" ' MyString = "The fox jumps"。
Mid(MyString, 5) = "cow" ' MyString = "The cow jumps"。
Mid(MyString, 5) = "cow jumped over" ' MyString = "The cow jumpe"。Mid(MyString, 5, 3) = "duck" ' MyString = "The duc jumpe"。
12、Open 语句
能够对文件输入/输出 (I/O)。
语法
Open pathname For mode [Access access] [lock] As [#]filenumber
[Len=reclength]
Open语句的语法具有以下几个部分:
说明
对文件做任何 I/O 操作之前都必须先打开文件。Open语句分配一个缓冲区供文件进行 I/O 之用,并决定缓冲区所使用的访问方式。
如果pathname指定的文件不存在,那么,在用Append、Binary、Output、或Random 方式打开文件时,可以建立这一文件。
如果文件已由其它进程打开,而且不允许指定的访问类型,则Open操作失败,而且会有错误发生。
如果mode 是Binary方式,则Len 子句会被忽略掉。
重要在Binary、Input 和Random方式下可以用不同的文件号打开同一文件,而不必先将该文件关闭。在Append 和Output 方式下,如果要用不同的文件号打开同一文件,则必须在打开文件之前先关闭该文件。
13、Open 语句示例
本示例示范Open语句的不同用法来做到文件的输出与输入。
下列代码以顺序输入模式打开 TESTFILE 文件。
Open "TESTFILE" For Input As #1
' 若要以其他方式打开文件,必需先关闭此文件。
Close #1
下列代码以只允许写操作的二进制方式打开文件。
Open "TESTFILE" For Binary Access Write As #1
' 若要以其他方式打开文件,必需先关闭此文件。
Close #1
下列代码以随机方式打开文件,文件中含有用户自定义数据类型 Record 的记录。
Type Record ' 定义用户自定义数据类型。
ID As Integer
Name As String * 20
End Type
Dim MyRecord As Record ' 声明变量。
Open "TESTFILE" For Random As #1 Len = Len(MyRecord)
' 若要以其他方式打开文件,必需先关闭此文件。
Close #1
下列代码以顺序输出方式打开文件;任何过程都可以读写该文件。
Open "TESTFILE" For Output Shared As #1
' 若要以其他方式打开文件,必需先关闭此文件。
Close #1
下列代码以只允许读的二进制方式打开文件;其他过程不可以读该文件。Open "TESTFILE" For Binary Access Read Lock Read As #1
14、Print # 语句
将格式化显示的数据写入顺序文件中。
语法
Print#filenumber, [outputlist]
Print #语句的语法具有以下几个部分:
设置
outputlist参数的设置如下:
[{Spc(n) | Tab[(n)]}] [expression] [charpos]
说明
通常用Line Input #或Input 读出Print # 在文件中写入的数据。
如果省略参数outputlist,而且,filenumber之后只含有一个列表分隔符,则将一空白行打印到文件中。多个表达式之间可用一个空白或一个分号隔开。空白与分号等效。
对于 Boolean 类型的数据,打印的是 True 或 False。无论在什么国别,都不将True 和False 这两个关键字翻译出来。
使用操作系统所能够辨认的标准短日期格式可将 Date 类型的数据写入文件中。在未指定日期或时间部件或这些部件的设置为零时,只将指定的部分写入文件中。
如果outputlist的数据是Empty,则不将任何数据写入文件。但是,如果outputlist的数据是Null,则将Null写入文件。
对于Error 类型的数据而言,输出的数据看起来与 Error errorcode 一样。而且无论在什么地区,都不将Error 关键字翻译出来。
用Print #写入文件的所有数据都是国际通用的;也就是说,可以正确利用十进制分隔符将这些数据格式化。
因为Print #将数据的图像写入文件,所以必须将各项数据分隔开来,以便正确打印。如果使用无参数的Tab将打印位置移动到下一个打印区,则Print # 也会将打印字段之间的空白写入文件中。
注意如果今后想用Input #语句读出文件的数据,就要用Write # 语句而不用Print #语句将数据写入文件。因为在使用Write #时,将数据域分界就可确保每个数据域的完整性,因此可用Input #再将数据读出来。使用Write #还能确保任何地区的数据都被正确读出。
Print # 语句示例
本示例使用Print #语句将数据写入一个文件。
Open "TESTFILE" For Output As #1 ' 打开输出文件。
Print #1, "This is a test" ' 将文本数据写入文件。
Print #1, ' 将空白行写入文件。
Print #1, "Zone 1"; Tab ; "Zone 2" ' 数据写入两个区(print zones)。Print #1, "Hello" ; " " ; "World" ' 以空格隔开两个字符串。
Print #1, Spc(5) ; "5 leading spaces " ' 在字符串之前写入五个空格。Print #1, Tab(10) ; "Hello" ' 将数据写在第十列。' 赋值 Boolean、Date、Null 及 Error 等。
Dim MyBool, MyDate, MyNull, MyError
MyBool = False : MyDate = #February 12, 1969# : MyNull = Null
MyError = CVErr(32767)
' True、False、Null 及 Error 会根据系统的地区设置自动转换格式。
' 日期将以标准的短式日期的格式显示。
Print #1, MyBool ; " is a Boolean value"
Print #1, MyDate ; " is a date"
Print #1, MyNull ; " is a null value"
Print #1, MyError ; " is an error value"
Close #1 ' 关闭文件。
15、Randomize 语句
初始化随机数生成器。
语法
Randomize [number]
可选的number参数是Variant或任何有效的数值表达式。
说明
Randomize用number将Rnd函数的随机数生成器初始化,该随机数生成器给number 一个新的种子值。如果省略number,则用系统计时器返回的值作为新的种子值。
如果没有使用Randomize,则(无参数的)Rnd函数使用第一次调用Rnd函数的种子值。
注意若想得到重复的随机数序列,在使用具有数值参数的Randomize之前直接调用具有负参数值的Rnd。使用具有同样number值的Randomize 是不会得到重复的随机数序列的。
Randomize 语句示例
本示例用Randomize语句初始化随机数生成器。由于忽略了数值参数,所
以Randomize用Timer函数的返回值作为新的随机数种子值。
Dim MyValue
Randomize ' 对随机数生成器做初始化的动作。MyValue = Int((6 * Rnd) + 1) ' 生成 1 到 6 之间的随机数值。
16、Rem 语句
用来在程序中包含注释。
语法
Rem comment
也可以使用如下语法:
'comment
comment参数是可选的,指要包括的任何注释文本。在Rem关键字与comment之间要加一个空格。
说明
如果使用行号或行标签,则可以从GoTo或GoSub语句转到一个Rem
17、Static 语句
用于声明变量并分配存储空间。在整个代码运行期间都能保
语句声明的变量的值。
语法
Static varname[([subscripts])] [As[New] type] [, varname[([subscripts])] [As [New] type]] . . .
Static语句的语法包含下面部分:
说明
模块的代码开始运行后,使用Static语句声明的变量会一直保持其值,直至
该模块复位或重新启动。可以在非静态的过程中使用Static语句显式声明只
在该过程内可见,但具有与包含该过程定义的模块相同生命期的变量。
可以在过程中使用Static语句来声明在过程调用之间仍能保持其值的变量的
数据类型。例如,下面的语句声明了一个定长的整型数组:
EmployeeNumber(200) As Integer
下面的语句为 worksheet 的新实例声明了一个变量:
X As New Worksheet