您的位置:寻梦网首页编程乐园VB 编程乐园VB 函数速查
Visual Basic 函数速查
语句(I-P)
If...Then...Else 语句
Implements 语句
Input # 语句
Kill 语句
Let 语句
Line Input # 语句
Lock,Unlock 语句
LSet 语句
Mid 语句
MkDir 语句
Name 语句
On Error 语句
On...GoSub、On...GoTo 语句
Open 语句
Option Base 语句
Option Compare 语句
Option Explicit 语句
Option Private 语句
Print # 语句
Private 语句
Property Get 语句
Property Let 语句
Property Set 语句
Public 语句
Put 语句


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 语句的语法具有以下几个部分:

部分 描述
condition 必要参数。一个或多个具有下面两种类型的表达式:
  数值表达式或字符串表达式,其运算结果为 TrueFalse。如果 condition 为 Null,则 condition 会视为 False。
  TypeOf objectname Is objecttype 形式的表达式。其中的 objectname 是任何对象的引用,而 objecttype 则是任何有效的对象类型。如果 objectnameobjecttype 所指定的一种对象类型,则表达式为 True,否则为False
statements 在块形式中是可选参数;但是在单行形式中,且没有 Else 子句时,则为必要参数。一条或多条以冒号分开的语句,它们在 condition True 时执行。
condition-n 可选参数。与 condition 同。
elseifstatements 可选参数。一条或多条语句,它们在相关的 condition-n True 时执行。
elsestatements 可选参数。一条或多条语句,它们在前面的 condition condition-n 都不为 True 时执行。

说明

可以使用单行形式(第一种语法)来做短小简单的测试。但是,块形式(第二种语法)则提供了更强的结构化与适应性,并且通常也是比较容易阅读、维护及调试的。

注意 在单行形式中,按照 If...Then 判断的结果也可以执行多条语句。所有语句必须在同一行上并且以冒号分开,如下面语句所示:

If A > 10 Then A = A + 1 : B = B + A : C = C + B

在块形式中,If 语句必须是第一行语句。其中的 ElseElseIf,和 End If 部分可以只在之前加上行号或行标签。If 块必须以一个 End If 语句结束。

要决定某个语句是否为一个 If 块,可检查 Then 关键字之后是什么。如果在 Then 同一行之后,还有其它非注释的内容,则此语句就是单行形式的 If 语句。

ElseElseIf 子句都是可选的。在 If 块中,可以放置任意多个 ElseIf 子句,但是都必须在 Else 子句之前。If 块也可以是嵌套的。

当程序运行到一个 If 块(第二种语法)时,condition 将被测试。如果 conditionTrue,则在 Then 之后的语句会被执行。如果 condition False,则每个 ElseIf 部分的条件式(如果有的话)会依次计算并加以测试。如果找到某个为 True 的条件时,则其紧接在相关的 Then 之后的语句会被执行。如果没有一个 ElseIf 条件式为 True(或是根本就没有 ElseIf 子句),则程序会执行 Else 部分的语句。而在执行完 Then Else 之后的语句后,会从 End If 之后的语句继续执行。

提示 根据单一表达式来执行多种可能的动作时,Select Case 更为有用。不过,TypeOf objectname Is objecttype 子句不能在 Select Case 语句中使用。

注意 TypeOf 不能与诸如 Long、Integer 以及其他不是 Object 的固定数据类型一起使用。


Implements 语句

指定要在包含该语句的类模块中实现的接口或类。

语法

Implements [InterfaceName | Class]

所需的 InterfaceNameClass 是类型库中的接口或类的名称,该类型库中的方法将用与 Visual Basic 类中相一致的方法来实现。

说明

所谓接口就是代表接口封装的成员(方法以及属性)的原型集合;也就是说,它只包含成员过程的声明部分。一个类提供一个或多个接口的所有方法以及属性的一种实现方案。类的控制者每次调用函数时,该函数所执行的代码由类来提供。每个类至少应实现一个缺省接口。在 Visual Basic 中,一个已实现的接口中任何没有显式声明的成员都是缺省接口的隐式成员。

当 Visual Basic 类实现接口时,都会提供该接口的类型库中说明的所有 Public 过程的版本。除了提供接口原型与自编过程之间的映射关系之外,Implements 语句还使这个类接收对指定接口 ID 的 COM QueryInterface 调用。

注意 Visual Basic 不能实现派生出来的类或接口。

在实现接口或类时,必须包括所用到的 Public 过程。如果在实现接口或类时遗漏了成员,就会产生错误。如果正在实现的类中某个过程还没有代码,则可以产生一个适当的错误信息 (Const E_NOTIMPL = &H80004001),以便用户意识到该成员还没有实现。

Implements 语句不能在标准模块中使用。


Input # 语句

从已打开的顺序文件中读出数据并将数据指定给变量。

语法

Input #filenumber, varlist

Input # 语句的语法具有以下几个部分:

部分 描述
filenumber 必要。任何有效的文件号。
varlist 必要。用逗号分界的变量列表,将文件中读出的值分配给这些变量;这些变量不可能是一个数组或对象变量。但是,可以使用变量描述数组元素或用户定义类型的元素。

说明

通常用 Write #Input # 语句读出的数据写入文件。该语句只能用于以 Input Binary 方式打开的文件。

在读出数据时不经修改就可直接将标准的字符串或数值数据指定给变量。下表说明如何处理其它输入数据:

数据 指定给变量的值
分隔逗号或空白行 Empty
#NULL# Null
#TRUE# or #FALSE# True False
#yyyy-mm-dd hh:mm:ss# 用表达式表示的日期与/或时间
#ERROR errornumber# errornumber(此变量是一个 Variant,用来标记错误)

输入数据中的双引号符号 (" ") 将被忽略。

文件中数据项目的顺序必须与 varlist 中变量的顺序相同,而且与相同数据类型的变量匹配。如果变量为数值类型而数据不是数值类型,则指定变量的值为零。

在输入数据项目时,如果已到达文件结尾,则会终止输入,并产生一个错误。

注意 为了能够用 Input # 语句将文件的数据正确读入到变量中,在将数据写入文件时,要使用 Write # 语句而不使用 Print # 语句。使用 Write # 语句可以确保将各个单独的数据域正确分隔开。


Kill 语句

从磁盘中删除文件。

语法

Kill pathname

必要的 pathname 参数是用来指定一个文件名的字符串表达式。pathname 可以包含目录或文件夹、以及驱动器。

说明

Microsoft Windows 中,Kill 支持多字符 (*) 和单字符 (?) 的通配符来指定多重文件。


Let 语句

将表达式的值赋给变量或属性。

语法

[Let] varname = expression

Let 语句的语法包含下面部分:

部分 描述
Let 可选的。显式使用 Let 关键字也是一种格式,但通常都省略该关键字。
varname 必需的。变量或属性的名称;遵循标准变量命名约定。
expression 必需的。赋给变量或属性的值。

说明

只有当表达式是一种与变量兼容的数据类型时,该表达式的值才可以赋给变量或属性。不能将字符串表达式的值赋给数值变量,也不能将数值表达式的值赋给字符串变量。如果这样做,就会在编译时间出现错误。

可以用字符串或数值表达式赋值给 Variant 变量,但反过来不一定正确。任何除 Null 之外的 Variant 都可以赋给字符串变量,但只有当 Variant 的值可以解释为某个数时才能赋给数值变量。可以使用 IsNumeric 函数来确认 Variant 是否可以转换为一个数。

注意 将一种数值类型的表达式赋给另一种数值类型的变量时,会强制将该表达式的值转换为结果变量的数值类型。

Let 语句可以将一个记录类型的变量赋给属于同一用户定义类型的变量。使用 LSet 语句可以给不同用户自定义类型的记录变量赋值。使用 Set 语句可以将对象引用赋给变量。


Line Input # 语句

从已打开的顺序文件中读出一行并将它分配给 String变量。

语法

Line Input #filenumber, varname

Line Input # 语句的语法具有以下几个部分:

部分 描述
filenumber 必要。任何有效的文件号。
varname 必要。有效的 Variant 或 String 变量名。

说明

通常用 Print # Line Input # 语句读出的数据从文件中写出来。

Line Input # 语句一次只从文件中读出一个字符,直到遇到回车符 (Chr(13)) 或回车-换行符 (Chr(13) + Chr(10)) 为止。回车-换行符将被跳过,而不会被附加到字符串上。


Lock,Unlock 语句

对于用 Open 语句打开的全部文件或一部分文件,其它进程所进行的控制访问。

语法

Lock [#]filenumber[, recordrange]
. . .

Unlock [#]filenumber[, recordrange]

Lock Unlock 语句的语法具有以下几个部分:

部分 描述
filenumber 必要。任何有效的文件号。
recordrange 可选。要锁定或解锁的记录范围。

设置

recordrange 参数的设置如下:

recnumber | [start] To end

设置 描述
recnumber 记录号(Random 方式的文件)或字节数(Binary 方式的文件),指定要开始锁定或解锁的位置。
start 第一个要锁定或解锁的记录号或字节数。
end 最后一个要锁定或解锁的记录号或字节数。

说明

在有若干个进程访问同一个文件的环境中,要使用 Lock Unlock 语句。

在使用 LockUnlock 语句时,这两个语句总是成对出现。Lock Unlock 的参数必须完全一致。

文件中的第一个记录或字节在位置 1,第二个记录或字节在位置 2,依此类推。若只指定一个记录,则只对该记录进行锁定或解锁。若指定某个范围内的记录并省略起始记录 (start),则将此范围内的所有记录从头到尾 (end) 进行锁定或解锁。如果使用无 recnumberLock,则会将整个文件都锁定;而使用无 recnumberUnlock 则会将整个文件都解锁。

若已经以顺序输入或输出的方式打开文件,则无论 start end 指定什么范围,Lock Unlock 都将影响整个文件。

警告 在关闭一个文件或退出程序之前,务必要确保用 Unlock 语句删除对文件进行的所有锁定。若不能删除锁定,则会产生无法预料的后果。


LSet 语句

在一字符串变量中将一字符串往左对齐,或是将一用户定义类型变量复制到另一用户自定义类型变量。

语法

LSet stringvar = string

LSet varname1 = varname2

LSet 语句的语法有下面这些部分:

部分 说明
stringvar 必要参数。字符串变量名称。
string 必要参数。在 stringvar 内想往左对齐的字符串表达式。
Varname1 必要参数。用户自定义类型变量名,内容将复制进来。
Varname2 必要参数。用户自定义类型变量名,内容将复制出去。

说明

Lset 会将 stringvar 中空余的字符以空白替换。

如果 string stringvar 还长,Lset 只在 stringvar 中放置最左边几个字符,且长度为 stringvar 的长度。

警告 不能使用 Lset 将一用户自定义类型变量复制到另一用户自定义类型变量。将一个数据类型的数据复制到留给另一数据类型的空间,可能会造成不可预料的结果。

当从一用户自定义类型复制一变量给其他变量时,此变量的二进制数据会从一个变量复制到另一个变量的内存空间中,但并不关心为元素指定的数据类型。


Mid 语句

在一 Variant (String) 变量中以另一个字符串中的字符替换其中指定数量的字符。

语法

Mid(stringvar, start[, length]) = string

Mid 语句的语法具有下面几个部分:

部分 描述
stringvar 必要参数。被更改的字符串变量名。
start 必要参数;Variant (Long)。stringvar 中被替换的字符开头位置。
length 可选参数;Variant (Long)。被替换的字符数。如果省略,string将全部用上。
string 必要参数。字符串表达式,替换部分 stringvar 的字符串。

说明

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

注意 MidB 语句作用于包含在字符串中的字节数据。在 MidB 语句中,start 指定 stringvar 中被替换的字节开头位置,而 length 为替换的字节数。


MkDir 语句

创建一个新的目录或文件夹。

语法

MkDir path

必要的 path 参数是用来指定所要创建的目录或文件夹的字符串表达式。path 可以包含驱动器。如果没有指定驱动器,则 MkDir 会在当前驱动器上创建新的目录或文件夹。


Name 语句

重新命名一个文件、目录、或文件夹。

语法

Name oldpathname As newpathname

Name 语句的语法具有以下几个部分:

部分 描述
oldpathname 必要参数。字符串表达式,指定已存在的文件名和位置,可以包含目录或文件夹、以及驱动器。
newpathname 必要参数。字符串表达式,指定新的文件名和位置,可以包含目录或文件夹、以及驱动器。而由 newpathname 所指定的文件名不能存在。

说明

 Name 语句重新命名文件并将其移动到一个不同的目录或文件夹中。如有必要,Name 可跨驱动器移动文件。 但当 newpathname 和 oldpathname 都在相同的驱动器中时,只能重新命名已经存在的目录或文件夹。 Name 不能创建新文件、目录或文件夹。

在一个已打开的文件上使用 Name,将会产生错误。必须在改变名称之前,先关闭打开的文件。Name 参数不能包括多字符 (*) 和单字符 (?) 的通配符。


On Error 语句

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

语法

On Error GoTo line

On Error Resume Next

On Error GoTo 0

On Error 语句的语法可以具有以下任何一种形式:

语句 描述
On Error GoTo line 启动错误处理程序,且该例程从必要的 line 参数中指定的 line 开始。line 参数可以是任何行标签或行号。如果发生一个运行时错误,则控件会跳到 line,激活错误处理程序。指定的 line 必须在一个过程中,这个过程与 On Error 语句相同; 否则会发生编译时间错误。
On Error Resume Next 说明当一个运行时错误发生时,控件转到紧接着发生错误的语句之后的语句,并在此继续运行。访问对象时要使用这种形式而不使用 On Error GoTo
On Error GoTo 0 禁止当前过程中任何已启动的错误处理程序。

说明

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

一个“允许的”错误处理程序是由 On Error 语句打开的一个处理程序;一个“活动的”错误处理程序是处理错误的过程中允许的错误处理程序。如果在错误处理程序处于活动状态时(在发生错误和执行 ResumeExit SubExit FunctionExit Property 语句之间这段时间)又发生错误,则当前过程的错误处理程序将无法处理这个错误。控件返回调用的过程。如果调用过程有一个已启动的错误处理程序,则激活错误处理程序来处理该错误。如果调用过程的错误处理程序也是活动的,则控件将再往回传到前面的调用过程,这样一直进行下去,直到找到一个被允许的但不是活动的错误处理程序为止。如果没有找到被允许而且不活动的错误处理程序,那么在错误实际发生的地方,错误本身是严重的。错误处理程序每次将控件返回调用过程时,该过程就成为当前过程。在任何过程中,一旦错误处理程序处理了错误,在当前过程中就会从 Resume 语句指定的位置恢复运行。

注意 一个错误处理程序不是 Sub 过程或 Function 过程。它是一段用行标签或行号标记的代码。

错误处理程序依靠 Err 对象的 Number 属性中的值来确定错误发生的原因。在其它任何错误发生之前,或在调用一个可能会导致错误发生的过程之前,错误处理程序应该先测试或存储 Err 对象中相关的属性值。Err 对象中的属性值只反映最近发生的错误。Err.Description 中包含有与 Err.Number 相关联的错误信息。

On Error Resume Next 会使程序从紧随产生错误的语句之后的语句继续执行,或是从紧随最近一次调用含有 On Error Resume Next 语句的过程的语句继续运行。这个语句可以置运行时错误于不顾,使程序得以继续执行。可以将错误处理程序放置在错误发生的地方,而不必将控件传输到过程中的其它位置。在调用另一个过程时,On Error Resume Next 语句成为非活动的,所以,如果希望在例程中进行嵌入错误处理,则应在每一个调用的例程中执行 On Error Resume Next 语句。

注意 当处理在访问其它对象期间产生的错误时,与其使用 On Error GoTo 指令,不如使用 On Error Resume Next。每次和对象打交道,在不知道用代码访问哪个对象时,检查一下 Err 都会打消这种疑虑。可以确定是哪个对象产生错误(Err.Source 中指定的对象),也可以确定是哪个对象将错误代码放在 Err.Number

On Error GoTo 0 停止在当前过程中处理错误。即使过程中包含编号为 0 的行,它也不把行 0 指定为处理错误的代码的起点。如果没有 On Error GoTo 0 语句,在退出过程时,错误处理程序会自动关闭。

在错误未发生的时候,为了防止错误处理程序代码运行,请像在下段程序中那样,在紧靠着错误处理程序的前面写入 Exit Sub、Exit Function Exit Property 语句。

Sub InitializeMatrix(Var1, Var2, Var3, Var4)
   On Error GoTo ErrorHandler
   . . .
   Exit Sub
ErrorHandler:
   . . .
   Resume Next
End Sub

此处,错误处理程序代码在 Exit Sub 语句之后,而在 End Sub 语句之前,从而与过程中的流程分开。错误处理程序代码可以在程序中的任何地方写入。

当对象作为文件运行时,对象中未捕获的错误都被返回控制应用程序。在开发环境中,如果设置了正确选项,未捕获的错误只返回控制应用程序。请参考主应用程序的文档的有关描述,从而得知,在调试时应该设置哪些选项、如何设置这些选项以及主机能否建立类。

如果建立一个访问其它对象的对象,则应该着手处理从那些对象返回的未处理错误。如果无法处理这种错误,请将 Err.Number 中的错误代码当作自己的一个错误,然后将错误回传给对象的调用者。应该将错误代码添加到 vbObjectError 常数上来指定这个错误。举例来说,如果错误代码为 1052,则使用如下方法指定错误:

Err.Number = vbObjectError + 1052

注意 调用动态链接库 (DLL) 期间产生的系统错误不会产生例外情况,也不会被 Visual Basic 的错误捕获操作所捕获。当调用 DLL 函数时,应该(根据 API 的详细说明)检查每一个返回值以确定是成功还是失败,如果失败,则检查 Err 对象的 LastDLLError 属性中的值。


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

根据表达式的值,转到特定行执行。

语法

On expression GoSub destinationlist

On expression GoTo destinationlist

On...GoSub On...GoTo 语句的语法具有以下几个部分:

部分 描述
expression 必要参数。数值表达式,其运算结果应该是一个界于 0 到 255 之间的整数,包含 0 和 255。如果 expression 的计算结果不是一个整数,则它会先四舍五入为一个整数。
destinationlist 必要参数。行号或行标签的列表,之间要以逗号隔开。

说明

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

如果表达式的值
等于 0 控制权会转移到 On...GoSubOn...GoTo 之后的语句。
大于串的项目个数 控制权会转移到 On...GoSubOn...GoTo 之后的语句。
负数 会发生错误。
大于 255 会发生错误。

可以在同一个列表中混合使用行号和行标签。在 On...GoSub On...GoTo 中也可随意使用任意个行号和行标签。但是,如果使用了太多的行标签或行号,以至于在一行中放不下,那么就必须在一行后使用>续行符来衔接到下一行。

提示 若要执行多重分支,Select Case 提供了一种结构化与适应性更强的方法。


Open 语句

能够对文件输入/输出 (I/O)。

语法

Open pathname For mode [Access access] [lock] As [#]filenumber [Len=reclength]

Open 语句的语法具有以下几个部分:

部分 描述
pathname 必要。字符串表达式,指定文件名,该文件名可能还包括目录、文件夹及驱动器。
mode 必要。关键字,指定文件方式,有 AppendBinaryInputOutput、或 Random 方式。如果未指定方式,则以 Random 访问方式打开文件。
access 可选。关键字,说明打开的文件可以进行的操作,有 ReadWrite、或 Read Write 操作。
lock 可选。关键字,说明限定于其它进程打开的文件的操作,有 SharedLock ReadLock Write、和 Lock Read Write 操作。
filenumber 必要。一个有效的文件号,范围在 1 到 511 之间。使用 FreeFile 函数可得到下一个可用的文件号。
reclength 可选。小于或等于 32,767(字节)的一个数。对于用随机访问方式打开的文件,该值就是记录长度。对于顺序文件,该值就是缓冲字符数。

说明

对文件做任何 I/O 操作之前都必须先打开文件。Open 语句分配一个缓冲区供文件进行 I/O 之用,并决定缓冲区所使用的访问方式。

如果 pathname 指定的文件不存在,那么,在用 AppendBinaryOutput、或 Random 方式打开文件时,可以建立这一文件。

如果文件已由其它进程打开,而且不允许指定的访问类型,则 Open 操作失败,而且会有错误发生。

如果 mode Binary 方式,则 Len 子句会被忽略掉。

重要BinaryInput Random 方式下可以用不同的文件号打开同一文件,而不必先将该文件关闭。在 Append Output 方式下,如果要用不同的文件号打开同一文件,则必须在打开文件之前先关闭该文件。


Option Base 语句

在模块级别中使用,用来声明数组下标的缺省下界。

语法

Option Base {0 | 1}

说明

由于下界的缺省设置是 0,因此无需使用 Option Base 语句。如果使用该语句,则必须写在模块的所有过程之前。一个模块中只能出现一次 Option Base,且必须位于带维数的数组声明之前。

注意   Dim、Private、Public、ReDim 以及 Static 语句中的 To 子句提供了一种更灵活的方式来控制数组的下标。不过,如果没有使用 To 子句显式地指定下界,则可以使用 Option Base 将缺省下界设为 1。使用 Array 函数或 ParamArray 关键字创建的数组的下界为 0;Option BaseArrayParamArray 不起作用。

Option Base 语句只影响位于包含该语句的模块中的数组下界。


Option Compare 语句

在模块级别中使用,用于声明字符串比较时所用的缺省比较方法。

语法

Option Compare {Binary | Text | Database}

说明

如果使用,则 Option Compare 语句必须写在模块的所有过程之前。

Option Compare 语句为模块指定字符串比较的方法(Binary、Text Database)。如果模块中没有 Option Compare 语句,则缺省的文本比较方法是 Binary

Option Compare Binary 是根据字符的内部二进制表示而导出的一种排序顺序来进行字符串比较。在 Microsoft Windows 中,排序顺序由代码页确定。典型的二进制排序顺序如下例所示:

A < B < E < Z < a < b < e < z < _ < _ < _ < _ < _ < ?

Option Compare Text 根据由系统国别确定的一种不区分大小写的文本排序级别来进行字符串比较。当使用 Option Compare Text 对相同字符排序时,会产生下述文本排序级别:

(A=a) < ( _=_) < (B=b) < (E=e) < (_=_) < (Z=z) < (_=_) 

Option Compare Database 只能在 Microsoft Access 中使用。当需要字符串比较时,将根据数据库的国别 ID 确定的排序级别进行比较。


Option Explicit 语句

在模块级别中使用,强制显式声明模块中的所有变量。

语法

Option Explicit

说明

如果使用,Option Explicit 语句必须写在模块的所有过程之前。

如果模块中使用了 Option Explicit,则必须使用 Dim、Private、Public、ReDimStatic 语句来显式声明所有的变量。如果使用了未声明的变量名在编译时间会出现错误。

如果没有使用 Option Explicit 语句,除非使用 Deftype 语句指定了缺省类型,否则所有未声明的变量都是 Variant 类型的。

注意 使用 Option Explicit 可以避免在键入已有变量时出错,在变量的范围不是很清楚的代码中使用该语句可以避免混乱。


Option Private 语句

在允许引用跨越多个工程的主机应用程序中使用 Option Private Module,可以防止在模块所属的工程外引用该模块的内容。在不允许这种引用的主机应用程序中,例如,Visual Basic 的独立方式版本,Option Private 就不起作用。

语法

Option Private Module

说明

如果使用 Option Private 语句,则必须是写在模块级别中的任何过程之前。

如果模块中使用了 Option Private Module,则其公用部分(例如,在模块级定义的变量,对象,以及用户定义类型)在该模块所属的工程内仍是可用的,但对其它应用程序或工程则是不可用的。

注意 只有在支持同时加载多个工程,且允许在加载的工程间引用的主应用程序中可使用 Option Private。例如,Microsoft Excel 允许加载多个工程,Option Private Module 就可以用来限制跨工程的可见性。尽管 Visual Basic 允许加载多个工程,但在 Visual Basic 中是从不允许跨工程引用的。


Print # 语句

将格式化显示的数据写入顺序文件中。

语法

Print #filenumber, [outputlist]

Print # 语句的语法具有以下几个部分:

部分 描述
filenumber 必要。任何有效的文件号。
outputlist 可选。表达式或是要打印的表达式列表。

设置

outputlist 参数的设置如下:

[{Spc(n) | Tab[(n)]}] [expression] [charpos]

设置 描述
Spc(n) 用来在输出数据中插入空白字符,而 n 指的是要插入的空白字符数。
Tab(n) 用来将插入点定位在某一绝对列号上,这里,n 是列号。使用无参数的 Tab 将插入点定位在下一个打印区的起始位置。
expression 要打印的数值表达式或字符串表达式。
charpos 指定下一个字符的插入点。使用分号将插入点定位在上一个显示字符之后。用 Tab(n) 将插入点定位在某一绝对的列号上,用无参数的 Tab 将插入点定位在下一个打印区的起始处。如果省略 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 # 还能确保任何地区的数据都被正确读出。


Private 语句

在模块级别中使用,用于声明私有变量及分配存储空间。

语法

Private [WithEvents] varname[([subscripts])] [As [New] type] [,[WithEvents] varname[([subscripts])] [As [New] type]] . . .

Private 语句的语法包含下面部分:

部分 描述
WithEvents 可选的。关键字,说明 varname 是用来响应由 ActiveX 对象所触发的事件的对象变量。只有在类模块中才是合法的。使用 WithEvents,可以定义任意个所需的单变量,但不能用 WithEvents 创建数组。NewWithEvents 不能一起使用。
varname 必需的。变量的名称;遵循标准的变量命名约定。
subscripts 可选的。数组变量的维数;最多可以定义 60 维的多维数组。subscripts 参数的使用语法如下:
  [lower To] upper [,[lower To] upper] . . .
  如果不显式指定 lower,则数组的下界由 Option Base 语句控制。如果没有 Option Base 语句则下界为 0。
New 可选的。使其可以隐式地创建对象的关键字。如果使用 New 声明对象变量,则在第一次引用该变量时创建该对象的新实例,因此不必使用 Set 语句来对该对象引用赋值。New 关键字不能声明任何内部数据类型的变量以及从属对象的实例,也不能与 WithEvents 一起使用。
type 可选的。变量的数据类型;可以是 Byte、Boolean、Integer、Long、Currency、Single、Double、Decimal(目前尚不支持)、Date、String(对可变长的字符串)、String * length(对定长的字符串)、Object、Variant、用户定义类型或对象类型。所声明的每个变量都要一个单独的 As type 子句。

说明

Private 变量只能在包含其声明的模块中使用。

可以使用 Private 语句声明变量的数据类型。例如,下面的语句声明了一个 Integer 类型的变量。

Private NumberOfEmployees As Integer

也可以使用 Private 语句来声明变量的对象类型。下面的语句为工作表的新实例声明了一个变量。

Private X As New Worksheet

如果在定义对象变量时没有使用 New 关键字,则在使用该变量之前,必须使用 Set 语句将一个已有的对象赋给该引用对象的变量。在赋值之前,所声明的这个对象变量有一个特定值 Nothing,这个值表示该变量没有指向任何对象的实例。

如果不指定数据类型或对象类型,且在模块中没有使用 Deftype 语句,则按缺省情况该变量为 Variant 类型。

可以用带空圆括号的 Private 语句来声明动态数组,然后可以在过程内用 ReDim 语句来定义该数组的维数和元素。如果试图在 PrivatePublic Dim 语句中重新定义一个已显式定义了大小的数组的维数,就会发生错误。

当初始化变量时,数值变量被初始化为 0,变长的字符串被初始化为一个零长度的字符串 (""),而定长的字符串则用 0 填充。Variant 变量被初始化为 Empty。用户自定义类型的变量的每个元素作为各自独立的变量进行初始化。

注意 当在过程中使用 Private 语句时,通常将 Private 语句放在过程的开始。


Property Get 语句

声明 Property 过程的名称,参数以及构成其主体的代码,该过程获取一个属性的值。

语法

[Public | Private | Friend] [Static] Property Get name [(arglist)] [As type]
[statements]
[name = expression]
[Exit Property]
[statements]
[name = expression]

End Property

Property Get 语句的语法包含下面部分:

部分 描述
Public 可选的。表示所有模块的所有其它过程都可访问 Property Get 过程。如果在包含 Option Private 的模块中使用,则该过程在该工程外是不可使用的。
Private 可选的。表示只有包含其声明的模块的其它过程可以访问该 Property Get 过程。
Friend 可选的。只能在类模块中使用。表示该 Property Get 过程在整个工程中都是可见的,但对对象实例的控制者是不可见的。
Static 可选的。表示在调用之间保留该 Property Get 过程的局部变量的值。Static 属性对在该 Property Get 过程外声明变量不会产生影响,即使过程中也使用了这些变量。
name 必需的。Property Get 过程的名称;遵循标准的变量命名约定,但不能与同一模块中的 Property LetProperty Set 过程同名。
arglist 可选的。代表在调用时要传递给 Property Get 过程的参数的变量列表。多个变量则用逗号隔开。Property Get 过程中的每个参数的名称和数据类型必须与相应 Property Let 过程(如果存在)中的参数一致。
type 可选的。该 Property Get 过程的返回值的数据类型;可以是 Byte、Boolean、Integer、Long、Currency、Single、Double、Decimal(目前尚不支持)、Date、String(除定长)、Object、Variant或任何用户定义类型。任何类型的数组都不能作为返回值,但包含数组的 Variant 可以作为返回值。

Property Get 过程的返回值类型必须与相应的 Property Let 过程(如果有)的最后一个(有时是仅有的)参数的数据类型相同,该 Property Let 过程将其右边表达式的值赋给属性。

statements 可选的。Property Get 过程体中所执行的任何语句组。
expression 可选的。Property Get 语句所定义的过程返回的属性值。

其中的 arglist 参数的语法及语法的各个部分如下:

[Optional] [ByVal | ByRef] [ParamArray] varname[( )] [As type] [= defaultvalue]

部分 描述
Optional 可选的。表示参数不是必需的。如果使用了该选项,则 arglist 中的后续参数都是可选的,而且必须都使用 Optional 关键字声明。
ByVal 可选的。表示该参数按值传递。
ByRef 可选的。表示该参数按地址传递。ByRef 是 Visual Basic 的缺省选项。
ParamArray 可选的。只用于 arglist 的最后一个参数,指明最后这个参数是一个 Variant 元素的 Optional 数组。使用 ParamArray 关键字可以提供任意数目的参数。ParamArray 关键字不能与 ByVal、ByRef Optional 一起使用。
varname 必需的。代表参数的变量名称;遵循标准的变量命名约定。
type 可选的。传递给该过程的参数的数据类型;可以是 Byte、BooleanInteger、Long、Currency、Single、Double、Decimal(目前尚不支持)、Date、String(只支持变长)、ObjectVariant。如果参数不是 Optional,则也可以是用户自定义的类型,或对象类型。
defaultvalue 可选的。任何常数或常量表达式。只在 Optional 参数时是合法的。如果类型为 Object,则显式的缺省值只能是 Nothing

说明

如果没有使用 Public,Private Friend 显式指定,则 Property 过程缺省为公用。如果没有使用 Static,则在调用之后不会保留局部变量的值。Friend 关键字只能在类模块中使用。Friend 过程可以被工程中的任何模块的过程访问。Friend 过程不会在其父类的类型库中出现,且 Friend 过程不能被后期绑定。

所有的可执行代码都必须属于某个过程。不能在别的 Property、Sub Function 过程中定义 Property Get 过程。

Exit Property 语句使执行立即从一个 Property Get 过程中退出。程序接着从调用该 Property Get 过程的语句下一条语句开始执行。在 Property Get 过程中的任何位置都可以有 Exit Property 语句。

Property Get 过程与 SubProperty Let 过程的相似之处是:Property Get 过程是一个可以获取参数,执行一系列语句,以及改变其参数的值的独立过程,而与 SubProperty Let 过程不同的是:当要返回属性的值时,可以在表达式的右边使用 Property Get 过程,这与使用 Function 或属性名的方式一样。


Property Let 语句

声明 Property Let 过程的名称,参数以及构成其主体的代码,该过程给一个属性赋值。

语法

[Public | Private | Friend] [Static] Property Let name ([arglist,] value)
[statements]
[Exit Property]
[statements]

End Property

Property Let 语句的语法包含下面部分:

部分 描述
Public 可选的。表示所有模块的所有其它过程都可访问该 Property Let 过程。如果在包含 Option Private 的模块中使用,则这个过程在该工程外是不可使用的。
Private 可选的。表示只有在包含其声明的模块的其它过程中可以访问该 Property Let 过程。
Friend 可选的。只能在类模块中使用。表示该 Property Let 过程在整个工程中都是可见的,但对于对象实例的控制者是不可见的。
Static 可选的。表示在调用之间将保留 Property Let 过程的局部变量的值。Static 属性对在该 Property Let 过程外声明的变量不会产生影响,即使过程中也使用了这些变量。
name 必需的。Property Let 过程的名称;遵循标准的变量命名约定,但不能与同一模块中的 Property GetProperty Set 过程同名。
arglist 可选的。代表在调用时要传递给 Property Let 过程的参数的变量列表。多个变量则用逗号隔开。Property Let 过程中的每个参数的名称和数据类型必须与 Property Get 过程中的相应参数一致。
value 必需的。指用于给属性赋值的变量。当调用该过程时,这个参数出现在调用表达式的右边。value 的数据类型必须和相应的 Property Get 过程的返回值类型一致。
statements 可选的。Property Let 过程中执行的任何语句组。

其中的 arglist 参数的语法和语法的各个部分如下:

[Optional] [ByVal | ByRef] [ParamArray] varname[( )] [As type] [= defaultvalue]

部分 描述
Optional 可选的。表示参数不是必需的。如果使用了该选项,则 arglist 中的后续参数都必须是可选的,而且必须都使用 Optional 关键字声明。注意,一个 Property Let 表达式的右边是不可能为 Optional 的。
ByVal 可选的。表示该参数按值传递。
ByRef 可选的。表示该参数按地址传递。ByRef 是 Visual Basic 的缺省选项。
ParamArray 可选的。只用于 arglist 的最后一个参数,指明最后这个参数是一个 Variant 元素的 Optional 数组。使用 ParamArray 关键字可以提供任意数目的参数。ParamArray 关键字不能与 ByVal、ByRef Optional 一起使用。
varname 必需的。代表参数变量的名称;遵循标准的变量命名约定。
type 可选的。传递给该过程的参数的数据类型;可以是 Byte、Boolean、Integer、Long、Currency、Single、Double、Decimal(目前尚不支持)、Date、String(只支持变长)、Object 或 Variant。如果参数不是 Optional,则也可以是用户定义类型,或对象类型。
defaultvalue 可选的。任何常数或常数表达式。只在 Optional 参数时是合法的。如果类型为 Object,则显式的缺省值只能是 Nothing

注意 每个 Property Let 语句必须为其所定义的过程定义至少一个参数。当这个 Property Let 语句所定义的过程被调用时,该参数(如果有多个参数则指最后一个)就包含了将赋给属性的实际值。该参数就是前述语法中的 value

说明

如果没有使用 Public、Private Friend 显式指定,则 Property 过程缺省为公用。如果没有使用 Static,则不会在调用之后保留局部变量的值。Friend 关键字只能在类模块中使用。不过 Friend 过程可以被工程中的任何模块的过程访问。Friend 过程不会在其父类的类型库中出现,且 Friend 过程不能被后期绑定。

所有的可执行代码都必须属于某个过程。不能在别的 Property、Sub Function 过程中定义 Property Let 过程。

Exit Property 语句使执行立即从一个 Property Let 过程中退出。程序接着从调用该 Property Let 过程的语句下一条语句开始执行。在 Property Let 过程的任何位置都可以有 Exit Property 语句。

Property Let 过程与 FunctionProperty Get 过程的相似之处是:Property Let 过程是一个可以获取参数,执行一系列语句,以及改变其参数值的独立过程。而与 FunctionProperty Get 过程不同的是:这两个过程都有返回值,而 Property Let 过程只能用于属性表达式或 Let 语句的左边。


Property Set 语句

声明 Property 过程的名称,参数以及构成其主体的代码,该过程设置一个对象引用。

语法

[Public | Private | Friend] [Static] Property Set name ([arglist,] reference)
[statements]
[Exit Property]
[statements]

End Property

Property Set 语句的语法包含下面部分:

部分 描述
Optional 可选的。表示调用者可以提供或不提供该参数。
Public 可选的。表示所有模块的所有其它过程都可访问这个 Property Set 过程。如果在包含 Option Private 的模块中使用,则这个过程在该工程外是不可使用的。
Private 可选的。表示只有包含其声明的模块的其它过程可以访问该 Property Set 过程。
Friend 可选的。只能在类模块中使用。表示该 Property Set 过程在整个工程中都是可见的,但对对象实例的控制者是不可见的。
Static 可选的。表示在调用之间保留 Property Set 过程的局部变量的值。Static 属性对在该 Property Set 外声明的变量不会产生影响,即使过程中也使用了这些变量。
name 必需的。Property Set 过程的名称;遵循标准的变量命名约定,但不能与同一模块中的 Property GetProperty Let 过程同名。
arglist 可选的。代表在调用时要传递给 Property Set 过程的参数的变量列表。对于多个变量则用逗号隔开。
reference 必需的。对象引用赋值的右边所使用的包含对象引用的变量。
statements 可选的。Property 过程体中所执行的任何语句组。

其中的 arglist 参数的语法以及语法各个部分如下:

[Optional] [ByVal | ByRef] [ParamArray] varname[( )] [As type] [= defaultvalue]

部分 描述
Optional 可选的。表示参数不是必需的。如果使用了该选项,则 arglist 中的后续参数都必须是可选的,而且必须都使用 Optional 关键字声明。注意:Property Set 表达式的右边不可能是 Optional
ByVal 可选的。表示该参数按值传递。
ByRef 可选的。表示该参数按地址传递。ByRef 是 Visual Basic 的缺省选项。
ParamArray 可选的。只用于 arglist 的最后一个参数,指明最后这个参数是一个 Variant 元素的 Optional 数组。使用 ParamArray 关键字可以提供任意数目的参数。ParamArray 关键字不能与 ByVal、ByRef Optional 一起使用。
varname 必需的。代表参数的变量的名称;遵循标准的变量命名约定。
type 可选的。传递给该过程的参数的数据类型;可以是 Byte、Boolean、Integer、Long、Currency、Single、Double、Decimal(目前尚不支持)、Date、String(只支持变长)、Object 或 Variant。如果参数不是 Optional,则也可以是用户定义类型,或对象类型。
defaultvalue 可选的。任何常数或常数表达式。只在 Optional 参数时是合法的。如果类型为 Object,则显式的缺省值只能是 Nothing

注意 每个 Property Set 语句必须为其所定义的过程定义至少一个参数。当 Property Set 语句所定义的过程被调用时,这个参数(如果有多个参数则指最后一个)就包含了将赋给属性的实际的对象引用。这个参数就是前述语法中的 reference。它不能是 Optional

说明

如果没有使用 Public、Private Friend 显式指定,则 Property 过程按缺省情况是公用的。如果没有使用 Static,则在调用之后不会保留局部变量的值。Friend 关键字只能在类模块中使用。不过 Friend 过程可以被工程中的任何模块的过程访问。Friend 过程不会在其父类的类型库中出现,且 Friend 过程不能被后期绑定。

所有的可执行代码都必须属于某个过程。不能在别的 Property、Sub Function 过程中定义 Property Set 过程。

Exit Property 语句使执行立即从一个 Property Set 过程中退出。程序接着从调用该 Property Set 过程的语句下一条语句执行。在 Property Set 过程的任何位置都可以有 Exit Property 语句。

Property Set 过程与 FunctionProperty Get 过程的相似之处是:它们都是一个可以获取参数,执行一系列语句,以及改变其参数的值的独立过程。而与 FunctionProperty Get 过程不同的是:这两个过程都有返回值,而 Property Set 过程只能用于对象引用赋值(Set 语句)的左边。


Public 语句

在模块级别中使用,用于声明公用变量和分配存储空间。

语法

Public [WithEvents] varname[([subscripts])] [As [New] type] [,[WithEvents] varname[([subscripts])] [As [New] type]] . . .

Public 语句的语法包含下面部分:

部分 描述
WithEvents 可选的。关键字,说明 varname 是用来响应由 ActiveX 对象触发的事件的对象变量。只有在类模块中才是合法的。使用 WithEvents,可以定义任意个所需的单个变量,但不能用 WithEvents 创建数组。NewWithEvents 不能一起使用。
varname 必需的。变量的名称;遵循标准的变量命名约定。
subscripts 可选的。数组变量的维数;最多可以定义 60 维的多维数组。subscripts 参数使用下面的语法:
  [lower To] upper [,[lower To] upper] . . .
  如果不显式指定 lower,则数组的下界由 Option Base 语句控制。如果没有 Option Base 语句则下界为 0。
New 可选的。用它可以隐式地创建对象的关键字。如果使用 New 声明对象变量,则在第一次引用该变量时创建该对象的新实例,因此不必使用 Set 语句来对该对象引用赋值。New 关键字不能用来声明任何内部数据类型的变量以及从属对象的实例,也不能与 WithEvents 一起使用。
type 可选的。变量的数据类型;可以是 Byte、Boolean、Integer、Long、Currency、Single、Double、Decimal(目前尚不支持)、Date、String(对变长的字符串)、String * length(对定长的字符串)、Object或 Variant,用户定义类型,或对象类型。所声明的每个变量都要有一个单独的 As type 子句。

说明

Public 语句声明的变量在所有应用程序的所有没有使用 Option Private Module 的模块的任何过程中都是可用的;若该模块使用了 Option Private Module,则该变量只是在其所属工程中是公用的。

注意 不能在类模块中使用 Public 语句来声明一个定长的字符串变量。

使用 Public 语句可以声明变量的数据类型。例如,下面的语句声明了一个 Integer 类型的变量。

Public NumberOfEmployees As Integer

也可以使用 Public 语句来声明变量的对象类型。下面的语句为工作表的新实例声明了一个变量。

Public X As New Worksheet

如果在定义对象变量时没有使用 New 关键字,则在使用该变量之前,必须使用 Set 语句将一个已有的对象赋给这个引用对象的变量。在被赋值之前,所声明的这个对象变量有一个特定值 Nothing,这个值表示该变量没有指向任何对象的实例。

可以用带空圆括号的 Public 语句来声明动态数组。在声明了动态数组之后,可以在过程内用 ReDim 语句来定义该数组的维数和元素。如果试图在 Private、Public Dim 语句中重定义一个已被显式定义了大小的数组的维数,就会发生错误。

如果不指定数据类型或对象类型,且在模块中没有使用 Deftype 语句,则按缺省情况该变量为 Variant 类型。

当初始化变量时,数值变量被初始化为 0,变长的字符串被初始化为一个零长度的字符串 (""),而定长的字符串则用 0 填充。Variant 变量被初始化为 Empty。用户自定义类型的变量的每个元素都作为各自独立的变量进行初始化。


Put 语句

将一个变量的数据写入磁盘文件中。

语法

Put [#]filenumber, [recnumber], varname

Put 语句的语法具有以下几个部分:

部分 描述
filenumber 必要。任何有效的文件号。
recnumber 可选。Variant (Long)。记录号(Random 方式的文件)或字节数(Binary 方式的文件),指明在此处开始写入。
varname 必要。包含要写入磁盘的数据的变量名。

说明

通常用 GetPut 写入的文件数据读出来。

文件中的第一个记录或字节位于位置 1,第二个记录或字节位于位置 2,依此类推。如果省略 recnumber,则将上一个 GetPut 语句之后的(或上一个 Seek 函数指出的)下一个记录或字节写入。所有用于分界的逗号都必须罗列出来,例如:

Put #4,,FileBuffer

下列规则适用于以 Random 方式打开的文件:

  • 如果已写入的数据的长度小于 Open 语句的 Len 子句指定的长度,则 Put 以记录长度为边界写入随后的记录。记录终点与下一个记录起点之间的空白将用现有文件缓冲区内的内容填充。因为填入的数据量无法确定,所以一般说来,最好设法使记录的长度与写入的数据长度一致。如果写入的数据长度大于由 Open 语句的 Len 子句所指定的长度,就会导致错误发生。

  • 如果写入的变量是一个可变长度的字符串,则 Put 先写入一个含有字符串长度的双字节描述符,然后再写入变量。Open 语句的 Len 子句所指定的记录长度至少要比实际字符串的长度多两个字节。

  • 如果写入的变量是数值类型的 Variant Put 先写入两个字节来辨认 Variant VarType,然后才写入变量。例如,当写入 VarType 3 的 Variant 时,Put 会写入六个字节:其中,前两个字节辨认出 Variant VarType 3 (Long),后四个字节则包含 Long 类型的数据。Open 语句的 Len 子句所指定的记录长度必须至少比储存变量所需的实际字节多两个字节。

注意   Put 语句可用来将一个 Variant 数组写入磁盘,但不能用来将包含数组的标量 Variant 写入磁盘。Put 也不能用来将对象写入磁盘。

  • 如果写入的变量是 VarType 8 (String) 的 Variant,则 Put 先写入两个字节来辨认 VarType,接下来的两个字节则指出字符串的长度,然后再写入字符串数据。Open 语句的 Len 子句所指定的记录长度必须至少比实际的字符串长度多四个字节。

  • 如果写入的变量是动态数组,则 Put 写入一个描述符,其长度等于 2 加上 8 乘以维数,即 2 + 8 * NumberOfDimensionsOpen 语句的 Len 子句所指定的记录长度必须大于或等於为读出数组数据和数组描述符所需要的所有字节数总和。例如,在将数组写入磁盘时,下列数组声名需要 118 个字节的空间:
    Dim MyArray(1 To 5,1 To 10) As Integer
    
  • 这 118 个字节的分配情况如下:18 个字节用于描述符 (2 + 8 * 2),100 个字节用于数据 (5 * 10 * 2)。

  • 如果写入的变量是大小固定的数组,则 Put 只写入数据。它不将描述符写入磁盘。

  • 如果写入的变量是任何其他类型的变量(不是可变长度的字符串或 Variant£©,则 Put 只写入变量数据。Open 语句的 Len 子句所指定的记录长度必须大于或等於要读出的数据长度。

  • Put 写入用户定义类型的元素时,除了不在元素之间进行填充外,好象是单独地写入每一个元素。在磁盘上,有一个描述符位于 Put 写入的用户定义的类型的动态数组之前,其长度等于 2 加上 8 乘以维数,即 2 + 8 * NumberOfDimensionsOpen 语句中的 Len 子句所指定的记录长度必须大于或等於为写入各个元素(包括任何数组及其描述符在内)所需的全部字节数总和。

对于以 Binary 方式打开的文件,上述所有 Random 规则都适用,除了:

  • Open 语句中的 Len 子句不起作用。Put 语句连续地将所有变量写入磁盘;也就是说,两个记录之间没有任何填充。

  • 对于任何不属于用户定义的类型的数组,Put 只写入数据。它不会写入描述符。

  • 对于非用户定义的类型的可变长度字符串,Put 将其直接写入,而无须有双字节描述符。写入的字节数等於字符串所包含的字符数。例如,下列语句将十个字节写入文件号为 1 的文件中:
    VarString$ = String$(10, )
    Put #1,,VarString$