类型转换函数

Asc 函数

CBool 函数

CCur 函数

CDate 函数

CDbl 函数

CInt 函数

CLng 函数

CSng 函数

CStr 函数

CVar 函数

CVErr 函数

Format 函数

Str 函数

Val 函数


Asc 函数

返回对应于字符串中第一个字符的字符码。

语法

Asc(string)

元素

命名参数 string可以是任何合法的字符串表达式。如果tring不包含任何字符，将发生运行时间错误。


CBool 函数

将表达式转换为Boolean类型。

语法

CBool(expression)

元素

expression参数可以是任何合法的 数字表达式。

注释

如果expression为零。本函数返回False，否则返回True。如果expression不能被解释为数字值，将发生运行时间错误。


CCur 函数

将表达式转换为Currency类型。

语法

CCur(expression)

元素

expression参数可以是任何合法的 数字表达式或 字符串表达式。

注释

通常，您可以使用数据类型转换函数来文档化您的代码，以显示某些操作的结果应当被表达为特定的数据类型，而非缺省数据类型。例如，在一般进行单精度浮点数，双精度浮点数或整数计算的地方，使用Ccur以强制进行货币计算。

应当使用 CCur函数而非 Val函数来进行从其它数据类型到Currency类型的国际公认的格式转换。例如，依赖于计算机不同的 语言环境设置，将有不同样式的十进制分隔符，千位分隔符及其它货币选项。

如果expression不能被识别为可接受的Currency数据类型，将产生错误。


CDate 函数

将表达式转换为Date类型。

语法

CDate(date)

元素

date参数可以是任何合法的 数据表达式。

注释

使用 IsDate函数以决定date是否可被转换为日期或时间。CDate既能识别日期和时间直接量，也能识别处于可接受范围内的数字。当把数字转换为日期时，整数部分转换为日期，小数部分转换为从午夜开始的时间。

CDate按照系统的国别设定来识别日期格式。如果未能按照适当的顺序书写日，月和年，将不能正确地决定它们的顺序。同时，如果长日期格式中包含了表示星期几的字符串，也不能被识别。

附注   为与旧版本的Visual Basic兼容，提供了CVDate函数。然而，由于没有内部Date类型，并不需要CVDate。CVDate函数的语法与Cdate函数相同。不同点在于CVDate返回子类型为日期的Variant型量，而非真正的Date类型。可将变量转换为Date类型，再将其赋给Variant型量来达到相同的效果。这种技术适用于所有其它内部类型到与之等同的Variant子类型的转换。


CDbl 函数

将表达式转换为Double类型。

语法

CDbl(expression)

元素

expression参数可以是任何合法的 数字表达式或 字符串表达式。

注释

通常，您可以使用数据类型转换函数来文档化您的代码，以显示某些操作的结果应当被表达为特定的数据类型，而非缺省数据类型。例如，在一般进行货币或整数计算的地方，使用CDbl或 CSng 以强制进行双精度浮点数或单精度浮点数计算。

应当使用CDbl函数而非 Val函数来进行从其它数据类型到Double类型的国际公认的格式转换。 例如，依赖于计算机不同的 语言环境设置，将有不同样式的十进制分隔符和千位分隔符。


CInt 函数

将表达式转换为Integer类型。

语法

CInt(expression)

元素

expression参数可以是任何合法的 数字表达式或 字符串表达式。

注释

通常，您可以使用数据类型转换函数来文档化您的代码，以显示某些操作的结果应当被表达为特定的数据类型，而非缺省数据类型。例如，在一般进行货币，单精度浮点数或双精度浮点数计算的地方，使用CInt或 CLng 以强制进行整数计算。

应当使用CInt函数而非 Val函数来进行从其它数据类型到Integer类型的国际公认的格式转换。 例如，依赖于计算机不同的 语言环境设置，将有不同样式的十进制分隔符和千分位分隔符。

如果expression不能被识别为可接受的Integer数据类型，将产生错误。

附注   CInt不象Fix和Int函数那样舍去小数部分，而是将其近似。当小数部分恰好等于0.5时，CInt函数总是将其近似到最接近的偶数。例如，0.5近似为0，1.5近似为2。


CLng 函数

将表达式转换为Long类型。

语法

CLng(expression)

元素

expression参数可以是任何合法的 数字表达式或 字符串表达式。

注释

通常，您可以使用数据类型转换函数来文档化您的代码，以显示某些操作的结果应当被表达为特定的数据类型，而非缺省数据类型。例如，在一般进行货币，单精度浮点数或双精度浮点数计算的地方，使用CInt或 CLng 以强制进行整数计算。

应当使用CLng函数而非 Val函数来进行从其它数据类型到Long类型的国际公认的格式转换。 例如，依赖于计算机不同的 语言环境设置，将有不同样式的十进制分隔符和千分位分隔符。

如果expression不能被识别为可接受的Long数据类型，将产生错误。

附注   CLng不象Fix和Int函数那样舍去小数部分，而是将其近似。当小数部分恰好等于0.5时，CLng函数总是将其近似到最接近的偶数。例如，0.5近似为0，1.5近似为2。


CSng 函数

将表达式转换为Single类型。

语法

CSng(expression)

元素

expression参数可以是任何合法的 数字表达式或 字符串表达式。

注释

通常，您可以使用数据类型转换函数来文档化您的代码，以显示某些操作的结果应当被表达为特定的数据类型，而非缺省数据类型。例如，在一般进行货币或整数计算的地方，使用CDbl或 CSng 以强制进行双精度浮点数或单精度浮点数计算。

应当使用CSng函数而非 Val函数来进行从其它数据类型到Single类型的国际公认的格式转换。 例如，依赖于计算机不同的 语言环境设置，将有不同样式的十进制分隔符和千分位分隔符。

如果expression不能被识别为可接受的Single数据类型，将产生错误。


CStr 函数

将表达式转换为String类型。

语法

CStr(expression)

元素

expression参数可以是任何合法的 数字表达式或 字符串表达式。

注释

通常，您可以使用数据类型转换函数来文档化您的代码，以显示某些操作的结果应当被表达为特定的数据类型，而非缺省数据类型。例如，使用CStr以将结果强制表达为String类型。

应当使用CStr函数而非 Str函数来进行从其它数据类型到String类型的国际公认的格式转换。 例如，依赖于计算机不同的 语言环境设置，将有不同样式的十进制分隔符。

expression中的数据依照下表决定了返回值：

若expression为	CStr返回

Boolean	String，其中包含True或False(依语言环境恰当地翻译)。

Date	String，其中包含系统短日期格式日期。

Null	运行错误。

Empty	零长度String (“”)。

Error	String，其中包含跟随错误代码的Error字(依语言环境恰当地翻译)。

其它数字	String，其中包含该数字


CVar 函数

将表达式转换为Variant类型。

语法

CVar(expression)

元素

expression参数可以是任何合法的 数字表达式或 字符串表达式。

注释

通常，您可以使用数据类型转换函数来文档化您的代码，以显示某些操作的结果应当被表达为特定的数据类型，而非缺省数据类型。例如，使用CVar以将结果强制表达为Variant类型。


CVErr 函数

返回子类型为Error的Variant值，该值包含用户指定的错误代码。

语法

CVErr(errornumber)

元素

errornumber参数可以是任何合法的 错误代码。

注释

CVErr函数可以用来在用户编写的过程中创建自定义的错误。例如，如果您有一个函数，它接受若干参数，正常情况下应返回字符串，则可令该函数分析输入的参数，看看它们是否处于可接受范围之内。如果不是这样，那么很有可能该函数不能返回预期结果。这种情况下，可用CVErr返回一错误代码，以通知您采取相应的行动。

请注意，不明确地转换Error类型是不允许的。例如，不能直接将CVErr的返回值赋给非Variant型的变量。不过，对CVErr的返回值进行明确的类型转换(使用CInt, CDbl等等)，然后将其赋予适当类型的变量是可以的。


Val 函数

返回包含在字符串中的数字。

语法

Val(string)

元素

string 命名参数可以是任何合法的 字符串表达式。

注释

遇到第一个不能被识别为数字的一部分的字符后，Val函数停止分析字符串。一些经常被看作数字的一部分的符号，比如美元符号和逗号，Val函数也不识别。然而，Val函数识别进制前缀&O (八进制)和&H(十六进制)。空格，制表符和换行符被舍弃。

下面的例子返回1615198：

Val("    1615 198th Street N.E.")

下面的例子对所示的十六进制数返回十进制值-1：

Val("&HFFFF")

附注   Val函数仅认为句点(.)是合法的十进制分隔符。当其它分隔符可能在使用时（比如在国际应用程序中），应当使用CDbl来将字符串转换为数字。


Asc 函数示例

此例使用Asc 函数返回对应于字符串中第一个字母的字符码。

MyNumber = Asc("A")	' 返回 65.

MyNumber = Asc("a")	' 返回 97.

MyNumber = Asc("Apple")	' 返回 65.


CBool 函数示例

此例使用CBool 函数将表达式转换为Boolean值。如果该表达式非零，CBool 返回 True； 否则返回False。

A = 5 : B = 5	' 定义变量。

Check = CBool(A = B)	' Check等于True。

A = 0	' 定义变量。

Check = CBool(A)	' Check等于False。


CDate 函数示例

此例使用CDate 函数将字符串转换为Date值。通常，象此例所示的将日期/时间硬编码为字符串是不好的编程习惯。最好使用日期直接量。

MyDate = "February 12, 1969"	' 定义日期。

MyShortDate = CDate(MyDate)	' 转换为日期数据类型。

MyTime = "4:35:47 PM"	' 定义时间。

MyShortTime = CDate(MyTime)	' 转换为日期数据类型。


CVErr 函数示例

此例使用CVErr函数返回子类型为Error的Variant值。若传给自定义函数CalculateDouble的参数不是数字，它将返回一个错误代码。对于从自定义过程返回自定义错误代码，CVErr是很有用的。可以使用IsError函数检测某个值是否一个错误代码。

' 定义 CalculateDouble 函数过程。

Function CalculateDouble(Number)

If IsNumeric(Number) Then

CalculateDouble = Number * 2	' 返回结果。

Else

CalculateDouble = CVErr(2001)	' 返回自定义错误代码。

End If

End Function


CCur 函数示例

此例使用CCur函数将表达式转换为Currency值。

MyDouble = 543.214588	' MyDouble是双精度浮点数。

MyCurr = CCur(MyDouble * 2)	' 将结果(1086.4292)转换为货币类型。


CDbl 函数示例

此例使用CDbl 函数将表达式转换为Double值。

MyCurr = CCur(234.456784)	' MyCurr是货币类型的值。

MyDouble = CDbl(MyCurr * 8.2 * 0.01)	' 将结果转换为双精度浮点数。


CInt 函数示例

此例使用CInt 函数将表达式转换为Integer值。

MyDouble = 2345.5678	' MyDouble是双精度浮点数。

MyInt = CInt(MyDouble)	' MyInt等于2346。


CLng 函数示例

此例使用CLng 函数将表达式转换为Long值。

MyVal1 = 25427.45 : MyVal2 = 25427.55	' MyVal1，MyVal2是双精度浮点数。

MyLong1 = CLng(MyVal1)	' MyLong1等于25427.

MyLong2 = CLng(MyVal2)	' MyLong2等于25428.


CSng 函数示例

此例使用CSng 函数将表达式转换为Single值。

' MyDouble1，MyDouble2是双精度浮点数。

MyDouble1 = 75.3421115 : MyDouble2 = 75.3421555

MySingle1 = CSng(MyDouble1)	' MySingle1等于75.34211.

MySingle2 = CSng(MyDouble2)	' MySingle2等于75.34216.


CStr 函数示例

此例使用CStr 函数将数字转换为String型变量。

MyDouble = 437.324	' MyDouble is a Double.

MyString = CStr(MyDouble)	' MyString contains "437.324".


CVar 函数示例

此例使用CVar 函数将表达式转换为Variant值。

MyInt = 4534	' MyInt是整数。

MyVar = CVar(MyInt & "000")	' MyVar等于4534000.


Val 函数示例

此例使用Val 函数返回字符串中包含的数字。

MyValue = Val("2457")	' 返回 2457.

MyValue = Val(" 2 45 7")	' 返回 2457.

MyValue = Val("24 and 57")	' 返回 24.


创建对象变量
牜��创建对象变量

可以象对待其引用的对象那样对待对象变量。可以设置或读取对象的属性，或使用对象的方法。

若要创建对象变量

1.	声明对象变量。

2.	将某一对象赋给对象变量。

声明对象变量

使用Dim语句或其它变量声明语句之一(Public，Private，或Static)来声明一个对象变量。引用一个对象的变量必须是Variant型，Object型，或特定对象的类型。例如，下面的声明语句是合法的：

Dim MyObject	' 将MyObject声明为Variant型变量。

Dim MyObject As Object	' 将MyObject声明为Object型变量。

Dim MyObject As Font	' 将MyObject声明为Font型变量。

Note   象其它类型的变量一样，未声明就使用一个对象变量，该对象变量的数据类型缺省为Variant型。

可以用Object数据类型对任何对象进行通用的引用。有时在程序运行之前，特定的 对象类型还不能确定，就可以用Object类型声明一个对象变量。

如果确知对象变量将要引用的对象，应当用该对象类型来声明对象变量。例如，如果应用程序包含Sample对象类型，则可用下列任一语句声明对象变量：

Dim MyObject As Object	' 声明为通用的对象。

Dim MyObject As Sample	' 仅声明为Sample对象。

声明为特定的对象类型（而非通用对象类型）意味着自动类型检查，更快的代码，及更好的可读性。

将一个对象赋给一个对象变量

用Set语句将一个对象赋给一个对象变量。可以赋给对象变量以 对象表达式或Nothing值。例如，下面的对象变量赋值语句是合法的：

Set MyObject = YourObject	' 赋以对象引用（另一个对象变量）。

Set MyObject = Nothing	' 断开关联。

令一个对象变量等于Nothing值将断开该对象变量与任何对象的关联。这将防止因偶然地改变变量而改变了对象本身。如果总是在关闭对象后令对象变量等于Nothing值，就可以容易地检测一个对象变量是否指向一个合法的对象，例如：

If MyObject Not Nothing Then	' 变量指向一个合法的对象.

. . .

End If


创建数组

如果不指定数据类型，数组将包含变体型型的值。Variant型数组中每个元素消耗16字节。下面的代码用以比较若干数组的大小：

' 占用22字节的整型数组(11个元素 * 2字节)。

ReDim MyIntegerArray(10) As Integer

' 占用88字节的双精度浮点数组(11个元素 * 8字节)。

ReDim MyDoubleArray(10) As Double

' 至少占用176字节的变体型数组(11个元素 * 16字节)。

ReDim MyVariantArray(10)

' 占用100 * 100 * 2字节(20，000字节)的整型数组。

ReDim MyIntegerArray (99, 99) As Integer

' 占用100 * 100 * 8字节(80，000字节)的双精度浮点数组。

ReDim MyDoubleArray (99, 99) As Double

' 至少占用160，000字节的变体型数组(100 * 100 * 16字节)。

ReDim MyVariantArray(99, 99)

数组的最大大小依操作系统及可用内存多少的不同而不同。 一般不会遇到数组大小太大的问题，但是数组大小超过可用物理内存时将降低速度，因为此时数据必须从磁盘上存取。


创建递归过程

过程中的变量空间是有限的。过程每调用自身一次，就多消耗一些变量空间。这种调用自身的过程称为递归过程。无限制地调用自身的递归过程将引起一个错误。例如：

Function RunOut(Maximum)

RunOut = RunOut(Maximum)	'错误：不停地调用自身。

End Function

当两个过程不停地互相调用，或停止递归的条件永远不能满足时，这种错误就更不明显了。递归有其独特的应用。例如，下面的过程利用一个递归函数计算阶乘：

Function Factorial (N)

If N <= 1 Then	' 结束递归调用。

Factorial = 1	' (N <= 1)则逐级返回。

Else	' 若 N > 1则继续递归。

Factorial = Factorial(N - 1) * N

End If

End Function

应当检测递归过程，以防过多递归造成内存耗尽。如果得到内存耗尽的错误，请检查是否过程在无限制地调用自身。然后，试用以下方法节省内存：

�	去掉无用变量。

�	使用特定数据类型而非Variant类型。

�	重新设计过程的逻辑。递归经常可被嵌套的循环所取代。


生成更快的For...Next循环

整数不仅比Variant型占用的内存少，而且更新也稍快。由于计算机运算速度极快，只有在进行成千上万的运算时才能感觉到这种速度上的差异。例如：

Dim CountFaster As Integer	' 第一种情况，用整数。

For CountFaster = 0 to 32766

Next CountFaster

Dim CountSlower As Variant	' 第二种情况，用变体型。

For CountSlower = 0 to 32766

Next CountSlower

上面第一种情况要比第二种情况稍快。不过，如果CountFaster超过32,767，将产生错误。可将CountFaster改为范围大得多的Long型量以防错误发生。但是Long型量比Integer型量的更新速度慢。通常，数据类型占用内存越少，其更新速度越快。变体型量比与之等同的数据类型稍慢。


模块作用域

在模块级定义的变量和对象可被模块内所有的过程所见。可使用模块名限定它们， 以区别于同名的过程级变量。  例如， 在模块MyModule中定义的模块级变量MyVar，可写为MyModule.MyVar以区别于某一过程中定义的MyVar。然而，对于一个模块级变量，如果在过程中没有同名的本地变量，就无须再限定它了。模块级变量总是静态的，亦即当某模块属于运行中程序的一部分时，其中的模块级变量总是存在的。

过程总是定义在模块级，而且可在方案（Project）中的任何地方调用。如果希望某过程仅在其所属模块中可见，可将其定义为Private以防被方案中其它模块所调用。将Option Private写在某模块的开始，可使该模块内所有的过程都成为私有的。过程的生命期与静态变量相同，即当模块属于运行中程序的一部分时，其中的过程总是存在的。

直接被引用方案中在模块级定义为Public的标识符对直接引用方案可见。变量和常量（用Const语句定义）缺省为Private。过程缺省为Public。结构类型（用Type ... End Type 语句定义）缺省为Public。把Option Private Module写在方案的开始，将使 Public的标识符仅对本方案可见，而对其它方案不可见。


名称冲突错误

一般 Option Explicit用于防止名称冲突错误，但即便使用了Option Explicit,也可能发生该类错误。例如，如果在一个 For...Next循环中使用了一个未定义变量，而该变量又与某个有着更广作用域的变量同名，那么有可能无意地破坏那个有更广作用域的变量的值：

Option Explicit	' 强制使用前定义变量。

Dim X	' X的模块级定义。

Sub AnyProc()

' 此处若有 Dim X语句将防止错误。

For X = 0 to 25	' 循环计数器在其模块中未定义。

Print X	' 此处的 X与模块级的X相同。

Next X

Call AnotherProc

End Sub

Sub AnotherProc()

X = X + 1

Print X	' 此处的 X与AnyProc中循环计数器的值相等。

End Sub


OLE自动化

OLE自动化是一种工业标准，该标准被应用程序用来向开发工具，宏语言及其它支持OLE自动化的应用程序提供OLE对象。例如，电子表格程序可能将工作表，图表，单元格或某一范围内的单元格 [image] 作为不同类型的对象提供。字处理程序可能提供诸如应用程序，文档，段落，句子，书签或选定区域等对象。

Visual Basic可存取支持 OLE自动化的应用程序所提供的对象。使用Visual Basic，可通过引用对象的方法或读取和修改对象的属性来操纵这些对象。例如，如果创建了名为MyObj的OLE自动化对象，则可用如下的代码操纵此对象：

MyObj.Insert "Hello, world."	' 写入文本。

MyObj.Bold = True	' 格式化文本。

MyObj.SaveAs  "C:\WORDPROC\DOCS\TESTOBJ.DOC"	' 保存对象.

下列函数用以存取OLE自动化对象：

Function	Description

CreateObject	创建指定类型的新对象。

GetObject 	从文件中获取一个对象。

可从应用程序的文档中查阅其所支持的属性和方法。应用程序所支持的对象，函数，属性和方法一般定义在其对象库中。

若要在对象库中增加一个引用

1.	从工具菜单中选择引用。

引用对话框出现。

2.	选择该应用程序的引用，或者当其未列出时，单击浏览按钮并选择适当的文件。

即使应用程序的对象未被加到对象库中。然而，由于下列原因，在对象库中加入引用更为可取：

�	全局可访问函数可以不加限定地直接访问。

�	如果应用程序未被第一个对它的引用所加载，它将被自动加载。

�	将在编译时检查对函数，属性和方法的引用，因而其运行速度将大大加快。

�	可将变量声明为对象库中所定义的数据类型，这将改善可读性和运行时的可靠性。


高效率地传递参数

若非另外指定，所有传递给过程的参数都是传址的。因为不论是何种数据类型，所有的参数都花费同样的传递时间，占用相等的内存空间（4字节），所以这种传参方式是高效的。

在过程的声明语句中使用 ByVal关键字，就可以用传值方式取代按引用方式传递参数。对不同数据类型的参数，按值传参将在过程中消耗2到16字节以上。较大的数据类型消耗较长的传参时间。

按值传参将变量的值拷贝到过程中，在过程之内对参数的修改不影响原来的变量。例如：

Function Factorial (ByVal MyVar As Integer)	' 函数声明。

MyVar = MyVar - 1

If MyVar = 0 Then

Factorial = 1

Exit Function

End If

Factorial = Factorial(MyVar) * (MyVar + 1)

End Function

' 以变量S为参数调用Factorial函数。

S = 5

Print Factorial(S)	' 输出120(5的阶乘)。

Print S	' 输出5。

上例中，如果在函数声明语句中没有ByVal，Print语句将输出1和0。这是因为MyVar将引用变量S，从而变量S按1递减，直至等于0。

上例中，由于使用了ByVal，您可以把一个变体型变量传递给Factorial函数。如果使用按引用传参，就不能把变体型变量传递给声明为其它数据类型的参数。


过程作用域

在过程级定义的变量和对象（在过程内部）对定义它们的过程是私有的，不能在该过程外部访问。如果声明为Static,那么只要所属模块处于运行状态，变量就存在。与此相反，局部变量在每次过程开始时创建，过程结束时释放。

过程不能嵌套。


方案（Project）作用域

仅仅模块名和被引用方案s名处于方案级。其中包含 宿主应用程序模块和方案(即便它们可用宿主专用术语引用，例如，Excel中的工作簿)。

声明为Public的标识符在方案级可见，即使它们定义在模块级。可见性只在一个方向扩展，理解这一点是很重要的。亦即，在直接被引用方案中声明为Public的标识符，在直接引用方案中可见；而引用方案中的标识符，在被引用方案中不可见。例如，如果MyProj直接引用YourProj，那么YourProj中的模块名和其它声明为Public的标识符在MyProj中可见；而MyProj中的模块名和其它声明为Public的标识符在YourProj（或其它被YourProj引用的方案）中不可见。


消除名称冲突

名称冲突系指创建或使用一个被Visual Basic识别为已定义的标识符。某些情况下，名称冲突将产生诸如 Ambiguous name detected 或 Duplicate declaration in current scope之类的错误。名称冲突可能被忽略以至在代码中隐藏错误，并导致错误的输出结果，特别是当所有的变量都未在使用前定义的时侯。

深入理解数据，对象和过程的作用域 特性有助于解决大多数的名称冲突。Visual Basic有三种级别的作用域：过程级，模块级和方案级。

下列情况下可能产生名称冲突：

�	变量在多个作用域级别可见。

�	变量在同一作用域级别有两种不同含义。

例如，不同模块中的过程可以有相同名字。因此，一个名为MySub的过程可能在Mod1和Mod2中都有定义。如果这些过程仅在自身所属的模块中被调用，则不会发生任何冲突。但当MySub被第三个模块所调用，并且未加任何限定时，将产生名称冲突。例如，要从模块Mod5中调用MySub(在Mod1和Mod2中都有定义),只须在调用时简单地指定Mod1.MySub或Mod2.MySub即可。

Visual Basic把对标识符的引用对应到所有匹配的标识符中“最接近的”声明。例如，如果MyID在一个方案中的两个模块(Mod1和Mod2)中定义为Public，那么对于定义在Mod2中的MyID，在Mod2中可以不加限定地引用，而在Mod1中必须以Mod2.MyID引用之。当模块Mod2处于另一个直接被引用方案中时，上面所述也适用。然而，如果模块Mod2处于一个间接被引用方案时，对其中的变量MyID的引用必须用方案名限定。当从第三个直接被引用方案中引用MyID时，按照下列顺序查找第一个匹配的声明语句：

�	直接被引用方案，以它们在“工具”菜单的“引用”对话框中出现的顺序。

�	每个方案中的模块。(注意方案中的模块并无固有的顺序。)

宿主应用程序对象的名称(例如，Excel中的R1C1)不能在不同作用域级别重用。

在每个模块开始出写上语句Option Explicit有助于避免名称冲突及其它与标识符有关的错误，因为该语句使用前显式地声明变量。

在变量名前加上模块名（若有必要，加上方案名）限定，可以消除大多数名称冲突。例如：

YourProject.YourModule.YourSub MyProject.MyModule.MyVar

上面的代码用MyVar作为参数调用YourSub。为了足以区别同名的标识符，可以使用任意组合的限定词。

由名称冲突引起的典型错误包括歧义名称，重定义，未定义标识符，未定义过程等等。


从函数返回字符串

某些函数有两个版本，一个返回Variant 数据类型，另一个返回String数据类型。由于变体型数据自动地在不同数据类型之间进行数据转换，返回变体型量的版本更易于使用。

下列情况下应考虑使用String类的版本：

�	程序很大，使用了很多变量。

�	代码结构紧凑，希望能检测到从一种数据类型到另一种数据类型的转换。

�	直接向随机存取文件写入数据。

在下列这些函数的函数名后附加美元符($)，函数将返回String类型的值。这些与它们不加美元符的变体型版本有相同的用法和语法。

Chr$	CurDir$	Date$	Dir$

Error$	Format$	Hex$	Input$

LCase$	Left$ 	LTrim$	Mid$

Oct$	Right$	RTrim$	Seek$

Space$	Str$	String$	Time$

Trim$	UCase$

附注   双字节版本的Input (InputB), Left (LeftB), Mid (MidB)和Right (RightB)也支持附加美元符的语法。


使用数据类型节约内存

整数占用的计算机内存最少。例如，可以在一个变体型量占用的空间(16 bytes)中放置八个整数(8 * 2 bytes)。然而，使用数据类型节约内存的价值有限。通常不会遇到内存耗尽的问题，除非代码中包含了或无意地创建了巨大的数组或递归过程。


作用域级别

Visual Basic程序有三种作用域级别，用以决定标识符在何时何处可见，如下表所示：

可见之处	声明方式	引用方式
仅在过程中。	Dim或Static，在过程中定义。	Variablename
在模块中(即模块的所有过程中)。	Dim, Static, Private, 在所有过程之外定义。	[modulename.]variablename
在方案中(当前方案的所有模块的所有过程中，及所有的引用方案中)。	Public,在所有过程之外定义。	[projectname.[modulename.]]variablename


高效地使用数据类型

若非另外指定，未声明的变量均为Variant 数据类型。这种数据类型使编程更为容易，但它并非总是最有效的数据类型。

下列情况下应考虑使用其它数据类型：

�	程序很大，使用了很多变量。

�	程序需要尽可能快地运行。

�	代码结构紧凑，希望能检测到从一种数据类型到另一种数据类型的必需的转换。

�	直接向随机存取文件写入数据。

除Variant类型外，还支持下列数据类型：Boolean,  Integer,  Long, Single, Double, Currency, Date, Object, 和 String。可用Dim语句定义指定的数据类型，例如：

Dim X As Integer

上述语句定义X为-32,768到32,767之间的整数 [image] 。如果试图令X等于超出该范围的数，将产生错误。如果试图令X等于一个小数，该小数将近似。例如：

X = 32768 	   ' 产生错误。

X = 5.9	' X等于6。


在应用程序之间工作

Visual Basic可对如下的微软应用程序进行创建新对象和获取已存在对象的操作：

应用程序	对象类型	类
Microsoft Excel, version 5.0	应用程序	Excel.Application
	工作表	Excel.Sheet
	图表	Excel.Chart
Microsoft Project, version 4.0	应用程序	MSProject.Project
Microsoft Word, version 6.0	WordBasic	Word.Basic
注意 Microsoft Excel, Project, 和Word的更新的版本可能允许使用Visual Basic创建更多类型的对象。其它应用程序可能也提供可用Visual Basic创建的对象。请查阅应用程序的文档以获得更多的信息。

用CreateObject或GetObject函数从其它应用程序创建新对象和获取已存在对象：

' 启动Microsoft Excel并创建一个新工作表对象。

Set ExcelWorksheet = CreateObject("Excel.Sheet")

' 启动Microsoft Excel并打开一个已存在的工作表对象。

Set ExcelWorksheet = GetObject("SHEET1.XLS")

' 启动Microsoft Word。

Set WordBasic = CreateObject("Word.Basic")

在用CreateObject或GetObject函数启动时，不同的应用程序有不同的行为。例如，Microsoft Excel启动时不可见；Microsoft Word 启动时可见。 当Microsoft Excel不可见时，它不在屏幕上显示， 也不在Windows的Task List中出现。若要显示Microsoft Excel并令其出现在Task List中,可令其Visible属性为True。例如：

ExcelWorksheet.Application.Visible = True

令Microsoft Excel的Visible属性为False将使其在屏幕上不可见，并将其从Task List中除去。但Microsoft Excel并未关闭，仍可为Visual Basic所访问。

当其对象变量等于Nothing，或超出作用域时，Microsoft Word就关闭了。如果在此之前没有保存，所做的修改将丢失。例如：

' 保存所做的修改并关闭Word。

WordBasic.FileSaveAll

Set WordBasic = Nothing

当Microsoft Excel不可见，且其对象变量被设为Nothing或超出作用域时，它就关闭了。.

' 如果Microsoft Excel不可见，它将关闭。否则，它保持打开状态。

Set ExcelWorksheet = Nothing

大多数应用程序提供Exit或Quit方法以关闭自身，不管它是否可见。请查阅应用程序的文档以获得其所提供的对象，方法和属性的更多信息。


向文件中写入数据

与大量数据打交道时，用文件存取数据经常是方便的。可用Open语句直接创建或访问文件。Open语句三种类型的文件访问：

�	顺序访问(Input, Output和Append模式)，常常用于写简单的文本文件，比如错误记录和报告。

�	随机访问(Random模式)，用于读写一个文件而不关闭它。随机访问文件以记录的形式维护数据，这有助于容易地迅速定位数据。

�	二进制访问(Binary 模式)，用于需要在字节位置读写文件的场合，比如存储或显示位图图形。

下表示范了读写文件的典型语句。

访问方式	写入数据	读取数据

顺序	Print #, Write #	Input #

随机	Put	Get

二进制	Put	Get

Input #, Print #, 和 Write # 每次读写一行数据。例如：

Open "LOG.TXT" For Append As #1	' 如果文件不存在，Append语句将创建它。

Print #1, "Printing line to file."

Write #1, "Writing line to file."

Close #1

Open "LOG.TXT" For Input As #1

Do Until EOF(1)

Input #1, FileData

Print FileData	' 输出文本。

Loop

Close #1

Get和Put按记录读写数据。记录的大小依变量的数据类型而定。例如：

Dim MyData As Integer	' MyData为2字节长。

Open "DATA.REC" For Random As #1

For RecordNumber = 1 To 10

MyData = I * I

Put #1, RecordNumber, MyData	' 向文件写入数据。

Next RecordNumber

For RecordNumber = 1 To 10

MyData = I * I

Get #1, RecordNumber, MyData	' 从文件读取数据。

Print MyData

Next RecordNumber

Close #1

读写随机访问文件时，常常使用由Type语句声明的用户自定义数据类型。

附注   Print # 输出用户可读的/局部使用的数据。Write # 则以独立于语言的形式输出。


编写可维护的程序

Variant 数据类型的变量几乎可以接受赋给它的任何类型的变量。这是方便的，但也可能隐含错误。如果要编写一个由许多不同的人使用和维护的程序，最好使用非变体型的数据类型和Option Explicit语句。

把不适当的数据赋给非变体型数据类型的变量，将引发一个错误。例如：

Dim NumVar As Integer

Dim StrVar as String

StrVar = "This is some text"

NumVar = StrVar	' 错误：数据类型不匹配。

NumVar = 40000	' 太大导致"Overflow"错误。

非变体型数据类型会自动进行某些转换。例如，浮点数赋给整数类型的变量是将会近似。但若想把字符串转换为数字类型，必须使用某一数据类型转换函数。

一般，使用前声明对象并非必须。同样，这是方便的，但也可能由于拼写失误而导致错误。可用Option Explicit语句捕捉此类错误。例如：

Option Explicit

Sub ReadValues()

Dim NumVar As Integer

Dim StrVar As String

For NumVar = 0 to 9

StrVer = "Some text"	' 错误：变量拼写失误。

Next NumVar

End Sub

没有Option Explicit语句，将须花费大量时间艰难地寻找此类错误。


Call语句
�_�_Call语句

将控制传递给一个Sub过程，Function过程，动态链接库(DLL)过程或Macintosh代码资源过程。

语法

[Call] name [argumentlist]

元素

Call语句有以下部分：

组成部分	描述

Call	可选的；若有，则必须用括号把argumentlist括起来。例如：

Call MyProc(0)

name	被调用过程的名称。

argumentlist	传给过程的变量，数组或表达式，用逗号分隔。argumentlist的组成部分可能包括关键字ByVal或ByRef以描述被调用过程如何对待参数。 然而，仅当Call被用来调用DLL过程或Macintosh代码资源过程时，才能使用 ByVal和ByRef关键字

注释

调用过程时，Call并不是必需的。但若使用了Call关键字调用了一个需要参数的过程，必须用括号把argumentlist括起来。而若省略了Call关键字，那么也必须同时省略argumentlist两边的括号。使用任一种Call语法调用内部的或自定义函数，函数的返回值忽略。

数组名后跟空括号，可将整个数组传给过程。


DoEvents语句

交出控制以便操作系统处理其它事件。

语法

DoEvents

注释

DoEvents将控制交给操作系统。操作系统处理完队列中的事件后返回控制，在此期间SendKeys 队列中的键都发送了（仅适用于Microsoft Windows）。

如果代码中的某些部分占用了过多的处理器时间，可用DoEvents定期地把控制让给操作系统，从而使某些事件（例如键盘和鼠标输入）能被及时处理。

警告   用DoEvents交出控制的过程在第一个DoEvents语句返回之前，应保证在代码的另一处没有被进入而继续执行；否则将导致不可预测的结果。另外，如果在交出控制期间，可能有其它应用程序以事先未知的方式与您的程序相互影响，就不要使用DoEvents语句。


Do...Loop 语句

若某条件为True则重复执行语句块，或重复执行语句块直至某条件为True。

语法 1

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

语法 2

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

元素

Do...Loop语句包含下列组成部分：

组成部分	描述

condition	等于True或False的表达式。

statements	某条件为True或直至某条件为True时重复执行的一条或多条语句。

注释

Exit Do仅能用于Do...Loop控制结构内部，以提供一种退出Do...Loop语句的灵活方式。可在Do...Loop结构内任何地方放置任意数量的Exit Do语句。它常常与条件判断语句(例如, If...Then)共用，以将控制转移到紧随Loop的语句。

嵌套使用Do...Loop时，Exit Do将控制转移到嵌套的上一层。


End 语句

结束一个过程或代码块。

语法

End

End Function

End If

End Property

End Select

End Sub

End Type

End With

元素

End语句有下列形式：

语句	描述

End	终止进程的执行。并非必需，但可放在进程的任何地方，它将关闭Open语句打开的文件并清除变量。

End Function	结束Function时必须使用。

End If	结束If...Then...Else块时必须使用。

End Property	结束Property Let, Property Get或Property Set过程时必须使用。

End Select	结束Select Case语句时必须使用。

End Sub	结束Sub时必须使用。

End Type	结束Type语句时必须使用。

End With	结束With语句时必须使用。

注释

Note    执行End语句将清除所有模块中的模块级变量和静态局部变量。若需保留这些变量的值，应当使用Stop语句。这样，当恢复执行时，这些变量的值将保持不变。


Exit 语句

退出Do...Loop, For...Next, Function, Sub, 或 Property代码块。

语法

Exit Do

Exit For

Exit Function

Exit Property

Exit Sub

元素

Exit语句有下列形式：

语句	描述

Exit Do	提供一种退出Do...Loop语句的方式。只能用于Do...Loop语句内部。Exit Do将控制转移到紧随 Loop的语句。嵌套使用Do...Loop时，Exit Do将控制转移到嵌套的上一层。

Exit For	提供一种退出For循环的方式。只能用于For循环语句内部。Exit For将控制转移到紧随 Next的语句。嵌套使用For循环时，Exit For将控制转移到嵌套的上一层。

Exit Function	在其出现的位置立刻退出Function过程。在调用该Function的语句之后继续执行。

Exit Property	在其出现的位置立刻退出Property过程。在调用该Property过程的语句之后继续执行。

Exit Sub	在其出现的位置立刻退出Sub过程。在调用该Sub过程的语句之后继续执行。

注释

请不要混淆Exit语句和End语句。Exit语句并不定义某一结构的结束。


For Each...Next 语句

对某一数组或集合中的元素重复执行一组语句。

语法

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

元素

For Each...Next语句包含下列组成部分：

组成部分	描述

element	用以说明数组或集合中元素的变量。对于集合， element必须是Variant变量，通用的Object变量或任何特定的OLE自动化对象变量。对于数组，element 必须是Variant变量。

group	对象集合或数组（用户自定义类型的数组除外）的名称。

statements	对group中每一项执行的一条或多条语句。

重要说明   For Each... Next与数组共用时，对控制变量element所指示的数组元素，只能读不能写。

注释

group中至少有一个元素时，For Each块就将执行。 一旦进入循环，循环中所有的语句都将对group中第一个元素执行。若group中还有其它元素，将对每个元素继续执行这些语句。对所有元素都执行完后，退出循环并执行Next语句之后的语句。

Exit For只能在For Each...Next或For...Next控制结构内部使用，以提供一种退出循环的灵活方式。可在循环中的任何地方放置任意数量的Exit For语句。Exit For常常与条件判断语句(例如, If...Then)共用，以将控制转移到紧随Next的语句。

可以嵌套使用For Each...Next循环，不过，每个循环的element必须是独立的。

附注    Next语句中的element可以省略。如果Next出现在相应的For语句之前，将产生错误。

由于Variant量不能包含自定义数据类型，For Each...Next语句不能与自定义数据类型的数组共用。


For...Next 语句

以指定的次数重复执行一组语句。

语法

For counter = start To end [Step step]
[statements]
[Exit For]
[statements]
Next [counter]

元素

For...Next语句包含下列组成部分：

组成部分	描述

counter	用作循环计数器的数字变量。 此变量不能是数组元素或自定义数据类型的元素。

start	counter的初值。

end	counter的终值。

step	循环时counter每次改变的步长。缺省为1。

statements	For和Next之间以指定的次数重复执行的一组语句。

注释

参数step可正可负。step的值以如下方式决定循环过程：

值	执行循环的条件

正或0	counter <= end

负	counter >= end

一旦循环开始，且其中所有语句执行后，counter加step。然后，根据与初始进入循环时相同的判断条件，或者继续循环，或者退出循环并执行Next语句之后的语句。

提示   在循环内部修改counter的值将使程序的阅读和调试更加困难。

Exit For只能在For Each...Next或For...Next控制结构内部使用，以提供一种退出循环的灵活方式。可在循环中的任何地方放置任意数量的Exit For语句。Exit For常常与条件判断语句(例如, If...Then)共用，以将控制转移到紧随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可省略。如果Next出现在相应的For语句之前，将产生错误。


GoSub...Return 语句

在过程内部跳转到一个子例程，然后返回。

语法

GoSub line
. . .
line
. . .
Return

元素

参数line可以是任何合法的行标志 或 行号。

注释

可在过程的任何地方使用GoSub和Return语句，但GoSub和相应的Return必须在相同的过程内。一个子例程内可包含多个 Return语句，但第一个遇到的Return语句将使控制返回到最近执行的GoSub语句之后的语句。

附注   不能用GoSub...Return语句进入Sub过程或从其中返回。

提示   创建独立的可调用过程比使用GoSub...Return语句更为结构化。


GoTo 语句

在过程内部，无条件跳转到指定的代码行。

语法

GoTo line

元素

参数line可以是任何合法的行标志 或 行号。

注释

GoTo仅能在其所出现的过程内部实现无条件跳转。

附注   过多的GoTo语句将使程序的阅读和调试更为困难。请尽可能使用结构化控制语句(Do...Loop, For...Next, If...Then...Else, Select Case)。


If...Then...Else 语句

依据某一表达式的值有条件地执行一组代码。

语法 1

If condition Then statements [Else elsestatements ]

语法 2

If condition Then
[statements]
[ElseIf condition-n Then
[elseifstatements]] . . .
[Else
[elsestatements]]
End If

元素

语法1有如下成分：

组成部分	描述

condition	等于True或False的数字或 字符串表达式。

statements	condition为True时执行的一条或多条语句，以冒号分隔。

elsestatements	condition为False时执行的一条或多条语句，以冒号分隔。

语法2有如下成分：

组成部分	描述

condition	等于True或False的表达式。

statements	condition为True时执行的一条或多条语句。

condition-n	等于True或False的数字或字符串表达式。

elseifstatements	相关的condition-n为True时执行的一条或多条语句。

elsestatements	前面所有condition-n都不为True时执行的一条或多条语句。

注释

简短的条件测试可用单行形式(语法1)。然而，块形式(语法2)更为结构化和可伸缩，而且常常更易阅读，维护和调试。

附注   使用语法1可由单一If...Then判断执行多条语句，但必须用冒号隔开它们，如下所示：

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

执行块If (语法2)语句时，测试condition。若其为True，执行Then之后的语句。若其为False，按顺序判断每个ElseIf（如果有的话）的条件。若找到为True的条件，执行紧随在相关的Then之后的语句。如果ElseIf的条件都不为True(或不存在ElseIf从句)，执行 Else之后的语句。Then或Else后的语句执行后，控制转移到End If之后的语句。

Else 和 ElseIf从句都是可选的。 块If语句中的ElseIf从句数目无限，但它不能出现在 Else从句之后。块If语句可嵌套使用。

Then关键字后所跟的内容是判断是否为块If语句的标准。如果在同一行中，Then后面出现了除注释外的任何内容，该语句都将被认为是单行形式的If语句。

块If语句必须是一行中的第一个语句。在Else, ElseIf和End If部分之前都只能有一个行号码或行标识。块If必须以End If结束。

提示   在对单一表达式有若干个可能操作的场合，Select Case语句或许更为有用。


On...GoSub, On...GoTo 语句s

根据表达式的值，跳转到若干指定行之一。

语法

On expression GoSub destinationlist

On expression GoTo destinationlist

元素

On...GoSub和On...GoTo语句包含如下成分：

组成部分	描述

expression	等于0到255的任何数字表达式,包括0和255。如果expression为非整数的数字，它将被近似为整数。

destinationlist	以逗号分隔的行号s或行标志s列表。

注释

expression的值决定跳转到destinationlist中的哪一行。如果expression小于1或大于destinationlist中项目的数目，将产生如下结果之一：

expression的值：	结果

等于0	执行On...GoSub或On...GoTo之后的语句。

大于表中数目	执行On...GoSub或On...GoTo之后的语句。

负数	产生错误。

大于255	产生错误。

在列表中可混合使用行号码和行标识。对On...GoSub和On...GoTo语句中行号码和行标识的数目并无限制。不过，如果行号码和行标识太多，以至一行中放不下，则必须使用续行符在下一个物理行接续逻辑行。

提示   进行多分支跳转时，Select Case提供结构化和可伸缩的方式。


Select Case 语句

根据表达式的值，执行一组或多组语句。

语法

Select Case testexpression
[Case expressionlist-n
[statements-n]] . . .
[Case Else
[elsestatements]]
End Select

元素

Select Case语句包含如下成分：

组成部分 	描述

testexpression	数字或字符串表达式。

expressionlist-n	以逗号分隔的下列形式的表达式： expression，  expression To expression，Is comparisonoperator expression。关键字To指定值的范围。使用关键字To时，较小的值放在To之前。关键字Is与比较运算符 (除Is和Like外)共用，以指定值的范围。如省略，关键字Is被自动插入。

statements-n	当testexpression和expressionlist-n的任一部分匹配时执行的一条或多条语句。

elsestatements	当testexpression和expressionlist-n的任何部分都不匹配时执行的一条或多条语句。

注释

如果testexpression与某一Case从句的 expressionlist表达式匹配，执行该Case从句与下一Case从句之间的语句，对于最后一个从句，执行该Case从句与End Select之间的语句。然后控制转移到End Select之后的语句。如果testexpression与若干Case从句的 expressionlist表达式匹配，仅执行第一个匹配的Case从句后的语句。

如果testexpression和任何expressionlist都不匹配，执行Case Else从句后的语句。如果没有Case Else语句，也没有与testexpression匹配的Case从句，执行End Select之后的语句。

虽然并非必需，但最好在Select Case块中加上Case Else从句以处理事先未知的testexpression值。

在一个Case从句中可有多个表达式或范围。例如,下列代码是合法的：

Case 1 To 4, 7 To 9, 11, 13, Is > MaxNumber

附注   Is比较操作符与Select Case语句中的关键字Is不同。

也可对字符串指定范围和多个表达式。下例中，Case匹配恰好等于everything, 字母顺序落在nuts和soup之间和当前值等于TestItem的字符串：

Case "everything", "nuts" To "soup", TestItem

可嵌套使用Select Case语句，每个Select Case必须有相应的End Select语句。


Shell 函数
Shell Function

加载可执行程序。

语法

Shell(pathname[,windowstyle])

元素

Shell函数包含如下命名参数部分：

组成部分	描述

pathname	可执行程序的名称及所需命令行参数或开关；可能包括目录或文件夹和驱动器。也可能是已关联到某一可执行程序的文档的名称。

在 Macintosh机上，可用MacID函数指定应用程序的署名，而不必指定其名称。下例使用了Microsoft Word的署名：

Shell MacID("MSWD")

windowstyle	代表程序运行时窗口状态的数字。Microsoft Windows中,若省略windowstyle， 程序以最小化状态启动，并带有焦点。在Macintosh机(System 7.0或更高版本)上，windowstyle仅决定应用程序启动时是否获得焦点。

命名参数windowstyle可有下列值：

值	窗口状态

1, 5, 9	带焦点的标准状态。

2	带焦点的最小化状态。

3	带焦点的最大化状态。

4,8	不带焦点的标准状态。

6,7	不带焦点的最小化状态。

注释

Microsoft Windows中MacID函数与Shell共用将产生错误。

如果Shell函数成功启动了指定程序，将返回该程序的任务标识符(ID)。任务标识符是运行中程序的唯一标识符。如果Shell函数不能启动指定程序，将产生错误。

附注   Shell函数异步地运行其它程序。亦即在Shell函数之后的语句执行以前，不能期望用Shell启动的程序已经终止了。


 Stop 语句

挂起进程。

语法

Stop

注释

可在过程中的任何地方使用Stop语句挂起进程。使用Stop语句相当于在代码中设置断点。

Stop挂起进程，但不象End那样关闭文件和清除变量。


While...Wend 语句

给定条件为True时执行一系列语句。

语法

While condition
[statements]
Wend

元素

While...Wend语句有如下成分：

组成部分	描述

condition	等于True或False的数字或字符串表达式。

statements	条件为True时执行的一条或多条语句。

注释

condition为True时，执行statements中的所有语句，直至遇到Wend语句。然后控制返回到While语句并再次检测condition。如果condition仍为True，重复上面的过程。否则控制转移到Wend之后的语句。

While...Wend循环可任意深地嵌套。每个Wend匹配最近的While。

警告    请不要未执行While语句就直接跳转到While...Wend循环内部。这样做将导致难以定位的运行错误或其它问题。

提示   Do...Loop语句提供更为结构化和可伸缩的循环方式。


With 语句

对单一的对象或自定义类型执行一系列语句。

语法

With object
[statements]
End With

元素

With语句有如下成分：

组成部分	描述

object	对象或自定义数据类型的名称。

statements	对object执行的一条或多条语句。

注释

With可对指定对象执行一系列语句而不必多次限定对象的名称。例如,如果要修改单一对象的一些不同的属性，把这些属性赋值语句置于With控制结构内部将大为方便，因为此时只引用对象一次，而不必在每个属性赋值语句中都指定对象。下例示范了对同一对象的不同属性赋值时With语句的用法。

With MyLabel

.Height = 2000

.Width = 2000

.Caption = "This is MyLabel"

End With

可以嵌套使用With语句。此时每个object必须唯一。


Call 语句实例

此例示范用Call语句将控制转移到Sub过程，内部函数，动态链接库(DLL)过程和Macintosh代码资源中的过程。

' 调用Sub过程。

Call PrintToDebugWindow("Hello World")

' 上面的语句将控制转移到下面的Sub过程。

Sub PrintToDebugWindow(AnyString)

Debug.Print AnyString	' 打印到调试窗口。

End Sub

'调用内部函数。忽略返回值。

Call Shell(AppName， 1)	' AppName包含某可执行程序的路径名。

' 调用Microsoft Windows DLL过程。

Declare Sub MessageBeep Lib "User" (ByVal N As Integer)

Sub CallMyDll()

Call MessageBeep(0)	' 调用Windows DLL过程。

MessageBeep 0	' 不用关键字Call，再次调用。

End Sub

' 调用Macintosh代码资源。

Declare Sub MessageAlert Lib "MyHd:MyAlert" Alias "MyAlert" (ByVal N _

As Integer)

Sub CallMyCodeResource()

Call MessageAlert(0)	' 调用Macintosh代码资源。

MessageAlert 0	' 不用关键字Call，再次调用。

End Sub


DoEvents 语句实例

此例每过1000次循环，就用DoEvents语句把控制交给操作系统一次。

For I = 1 To 150000	' 开始循环。

If I Mod 1000 = 0 Then 	' 如果循环已重复1000次。

DoEvents	' 向操作系统交出控制。

End If

Next I	' 递增循环计数器。


Do...Loop 语句实例

此例示范Do...Loop语句的用法。内层Do...Loop语句循环10次，将标志设为False，并使用Exit Do语句提前退出循环。外层循环检查标志变量后立即退出。

Check = True : Counter = 0	' 变量初始化。

Do	' 外层循环。

Do While Counter < 20	' 内层循环。

Counter = Counter + 1	' 递增计数器。

If Counter = 10 Then	' 若条件满足。

Check = False	' 将标志设为False.

Exit Do	' 退出内层循环。

End If

Loop

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


End 语句实例

此例使用End语句终止进程，Select Case块和Sub过程。

Sub EndStatementDemo()

For Number = 1 To 2	' 循环两次。

Select Case Number	' 测试Number。

Case 1	' 若Number等于1。

Debug.Print Number 	' 打印到调试窗口。

Case Else	' 若Number不等于1。

End	' 终止进程的执行。

End Select	' 结束Select Case语句。

Next Number

End Sub	' 结束Sub过程。


Exit 语句实例

此例使用Exit语句退出For...Next循环，Do...Loop循环和Sub过程。

Sub ExitStatementDemo()

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， 退出Sub procedure。

End Select

Next I

Loop

End Sub


For Each...Next 语句实例

此例使用For Each...Next语句查寻集合中所有元素的 Text属性，以检查是否存在字符串"Hello"。例中MyObject是与文本有关的对象，属于MyCollection集合。两者均为通用的名称，仅用于演示。

Found = False	' 变量初始化。

For Each MyObject In MyCollection	' 对每个元素重复。

If MyObject。Text = "Hello" Then	' 若Text等于"Hello"。

Found = True	' 将Found设为True。

Exit For	' 退出循环。

End If

Next


For...Next 语句实例

此例用For...Next 语句创建一个包含从0到9的数字的字符串，数字之间用空格隔开。外层循环使用递减的计数器。

For Words = 10 To 1 Step -1 	' 设置为重复10次。

For Chars = 0 To 9	' 设置为重复10次。

MyString = MyString & Chars	' 把数字附加到字符串。

Next Chars

MyString = MyString & " "	' 附加空格。

Next Words


GoSub...Return 语句实例

此例在Sub内部用GoSub调用子例程。Return语句将控制返回到紧随 Gosub的语句。Exit Sub语句用于防止控制落入子例程中。

Sub GosubDemo()

Num = 10	' 变量初始化。

GoSub MyRoutine	' 跳转到子例程。

Debug.Print Num	' 返回后打印。

Exit Sub	' 退出Sub过程。

MyRoutine:	' 开始子例程。

Num = Num \ 2	' 变量除以2。

Return	' 从子例程返回。

End Sub


GoTo 语句实例

此例在过程内部使用GoTo语句跳转到某行。

Sub GotoStatementDemo()

Number = 1 	' 变量初始化。

' 测试Number并跳转到适当的行。

If Number = 1 Then GoTo Line1 Else GoTo Line2

Line1:

MyString = "Number equals 1"

GoTo LastLine	' 跳转到LastLine。

Line2:

' 下面的语句永不执行。

MyString = "Number equals 2"

LastLine:

Debug.Print MyString	' 在调试窗口打印。

End Sub


If...Then...Else 语句实例

此例示范If...Then...Else语句的用法。

Number = 53	' 变量初始化。

If Number < 10 Then

Digits = 1

ElseIf Number < 100 Then

' 条件为True从而执行随后的语句。

Digits = 2

Else

Digits = 3

End If

' 使用单行形式赋值。

If Digits = 1 Then MyString = "One" Else MyString = "More than one"


On...GoSub， On...GoTo 语句实例

此例使用On...GoSub和On...GoTo语句分别跳转到子例程和行。

Sub OnGosubGotoDemo()

Number = 2	' 变量初始化。

' Branch to Sub2。

On Number GoSub Sub1， Sub2

' On...GoSub返回后在此处恢复执行。

On Number GoTo Line1， Line2	' 跳转到Line2。

' On...GoTo后并未在此处恢复执行。

Exit Sub

Sub1:

MyString = "In Sub1" : Return

Sub2:

MyString = "In Sub2" : Return

Line1:

MyString = "In Line1"

Line2:

MyString = "In Line2"

End Sub


Select Case 语句实例

此例使用Select Case语句测试变量的值。 第二个Case从句包括被测试变量的值，从而只有与第二个Case从句关联的语句执行了。

Number = 8	' 变量初始化。

Select Case Number	' 测试Number。

Case 1 To 5	' Number处于1到5之间。

MyString = "Between 1 and 5"

Case 6， 7， 8， 9， 10	' Number处于6到10之间。

' 这是唯一测试为True的Case从句。

MyString = "Between 6 and 10"

Case Else	' 其它值。

MyString = "Not between 1 and 10"

End Select


Shell 语句实例
Shell 函数实例

此例使用Shell函数运行用户指定的应用程序。在Macintosh机上，可使用 MacID函数以使应用程序能正常加载，即便该应用程序的文件名已修改。Shell函数不能用于运行System 7.0之前版本的Macintosh机上。

' 对于Microsoft Windows。

' 令第二个参数为1使应用程序以正常状态启动，并获得焦点。

RetVal = Shell("C:\WINDOWS\CALC.EXE"， 1)	' 运行Calculator。

' 对于Macintosh。

' 两条语句均加载Microsoft Excel。

RetVal = Shell("Microsoft Excel")	' 指定文件名。

RetVal = Shell(MacID("XCEL"))	' 指定署名。


Stop 语句实例

此例在For...Next的每次循环中使用Stop语句挂起进程。

For I = 1 To 10	' 开始For...Next循环。

Debug。Print I	' 将I打印到调试窗口。

Stop	' 每次经过时Stop。

Next I


While...Wend 语句实例

此例使用While...Wend语句递增计数器。只要条件为True，循环中的语句就执行。

Counter = 0	' 变量初始化。

While Counter < 20	' 测试Counter的值。

Counter = Counter + 1	' 递增Counter。

Wend

Debug。Print Counter	' 在调试窗口中打印20。


With 语句实例

此例使用With语句对单一对象执行一系列语句。对象MyObject及其属性的名称是一般的，仅用于示范。

With MyObject

' 与MyObject.Height = 100相同

.Height = 100

.Caption = "Hello World"

With .Font

' 与MyObject.Font.Color = Red相同。

.Color = Red

.Bold = True

End With

End With


Date 函数
�_Date 函数

返回当前系统日期。

语法

Date

注释

要设置系统日期，使用Date语句。


Date 语句

设置当前系统日期。

语法

Date = date

元素

对于基于MS-DOS的计算机，参数date必须是从1980年1月1日到2099年12月31日之间的某一天，否则产生错误。对于Macintosh机， 参数date必须处于1904年1月1日到2040年12月31日之间。对于其它系统，参数date限于100年1月1日到9999年12月31日之间。

注释

附注   如果使用MS-DOS3.3以前的版本，Date语句对日期的修改仅在再一次修改或关机之前有效。许多计算机有电池供电的CMOS RAM，用来在关机后保存日期和时间信息。然而，要在运行早期版本的MS-DOS的计算机上永久地改变日期，可能必须使用设置盘或进行类似的操作。请参考特定系统的文档。


DateSerial 函数

对指定的年，月，日返回日期。

语法

DateSerial(year,month,day)

元素

DateSerial函数有如下命名参数部分：

组成部分	描述

year	100到9999间的数字（包括100和9999），或数字表达式。

month	1到12间的数字（包括1和12），或数字表达式。

day	1到31间的数字（包括1和31），或数字表达式。

注释

要指定日期，例如1991年12月31日，DateSerial的每个参数必须处于通常可接受的范围内，亦即，天数为1到31，月份为1到12。不过，对每个参数，还可以使用数字表达式指定早于或晚于某年某月某日的相对日期。

下例使用数字表达式而非绝对日期数字。此时DateSerial函数返回1990年以前10年（1990 - 10）的8月的前两个月（8 - 2）的一号的前一天（1 - 1）；亦即1980年5月31日。

DateSerial(1990 - 10, 8 - 2, 1 - 1)

对于1900到1999年，year参数可简写为0到99。对其它年份，year参数必须写全四个数字（例如，1800）。

无论直接指定或用表达式指定，如果日期超出可接受范围，将产生错误。


DateValue 函数

返回日期。

语法

DateValue(date)

元素

date 命名参数一般是代表100年1月1日到9999年12月31日的字符串表达式。不过，date也可以是代表该范围内日期，时间，或日期和时间的任何表达式。

注释

DateValue函数不返回参数date包含的时间信息。然而，如果date包含非法的时间信息，(诸如"89:98")，将产生错误。

如果date为仅包含由合法的日期分隔符隔开的数字组成的字符串，DateValue按系统的短日期格式识别年月日的顺序。DateValue也能识别包含月份名称的明确的日期，不论该月份名称是完整的还是简写的。例如, DateValue不仅能识别12/30/1991和12/30/91，也能识别December 30, 1991和Dec 30, 1991。

如果省略date的年份部分，DateValue使用当前系统日期的年份。


Day 函数

返回代表某月中一天的从1到31的整数（包括1和31）。

语法

Day(date)

元素

date 命名参数限于日期，或能代表日期的数字和字符串的任意组合。如果date不包含合法的数据，返回Null。


Hour 函数

返回代表一天中某一小时的从0到23的整数（包括0和23）。

语法

Hour(time)

元素

time 命名参数限于时间，或能代表时间的数字和字符串的任意组合。如果time不包含合法的数据，返回Null。


Minute 函数

返回代表一小时中某一分钟的从0到59的整数（包括0和59）。

语法

Minute(time)

元素

time 命名参数限于时间，或能代表时间的数字和字符串的任意组合。如果time不包含合法的数据，返回Null。


Month 函数

返回代表一年中某月的从1到12的整数（包括1和12）。

语法

Month(date)

元素

date 命名参数限于日期，或能代表日期的数字和字符串的任意组合。如果date不包含合法的数据，返回Null。


Now 函数

返回系统的当前日期和时间。

语法

Now

注释

附注   直接显示时，Now函数返回按系统的短日期时间格式显示的字符串。


Second 函数

返回代表一分钟内某一秒的从0到59的整数（包括0和59）。

Returns a whole number between 0 and 59, inclusive, representing the second of the minute.

语法

Second(time)

元素

time 命名参数限于时间，或能代表时间的数字和字符串的任意组合。如果time不包含合法的数据，返回Null。


Time 函数

返回当前系统时间。

语法

Time

注释

要设置系统时间，使用Time语句。


Time 语句

设置当前系统时间。

语法

Time = time

元素

time参数限于能代表时间的表达式。 如果time不包含合法的数据，返回Null。

注释

如果time为字符串，Time试图使用系统的时间分隔符将其转换为时间。若time不能转换为合法的时间，将产生错误。

附注   如果使用MS-DOS3.3以前的版本，Date语句对日期的修改仅在再一次修改或关机之前有效。许多计算机有电池供电的CMOS RAM，用来在关机后保存日期和时间信息。然而，要在运行早期版本的MS-DOS的计算机上永久地改变日期，可能必须使用设置盘或进行类似的操作。请参考特定系统的文档。


Timer 函数

返回自午夜以来的秒数。

语法

Timer

注释

Timer函数的返回值被Randomize语句用于为Rnd（随机数）函数产生种子。


TimeSerial 函数

按指定的小时，分钟和秒返回包含时间的日期。

语法

TimeSerial(hour,minute,second)

元素

TimeSerial函数包含以下命名参数部分：

组成部分	描述

hour	0 (12:00 A.M.)到23 (11:00 P.M.)之间的数字（包括0和23），或数字表达式。

minute	0到59之间的数字（包括0和59），或数字表达式。

second	0到59之间的数字（包括0和59），或数字表达式。

注释

要指定日期，例如11:59:59，TimeSerial的每个参数必须处于通常可接受的范围内，亦即，小时为0到23，分钟和秒为1到59。不过，对每个参数，还可以使用数字表达式指定早于或晚于某一时间的相对时间。下例使用数字表达式而非绝对时间数字。此时TimeSerial函数返回正午前六个小时（12 - 6）十五分（0 - 15）的时间，即5:45:00 A.M.

TimeSerial(12 - 6, 0 - 15, 0)

无论直接指定或用表达式指定，如果时间超出可接受范围，将产生错误。


TimeValue 函数

返回时间。

语法

TimeValue(time)

元素

time 命名参数 一般是代表0:00:00 (12:00:00 A.M.) 到 23:59:59 (11:59:59 P.M.)的字符串表达式（包含0:00:00 和 23:59:59）。不过，Time也可以是代表该范围内时间的任何表达式。如果time不包含合法的数据，返回Null。

注释

可以采用12或24小时时钟格式输入时间，例如，“2:24PM”和“14:24”均为合法的时间参数。

TimeValue函数不返回参数time包含的日期信息。然而，如果time包含非法的日期信息，将产生错误。


Weekday 函数

返回表示一星期中某一天的整数。

语法

Weekday(date)

元素

date 命名参数限于能代表日期的数字和字符串的任意组合。如果date不包含合法的数据，返回Null。

Return Values

值	描述

1	星期日

2	星期一

3	星期二

4	星期三

5	星期四

6	星期五

7	星期六


Year 函数

返回代表年份的整数。

语法

Year(date)

元素

date 命名参数限于日期，或能代表日期的数字和字符串的任意组合。如果date不包含合法的数据，返回Null。


Boolean 数据类型

Boolean变量存储为16位(2字节)的数，但仅能取值为True或False。Boolean变量或者显示为True或False (使用Print)，或者显示为#TRUE#或#FALSE# (使用Write #)。使用关键字 True和False将Boolean变量赋值为两种状态之一。

其它类型的变量转换为Boolean值时，0转换为False，所有其它值转换为True。Boolean值转换为其它数据类型时，False转换为0，而True转换为-1。


Currency 数据类型

Currency变量以整数格式存储为64位(8字节)的数，以10,000为比例，给出小数点左边15位，右边4位的定点数。该表示法提供-922,337,203,685,477.5808到922,337,203,685,477.5807之内的数。Currency的类型定义字符是@ (字符码64).

Currency 数据类型对于牵涉到金钱的或精确度特别重要的定点数计算有用。


数据类型概览

下表为所支持的数据类型s及其存储大小和表示范围。

数据类型	存储大小	表示范围
Boolean	2 字节	True or False。
Integer	2 字节	-32,768到32,767。
Long (长整数)	4 字节	-2,147,483,648到2,147,483,647。
Single (单精度浮点数)	4 字节	负数-3.402823E38到-1.401298E-45；正数1.401298E-45 到 3.402823E38。
Double (双精度浮点数)	8 字节	负数-1.79769313486232E308到 -4.94065645841247E-324；正数4.94065645841247E-324到1.79769313486232E308。
Currency (有比例的整数)	8 字节	-922,337,203,685,477.5808 到 922,337,203,685,477.5807。
Date	8 字节	100年1月1日到9999年12月31日。
Object	4 字节	任何Object的引用。
String	每字符1字节	0到约20亿个字符(对于Microsoft Windows 3.1及更早版本约65,535个字符)。
Variant	16字节+每字符1字节	与Double类型表示范围相同的数字，或者任何字符文本。
自定义数据类型 (使用Type语句)	元素所要求的大小	每个元素的表示范围与该元素数据类型表示范围相同。


Date 数据类型

Date变量存储为 64位(8字节)的数，代表从100年1月1日到9999年12月31日的日期和0:00:00到23:59:59 的时间。任何可识别的日期直接量均可赋给Date变量。日期直接量必须用数码字符(#)括起来。例如, #January 1, 1993# 或 #1 Jan 93#。

Date变量按系统的短日期格式显示日期，按系统设定的时间格式显示时间（12小时或24小时时钟）。

其它数据类型转换为Date时，  小数点左边的值转换为日期，右边的值转换为时间，午夜为0，正午为0.5。负整数表示1899年12月30日之前的日期。Date变量转换为其它数字型数据类型时，仅变为数字。


Double 数据类型

Double（双精度浮点数）变量存储为64位(8字节)的数，表示范围：负数-1.79769313486232E308到 -4.94065645841247E-324，正数4.94065645841247E-324到1.79769313486232E308。Double数据类型的类型定义字符是#（字符码35）。


Integer 数据类型

Integer变量存储为16位(2字节)的数，表示范围-32,768到32,767。Integer数据类型的类型定义字符是%（字符码37）。

也可用Integer变量代表枚举变量。枚举变量是一组不同整数的有限集合，其中每个整数依据所在上下文有特殊的含义。枚举变量提供了一种从一组已知数量的可能选择中进行选取的方便途径。例如, 请求用户从列表中选择一种颜色，可令0=黑色，1=白色等等。使用Const语句对每个枚举变量定义常数是一种良好的编程习惯。


Long 数据类型

Long (long integer)变量存储为有符号的32位(4字节)数，表示范围-2,147,483,648到2,147,483,647. Long数据类型的类型定义字符是&（字符码38）。


Object 数据类型

Object变量存储为32位(4字节)的地址，该地址引用应用程序中的对象。声明为Object的变量可用Set语句赋值以引用应用程序产生的任何对象。


Single 数据类型

Single（单精度浮点数）变量存储为32位(4字节)的数，表示范围：负数从-3.402823E38 到-1.401298E-45正数从1.401298E-45到3.402823E38。Single的类型定义字符是 !（字符码33）。


String 数据类型

有两类字符串：

�	变长字符串，可最多包含约20亿（2^31）个字符（对Microsoft Windows version 3.1或更早版本，约64K（2^16）个字符）。

�	定长字符串，包含预先声明数目（少于64K）的字符。

String的类型定义字符是$ （字符码36）。String中字符的字符码的范围为从0到255。其中前128个字符（0-127）相应于标准U.S.键盘上的字母和符号。前128个字符与ASCII字符集的定义相同。其余128个字符（128-255）表示特殊字符，诸如非英语字母，重音符号，货币符号和分数。


自定义数据类型

用Type语句定义的任何数据类型。自定义数据类型可包含一个或多个任意数据类型的元素，数组，或其它已定义的自定义数据类型。例如:

Type MyType

MyName As String	' 存储名字的字符串变量。

MyBirthDate As Date	' 存储出生日期的日期型变量。

MySex as Integer	' 存储性别的整型变量（0代表女，1代表男）。

End Type


Variant 数据类型

若未用Dim, Private, Public, 或Static等语句明确声明为其它类型，所有变量都成为Variant 数据类型。Variant数据类型没有类型定义字符。

Variant是一种特殊的数据类型，可赋值为任何类型的数据，也可等于Empty, Error,和Null等特殊值。可用VarType或TypeName函数查看Variant中的数据将按何种类型的数据对待。

数字类型的变量可以是处于-1.797693134862315E308到-4.94066E-324（负数）和4.94066E-324到1.797693134862315E308（正数）范围内的整数或实数。通常，数字类型的Variant数据在Variant内维护为其原始数据类型。例如，如果将Integer赋给Variant，随后的操作将把该 Variant量按Integer对待。然而，对包含Integer，Long或Single的Variant量进行算术运算，且运算结果超出原始数据类型的表示范围时，运算结果在Variant量内扩展为下一个较大的数据类型。Integer扩展为Long，Long和Single扩展为Double。当包含Currency和Double的Variant变量超出表示范围时，将产生错误。

可用Variant数据类型取代任何数据类型，以更灵活地操作数据。如果Variant变量的内容是数字，根据上下文，该变量既可以是代表数字的字符串，也可以是数字的实际值。例如:

Dim MyVar As Variant

MyVar = 98052

上例中，MyVar包含实际值98052。对于包含数字值或可解释为数字值的字符串的Variant变量，算术运算符将象预期的那样执行。如果用+运算符把MyVar与另一个包含数字的Variant量或数字型数据类型变量相加，结果为算术和。请查阅有关附加和并置运算符的信息，以了解它们如何与Variant数据共用。

Empty值表示Variant变量未初始化（赋以初值）。等于Empty的Variant变量按数字解释时为0，按字符串解释时为零长度字符串（“”）。

请勿混淆Empty和Null。Null指出Variant变量不等于任何合法值。

Variant中的Error是一种特殊值，用以指示过程中产生了错误。然而，不象其它类型的的错误，它并不引发一般的应用程序级错误处理例程。这将使程序员或应用程序本身能依据错误值采取灵活措施。可用CVErr函数将实数转换为错误代码以创建Error值。


Date 函数实例

此例使用Date 函数返回当前系统日期。

MyDate = Date	' MyDate等于当前系统日期。


Date 语句实例

此例使用Date语句设置计算机系统日期。

' 在开发环境中，日期直接量用代码的语言环境显示为短格式。

MyDate = #February 12, 1985#	' 日期赋值。

Date = MyDate	' 修改系统日期。


DateSerial 函数实例

此例使用DateSerial函数返回指定年月日的日期。

' MyDate等于1969年2月12日的日期。

MyDate = DateSerial(1969, 2, 12)	' 返回日期。


DateValue 函数实例

此例使用DateValue函数将字符转换为日期。通常，象本例一样将日期/时间硬编码为字符串是一种不好的编程习惯。应使用日期直接量。

MyDate = DateValue("February 12, 1969")	' 返回日期。


Day 函数实例

此例使用Day函数返回指定日期中的天数。

' 在开发环境中，日期直接量用代码的语言环境显示为短格式。

MyDate = #February 12, 1969#	' 日期赋值。

MyDay = Day(MyDate)	' MyDay等于12。


Hour 函数实例

此例使用Hour 函数返回指定时间中的小时数。

' 在开发环境中，时间（日期直接量）用代码的语言环境显示为短格式。

MyTime = #4:35:17 PM#	' 时间赋值。

MyHour = Hour(MyTime)	' MyHour等于16。


Minute 函数实例

此例使用Minute 函数返回指定时间中的分钟数。

' 在开发环境中，时间（日期直接量）用代码的语言环境显示为短格式。

MyTime = #4:35:17 PM#	' 时间赋值。

MyMinute = Minute(MyTime)	' MyMinute等于35。


Month 函数实例

此例使用Month 函数返回指定日期中的月份。

' 在开发环境中，日期直接量用代码的语言环境显示为短格式。

MyDate = #February 12, 1969#	' 日期赋值。

MyMonth = Month(MyDate)	' MyMonth等于2。


Now 函数实例

此例使用Now 函数to return the 当前系统日期 and time。

Today = Now	' 取得当前系统日期和时间。


Second 函数实例

此例使用Second 函数返回指定时间中的秒数。

' 在开发环境中，时间（日期直接量）用代码的语言环境显示为短格式。

MyTime = #4:35:17 PM#	' 时间赋值。

MySecond = Second(MyTime)	' MySecond等于17。


Time 函数实例

此例使用Time 函数返回当前系统时间。

MyTime = Time	'返回当前系统时间。


Time 语句实例

此例使用Time 语句设置计算机系统时间为自定义时间。

MyTime = #4:35:17 PM#	' 时间赋值。

Time = MyTime	' 设置系统时间为 MyTime.


Timer 函数实例

此例使用Timer 函数记录向调试窗口的打印输出所用的秒数。

Start = Timer	' 设置开始时间。

For I = 1 to 50	' 循环50次。

Debug.Print I	' 打印到调试窗口。

Next I

Finish = Timer	' 设置结束时间。

TotalTime = Finish - Start	' 计算总时间。


TimeSerial 函数实例

此例使用TimeSerial 函数对指定的小时，分钟和秒返回对应的时间。

' MyTime等于对应于4:35:17 PM的时间。

MyTime = TimeSerial(16, 35, 17)	' 返回时间。


TimeValue 函数实例

此例使用TimeValue函数将字符串转换为时间。 通常，象本例一样将日期/时间硬编码为字符串是一种不好的编程习惯。应使用日期直接量。

MyTime = TimeValue("4:35:17 PM")	' 返回时间。


Weekday 函数实例

此例使用Weekday 函数由指定日期返回一星期的某一天。

MyDate = #February 12, 1969#	' 日期赋值。

MyWeekDay = Weekday(MyDate)	' 由于是星期三，MyWeekDay等于4。


Year 函数实例

此例使用Year 函数返回指定日期的年份。

' 在开发环境中，日期直接量用代码的语言环境显示为短格式。

MyDate = #February 12, 1969#	' 日期赋值。

MyYear = Year(MyDate)	' MyYear等于1969。


Array 函数
�_Array 函数

返回包含数组的Variant量。

语法

Array(arglist)

元素

arglist是以逗号分隔的列表，可包含任意数目的值，这些值将赋给被返回的Variant量中数组的元素。如果未指定任何参数，将创建零长度的数组。

注释

虽然包含数组的Variant量在概念上有别于元素为Variant量的数组，但访问数组元素的方式是相同的。引用数组中某元素的记法是变量名后跟一括号，括号中包含所引用元素的下标。下面的例子中，第一条语句创建Variant型变量A。第二条语句将一数组赋给变量A。最后一条语句示范如何将数组中第二个元素的值赋给另一个变量。

Dim A As Variant

A = Array(10,20,30)

B = A(2)

用Array函数创建的数组的最小下标取决于Option Base语句确定的数组最小下标。


Const 语句

声明常量用于代替直接量。

语法

[Public | Private] Const constname [As type] = expression

元素

Const语句有如下成分：

成分	描述

Public	用于模块级，声明对所有模块中所有过程都可用的常量。不能用于过程中。

Private	用于模块级，声明仅对本模块中过程可用的常量。不能用于过程中。

constname	常量名；遵循标准变量命名约定。

type	常量的数据类型；可以是Boolean, Integer, Long, Currency, Single, Double, Date, String, 或Variant。要对每个常量使用独立的As type从句。

expression	直接量，其它常量，或这些量的包括算术和逻辑运算符（除Is外）的任意组合。

注释

若未显式指定Public或Private，常量缺省为Private的。

可在同一行中声明若干常量，用逗号隔开。如果常量声明用此种方式组合，Public或Private关键字将对该行中所有常量适用。

在赋给常量的表达式中不能使用字符串级连、变量、自定义函数或内部函数(例如Chr)。

若未显式指定常量类型(使用As type)，将根据所提供的表达式给常量以最适当的数据类型。

在Sub、Function或Property过程中声明的常量是该过程的局部常量。在过程外部声明的常量在整个模块中有定义。可以在使用表达式的任何地方使用常量。


Declare 语句

用于模块级，声明对动态链接库 (DLL)或Macintosh代码资源中外部过程的引用。

语法 1

[Public | Private ] Declare Sub name [CDecl] Lib "libname" [Alias "aliasname" ][([arglist])]

语法 2

[Public | Private ] Declare Function name [CDecl] Lib "libname" [Alias "aliasname" ] [([arglist])][As type]

元素

Declare语句有如下成分：

成分	描述

Public	用于声明对所有模块中的所有过程都可用的过程。

Private	用于声明仅对本模块可用的过程。

Sub	指出该过程无返回值。

Function	指出该过程返回一个值，可用于表达式中。

name	任何合法的过程名称。

CDecl	仅用于 Macintosh。 指出该过程使用C语言的参数顺序、命名约定和调用约定。

Lib	指出包含该过程的DLL或代码资源。Lib从句对所有的声明都是必选项。

libname	包含该过程的DLL或代码资源的名称。

Alias	指出该过程在DLL或Macintosh代码资源中有另一个名称。用于外部过程名与某一关键字相同时。也可用于DLL过程与同一作用域级的声明为Public的变量、常量或其它过程名相同时。Alias也可用于DLL过程名中包含禁止使用的字符的情况。

aliasname	DLL或代码资源中过程的名称。

在Microsoft Windows中，如果第一个字符不是#，aliasname过程在DLL中的入口点名称。如果第一个字符是#，随后的所有字符必须指出过程入口点的序数。

在Macintosh机上，指定代码资源类型的语法如下：

"[resourcetype]$[resourcename]"

resourcetype为任何合法的4字符常量。若省略，缺省的resourcetype是CODE。resourcename是代码资源中的过程名。若省略resourcename，认为与name相同。

arglist	传递到过程的参数表。

type	函数过程的返回值；可以是Boolean, Integer, Long, Currency, Single, Double, Date, String (仅可用变长字符串), Object, Variant, 自定义类型, 或对象类型。

arglist 参数有下列语法和成分：

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

成分	描述

Optional	指示该参数不是必选项。如果指定某参数为Optional的，那么在arglist中随后的所有参数也必须用Optional关键字声明为可选项。声明为Optional的参数必须是Variant量。如果使用了ParamArray，就不能对任何参数使用Optional。

ByVal	指示该参数按传值方式传递。

ByRef	指示该参数按传址方式传递。

ParamArray	必须处于arglist的结尾，指出最后一个参数是Optional的包含Variant元素的数组。ParamArray关键字使提供任意数量的参数成为可能。不能与ByVal, ByRef,或Optional共用。

varname	传递到过程的参数名；遵循标准变量命名约定。

type	传递到过程的参数的数据类型；可以是Boolean, Integer, Long, Currency, Single, Double, Date, String (仅可用变长字符串), Object, Variant, 自定义类型, 或对象类型。

注释

对于Function过程，过程的数据类型决定了该函数的返回值类型。要指定函数的返回值类型，可在arglist之后使用As从句。在arglist内，可用As从句指定传递到该过程的任何参数的数据类型。不仅可以指定标准数据类型，还可在arglist中使用As Any以禁止类型检查，从而使任何数据类型的量都可传递到该过程。

空括号指明该Sub或Function过程没有参数。下面的例子中，First没有参数。如果在调用First时使用参数，将产生错误:

Declare Sub First Lib "MyLib" ()

如果在过程声明中包括了参数列表，每次调用该过程时系统都要检查参数的数目和类型。下面的例子中，First有一个Long型的参数:

Declare Sub First Lib "MyLib" (X As Long)

附注   因为只有变长字符串可被传递到过程，在Declare语句的参数列表中不能有定长的字符串。定长字符串可以作为过程的参数，但在传递之前，它们被转换成了变长字符串。


Deftype 语句

用于模块级，设置以特定字符打头的变量和函数过程的缺省数据类型 。

语法

DefBool letterrange[,letterrange] . . .

DefInt letterrange[,letterrange] . . .

DefLng letterrange[,letterrange] . . .

DefCur letterrange[,letterrange] . . .

DefSng letterrange[,letterrange] . . .

DefDbl letterrange[,letterrange] . . .

DefDate letterrange[,letterrange] . . .

DefStr letterrange[,letterrange] . . .

DefObj letterrange[,letterrange] . . .

DefVar letterrange[,letterrange] . . .

元素

letterrange参数的语法如下:

letter1[-letter2]

参数letter1和letter2指定将被设置缺省数据类型的名称范围。这些参数代表变量名和函数过程名的第一个字母，可以是字母表中的任意字母。letterrange中的字母大小写不敏感。

注释

语句的名称决定了数据类型:

Statement	Data Type

DefBool	Boolean

DefInt	Integer

DefLng	Long

DefCur	Currency

DefSng	Single

DefDbl	Double

DefDate	Date

DefStr	String

DefObj	Object

DefVar	Variant

例如，在下面的程序片段中，Message是字符串变量:

DefStr A-Q

. . .

Message = "Out of stack space."

Deftype语句仅影响使用它的模块。例如，在某模块中的DefInt语句，仅影响在该模块中声明的变量和函数过程的缺省数据类型；其它模块中变量的缺省数据类型不受影响。如果没有用Deftype语句显式声明，所有变量和函数过程的缺省数据类型都是Variant。

指定字母范围时，通常是为以字符集中前128个字母打头的变量定义了数据类型。然而，如果指定的字母范围是A-Z，那么，不管变量是以character set的前128个字母打头，还是后128个字母(128-255)打头，其缺省数据类型都将被设置为指定的数据类型。

一旦指定了A-Z的范围，就不能再用Deftype语句定义任何子范围了。事实上，一旦指定了某一范围，如果再在其它Deftype语句中包含一个先前已定义的字母，将产生错误。然而，不管已定义与否，均可以用Dim语句加As type从句显式地指定任何变量的数据类型。例如，虽然缺省数据类型是Integer，但也可用如下代码在模块级定义Double型的变量:

DefInt A-Z

Dim TaxRate As Double

由于自定义数据类型的元素必须显式声明，故Deftype语句不影响它们。


Dim 语句

声明变量并分配存储空间。

语法

Dim varname[([subscripts])][As type][,varname[([subscripts])][As type]] . . .

元素

Dim 语句有如下成分：

成分	描述

varname	变量的名称；遵循标准变量 命名约定。

subscripts	数组变量的维；最多可声明60维数组。subscripts参数有如下语法:

[lower To] upper [,[lower To] upper] . . .

type	变量的数据类型；可以是Boolean, Integer, Long, Currency, Single, Double, Date, String (用于变长字符串), String * length (用于定长字符串), Object, Variant,自定义数据类型，或对象类型。应对每个变量使用独立的As type 从句。

注释

在模块级 用Dim 声明的变量对本模块的所有过程可用。若声明在过程级，变量仅在该过程内可用。

可用Dim 语句在模块级或过程级声明变量的数据类型或对象类型。例如，下列语句声明Integer 型的变量。

Dim NumberOfEmployees As Integer

如果没有指定数据类型或对象类型，且模块中没有Deftype语句，变量缺省为Variant型。

变量初始化时，数字变量初始化为0，变长字符串初始化为零长字符串，定长字符串以零值填充。Variant 变量初始化为Empty。自定义数据类型的每个元素当作独立变量初始化。引用对象的变量在使用前必须用Set 语句赋以一已存在的对象。在赋以对象以前，已声明的对象变量有特殊值Nothing，该值指出此变量并未指向对象的任何特定实例。

也可以用Dim 语句和空括号声明动态数组。声明动态数组以后，可在过程内使用ReDim 语句定义数组的维数和元素的数目。如果已经用Private, Public或Dim语句显式指定了某数组变量的大小，再试图重定义该数组的某一维将导致错误。

提示   如果在过程内使用Dim语句，把Dim语句放在过程的开始部分是被通常接受的编程习惯。


Erase 语句

重新初始化固定大小的数组的元素或释放动态数组的存储空间。

语法

Erase arraylist

元素

arraylist 参数是一个或多个逗号分隔的数组变量。

注释

由于Erase的行为依赖于数组的类型，知道某数组是固定大小的还是动态的是非常重要的。Erase 不回收固定大小的数组的内存空间，而是如下所示设置元素的值:

数组类型	Erase 对固定大小的数组的元素的效果

固定大小的数字量数组	将每个元素清零。

固定大小的字符串数组(变长字符串)	将每个元素设置为零长度字符串("")。

固定大小的字符串数组(定长字符串)	将每个元素清零。

固定大小的Variant 数组	将每个元素设置为Empty。

自定义数据类型数组	设置时将每个元素按独立变量等待。

对象数组	将每个元素设置为特殊值Nothing。

Erase 释放动态数组占用的存储空间。用ReDim语句重新声明数组的维以后，才能在程序中再次引用动态数组。


Function 语句

声明组成函数过程体的名称、参数和代码。

语法

[Public | Private][Static] 函数 name [(arglist)][As type]
[statements]
[name = expression]
[Exit Function]
[statements]
[name = expression]
End Function

元素

Function语句有如下成分：

成分	描述

Public	指示该Function 过程可被所有模块的所有过程所访问。如果用在私有模块 (包含Option Private语句的模块)中，该过程在方案外部不可用。

Private	指示该Function 过程仅对本模块中的其他过程可用。

Static	指示该Function 过程的局部变量的值在两次调用之间保持不变。Static 属性不影响在该Function 过程以外声明的变量，即使在该过程内使用了它们。

name	Function过程的名称；遵循标准变量 命名约定。

arglist	传递到该Function 的参数列表。若有多个参数，用逗号分隔。

type	Function 过程返回值的数据类型；可以是Boolean, Integer, Long, Currency, Single, Double, Date, String (定长字符串除外), Object, Variant 或任何自定义数据类型。不能返回任何类型的数组，但可返回包含数组的Variant 量。

statements	Function 过程体中执行的语句组。

expression	Function的返回值。

arglist 参数有如下语法和成分:

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

成分	描述

Optional	指示该参数不是必选项。如果指定某参数为Optional的，那么在arglist中随后的所有参数也必须用Optional关键字声明为可选项。声明为Optional的参数必须是Variant量。如果使用了ParamArray，就不能对任何参数使用Optional。

ByVal	指示该参数按传值方式传递。

ByRef	指示该参数按传址方式传递。

ParamArray	必须处于arglist的结尾，指出最后一个参数是Optional的包含Variant元素的数组。ParamArray关键字使提供任意数量的参数成为可能。不能与ByVal, ByRef,或Optional共用。

varname	传递到过程的参数名；遵循标准变量命名约定。

type	传递到过程的参数的数据类型；可以是Boolean, Integer, Long, Currency, Single, Double, Date, String (仅可用变长字符串), Object, Variant, 自定义类型, 或对象类型。

注释

如果未用Public或Private显式指定，Function过程缺省为Public。如果未使用Static ，在两次调用之间不保留局部变量的值。

所有的可执行代码必须处于过程内。不能在Function, Sub或Property 过程中再定义一个Function 过程。

Exit Function关键字导致从Function 过程中立即退出。程序将在调用Function 过程的语句之后的语句继续执行。可在Function 过程的任何地方放置任意数目的Exit Function 语句。

象Sub 过程一样，Function 过程是独立的过程，可以接受参数，执行一系列语句，并修改其参数的值。然而，不象Sub 过程，当希望使用函数的返回值时，Function 过程可以象使用任何内部函数(诸如Sqr, Cos, Chr 等)一样用在表达式的右边。

用函数名加括号括起来的参数表，可以在表达式中调用Function 过程。即使函数无参数，仍须包含括号。关于如何调用Function 过程的特定信息，请参阅Call 语句。

警告   Function 过程可递归调用；亦即，它们可调用自身以执行给定的任务。然而，递归可能造成堆栈溢出。通常Static 关键字不跟递归Function 过程共用。

要从函数返回值，给函数名赋值即可。可在过程中任何地方放置任意数目的这种赋值语句。如果没有给name赋值，过程返回缺省值: 数字函数返回0，字符串函数返回零长字符串("")，Variant 函数返回Empty。以对象引用为返回值的函数，如果在Function内没有将某对象引用赋给name(使用Set)，将返回Nothing 。

下例示范如何对名为BinarySearch 的函数赋以返回值。这个例子中，函数名被赋以False，以指出未找到某值。

Function BinarySearch(. . .) As Boolean

. . .

' Value not found. Return a value of False.

If lower > upper Then

BinarySearch = False

Exit Function

End If

. . .

End Function

Function 过程中使用的变量可分为两类: 过程内部显式声明的和未在过程内部显式声明的。过程内部显式声明的变量(使用Dim 或其等价形式) 总是该过程的局部变量。其他未在过程内部显式声明的变量也是局部的，除非它们在过程外部的更高级别声明过。

警告   可以在过程中使用未在过程内部显式声明的变量，但如果在模块级有同名的标识符，将造成名称冲突。如果在过程中引用与其它过程、常量或变量同名的未定义变量，该引用将假定为对模块级名称的引用。应当显式声明变量以避免此类冲突。可用Option Explicit 语句强制变量的显式声明。

警告   应仔细安排算术表达式以提高内部效率。要避免在算术表达式中使用Function 过程，而该函数又修改同一表达式中某变量的值的情况。


LBound 函数

返回数组的指定维的最小可用下标。

语法

LBound(arrayname[,dimension])

元素

LBound 函数有如下成分：

成分	描述

arrayname	数组变量的名称，遵循标准变量命名约定。

dimension	整数，指示返回哪一维的下界。1 指第一维，2 指第二维，以此类推。若省略dimension ，假定为1。

注释

LBound 函数与UBound 函数共用可决定数组的大小。UBound 函数用于找出数组维的上限。

对下列数组，LBound 的返回值列在下表中:

Dim A(1 To 100, 0 To 3, -3 To 4)

语句	返回值

LBound(A, 1)	1

LBound(A, 2)	0

LBound(A, 3)	-3

数组维的缺省下界为0 或 1，依赖于Option Base 语句的设置。

用Dim, Private, Public, ReDim, 或 Static 语句的To 从句设定数组维的数组，可以有任何整数下界。


Let 语句

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

语法

[Let] varname = expression

元素

The Let statement 有如下成分：

成分	描述

varname	变量或属性的名称；遵循标准变量命名约定。

expression	赋给变量的值。

注释

为了简化Basic 代码，可选的Let 关键字经常省略。

仅当表达式的数据类型 和变量的数据类型兼容时，表达式的值才能赋给变量。不能字符串表达式赋给数字变量，也不能把数字表达式赋给字符串变量。如果这样做，将在编译时产生错误。

Variant 变量可被赋以字符串或数字表达式。然而，反过来却并非总可以。除Null 外的任何Variant 量均可赋给字符串变量，但仅有那些值可解释为数字的Variant 量才能赋给数字变量。可用IsNumeric 函数检查Variant 能否转换为数字。

警告   将一种数字类型的表达式赋给另一种数字类型的变量，将把表达式的类型强制转换为结果变量的数据类型。

Let 语句可为记录变量赋值，但仅可用于两个记录变量属于同一自定义类型的情况。可用LSet 语句为不同自定义类型的记录变量赋值。用Set 语句可将对象引用赋给变量。


Option Base 语句

用于模块级 ，定义数组 下标的下界。

语法

Option Base {0 | 1}

注释

使用时，Option Base 语句必须放在模块中变量声明和常量定义语句之前

由于缺省下界为0，Option Base 并非必需。然而，如果使用，在每个模块中只能有一个Option Base，而且必须处于数组声明之前。

Option Base 语句不影响自定义类型内部的数组。自定义类型内部的数组的下界总是0。

提示   Dim, Private, Public, ReDim, 和 Static 语句中的To 从句提供更为灵活的方式以控制数组下标的范围。然而，如果没有用To 从句显式设定下界，可用Option Base 把缺省下界改为1。

Option Base 仅影响所属模块中的数组下界。


Option Compare 语句

用于模块级 ，定义比较字符串时所用的缺省比较模式。

语法

Option Compare {Binary | Text}

注释

使用时，Option Compare 语句必须放在模块中变量声明和常量定义语句之前

Option Compare 语句为模块指定字符串比较方式(Binary或Text)。如果模块不包含Option Compare 语句，缺省的文本比较方式为Binary。

Option Compare Binary 导致字符串比较基于字符的内部二进制表示所引出的排序顺序 。在Microsoft Windows中，排序顺序取决于代码页。在Macintosh机上，排序顺序取决于字符集。下面的例子演示典型的二进制排序顺序:

A < B < E < Z < a < b < e  < z < � < � < � < � < � < �

Option Compare Text 导致字符串比较基于大小写不敏感的文本排序顺序，该顺序取决于系统的语言环境。上面所示的字符，如果用Option Compare Text排序，将产生如下结果:

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


Option Explicit 语句

用于模块级 ，强制在该模块中显式声明变量。

语法

Option Explicit

注释

使用时，Option Explicit 语句必须放在模块中变量声明和常量定义语句之前

如果不使用Option Explicit 语句，所有未声明的变量均为Variant 类型，除非另外用Deftype 语句指定了缺省类型。

如果使用了Option Explicit 语句，必须用Dim, Private, Public, ReDim,或Static 语句显式声明所有变量。如果试图使用未定义变量，编译时将产生错误。

提示   可用Option Explicit 避免拼错已存在变量的名称，对于变量的作用域级别不很清楚的代码，用Option Explicit可免于晕头转向。


Option Private 语句

用于模块级 ，表明整个模块是Private的。

语法

Option Private Module

注释

使用时，Option Private 语句必须放在模块中变量声明和常量定义语句之前

用Option Private 语句声明为Private 的模块，其公共部分(在模块级声明的变量、对象和自定义数据类型) 在包含该模块的方案 内部可用，但对其它应用程序或方案不可用。


Private 语句

用于模块级 ，声明私有变量并分配存储空间。

语法

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

元素

Private 语句有如下成分：

成分	描述

varname	变量的名称；遵循标准变量 命名约定。

subscripts	数组变量的维；最多可声明60维数组。subscripts参数有如下语法:

[lower To] upper [,[lower To] upper] . . .

type	变量的数据类型；可以是Boolean, Integer, Long, Currency, Single, Double, Date, String (用于变长字符串), String * length (用于定长字符串), Object, Variant,自定义数据类型，或对象类型。应对每个变量使用独立的As type 从句。

注释

Private 变量仅在声明它的模块内部可用。

可用Private语句声明变量的数据类型或对象类型。例如，下列语句声明Integer型的变量。

Private NumberOfEmployees As Integer

如果没有指定数据类型或对象类型，且模块中没有Deftype语句，变量缺省为Variant型。

变量初始化时，数字变量初始化为0，变长字符串初始化为零长字符串，定长字符串以零值填充。Variant 变量初始化为Empty。自定义数据类型的每个元素当作独立变量初始化。引用对象的变量在使用前必须用Set 语句赋以一已存在的对象。在赋以对象以前，已声明的对象变量有特殊值Nothing，该值指出此变量并未指向对象的任何特定实例。

也可以用Private 语句和空括号声明动态数组。声明动态数组以后，可在过程内使用ReDim 语句定义数组的维数和元素的数目。如果已经用Private, Public或Dim语句显式指定了某数组变量的大小，再试图重定义该数组的某一维将导致错误。


Property Get 语句

声明组成Property 过程体的名称、参数和代码，Property 过程用于获取属性的值。

语法

[Public | Private][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 过程仅对本模块中的其他过程可用。

Static	指示该Property Get 过程的局部变量的值在两次调用之间保持不变。Static 属性不影响在该Property Get 过程以外声明的变量，即使在该过程内使用了它们。

name	Property Get 过程的名称；遵循标准变量 命名约定，但该名称可与同一模块中的Property Let或Property Set过程同名。

arglist	传递到该Property Get 的参数列表。若有多个参数，用逗号分隔。

type	Property Get 过程返回值的数据类型；可以是Boolean, Integer, Long, Currency, Single, Double, Date, String (定长字符串除外), Object, 或Variant 。不能返回任何类型的数组，但可返回包含数组的Variant 量。

statements	Property Get 过程体中执行的语句组。

expression	Property Get 定义的过程返回的属性值。

arglist 参数有如下语法和成分:

[Optional][ByVal | ByRef] varname[( )][As type]

成分	描述

Optional	指示该参数不是必选项。如果指定某参数为Optional的，那么在arglist中随后的所有参数也必须用Optional关键字声明为可选项。声明为Optional的参数必须是Variant量。

ByVal	指示该参数按传值方式传递。

ByRef	指示该参数按传址方式传递。

varname	传递到过程的参数名；遵循标准变量命名约定。

type	传递到Property Get过程的参数的数据类型；可以是Boolean, Integer, Long, Currency, Single, Double, Date, String (仅可用变长字符串), Object, Variant, 自定义类型, 或对象类型。

注释

如果未用Public或Private显式指定，Property过程缺省为Public。如果未使用Static ，在两次调用之间不保留局部变量的值。

所有的可执行代码必须处于过程内。不能在Function, Sub或Property 过程中再定义一个Property Get 过程。

Exit Property 关键字导致从Property Get 过程中立即退出。程序将在调用Property Get 过程的语句之后的语句继续执行。可在Property Get 过程的任何地方放置任意数目的Exit Property 语句。

象Sub 和Property Let 过程一样，Property Get 过程是独立的过程，可以接受参数，执行一系列语句，并修改其参数的值。然而，不象Sub 或Property Let 过程，当希望使用属性的返回值时，Property Get 过程可以象使用函数或属性名一样用在表达式的右边。


Property Let 语句

声明组成Property Let过程体的名称、参数和代码，Property Let过程用于设置属性的值。

语法

[Public | Private][Static] Property Let name [(arglist)]
[statements]
[Exit Property]
[statements]
End Property

元素

Property Let 语句有如下成分：

成分	描述

Public	指示该Property Let过程可被所有模块的所有过程所访问。如果用在私有模块 (包含Option Private语句的模块)中，该过程在方案外部不可用。

Private	指示该Property Let过程仅对本模块中的其他过程可用。

Static	指示该Property Let过程的局部变量的值在两次调用之间保持不变。Static 属性不影响在该Property Let过程以外声明的变量，即使在该过程内使用了它们。

name	Property Let过程的名称；遵循标准变量 命名约定，但该名称可与同一模块中的Property Get或Property Set过程同名。

arglist	传递到该Property Let的参数列表。若有多个参数，用逗号分隔。最后一个参数是在表达式右边要赋给该属性的值。

type	Property Let过程返回值的数据类型；可以是Boolean, Integer, Long, Currency, Single, Double, Date, String (定长字符串除外), Object, 或Variant 。不能返回任何类型的数组，但可返回包含数组的Variant 量。

statements	Property Let过程体中执行的语句组。

arglist 参数有如下语法和成分:

 [ByVal | ByRef] varname[( )][As type]

成分	描述

ByVal	指示该参数按传值方式传递。

ByRef	指示该参数按传址方式传递。

varname	传递到过程的参数名；遵循标准变量命名约定。

type	传递到Property Let过程的参数的数据类型；可以是Boolean, Integer, Long, Currency, Single, Double, Date, String (仅可用变长字符串), Object, Variant, 自定义类型, 或对象类型。

附注   每个Property Let 语句必须为所定义的过程定义至少一个参数。该参数(或有多个参数时的最后一个参数)包含引用Property Let所定义的过程时要赋给属性的实际值。

注释

如果未用Public或Private显式指定，Property过程缺省为Public。如果未使用Static ，在两次调用之间不保留局部变量的值。

所有的可执行代码必须处于过程内。不能在Function, Sub或Property 过程中再定义一个Property Let 过程。

Exit Property 关键字导致从Property Let过程中立即退出。程序将在调用Property Let过程的语句之后的语句继续执行。可在Property Let过程的任何地方放置任意数目的Exit Property 语句。

象Sub 和Property Get过程一样，Property Let过程是独立的过程，可以接受参数，执行一系列语句，并修改其参数的值。然而，不象Function或Property Get过程，Property Let过程不返回值，仅能用在属性赋值语句或Let语句的左边。


Property Set 语句

声明组成Property过程体的名称、参数和代码，Property Set过程用于设置对对象的引用。

语法

[Public | Private][Static] Property Set name [(arglist)]

[statements]
[Exit Property]
[statements]
End Property

元素

Property Set 语句有如下成分：

成分	描述

Public	指示该Property Set过程可被所有模块的所有过程所访问。如果用在私有模块 (包含Option Private语句的模块)中，该过程在方案外部不可用。

Private	指示该Property Set过程仅对本模块中的其他过程可用。

Static	指示该Property Set过程的局部变量的值在两次调用之间保持不变。Static 属性不影响在该Property Set过程以外声明的变量，即使在该过程内使用了它们。

name	Property Set过程的名称；遵循标准变量 命名约定，但该名称可与同一模块中的Property Get或Property Let过程同名。

arglist	传递到该Property Set的参数列表。若有多个参数，用逗号分隔。最后一个参数是用在对象引用赋值语句右边对象引用。

type	Property Set过程返回值的数据类型；可以是Boolean, Integer, Long, Currency, Single, Double, Date, String (定长字符串除外), Object, 或Variant 。不能返回任何类型的数组，但可返回包含数组的Variant 量。

statements	Property过程体中执行的语句组。

arglist 参数有如下语法和成分:

 [ByVal | ByRef] varname[( )][As type]

成分	描述

ByVal	指示该参数按传值方式传递。

ByRef	指示该参数按传址方式传递。

varname	传递到过程的参数名；遵循标准变量命名约定。

type	传递到Property Set过程的参数的数据类型；可以是Boolean, Integer, Long, Currency, Single, Double, Date, String (仅可用变长字符串), Object, Variant, 自定义类型, 或对象类型。

附注   每个Property Set 语句必须为所定义的过程定义至少一个参数。该参数(或有多个参数时的最后一个参数)包含引用Property Set所定义的过程时要赋给属性的实际对象引用。

注释

如果未用Public或Private显式指定，Property过程缺省为Public。如果未使用Static ，在两次调用之间不保留局部变量的值。

所有的可执行代码必须处于过程内。不能在Function, Sub或Property 过程中再定义一个Property Set 过程。

Exit Property 关键字导致从Property Set过程中立即退出。程序将在调用Property Set过程的语句之后的语句继续执行。可在Property Set过程的任何地方放置任意数目的Exit Property 语句。

象Function 和Property Get过程一样，Property Set过程是独立的过程，可以接受参数，执行一系列语句，并修改其参数的值。然而，不象Function或Property Get过程，Property Set过程不返回值，仅能用在对象引用赋值语句或Set语句的左边。


Public 语句

用于模块级 ，声明公共变量并分配存储空间。

语法

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

元素

Public 语句有如下成分：

成分	描述

varname	变量的名称；遵循标准变量 命名约定。

subscripts	数组变量的维；最多可声明60维数组。subscripts参数有如下语法:

[lower To] upper [,[lower To] upper] . . .

type	变量的数据类型；可以是Boolean, Integer, Long, Currency, Single, Double, Date, String (用于变长字符串), String * length (用于定长字符串), Object, Variant,自定义数据类型，或对象类型。应对每个变量使用独立的As type 从句。

注释

用Public 语句声明的变量对所有应用程序的所有模块的所有过程可用，除非使用了Option Private Module 语句正在起作用；Option Private Module 起作用时，变量仅对所属的方案 是Public 的。

可用Public 语句声明变量的数据类型或对象类型。例如，下列语句声明Integer型的变量。

Public NumberOfEmployees As Integer

如果没有指定数据类型或对象类型，且模块中没有Deftype语句，变量缺省为Variant型。

变量初始化时，数字变量初始化为0，变长字符串初始化为零长字符串，定长字符串以零值填充。Variant 变量初始化为Empty。自定义数据类型的每个元素当作独立变量初始化。引用对象的变量在使用前必须用Set 语句赋以一已存在的对象。在赋以对象以前，已声明的对象变量有特殊值Nothing，该值指出此变量并未指向对象的任何特定实例。

也可以用Public 语句和空括号声明动态数组。声明动态数组以后，可在过程内使用ReDim 语句定义数组的维数和元素的数目。如果已经用Private, Public或Dim语句显式指定了某数组变量的大小，再试图重定义该数组的某一维将导致错误。


ReDim 语句

用于过程级，声明动态数组 变量并分配或重新分配存储空间。

语法

ReDim [Preserve] varname(subscripts) [As type][,varname(subscripts) [As type]] . . .

元素

ReDim 语句有如下成分：

成分	描述

Preserve	改变已有数组的最后一维时保留数组中已存在的数据。

varname	变量的名称；遵循标准变量 命名约定。

subscripts	数组变量的维；最多可声明60维数组。subscripts参数有如下语法:

[lower To] upper [,[lower To] upper] . . .

type	变量的数据类型；可以是Boolean, Integer, Long, Currency, Single, Double, Date, String (用于变长字符串), String * length (用于定长字符串), Object, Variant,自定义数据类型，或对象类型。应对每个变量使用独立的As type 从句。对于包含数组的Variant 量，type 描述了数组中每个元素的类型，但并不把Variant 改变成其它类型。

注释

ReDim 语句常用于指定或修改已由Private, Public or Dim 语句加空括号声明了的动态数组的大小。

可重复地使用ReDim 语句以修改数组的维数和元素的数目。然而，不能声明某种数据类型的数组，而后又用ReDim 将其改为另一种类型，除非数组包含在Variant量中。如果数组包含在Variant量中，数组元素的类型可用As type 从句修改。

如果使用了Preserve 关键字，就只能修改数组最后一维的大小，并且不能改变维数。例如,如果数组只有一维，就可以修改该数组的大小，因为该维是最后的也是仅有的一维。但是，如果数组有两个或更多维，要保留数组的原有内容，就只能改变最后一维的大小。下面的例子示范了如何不删除数组的原有内容而又增加最后一维的大小。

ReDim X(10, 10, 10)

. . .

ReDim Preserve X(10, 10, 15)

警告   如果减小数组的大小，被消去的元素中的数据将丢失。

变量初始化时，数字变量初始化为0，变长字符串初始化为零长字符串，定长字符串以零值填充。Variant 变量初始化为Empty。自定义数据类型的每个元素当作独立变量初始化。引用对象的变量在使用前必须用Set 语句赋以一已存在的对象。在赋以对象以前，已声明的对象变量有特殊值Nothing，该值指出此变量并未指向对象的任何特定实例。

附注   若要修改Variant 量中包含的数组的大小，必须在修改之前显式声明该Variant 变量。


Rem 语句

用于在程序中包含解释性注释。

语法 1

Rem comment

语法 2

' comment

元素

comment参数是所加的注释文本。在Rem 关键字和注释文本之间应有空格。

注释

如果使用行号s或行标志s，可以用GoTo或GoSub语句跳转到只包含Rem语句的代码行。程序将在Rem语句之后的第一条可执行语句处继续执行。

如语法2所示，可使用单引号(')代替Rem关键字。如果在单一行中，Rem 关键字跟在其它语句之后，必须用冒号将Rem关键字和其它语句分开。但是，如果使用单引号，就不必使用冒号。


Set 语句

将对象引用赋给变量或属性。

语法

Set objectvar = {objectexpression | Nothing}

元素

Set 语句有如下成分：

成分	描述

objectvar	变量或属性的名称；遵循标准变量命名约定。

objectexpression	由对象，声明为相同对象类型 的其它变量，或者返回相同对象类型的函数或方法构成的表达式。

Nothing	终止objectvar同然后指定对象的关联。如果把objectvar赋值为Nothing，又没有其它变量指向先前objectvar引用的对象，那么与该对象相关联的所有资源都将释放。

注释

objectvar 必须是与赋给它的对象相一致的对象类型。

Dim, Private, Public, Redim 和Static 语句只是声明指向对象的变量。在用Set 语句赋给变量特定的对象以前，该变量并不指向然后实际对象。

通常，当用Set 将对象引用赋给变量时，并未创建该对象的拷贝，而是创建了对象该对象的一个引用。若干对象变量可指向同一对象。由于这些变量是该对象的引用(而非拷贝)，对象的任何改变都反映到所有引用该对象的变量中。


Static 语句

用于过程级 声明变量并分配存储空间。代码运行期间，用Static 语句声明的变量的值将保留。

语法

Static varname[([subscripts])][As type][,varname[([subscripts])][As type]] . . .

元素

Static 语句有如下成分：

成分	描述

varname	变量的名称；遵循标准变量 命名约定。

subscripts	数组变量的维；最多可声明60维数组。subscripts参数有如下语法:

[lower To] upper [,[lower To] upper] . . .

type	变量的数据类型；可以是Boolean, Integer, Long, Currency, Single, Double, Date, String (用于变长字符串), String * length (用于定长字符串), Object, Variant,自定义数据类型，或对象类型。应对每个变量使用独立的As type 从句。

注释

只要模块代码在运行中，用Static 语句声明的变量的值将保留，直到模块重置或重启动。在非静态过程中可用Static 语句显式声明Static 变量。

可在过程内部用Static 语句声明静态变量的数据类型。例如，下列语句声明固定大小的整数数组。

Static EmployeeNumber(200) As Integer

如果没有指定数据类型或对象类型，且模块中没有Deftype语句，变量缺省为Variant型。

附注   Static 语句和Static 关键字对变量的生命期有不同的影响。如果用Static 关键字声明过程(就象Static Sub CountSales ())，过程内的所有局部变量的存储空间一次性分配，整个代码运行期间这些变量的值都保留。对于非静态过程，变量的存储空间在每次过程被调用时分配，过程退出时释放。Static 语句就是用来在非静态过程中声明静态变量，以时被声明的变量在程序运行期间保留其值。

变量初始化时，数字变量初始化为0，变长字符串初始化为零长字符串，定长字符串以零值填充。Variant 变量初始化为Empty。自定义数据类型的每个元素当作独立变量初始化。引用对象的变量在使用前必须用Set 语句赋以一已存在的对象。在赋以对象以前，已声明的对象变量有特殊值Nothing，该值指出此变量并未指向对象的任何特定实例。

提示   如果在过程内使用Static 语句，把Static 语句与Dim 语句放在过程的开始部分是被通常接受的编程习惯。


Sub 语句

声明组成Sub 过程体的名称、参数和代码。

语法

[Private | Public][Static] Sub name [(arglist)]
[statements]
[Exit Sub]
[statements]
End Sub

元素

Sub 语句有如下成分：

成分	描述

Public	指示该Sub 过程可被所有模块的所有过程所访问。如果用在私有模块 (包含Option Private语句的模块)中，该过程在方案外部不可用。

Private	指示该Sub 过程仅对本模块中的其他过程可用。

Static	指示该Sub 过程的局部变量的值在两次调用之间保持不变。Static 属性不影响在该Sub 过程以外声明的变量，即使在该过程内使用了它们。

name	Sub过程的名称；遵循标准变量 命名约定。

arglist	传递到该Sub 的参数列表。若有多个参数，用逗号分隔。

statements	Sub 过程体中执行的语句组。

arglist 参数有如下语法和成分:

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

成分	描述

Optional	指示该参数不是必选项。如果指定某参数为Optional的，那么在arglist中随后的所有参数也必须用Optional关键字声明为可选项。声明为Optional的参数必须是Variant量。如果使用了ParamArray，就不能对任何参数使用Optional。

ByVal	指示该参数按传值方式传递。

ByRef	指示该参数按传址方式传递。

ParamArray	必须处于arglist的结尾，指出最后一个参数是Optional的包含Variant元素的数组。ParamArray关键字使提供任意数量的参数成为可能。不能与ByVal, ByRef,或Optional共用。

varname	传递到过程的参数名；遵循标准变量命名约定。

type	传递到过程的参数的数据类型；可以是Boolean, Integer, Long, Currency, Single, Double, Date, String (仅可用变长字符串), Object, Variant, 自定义类型, 或对象类型。

注释

如果未用Public或Private显式指定，Sub过程缺省为Public。如果未使用Static ，在两次调用之间不保留局部变量的值。

所有的可执行代码必须处于过程内。不能在Sub, Function或Property 过程中再定义一个Sub 过程。

Exit Sub关键字导致从Sub 过程中立即退出。程序将在调用Sub 过程的语句之后的语句继续执行。可在Sub 过程的任何地方放置任意数目的Exit Sub 语句。

象Function过程一样，Sub 过程是独立的过程，可以接受参数，执行一系列语句，并修改其参数的值。然而，不象Function过程，Sub 过程不返回值，不能用在表达式中。

用过程名加参数表调用Sub过程。关于如何调用Sub过程的特定信息，请参阅Call 语句。

警告   Sub 过程可递归调用；亦即，它们可调用自身以执行给定的任务。然而，递归可能造成堆栈溢出。通常Static 关键字不跟递归Sub 过程共用。

Sub过程中使用的变量可分为两类: 过程内部显式声明的和未在过程内部显式声明的。过程内部显式声明的变量(使用Dim 或其等价形式) 总是该过程的局部变量。其他未在过程内部显式声明的变量也是局部的，除非它们在过程外部的更高级别声明过。

警告   可以在过程中使用未在过程内部显式声明的变量，但如果在模块级 有同名的标识符，将造成名称冲突。如果在过程中引用与其它过程、常量或变量同名的未定义变量，该引用将假定为对模块级名称的引用。应当显式声明变量以避免此类冲突。可用Option Explicit 语句强制变量的显式声明。

附注   可用GoSub, GoTo, 或Return 进入或退出Sub 过程。


Type 语句

用于模块级，声明包含一个或多个元素的自定义数据类型。

语法

[Private | Public] Type varname
  elementname [([subscripts])] As type
[ elementname [([subscripts])] As type]
. . .
End Type

元素

Type 语句有如下成分：

成分	描述

Public	用于声明对所有方案 中所有模块的所有过程都可用的自定义类型 。

Private	用于声明仅在本模块内可用的自定义类型 。

varname	变量的名称；遵循标准变量 命名约定。

elementname	自定义类型的元素的名称。元素名称也遵循标准变量命名约定，但可使用保留字。

subscripts	作为自定义类型元素的数组的维。用空括号声明可改变大小的数组。

type	元素的数据类型；可以是Boolean, Integer, Long, Currency, Single, Double, Date, String, String * length (用于定长字符串), Object, Variant,其它自定义数据类型，或对象类型。

注释

Type 语句仅能用在模块级。一旦用Type 语句声明了自定义类型，就可以在该声明语句的作用域内任何地方定义该自定义类型的变量。可用Dim, Private, Public, ReDim, 或Static 定义自定义类型的变量。

不能在Type...End Type 块中使用行号s 和行标志s 。

因为数据记录常由一些不同数据类型的元素组成，故经常把自定义类型用于数据记录。

下面的例子示范了自定义类型中的固定大小数组的用法:

Type StateData

CityCode (1 To 100) As Integer ' Declare a static array.

County As String * 30

End Type

Dim Washington(1 To 100) As StateData

上例中，StateData 包含静态数组CityCode ，记录Washington 与StateData 有相同的结构。

在自定义类型中声明固定大小的数组时，必须用数字直接量或常量声明上下界，而不能用变量。

Option Base 语句的设定决定了自定义类型中数组的下界。


UBound 函数

返回数组的指定维的最大可用下标。

语法

UBound(arrayname[,dimension])

元素

UBound 函数有如下成分：

成分	描述

arrayname	数组变量的名称，遵循标准变量命名约定。

dimension	整数，指示返回哪一维的上界。1 指第一维，2 指第二维，以此类推。若省略dimension ，假定为1。

注释

UBound 函数与LBound 函数共用可决定数组的大小。LBound 函数用于找出数组维的下界。

对下列数组，UBound 的返回值列在下表中:

Dim A(1 To 100, 0 To 3, -3 To 4)

语句	返回值

UBound(A, 1)	100

UBound(A, 2)	3

UBound(A, 3)	4


ANSI字符集
�_ANSI字符集

Microsoft Windows使用美国国家标准句(ANSI) 8位字符集，允许用键盘表示最多256个(0-255) 字符。其中前128个字符（0-127）相应于标准U.S.键盘上的字母和符号。其余128个字符（128-255）表示特殊字符，诸如非英语字母，重音符号，货币符号和分数。


参数

传递给过程的常数，变量或表达式。


数组

一组有相同内部数据类型的顺序索引的元素。数组内每个元素由唯一的索引号标识。修改数组中某一个元素不影响其它元素。


ASCII 字符集

美国信息交换标准代码(ASCII) 7位字符集广泛地用于表示标准U.S.键盘上的字母和符号。ASCII字符集与ANSI字符集中前128个(0-127)字符相同。


自动格式化

在输入的同时自动格式化代码的特性，包括关键字第一个字母大写，有规律地使用空格，加入标点，以及设置前景和背景颜色。


位比较

两个数字表达式按照二进制位进行的比较。


布尔表达式

取值为True或False的表达式。


中断模式

在开发环境中，暂时地挂起程序的执行。处于中断模式时，可检查，调试，重置，步进，或继续程序的执行。可用下列方式进入中断模式：

设置断点。

程序运行时按CTRL+BREAK键。

程序运行时遇到Stop语句或未捕获的运行错误。

加入了“当值为真时停止”监视表达式。当该监视表达式为True时挂起程序的执行。

加入了“当值有修改时停止”监视表达式。当该监视表达式被修改时挂起程序的执行。


断点

选定的程序行，执行到该行时程序自动停止。断点不随代码一起保存。

允许被调用过程直接访问参数的实


传址

际值的传参方法。从而，过程可以修改参数的实际值。


传值

仅允许被调用过程访问参数的拷贝的传参方法。从而，过程不能修改参数的实际值。


剪贴板

用于传递文本，图形和代码的暂时存储空间。


字符码

代表字符集（例如ANSI字符集）中特定字符的数字。


关闭框

在Macintosh机上，处于窗口左上角的小框，单击它将关闭窗口。


集合

一组对象。当集合发生改变时，对象在集合中的位置也可能改变。因此，对象在集合中的位置是不可预知的。这种不可预知性正是集合和数组的区别。


注释

程序员加入的文本，用以说明代码是如何工作的。每个注释行必须以撇号（'）或关键字Rem 加空格开始。


比较运算符

用以指示两个或更多表达式之间关系的字符或符号：

Symbol	描述

<	小于

<=	小于或等于

> 	大于

>=	大于或等于

<> 	不等于

=	等于

另外的比较运算符有Is和Like。但请注意Is和Like不能在Select Case语句中用作比较运算符。


编译时

源代码翻译为可执行代码的时刻。


常量

在程序执行期间保持为常数的命名项，与此相反，变量的值在程序执行时可改变。各应用程序可预定义自己的常量集。另外的常量可用Const语句定义。两类常量均可用在程序中任何可用实际值的地方。常量可以是字符串或数字直接量，另一个常量，或这些量的包含算术或逻辑运算符（除Is外）的组合。例如：

Const A = "MyString"


控制面板

控制系统设置的程序。使用控制面板实用程序调整硬件和软件选项，诸如桌面颜色，打印机选择，日期和数字格式，字体，及国别设定（如语言和计量系统）。


控制菜单框

Microsoft Windows中处于窗口左上角的小框， 用以打开控制菜单。

对于应用程序，该菜单提供的命令允许对窗口进行还原，移动，改变大小，最小化，最大化操作，或关闭当前应用程序。另外，还可以切换到或运行其它基于Microsoft Windows的应用程序。

对应用程序内部的窗口，该菜单提供的命令允许对窗口进行移动，改变大小，拆分，或关闭活动窗口。


数据类型

决定变量可容纳何种类型数据的一种特性。数据类型包括Boolean, Integer, Long, Currency, Single, Double, Date, String, Object, Variant (缺省) 和自定义类型, 以及指定类型的对象。

自定义数据类型用Type语句定义。自定义类型和其它类型的数组用Dim语句创建。自定义数据类型可包含任何数据类型的数组。


数据类型的表示范围

每种数据类型的允许取值都有特定的范围：

数据类型	表示范围

Boolean	True或False.

Integer	-32,768到32,767.

Long	-2,147,483,648到2,147,483,647.

Single	负数-3.402823E28到-1.401298E-45;正数1.401298E-45到3.402823E38.

Double	负数-1.79769313486232E308到-4.94065645841247E-324; 正数4.94065645841247E-324到1.79769313486232E308.

Currency	-922,337,203,685,477.5808到922,337,203,685,477.5807.

Date	100年1月1日到9999年12月31日。

Object	任何Object引用。

String	字符串长度从0到约20亿(对Microsoft Windows version 3.1或更早版本，约65,535)。

Variant	任何表示范围与Double类型相同的数字或任何字符文本。

自定义数据类型的元素	每个元素的表示范围与该元素的数据类型相同。


日期表达式

任何可被解释为日期的表达式。包括日期直接量，看起来象日期的数字，看起来象日期的字符串和相关函数返回的日期的任意组合。日期表达式的表示范围限于100年1月1日到9999年12月31日。

日期存储为实数的一部分。小数点左边的值代表日期，右边的值代表时间。负值代表1899年12月30日以前的日期。


 日期直接量

用数码符号(#)括起来的有着合法格式的任何字符序列。合法格式包括代码所处的语言环境所指定的格式及通用日期格式。

例如，当应用程序的语言环境是English-U.S.时，#12/31/92#代表1992年12月31日。使用日期直接量可改善代码在不同国家语言间的可移植性。


日期分隔符

格式化日期值时用以隔开年月日的字符。该字符由系统设置或Format函数决定。


日期和时间

日期和时间在内部存储为实数的不同部分。

小数点左边的值代表100年1月1日到9999年12月31日的日期，包括100年1月1日和9999年12月31日。负值代表1899年12月30日以前的日期。

小数点右边的值代表0:00:00到23:59:59的时间，包括0:00:00和23:59:59。正午表示为0.5。


声明

声明指定了数据或过程标识符的类型。常量和变量的声明语句有Const, Dim, Private, Public, ReDim, Static。未用变量声明语句显式声明的变量将被隐含声明，除非有模块级的Option Explicit语句。Type...End Type语句声明自定义类型的变量。Sub, Function, Property, 和Declare (以及可选的属性Public和Private)用于声明过程。

声明时可用As从句指定类型，或某些情况下，在名称后附加类型声明字符。未指定类型的变量成为当前缺省类型(缺省为Variant)。声明使Visual Basic能为变量和函数返回值分配合适的内存，并且能检查传给过程的参数，以保证它们有预期的类型和数目。


动态链接库(DLL)

运行时加载并链接到应用程序的例程库。DLLs是用其它编程语言如C, MASM, 或 Fortran创建的。


Empty

变量的一个可取值，用来指出变量还未初始化（未赋给起始值），取值为Empty的变量等于0 (在数字上下文中), 零长度字符串(在字符串上下文中), 或VarType 0。


错误代码

处于0到65,535之间的整数，包括0和65,535，代表特定的错误信息。


表达式

关键字，运算符，变量和常量的组合，产生一个字符串，数字或对象。表达式可执行计算，处理字符，或测试数据。


文件号

打开文件时在Open语句中使用的数字。用1到255（包括1和255）的文件标识打开的文件不能被其它应用程序访问，用256到511（包括256和511）的文件标识打开的文件可以被其它应用程序访问。


宿主应用程序

支持Visual Basic应用程序版本的应用程序。例如, Microsoft Excel, Microsoft Project, 等等。


插入点

敲键时插入文本的地方，通常由文本光标或选定的文本指示。


关键字

识别为编程语言一部分的字或符号，例如，语句，函数名或运算符。

有两类关键字：

类型	描述

限制类型	不能用于命名过程的关键字。

非限制类型	可不受限制地使用的关键字。大部分非限制类型关键字是系统或应用程序提供的函数，方法，属性和语句名称，这些名称不为编译器所知。于是可用与之相同的名称命名过程。例如，如果您创建了FileCopy过程，并从自己的应用程序内调用它，那么被调用的是您自己的FileCopy，而非系统提供的FileCopy语句。


行标志

行标志用于标识代码中的单一行。可以是字母打头，冒号结尾的任意字符的组合。模块内的行标志必须唯一。行标志不区分大小写,可从任一列开始,但必须是行内第一个非空白字符。


行号

行号用于标识代码中的单一行的数字。该数字可以是数码的任意组合，但必须在模块内唯一。行号可从任一列开始,但必须是行内第一个非空白字符。

附注   大于65,529的行号按行标志对待，不能被Erl函数返回。


续行符

空格加一下划线( _)；在开发环境中用于将单一逻辑行的代码扩展到两个或更多物理行。注意续行符不能用于字符串表达式的内部。


语言环境

对应于给定国家和语言的信息集合。语言环境描述了预定义编程术语所用的语言，以及特定于语言环境的设置，诸如十进制分隔符，列表分隔符，日期格式和字符排列顺序等。有两种语言环境特别重要的情况：

代码的语言环境影响关键字所用语言和十进制分隔符等。选择“工具”菜单的“选项”可设置代码的语言环境。

系统的语言环境影响相关功能的行为。例如，系统的语言环境用于显示数字或把字符串转换为日期。可用操作系统提供的控制面板实用程序设置系统的语言环境。

绝大多数情况下，系统的语言环境与代码的语言环境是相同的。


逻辑错误

导致代码产生不正确结果或停止执行的编程错误。例如，下列情况将产生错误：不正确的变量名，错误的变量类型，无限循环，逻辑比较中的缺陷，数组有问题等。


成员

集合，对象或自定义数据类型的构成元素。


方法

适用于特定对象的过程。


模块

声明和过程的集合。


模块级

模块的声明部分。过程外部的所有代码都当作模块级代码。声明必须首先列出，随后是过程。例如：

Dim X as Integer	' 模块级声明。

Const RO = "ReadOnly"	' 模块级声明。

Type MyType	' 模块级声明。

MyString As String

MyAge As Integer

End Type

Sub MySub()	' 声明sub过程块。

Dim A	' 开始sub过程块。

A = "My variable"	' 过程级代码。

Debug.Print A	' 过程级代码。

End Sub	' 结束sub过程块。


模块级变量

在Function, Sub, 或Property过程外部声明的变量。模块级变量必须在模块中所有过程之前声明。


命名参数

有预定义名称的参数。使用命名参数时，可以仅向所需的参数（若参数可选）以任何顺序赋值，而不必按顺序提供所有参数。例如, 假定某方法接受三个参数：

DoSomeThing namedarg1, namedarg2, namedarg3

可用如下语句向命名参数赋值：

DoSomeThing namedarg3:=4,namedarg2:=5

注意不必按参数的位置顺序向参数赋值。


Null

变量的一个可取值，用来指出变量不包含任何合法值。Null是下列操作的结果：

显式地将变量赋值为Null。

等于Null的表达式之间的运算。


数字表达式

可计算为数字的表达式。表达式的元素可包括关键字，变量，常量和产生数字结果的运算符的任意组合。


数字类型

内部的数字型的数据类型(Boolean, Integer, Long, Currency, Single, Double或 Date)，或Variant的数字型的子类型(Empty, Integer, Long, Single, Double, Currency, Date, Error或Boolean)。


对象表达式

指定特定对象的表达式。该对象可包含任何对象容器。例如, 如果应用程序有一个Application对象，该对象包含Document对象，而Document对象又包含一个Text对象, 那么如下表达式是合法的对象表达式：

Application.Document.Text

Application.Text

Document.Text

Text


对象类型

应用程序通过OLE自动化提供的对象类型；例如, 应用程序，文件区域，表格等。请参考应用程序的文档(Microsoft Excel, Microsoft Project, Microsoft Word等) 以获得可用对象的完整列表。


参数

过程变元在过程内部所使用的变量名。该变量接受传递给过程的变元的值，作用域终止于本过程的End语句。


路径

表示目录或文件夹位置的字符串；可能包括驱动器。例如, Microsoft Windows中:

C:\MAIN\SUBDIR\MYSUBDIR

在Macintosh机上:

MY HARDDRIVE:MY FOLDER OF STUFF


路径名

表示指定目录或文件夹中文件的字符串。路径名可能包括驱动器，除非已有当前驱动器。例如, Microsoft Windows中:

C:\MAIN\SUBDIR\MYSUBDIR\MYFILE.TXT

在Macintosh机上:

MY HARDDRIVE:MY FOLDER OF STUFF:MY FILE


pi

数学常数，约等于3.1415926535897932。


打印区

每14列为一个打印区。每列的宽度为所选字体所有字符的平均宽度，以点(point)计量。


过程

命名的代码语句序列，是程序的执行单位。例如, Function, Property和Sub是所有类型的过程。


过程级

处于Function, Property或Sub过程内部的语句。声明常常首先列出，随后是赋值和其它可执行代码。例如:

Sub MySub()

Dim A	' 声明语句。

A = "My variable"	' 赋值语句。

Debug.Print A	' 可执行语句。

End Sub

附注   相反地，模块级代码处于所有Sub...End Sub块之外。


方案

模块的集合。


属性

对象的命名了的性质。属性定义了对象的特性(诸如大小，颜色和屏幕位置等)或对象的行为(例如, 是否激活)。


被引用方案

若正在某方案上工作，该方案就称为当前方案。可以在当前方案和其它方案之间建立链接，被链接的方案称为直接被引用方案，而当前方案则称为直接引用方案。方案如何被链接取决于宿主应用程序。例如, 在Excel中，从“工具”菜单的“引用”对话框选择一个方案即可直接引用之。在直接被引用方案中声明为Public的标识符，对直接引用方案可见，但反之不然。(亦即在直接引用方案中声明为Public的标识符，对直接被引用方案不可见)。

被当前方案的直接被引用方案所引用的方案称为间接被引用方案。该方案中声明为Public的标识符不能为当前方案所访问，除非用该方案的方案名限定。只要不造成引用循环，方案之间直接和间接引用的任意组合都是合法的。例如,如果ProjectA引用ProjectB, ProjectA和ProjectB都能引用ProjectC, 但ProjectB和ProjectC均不能引用ProjectA, 因为这将导致引用循环。


运行时

代码运行的时间。在运行时，仅能以用户的身份与程序相互作用。


运行错误

代码运行时产生的错误。语句试图进行非法操作时将造成运行错误。


 作用域

定义变量、过程和对象的可访问性和生命期。例如, 声明为Public的变量对所有应用程序的所有模块的所有过程可用(除非使用Option Private Module语句)。


种子

用以产生伪随机数的初始值。例如, Randomize语句产生种子数，该数被Rnd函数用以创建独立的伪随机数序列。


排列顺序

用以排列数据的顺序规则；例如, 字典顺序、数字顺序、升序、降序等等。


拆分条

把窗口分成两个分立区域的细条。在模块中，拆分条把代码窗口分成两个分立的代码窗口。在调试窗口中，拆分条把窗口分为“即时”、“监视”和代码窗口。


语句

句法完整的单位，表达一种动作、声明或定义。通常一条语句占用单一代码行，但也可用冒号(:)把一条以上的语句置于一行中，或用空格下划线( _)序列在下一物理行接续逻辑行。


字符串比较

两个字符序列的比较。既可以二进制方式也可以文本方式进行比较。英语中，二进制比较是大小写敏感的，而文本比较时大小写不敏感。


字符串常量

任何包含一系列连续字符的常量(用Const关键字定义)，解释为字符本身而非某些数字值。例如:

Const A="MyString"


字符串表达式

任何计算为一系列连续字符的表达式。表达式的元素可包括返回字符串的函数、字符串直接量、字符串常量、字符串变量、字符串Variant或返回字符串Variant(VarType 8)的函数。


字符串直接量

用引号括起来的包含一系列连续字符的表达式，文法上解释为引号内的字符。例如:

"MyString"


字符串类型

数据类型，其数据由一系列连续字符构成，表示实际的字符本身，而非某些数字值。字符串可包括字母、数字、空格和标点符号。


语法检查

检查代码语法正确性的特性。若打开语法检查，键入的代码有语法错误时将显示消息框。


语法错误

当系统不能理解键入的代码时产生的错误。

附注   每个关键字的语法规则定义在相关帮助主题的语法部分。要在开发环境中得到关于某关键字的帮助，选定该关键字并按F1。


时间表达式

任何可解释为时间的表达式。包括时间直接量、看起来象时间的数字、看起来象时间的字符串和由相关函数返回的时间，以及它们的任意组合。

时间存储为实数的一部分。小数点右边的值代表时间。正午(12:00 P.M.) 以0.5表示。


标题栏

窗口顶部的一块区域，显示窗口的标题或名称。


类型定义字符

附加在变量名之后的字符，用以指示变量的数据类型。变量缺省为Variant类型，除非模块中有相应的Deftype语句。

字符	数据类型

无	Boolean

%	Integer

&	Long

!	Single

#	Double

无	Date

@	Currency

$	String

无	Object

无	Variant


通用日期格式

通用日期格式为#yyyy-mm-dd hh:mm:ss#。然而，日期部分(#yyyy-mm-dd#)和时间部分(#hh:mm:ss#) 均可分别表示。


自定义数据类型

用Type语句定义的数据类型。自定义数据类型可包含一个或多个任意数据类型的元素。自定义的或其它数据类型的数组用Dim语句创建。自定义数据类型内可包括任何类型的数组。


变量

命名了的存储位置，可包含确定类型的数据，该数据在程序运行时可修改。每个变量在其作用域级别内由唯一的名称标识。变量名必须以字母打头，不能包含句点或类型定义字符，必须在作用域中唯一。


变量名

对于变量名：

必须以字母打头。

不能包含句点或类型定义字符。

在同一作用域中必须唯一。

最长255个字符。


VarType

VarType函数的返回值提供了变量中数据的类型信息。

返回值	等同的常量	关于变量的描述
0	vbEmpty	未初始化
1	vbNull	不包含任何合法数据
2	vbInteger	整数
3	vbLong	长整数
4	vbSingle	单精度浮点数
5	vbDouble	双精度浮点数
6	vbCurrency	货币
7	vbDate	日期
8	vbString	字符串
9	vbObject	OLE自动化对象
10	vbError	错误
11	vbBoolean	布尔值
12	vbVariant	变体型(仅用于变体型数组)
13	vbDataObject	非OLE自动化对象
8192	vbArray	数组
附注   常量vbArray与其它类型常量的组合表示该类型变量的数组。


等待模式

程序暂停运行，变量也未被清除的时候。等待模式中，可检查、调试或重启动程序。


监视表达式

用以观察变量或表达式行为的表达式。例如, 如果a和b是两个变量，下列表达式是合法的监视表达式：

a

a*b

3*a = b-2

监视表达式显示在调试窗口的“监视”窗口中，进入中断模式时被自动更新。“监视”窗口显示出表达式在给定上下文中的值。监视表达式不随代码一起保存。


Array 函数实例
�_Array 函数实例

本例使用Array函数返回包含数组的Variant变量。

MyWeek = Array("Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun")

' 返回值假定最左边的值等于1(使用Option Base)。

MyDay = MyWeek(2)	' 返回"Tue"。

MyDay = MyWeek(4)	' 返回"Thu"。


Const 语句实例

本例使用Const语句定义常量以取代直接量。

' 常量缺省为私有的。

Const MyVar = 459

' 声明公共常量。

Public Const MyString = "HELP"

' 声明私有整数常量。

Private Const MyInt As Integer = 5

' 在一行中声明多个常量。

Const MyStr = "Hello", MyDouble As Double = 3.4567


Declare 语句实例

本例示范在模块级使用Declare语句声明动态链接库(DLL)或Macintosh代码资源中的外部过程。

' 在Microsoft Windows中。

Declare Sub MessageBeep Lib "User" (ByVal N As Integer)

' 在Macintosh机上。

Declare Sub MessageAlert Lib "MyHd:MyAlert" Alias "MyAlert" (ByVal N _

As Integer)


Deftype 语句实例

本例示范使用Deftype语句设置某些以特定字符打头的变量和函数的缺省数据类型。缺省数据类型仅能被Dim语句的显式声明所取代。Deftype语句仅能用于模块级。

' 以A到K打头的变量缺省为整数。

DefInt A-K

' 以L到Z打头的变量缺省为整数。

DefStr L-Z

CalcVar = 4	' 初始化整数。

StringVar = "Hello there"	' 初始化字符串。

AnyVar = "Hello" 	' 导致"Type mismatch"错误。

Dim Calc As Double	' 显式地将类型设置为双精度浮点数。

Calc = 2.3455	' 赋值以双精度浮点数。

' Deftype语句也适用于函数过程。

CalcNum = ATestFunction(4)	' 调用自定义函数。

' ATestFunction函数过程声明。

Function ATestFunction(INumber)

ATestFunction = INumber * 2	' 返回值为整数。

End Function


Dim 语句实例

本例示范用Dim语句声明变量。Dim语句也用于声明数组。缺省时数组第一个元素的下标为0，可在模块级用Option Base语句重新设置该值。

' AnyValue和MyValue缺省为变体型，初值为Empty。

Dim AnyValue, MyValue

'  显式声明整数变量。

Dim Number As Integer

' 一行中多个声明。由于AnotherVar的类型省略，它是变体型。

Dim AnotherVar, Choice As Boolean, BirthDate As Date

' DayArray是变体型数组，假定当前模块Option Base设置为0(缺省)，则DayArray有

' 从0到50共51个元素。

Dim DayArray(50)

' Matrix是二维整数数组。

Dim Matrix(3,4) As Integer

' MyMatrix是双精度浮点数数组，有明确的边界。

Dim MyMatrix(1 To 5,  4 To 9,  3 To 5) As Double

' BirthDay是日期数组，下标从1到10。

Dim BirthDay(1 To 10) As Date

' MyArray是动态数组。

Dim MyArray()


Erase 语句实例

本例使用Erase语句对固定大小的数组重新初始化，或释放动态数组的存储空间。

' 声明数组变量。

Dim NumArray(10) As Integer	' 整数数组。

Dim StrVarArray(10) As String	' 变长字符串数组。

Dim StrFixArray(10) As String * 10	' 定长字符串数组。

Dim VarArray(10) As Variant	' 变体型数组。

Dim DynamicArray() As Integer	' 动态数组。

ReDim DynamicArray(10)	' 分配存储空间。

Erase NumArray	' 每个元素置为0。

Erase StrVarArray	' 每个元素置为""。

Erase StrFixArray	' 每个元素置为0。

Erase VarArray	' 每个元素置为Empty。

Erase DynamicArray	' 释放数组所占的存储空间。


Function语句实例

本例使用Function语句声明名称、参数和代码，以构成Function的过程体。

' 下列自定义函数返回参数的平方根。

Function CalculateSquareRoot(NumberArg As Double) As Double

If NumberArg < 0 Then	' 测试参数。

Exit Function	' 返回到调用过程。

Else

CalculateSquareRoot = Sqr(NumberArg)	' 返回平方根。

EndIf

End Function

' 用ParamArray关键字可使函数接受不定数目的参数。下面的定义中，FirstArg按值传

' 递。

Function CalcSum(ByVal FirstArg As Integer, ParamArray OtherArgs())

' 如果该函数象下面这样被调用...

ReturnValue = CalcSum(4,3,2,1)

' 局部变量取值如下：FirstArg=4， OtherArgs(1)=3，

' OtherArgs(2) = 2 等等。（假设数组第一个元素的下标缺省为1）

' 如果函数的参数定义为...

Function MyFunc(MyStr As String, Optional MyArg1, Optional MyArg2)

' 该函数可按如下方式调用。

RetVal = MyFunc("Hello", 2, "World")	' 提供所有3个参数。

RetVal = MyFunc("Test", , 5)	' 省略第二个参数。

RetVal = MyFunc("Test")	' 仅提供第一个参数。


LBound 函数实例

本例使用LBound函数对数组的指定维返回可用的最小下标。数组的缺省最小下标为0，可用Option Base语句重新设置该值。

Dim MyArray(1 To 10, 5 To 15, 10 To 20) 	' 声明数组变量。

Dim AnyArray(10)

Lower = LBound(MyArray, 1) 	' 返回1。

Lower = LBound(MyArray, 3)	' 返回10。

Lower = LBound(AnyArray)	' 返回0或1，取决于Option Base

' 的设定。


Let 语句实例

本例使用带Let和不带Let的语句将表达式的值赋给变量。

' 使用Let语句的变量赋值。

Let MyStr = "Hello World"

Let MyInt = 5

' 不使用Let语句的相同变量赋值。

MyStr = "Hello World"

MyInt = 5


Option Base 语句实例

本例使用Option Base语句设置缺省的数组最小下标。LBound函数对数组的指定维返回可用的最小下标。Option Base仅用于模块级。

' 设置缺省数组最小下标为1。

Option Base 1

Dim MyArray(20), TwoDArray(3,4)	' 声明数组变量。

Dim ZeroArray(0 To 5)	' 优先于缺省数组最小下标。

' 使用LBound函数测试数组的较低边界。

Lower = LBound(MyArray)	' 返回1。

Lower = LBound(TwoDArray, 2)	' 返回1。

Lower = LBound(ZeroArray)	' 返回0。


Option Compare 语句实例

本例使用Option Compare语句设置缺省字符串比较模式。Option Compare语句仅用于模块级。

' 设置字符串比较模式为Binary。

Option Compare Binary 	' 亦即"AAA"小于"aaa"。

' 设置字符串比较模式为Text。

Option Compare Text	' 亦即"AAA"等于"aaa"。


Option Explicit 语句实例

本例使用Option Explicit语句强制显式声明所有变量。使用未定义变量将在编译时产生错误。Option Explicit仅用于模块级。

Option Explicit	' 强制显式的变量声明。

Dim MyVar	' 声明变量。

MyInt = 10	' 未声明的变量将引起错误。

MyVar = 10	' 不引起错误。


Option Private 语句实例

这条Option Private语句用于模块级，指示整个模块是私有的。

Option Private Module	' 指出模块是私有的。


Private 语句实例

这些Private语句用于模块级以声明变量为私有的；亦即，这些变量仅在声明它们的模块中可用。

Private Number As Integer	' 私有的整数变量。

Private NameArray(1 To 5) As String	' 私有的数组变量。

Private MyVar, YourVar, ThisVar As Integer	' 多重声明。


Property Get 语句实例

本例使用Property Get语句定义属性过程，该过程取得某属性的值，该值以字符串形式表示图形包里绘图笔的当前颜色：

Dim CurrentColor As Integer

Const BLACK = 0, RED = 1, GREEN = 2, BLUE = 3

' 以字符串形式返回绘图的当前颜色。

Property Get PenColor() As String

Select Case CurrentColor

Case RED

PenColor = "Red"

Case GREEN

PenColor = "Green"

Case BLUE

PenColor = "Blue"

End Select

End Property

' 下列代码调用Property Get过程以取得绘图笔的当前颜色。

ColorName = PenColor()


Property Let 语句实例

本例使用Property Let语句定义一个过程，该过程对表示图形包里绘图笔颜色的属性赋值。

Dim CurrentColor As Integer

Const BLACK = 0, RED = 1, GREEN = 2, BLUE = 3

' 为图形包设置绘图笔颜色属性。

' 模块级变量'CurrentColor'设置为数字值，表示绘图用的颜色。

Property Let PenColor(ColorName as String)

Select Case ColorName	' 检查颜色名字符串。

Case "Red"

CurrentColor = RED	' 赋值为Red。

Case "Green"

CurrentColor = GREEN	' 赋值为Green。

Case "Blue"

CurrentColor = BLUE	' 赋值为Blue。

Case Else

CurrentColor = BLACK	' 赋缺省值。

End Select

End Property

' 下列代码调用Property Let过程以设置图形包的PenColor属性。

PenColor() = "Red"


Property Set 语句实例

本例使用Property Set语句声明属性过程，该过程将一个引用赋给对象。

' Pen属性可赋值为其它的Pen对象的实现。

Property Set Pen(P As Object)

Set CurrentPen = P	' 将对象赋给Pen。

End Property


Public 语句实例

Public语句用于模块级，以声明变量为公共的；亦即，它们对所有应用程序的所有模块的所有过程可用，除非Option Private Module正在起作用。

Public Number As Integer	' 公共的整数变量。

Public NameArray(1 To 5) As String	' 公共的数组变量。

Public MyVar, YourVar, ThisVar As Integer	' 多重声明。


ReDim 语句实例

本例使用ReDim语句声明动态数组变量，然后分配和重分配存储空间。

Dim MyArray() As Integer	' 声明动态数组。

ReDim MyArray(5)	' 分配5个元素的空间。

For I = 1 To 5	' 循环5次。

MyArray(I) = I	' 初始化数组。

Next I

' 下列语句改变数组的大小，同时删除原来的元素。

ReDim MyArray(10)	' 改为10个元素的大小。

For I = 1 To 10	' 循环10次。

MyArray(I) = I	' 初始化数组。

Next I

' 下列语句改变数组的大小，但不删除原来的元素。

ReDim Preserve MyArray(15)	' 改为15个元素的大小。


Rem 语句实例

本例示范了Rem语句的多种形式，该语句用于在程序中加入解释性注释。

Rem 第一种形式的语法。

' 第二种形式的语法。

MyStr1 = "Hello" : Rem 语句之后的注释，以分号隔开。

MyStr2 = "Goodbye" 	' 这也是注释。


Set 语句实例

本例使用Set语句将对象引用赋给变量。

Set MyObject = YourObject	' 赋以对象引用。

' MyObject和YourObject指向同一个对象。

YourObject.Text = "Hello World"	' 初始化属性。

MyStr = MyObject.Text	' 返回"Hello World"。

' 终止关联。MyObject不再指向YourObject。

Set MyObject = Nothing


Static 语句实例

本例使用Static语句使模块的代码运行时本来的值保持不变。

' 函数定义。

Function KeepTotal(Number)

' 在两次调用之间仅变量Accumulate的值保持不变。

Static Accumulate

Accumulate = Accumulate + Number

KeepTotal = Accumulate

End Function

' 静态函数定义。

Static Function MyFunction(Arg1, Arg2, Arg3)

' 在两次调用之间所有局部变量的值保持不变。

Accumulate = Arg1 + Arg2 + Arg3

Half = Accumulate / 2

MyFunction = Half

End Function


Sub 语句实例

本例使用Sub语句声明名称、参数和代码，以构成Sub的过程体。

' Sub过程定义。

Sub SubComputeArea(Length, Width)	' 有两个参数的Sub。

Dim Area As Double	' 声明局部变量。

If Length = 0 Or Width = 0 Then	' 如果任意一个变量为0。

Exit Sub	' 立即退出Sub。

End If

Area = Length * Width	' 计算矩形的面积。

Debug.Print Area	' 将Area打印到调试窗口。

End Sub


Type 语句实例

本例使用Type语句定义自定义数据类型。Type语句仅用于模块级。

Type EmployeeRecord	' 创建自定义类型。

ID As Integer	' 定义该类型的元素。

Name As String * 20

Address As String * 30

Phone As Long

HireDate As Date

End Type

Dim MyRecord As EmployeeRecord	' 声明变量。

MyRecord.ID = 12003	' 对元素赋值。


UBound 函数实例

本例使用UBound函数返回数组中指定维的最大可用下标。

Dim MyArray(1 To 10, 5 To 15, 10 To 20)	' 声明数组变量。

Dim AnyArray(10)

Upper = UBound(MyArray, 1)	' 返回10。

Upper = UBound(MyArray, 3)	' 返回20。

Upper = UBound(AnyArray)	' 返回10。


检测到歧义名称
�_检测到歧义名称

两个标识符冲突或标识符需要限定。同一作用域中可能有多于一个的对象有同名元素，故需要用对象名加句点限定元素名。例如：

object.property

模块级标识符和方案defProject级标识符(模块名和被引用方案名)可能在过程中使用(虽然这导致程序难于维护和调试)。然而，如果想在同一过程中引用两个项目，那么必须限定那个有更广作用域的项目。例如, 如果MyID在MyModule的模块级声明，然后在过程级声明了一个同名的变量，对模块级变量的引用必须适当地限定：

Dim MyID As String

Sub MySub

MyModule.MyID = "This is module-level variable"

Dim MyID As String

MyID = "This is the procedure-level variable"

Debug.Print MyID

Debug.Print MyModule.MyID

End Sub

模块级标识符可能与过程名相冲突。例如，如果变量MyID在模块级声明，而又定义了同名的过程，将产生此错误：

Public MyID

Sub MyID

. . .

End Sub

这种情况下，需要改变两个名称之一，因为用相同的模块名限定并不能解决歧义性。注意过程名缺省为Public的，而变量名为Private的，除非指定为Public。


AppleScript错误

处理手写体时产生的错误。该错误可能与目标应用程序或AppleScript有关。


ParamArray中的参数不应命名

ParamArray中的参数必须按顺序提供。若只提供Paramarray的一部分元素，可用逗号作为省略参数的占位符。例如，在下列调用中，ParamArray跟在Arg2后，只传递ParamArray的第一、三、六个值：

MySub Arg1, Arg2, 7,, 44,,,3

还要注意，ParamArray总是作为参数表的最后一项。


参数不是可选的(错误码 449)
参数不是可选的(Error 449)

参数的数目和类型必须按要求匹配。例如，Left函数要求两个参数，第一个代表被操作的字符串，第二个代表从字符串左边开始要返回的字符的数目。因为两个参数均非可选项，所以都必须提供。

仅当自定义函数的参数声明为Optional时，才可在调用时省略。


Property Let或Property Set缺少参数

Property Let和Property Set过程的目的是赋予属性新的值。该值必须用最后一个变元传递。定义此类过程时，必须用一个参数接受该变元。


数组已设定了维

可能的原因:

�	试图用ReDim 语句改变静态数组的大小 [image] 仅动态数组可改变维大小。

�	Option Base 语句出现在数组的维已被设定之后。

可用Dim, Public, Private, or Static 语句和空括号定义动态数组。例如:

Dim MyArray()

在过程中，可用ReDim 语句改变动态数组的大小，用变量指定元素的数目:

ReDim MyArray(n)


数组参数必须按引用传递

数组的单个元素可ByVal (传值)传递，但传递整个数组必须用ByRef (传址)。注意ByRef 是缺省方式。


错误的DLL 调用约定(错误码49)

调用动态链接库(DLL)中的例程时，参数的类型或数目不对，或没有使用Pascal调用约定。请检查传递到DLL例程的参数是否与该例程所期望的参数一致。如果DLL例程的参数是传值调用，请检查该例程的声明语句中是否对该参数指定了ByVal。


错误的文件模式(错误码54)

可能的原因:

�	Put或Get语句指定了顺序存取文件。注意Put和Get仅能引用以Random访问模式打开的文件。

�	Print # 语句指定了以Output或Append之外的模式打开的文件。

�	Input # 语句指定了以Input之外的模式打开的文件。

�	试图写入只读文件。


错误的文件名或文件代码(错误码52)

所引用文件的文件名或文件代码有下列问题:

�	非法文件名或文件代码。

�	未在某Open 语句中指定。

�	在某Open 语句中指定过，但已关闭了。

�	超出文件代码的范围(1-511)。

在Microsoft Windows中，命名文件或目录时使用下列约定:

�	文件或目录名包含两个部分: 名称和可选的扩展名。两部分用句点隔开，例如, MYFILE.NEW。

�	名称最多可包含八个字符，扩展名最多可包含三个字符。

�	名称必须以字母或数字打头。名称可包含任何大写或小写(文件名大小写不敏感) 字符，但下列除外:

字符	描述

 .	句点

"	引号

'	单引号

+	加号

/	斜杠

\	反斜杠

[ ]	括号

:	冒号

;	分号

|	竖直线

=	等号

,	逗号

�	名称不能包含空格。下列名称是保留的，不能用于命名文件或目录:  CON, AUX, COM1, COM2, COM3, COM4, LPT1, LPT2, LPT3, PRN,和NUL。例如, 如果在Open 语句中指定文件名PRN，指向该Open 语句中文件代码的Print #和Write #的目标将成为缺省打印机。

�	下列的例子是合法的Microsoft Windows 文件名:

LETTER.DOC

MEMO.TXT

BUDGET.92

12345678.901

2NDTRY.RPT

在Macintosh机上，文件名可包含除分号(:)外的任何字符，可包含空格。在任何文件名中都不能包含Null字符(Chr(0))。


错误的记录长度(错误码59)

Get or Put 语句中记录变量的长度与相应Open 语句中指定的长度不一致。当Put 到随机存取文件时，变长字符串都要加上一个两字节描述符，故变长字符串要比Open 语句的Len 从句中指定的长度短至少两个字节。

Variant 数据类型也需要两字节描述符。包含变长字符串的变体型量需要四字节描述符。因而，对Variant中的变长字符串，字符串要比Len 从句中指定的长度短至少四个字节。


错误的记录数目(错误码63)

Put 或Get 语句中的记录数目小于或等于零。


已达到查找范围的开始，从结尾处继续查找吗?

向上的查找已达到查找范围的开始处。可选择从查找范围的结尾处继续查找，或取消并改变查找范围。


块If缺少End If

使用If 语句时未加上相应的End If 语句。对于嵌套的If...End If 语句，请检查在外部If...End If 结构内有正确匹配的If...End If 结构。


此行不能设置断点

某些代码行不能设置断点。例如, 不能把断点放在注释行、行标志(除非该行也包含可执行代码)、隐藏模块中的代码行或处于“即时”窗格中的代码行。不能在声明语句(Const, Dim, Static, Type, 等等)上设置断点。


ByRef 参数类型不匹配

当过程要求参数按引用传递(ByRef,缺省传参方式)时，所传递的参数必须与所要求的参数的数据类型严格匹配。例如, 当要求Long 类型，而传递了Integer 变量时，产生此错误。把参数放在单独的括号里将避免此错误，但有可能导致信息丢失。例如, 要把Variant 参数MyVar 传递到要求整数参数的过程，可如下调用:

Dim MyVar

MyVar = 3.1415

Call SomeSub((MyVar))

Sub SomeSub (MyNum As Integer)

MyNum = MyNum + MyNum

End Sub

把参数放在单独的括号里将强制参数按表达式计算。在计算期间，数字的小数部分被近似(而非截断) 以使起与所要求的参数类型一致。计算的结果放在一个临时位置，对此临时位置的引用传递到过程。这样，原始的MyVar 将保留其值。


不能将定长字符串数组或自定义类型数组赋给Variant变量

Variant 变量不能接受由定长字符串或自定义类型变量组成的数组。


无法赋值到数组

赋值是对数组中特定的元素而言，而不能简单地向数组名赋值。例如，如果MyArray是整数数组，那么表达式MyArray = 5 就是非法的，但下列表达式是合法的:

MyArray(UBound(MyArray)) = 5


无法改变数组元素的数据类型

可以用ReDim 改变数组中元素的数目，但数组元素的数据类型只能保持与初始创建数组的语句所声明的数据类型一致(除非数组包含在Variant量中)。


无法显示隐藏过程

试图查看某过程，但由于该过程属于隐藏模块而无法显示。必须将隐藏模块取消隐藏以查看该过程。如果试图查看处于隐藏过程中的产生错误的代码行，取消隐藏后再运行代码以查看错误。


无法编辑模块

模块标识为保护的。请在编辑前取消模块的保护。


无法找到方案或库

无法找到被引用方案，或无法找到相应于该方案的语言的被引用对象库。只有解决了所有的缺失引用后才能运行代码。

缺失的引用在“引用”对话框中以"MISSING:" 为前缀。选择缺失的引用可显示出缺少的方案或库的路径名和语言。按下列步骤解决这些引用:

解决引用的步骤

1.	从“工具”菜单中选择“引用”。

2.	选择缺失的引用。

3.	选择“浏览”以打开“浏览”对话框。

4.	使用“浏览”对话框找出缺失的引用。

5.	单击“确定”

6.	重复上述步骤直到解决所有缺失引用。

一旦找到了缺少的项目，"MISSING:"前缀就去掉了，以表明已重新建立连接。如果被引用方案的文件名已改变，就增加一个新的引用，且旧引用必须删除。

若要去掉不再需要的引用，只须清除无用引用旁边的复选框。注意不能去掉对Visual Basic 对象库(VBAXX.OLB)和宿主应用程序 对象库的引用。

应用程序可能支持其对象库的不同语言的版本。若要找出所需的语言版本，单击该引用，然后检查对话框底部指示的语言。

对象库对每个平台有不同版本。故而当方案在平台之间转移时(例如，从Macintosh到Windows)，该平台的引用库的正确语言版本必须在宿主应用程序的文档所指定的位置可用。

对象库文件名通常如下构造:

�	Windows:	应用程序代码+语言代码+[版本号].OLB。例如:

�	VBAFR.OLB是法语Visual Basic 对象库。

�	XLFR50.OLB是法语Excel 5.0对象库。

�	Macintosh:	应用程序名语言代码[版本号]OLB。例如:

�	VBA FR OLB 是法语Visual Basic 对象库。

�	MS Excel FR 50 OLB是法语Excel 5.0对象库。

如果在系统中找不到缺失的方案或库，请与引用方案的作者联系。如果缺失的库是Microsoft 应用程序对象库，可如下获得之:

�	如果可访问Microsoft 电子技术支持服务，请参阅本帮助文件中的“技术支持”一节。在电子服务下，可找到如何使用适当服务选项的指示。

�	如果不能访问Microsoft 电子技术支持服务，如果向Microsoft要求，可将Microsoft对象库作为应用程序附注从Microsoft得到。关于如何联系本地Microsoft产品供应组织的信息也可参阅本帮助文件中的“技术支持”一节。


无法获取或设置对象引用中的自定义类型

试图对对象引用中包含的自定义类型使用Get或Put语句。从记录变量中去掉对象引用或试用Input #, Line Input #, Print #, 或Write #。


无法加载模块；无效格式(错误码323)

试图加载的模块并非文本模块。某些版本的Visual Basic 允许将代码保存为二进制或文本格式。如果可能，在最后保存该文件的应用程序中加载之，并将其另存为文本格式。


无法执行要求的操作(错误码17)

由于要求执行的操作将导致方案的当前状态无效，无法执行该操作。例如，如果程序处于中断模式时，使用“工具”菜单中的“引用”对话框增加对新方案或对象库的引用，将产生本错误。


无法记录到正在运行的模块中

执行模块代码时，不能记录宏。要停止执行，从“运行”菜单中选取“结束”或摁CTRL+BREAK。


无法重命名到另外驱动器(错误码74)

不能用Name语句将文件改名为另一个驱动器上的文件。可用FileCopy 将文件写到另一个驱动器，然后用Kill 语句删除旧文件。


Case Else处于Select Case之外

Case Else只能放在匹配的Select Case 和End Select语句之间。


无Select Case而出现Case

没有相应的Select Case 语句就使用了Case 语句。请检查Select Case...Case 结构中的其它控制结构是否正确匹配。例如，Select Case...Case结构中的无匹配End If的If将导致本错误。


模块间有循环依赖

某模块中的自定义类型或常量引用了另一个模块中的自定义类型或常量,而被引用的自定义类型或常量又引用了第一个模块中的其它自定义类型或常量。此类模块之间、常量之间和自定义类型之间的循环引用是不允许的。


类不支持OLE自动化 (错误码430)

找到了调用GetObject或CreateObject函数时指定的对象，但该对象没有提供可编程的接口。故不能编写代码控制该对象的行为。请查看创建该对象的应用程序的文档，一得到关于此类对象用于OLE自动化时的限制。


代码的执行已被打断

检测到了CTRL+BREAK (Microsoft Windows)或COMMAND+PERIOD (Macintosh)组合键。可选择“调试”进入中断模式，或选择“继续”恢复执行，或选择“结束”终止进程。


代码资源锁定错误(错误码455)

程序试图调用代码资源中的过程。找到了该代码资源，但试图锁定该代码资源时产生了错误。请检测HLock返回的错误(例如，"Illegal on empty handle"或"Illegal on free block")。本错误仅产生在Macintosh机上。


未找到代码资源(错误码454)

程序试图调用代码资源中的过程，但找不到该代码资源。本错误仅产生在Macintosh机上。


隐藏模块:<模块名>中有编译错误

指定模块的代码中有编译错误，但因方案被保护，该模块不能显示。请将方案去掉保护再运行代码并查看错误。


需要常量表达式

常量必须初始化。初始化常量时不能用变量、对象、函数调用的返回值或自定义类型的实例，可用直接量、已定义常量，或由运算符(除Is逻辑运算符外)连接的直接量和已定义常量来初始化常量。如果声明数组时试图用变量指定元素的个数，也将产生本错误(除非用ReDim声明数组)。


当前模块不支持Print方法

本模块中只有Debug.Print是有效的。


不允许方案间的循环引用

试图加入对某方案的引用，但该引用已经是该方案的一部分。例如，如果MyProj引用了YourProj，那么YourProj(或引用YourProj的方案)就不能引用MyProj。


Deftype语句必须处于声明语句之前

类似于DefInt、DefDbl、DefCur等等的语句只能处于模块级 ，且必须处于所有变量声明语句之前。


目的行标志太远；循环、Select Case或块If太大

可能的原因:

�	跳转语句(GoTo、GoSub)的目的行标志与源跳转语句的距离超过32,767字节。

�	循环结构太大，从开始到结尾所占据的内存超过32K。

�	包含Then或Else从句的块If结构太大，从开始到结尾所占据的内存超过32K。

过程从开始到结尾最多可占据64K内存，但因为过程中的跳转既可向前也可向后，故两个方向的跳转均限制在32,767字节。


设备I/O错误(错误码57)

程序使用打印机或磁盘驱动器之类的设备时产生了输入输出错误。


设备不可用(错误码68)

试图访问的设备不是未在线，就是不存在。


磁盘满(错误码61)

可能的原因:

�	磁盘上没有足够的空间完成Print #、Write #或Close操作。

�	磁盘上没有足够的空间创建所需的文件。

请把一部分文件移到其它盘上，或删掉一些文件。


磁盘未准备好(错误码71)

指定的驱动器中没有磁盘，或驱动器门没关。请在驱动器中插入磁盘，关上驱动器门，再重试该操作。


被零除(错误码11)

作为除数的表达式的值为零。请检查表达式中变量的拼写。拼写错误的变量名可能被当作新变量，且初始化为零。请检查表达式中对变量的先前的操作，特别是当作参数传递到本过程的变量。


Do语句没有用Loop结尾

使用Do语句时没有结尾的Loop语句。请检查Do...Loop结构内部的其它控制结构是否正确匹配。例如，Do...Loop结构内没有End If的块If将导致本错误。


当前作用域中有双重声明

此作用域级别中已使用了指定的名称。例如，不同过程中声明的变量可有相同的名称，但在同一过程中不能定义同名变量。典型原因:

�	新变量或过程与已存在的变量或过程同名。例如:

Sub MySub()

Dim A As Integer

Dim A As Variant

. . .	' 其它声明语句或过程代码

End Sub

�	Const语句使用了与已存在的变量或过程相同的名称。

�	多于一次地声明固定大小的数组。

请检查当前过程、模块或方案并去掉双重声明。从“编辑”菜单中选择“查找”，以定位双重名称。因为名称相同而类型定义字符不同时产生冲突，指定要查找的名称时应省略类型定义字符。

注意模块级变量可与过程级变量同名，但要在过程内部引用模块级变量时，必须用模块名限定之。模块名和被引用方案名可在过程中用作变量名，也可被限定。


双重定义(错误码10)

本错误常常仅是由代码模拟的。例如:

Error 10

但如果试图用ReDim 修改固定大小的数组的元素个数时，将产生本错误。例如，下列代码中，过程NextOne中的SomeArr接受固定数组FixedArr，然后试图修改SomeArr的大小:

Sub FirstOne

Static FixedArr(25) As Integer	' 创建固定大小的数组并将其传递到另一

NextOne FixedArr()	' 个子例程。

End Sub

Sub NextOne(SomeArr() As Integer)

ReDim SomeArr(35)	' 此处产生双重定义错误。

. . .

End Sub


双重Deftype语句

此Deftype语句中指定的字母范围的一部分或全部已经包含在另一Deftype语句中了。


双重Option语句

此模块中已定义了多条Option Base, Option Compare,Option Explicit, 或Option Private 语句。去掉模块中重复了的这些语句。


将要进行的编辑不能撤消--进行吗？

执行了这次编辑后，不能选择“撤消操作”来恢复到当前状态。该编辑可能太大故而无法保存。可试一下较小规模的编辑。


没有If而使用了Else

使用了无相应If语句的Else语句。请检查If...End If结构内部的其它控制结构是否正确匹配。还应检查块If有正确格式。


没有监视表达式

没有在“增加监视表达式”对话框中提供监视表达式 。


并非块If而使用了End If

使用了无相应If语句的End If语句。请检查If...End If结构内部的其它控制结构是否正确匹配。还应检查块If有正确格式。


已达到查找范围的结尾；从开始处继续查找吗？

向下的查找已达到指定范围的结尾。可选择从查找范围的开始处继续查找，或取消并改变查找范围。


无Select Case而使用了End Select

使用了无相应Select Case语句的End Select语句。这常常是由于Select Case块后有多余的End Select，或在模块间拷贝Select Case 块时丢下了End Select 语句。请检查每个End Select 语句是否结束了一个Select Case 结构。


无With而使用了End With

使用了无相应With语句的End With语句。请检查With...End With结构内部的其它控制结构是否正确匹配。例如，With...End With结构内没有End If的If语句将导致本错误。


访问系统登记项错误

系统的登记项数据库已损坏。请再次运行宿主应用程序 的安装程序。


加载DLL时发生错误(错误码48)

无法加载指定的动态链接库(DLL)。这常常是由于Declare 语句的Lib 从句所指定的文件不是有效的DLL。

可能的原因:

�	该文件不是DLL可执行文件。

�	该文件不是Microsoft Windows DLL。

�	该文件是与Microsoft Windows保护模式不兼容的旧的Microsoft Windows DLL。

�	该DLL引用了另一个不存在的DLL。

�	该DLL或被引用的DLL之一不在指定的路径中。


Exit Do不在Do...Loop结构内

在Do...Loop 语句外部使用了Exit Do 语句。应保证Exit Do 之前存在有效的Do 语句。


Exit For不在For...Next结构内

在For...Next语句外部使用了Exit For语句。应保证Exit For之前存在有效的For语句。


在Sub或Property中不能使用Exit Function

应对此类过程使用适当的Exit 结构。


在Sub或Function中不能使用Exit Property

应对此类过程使用适当的Exit 结构。


在Function或Property中不能使用Exit Sub

应对此类过程使用适当的Exit 结构。


需要数组

指定的语法适用于数组，但在作用域中没有该名称的数组。


需要End Function

应对此类过程使用适当的End语句。


需要End Property

应对此类过程使用适当的End语句。


需要End Sub

应对此类过程使用适当的End语句。


需要End With

应对此类结构使用适当的End语句。


需要函数或变量

此语句的语法需要变量或函数调用，但该名称并非所知的变量或函数。请检查该名称的拼写。而且，应保证以该名称命名的任何变量或函数在程序中引用它的地方是可见的。例如，如果函数定义为Private 或变量未定义为Public，它们仅在自己所属的模块中可见。


需要过程，而非模块

当前作用域中没有以此为名称的过程，但有以此为名称的模块。请检查过程名的拼写，且应保证要调用的不是其它模块的私有过程。


需要过程，而非方案或库

当前作用域中没有以此为名称的过程，但有以此为名称的方案。请检查过程名的拼写，且应保证要调用的不是其它模块的私有过程。


需要过程，而非自定义类型

当前作用域中没有以此为名称的过程，但有以此为名称的自定义类型变量。请检查过程名的拼写，且应保证要调用的不是其它模块的私有过程。


需要过程，而非变量

当前作用域中没有以此为名称的过程，但有以此为名称的变量。本错误也可能由错误拼写了有效的过程名而引起，因为此时错误拼写的过程名可能被当作隐式定义的变量。请检查过程名的拼写，且应保证要调用的不是其它模块的私有过程。


需要Sub或Function

此语句的语法需要Sub或Function过程引用，但指定的名称并非当前作用域中可见的Sub或Function。注意如果过程定义为Private，旧仅能在其所属的模块中调用。


需要自定义类型，而非方案

当前作用域中没有以此为名称的自定义类型，但有以此为名称的方案。请检查自定义类型名的拼写，且应保证该自定义类型不是其它模块的私有自定义类型。


需要变量或过程，而非模块

当前作用域中没有以此为名称的变量或过程，但有以此为名称的模块。请检查变量或过程名的拼写，且应保证要引用的不是其它模块的私有变量或过程。模块名可作为限定词，但不能单独使用。


需要变量或过程，而非方案

当前作用域中没有以此为名称的变量或过程，但有以此为名称的方案。请检查变量或过程名的拼写，且应保证要引用的不是其它模块的私有变量或过程。方案名可作为限定词，但不能单独使用。


需要: <不定>

语法中所需的某部分未找到。本错误通常定位在选定项目的左边，但并非总是显而易见的。例如，可以带或不带Call关键字来调用Sub过程。但一旦使用了Call关键字，就必须把参数括在圆括号里。

下面描述了发生本错误的一些情况:

�	需要:语句的结尾 [image] 例如，如果函数调用指定了参数，就必须使用圆括号。同样，如果使用了Call关键字调用Sub过程，就必须把参数括在圆括号里。

X = Workbook.Add F:= 5	' 由于没有括号而产生错误。

Call MySub 5	' 由于没有括号而产生错误。

�	需要: ) [image] 例如，函数调用不能单独使用，必须用在表达式中。同样，如果调用有若干参数的Sub 过程，且用圆括号把参数括了起来，就必须使用Call关键字。

Workbook.Add (X:=5, Y:=7)	' 无表达式的函数调用。

YourSub(5, 7)	' 无Call而引用Sub。

�	需要: 表达式 [image] 例如，当从对象浏览器中粘贴代码时，可能忘记了向命名参数赋值。

Workbook.Add (X:= )	' 由于未向命名参数赋值而产生错误。

�	需要: 变量 [image] 例如，限制性关键字不能用作变量名。下例中，Input # 语句需要变量作为第二个参数。因为Type 是限制性关键字，不能用作变量名。

Input # 1, Type	' Type关键字非法地用作了变量名。


未定义的外部名称

方括号中指定的标识符对宿主应用程序无意义。


文件已存在(错误码58)

运行时，在新文件名(例如，在Name语句中指定的文件名)与已存在的文件名相同的情况下发生本错误。使用“另存为”保存某已加载方案时，如果方案名已存在，也发生本错误。


文件已打开(错误码55)

可能的原因:

�	对某已打开的文件执行了顺序输出模式的Open语句。

�	某语句(例如Kill、SetAttr或Name)指向已打开的文件。


不再支持的文件格式

并非所有的文件格式在所有的环境下都可读。例如，可能早先版本的Visual Basic的模块必须转换为文本格式才能加载到新版本的Visual Basic中。


文件未找到(错误码53)

运行时可能产生本错误的原因:

�	某语句(例如Kill、Name或Open) 指向不存在的文件。

�	试图调用动态链接库(DLL)中的过程，但找不到Declare语句的Lib从句所指定的库文件名。

在开发环境中，如果试图打开不存在的方案或文本文件时产生本错误。


固定数据或静态数据不能大于64K

可能的原因:

�	试图分配超过64K的模块级数据。注意虽然模块级数据的大小上限为64K，但模块级变长字符串和变长数组可超出此限。

�	试图在模块中分配超过64K 的静态过程级数据。所有过程的静态变量的总和不能超过64K(而非每个过程64K)。注意静态的变长字符串和变长数组可超出此限。

�	自定义类型的大小(即其中各元素大小之和)不能超过64K。

�	虽然变长字符串可超过65,464，但过程中声明的定长字符串不能超过此限。


For结构的控制变量已在其它地方使用

当嵌套使用For...Next循环时，必须对每个循环使用不同的控制变量。例如，如果外部循环使用For Count = 1 To 25，内部循环就不能再把Count用作控制变量。请检查重复的嵌套循环。


For Each的控制变量必须是Variant或Object

对于集合，For Each 语句的控制变量或element 部分可以是Variant和Object 数据类型。对于数组，For Each 语句的控制变量或element 部分必须是Variant 型变量。


For Each的数组控制变量必须是Variant

对于数组，For Each 语句的控制变量或element 部分必须是Variant 型变量。


For Each不能用于自定义类型数组

For Each结构仅对集合或内部类型的数组(包括对象数组)是有效的。


For Each循环仅能用于集合对象或数组上

For Each结构仅能用于集合或数组。请检查要在其上进行循环操作的项目的拼写，应保证其为集合或数组。


For循环未初始化(错误码92)

跳转到了For...Next循环体内。建议不要在For...Next循环体内放置行标志。


没有Next的For语句

使用了无相应Next语句的For语句。请检查外部For...Next结构中是否有不正确匹配的内部For...Next结构。


向前引用了自定义类型

可能的原因:

虽然自定义类型通常可嵌套在另一个自定义类型中，但不能将自定义类型嵌套在自身内。如果将某类型嵌套在另一个类型中，而该类型中已声明了第一个类型，就会间接发生这种情况。请检查每个嵌套类型定义以排除重复情况。

可能在自定义类型定义之前就用该类型声明了变量。下例中，变量OtherVar在其类型(OtherType)定义之前就声明了:

Type MyVar

OtherVar As OtherType

End Type

Type OtherType

WholeVar As Integer

RealVar As Double

End Type


处于赋值语句左边的函数调用的返回值须为Variant或Object

仅当函数的返回值为对象或Variant时，该函数调用可出现在赋值语句的左边。如果返回值是对象或包含对象的Variant，将赋值于对象的缺省属性。如果返回的Variant不是对象，赋值语句没有效果。


标识符太长

标识符不能超过255 字符长。


光标下的标识符并非过程名

试图查看某过程，但处于插入点上的标识符不是过程名。请检查该标识符的拼写。


不正确的DLL版本

Visual Basic动态链接库(DLL)的版本与此宿主应用程序所需要的版本不匹配。程序试图调用DLL中的例程，但该库的版本与Visual Basic或宿主应用程序的版本都不一致。


不正确的OLE版本

OLE动态链接库(DLL)的版本与此宿主应用程序所需要的版本不匹配。在Microsoft Windows中，应用程序查找DLL时，首先在当前目录，其次在设定的路径中，然后在WINDOWS\SYSTEM目录下。如果查找时老版本的OLE DLL先于宿主应用程序所需的DLL被发现，将产生本错误。若要两个版本的DLL都使用，必须把适当的版本放在相应应用程序的目录下。在Macintosh即上，OLE文件一般仅放在扩展文件夹中，故不常发生这类错误。


输入超过了文件结尾(错误码62)

Input #或Line Input #语句正在从已经全部读完数据的文件或空文件中读取。要避免本错误，可用EOF函数(紧靠在Input #语句之前)检测文件结尾。


内存不足，无法保存“撤消操作”信息

执行了这次编辑后，不能选择“撤消操作”来恢复到当前状态。该编辑可能太大故而无法保存。可试一下较小规模的编辑。


内部错误(错误码51)

Visual Basic产生了内部故障。请联系Microsoft Product Support Services，向其报告出现此消息的条件，除非本错误是由Error语句产生的。


无效存取模式

Open语句中指定了对指定文件类型非法的存取模式。

可能的原因:

�	试图为Input而打开文件，但指定了非法存取模式。打开输入文件时可以不指定存取模式，但如果要指定就必须为Read。为Input而打开文件时Write和ReadWrite 都是非法的存取模式。

�	试图为Append打开文件，但指定了非法存取模式。为追加而打开文件时可以不指定存取模式，但如果要指定就必须为Write。为Append而打开文件时Read和ReadWrite都是非法的存取模式。

�	试图为Output打开文件，但指定了非法存取模式。打开输出文件时可以不指定存取模式，但如果要指定就必须为Write。为Output而打开文件时Read和ReadWrite都是非法的存取模式。


无效的过程调用(错误码5)

参数可能超出了允许的取值范围。例如，Sin函数只接受特定范围内的值。小于2147483648 的正值是允许的，2147483648 将产生错误。

如果试图调用在当前平台上无效的过程，也将产生本错误。例如，某些过程可能仅适用于Macintosh，或Microsoft Windows，或其它。


Sub或Function内有无效属性

例如，不允许在过程体内使用Public和Private属性。


无效字符

该字符不能用在当前上下文中。例如，括号和连字号不能用在变量名中。


无效数据格式

从文件中读取的数据没有所需的格式。例如，方案文件或对象库文件不是损坏了就是其格式无法识别。可能试图将.EXE文件加载到模块中。

可能使用了“工具”菜单的“引用”对话框和“浏览”对话框增加了对某文件的引用，但该文件不是有效的对象库，或宿主应用程序不支持该文件包含的Basic方案的格式。例如Excel不能理解.BAS或.FRM文件，或Microsoft Project的包含Basic代码的文件。


常量的数据类型无效

常量不能是数组、对象或自定义类型。


在“即时”窗格中无效

“即时”窗格中并不能使用所有的语句。

可能的原因:

�	声明性语句，诸如Const, Declare, Deftype, Dim, Function, Option Base, Option Explicit, Option Compare, Private, Public,属性过程声明语句(包括Property Let, Property Set, Property Get), ReDim, Static, Sub,及Type不能用在“即时”窗格中。

�	某些控制流语句，例如Sub, Function, Property, GoSub, GoTo, Return, Resume等不能用在“即时”窗格中。

�	“即时”窗格中物理上分开的代码行之间没有逻辑联系，故多行格式的语句(例如块If语句)不能正常执行。但这样的语句可敲入单一物理行，只要语句之间用冒号(:)隔开。相反地，使用续行符，即空格加下划线( _)，可在“即时”窗格中将一条语句扩展到多个物理行。

�	试图在“即时”窗格中运行的代码使程序的当前状态成为无效，必须重新初始化程序。


在过程中无效

该语句不能出现在Sub或Function过程中。Declare, Deftype, Private, Public, Option Base, Option Compare, Option Explicit, Option Private,及Type不能放在过程中。


定长字符串的长度无效

定长字符串最长可达65,529个字符。变长字符串可超出此限。


Next引用的控制变量无效

Next从句指定的控制变量名与所匹配的For从句所使用的控制变量名不同。如果嵌套使用For循环，从最里面的循环开始检查以保证每个Next从句正确地匹配其For从句。


无效的或未限定的引用

以句点打头的标识符仅在With块内是有效的。


无效序数(错误码452)

所调用的动态链接库(DLL)用#num语法使用数字而非过程名。然而，无法将表达式num转换为序数，或给定的num并未指定DLL中任何函数。应保证该表达式代表有效的数字，或以名称调用该过程。


在过程之外无效

该语句必须出现在Sub或Function，或属性(Property Get, Property Let, Property Set)过程之内。可执行语句，Static和ReDim语句只能用在Sub或Function过程内。在模块级，只能使用注释和声明性语句，例如Const, Declare, Deftype, Dim, Option Base, Option Compare, Option Explicit, Option Private, Private, Public,及Type。Sub、Function和Property语句出现在其过程体之外，但在其过程声明之内。


ParamArray的用法无效

ParamArray关键字仅适用于过程声明的最后一个参数。它不能与ByVal、ByRef或Optional共用于同一参数。


无效的模式字符串(错误码93)

查找的Like操作中所指定的模式字符串无效。无效的字符列表表达式的普通例子是[a-b ，此处缺失了右边的括号。


无效过程名

试图定义过程，但该过程使用的名称已被宿主应用程序用于其它目的。例如，如果宿主应用程序是Microsoft Excel，就不能定义名为R1C1的过程，因为该标识符已由Microsoft Excel使用了。


无效的限定词

限定词必须标识某方案、模块、对象或自定义类型变量。


无效的ReDim

如果未指定变量的类型，缺省类型为Variant。如果变量隐式地声明为Variant，而又试图用ReDim 将其改为数组，将发生本错误。如果试图ReDim一个宿主对象，该对象是某类型库的成员或只能在运行时被Visual Basic识别，也将发生本错误。


无效的类型声明字符

不能把类型定义字符附加到用Private、Public或Static语句与As从句定义的变量之后。同样，不能把类型声明字符附加到不一致的直接量之后。例如，由于&是Long型变量的类型声明字符，将其附加到其它类型的直接量会导致本错误:

10.253&


非法使用Null (错误码94)

试图从等于Null的Variant变量或表达式获取值。Null是Variant的子类型，用以表示某数据项不包含有效数据。例如:

MyVar = Null

For Count = 1 To MyVar

. . .

Next Count


非法使用对象

试图以一种无效方式使用对象。例如，可能试图将Nothing赋值给对象变量以中断其对对象的引用，但丢掉了Set关键字:

MyObject = Nothing

省略Set关键字表示隐式地使用Let，这将导致进行值的赋值操作，而非引用的赋值。Nothing不能用于值的赋值。假定MyObject为对象，必须用Set语句将其赋值为Nothing:

Set MyObject = Nothing

试图将Nothing用于表达式中时也将产生本错误:

Debug.Print 5 + Nothing


无效的监视表达式

指定的监视表达式不是有效的表达式。该监视表达式可能有语法错误。注意监视表达式的语法与被监视的表达式所在方案的语言环境有关。


行标志未定义

被引用的行标志或行号(例如在GoTo语句中)在该引用所在的作用域中未定义。


语言/国别设定已改变

正在修改Visual Basic环境的缺省语言/国别设定。


代码行太长

Visual Basic代码的物理行长度可达1023个字符。可用续行符(空格加下划线)连接物理行以创建更长的逻辑行。最多可将十个物理行用续行符连接为一个逻辑行。这样，逻辑行最多可包含10230个字符。若超出该范围，就必须将该行分为单独的语句，或将某些表达式的值赋给中间表达式。


使用了没有Do的Loop语句

Do循环必须用Do语句打头。可能在某循环块中嵌套了另一个未结尾的循环块。请检查是否使用了正确Do...Loop语法。


LSet仅能用于字符串和自定义类型

LSet用于左对齐定长或变长字符串。LSet也可用于将某自定义类型变量的元素赋值给另一个兼容的自定义类型变量。


此处不能使用LSet

不能把LSet用于包含字符串、对象或变体型的自定义类型变量。


Err, Erl 函数

返回错误状态。

语法

Err

Erl

注释

错误产生后，Err 函数返回代表运行时 错误代码的数字，标识该错误。Erl 函数返回产生错误的代码行的行号 ，或该行之前最靠近该行的有行号的代码行的行号。

因为只有错误产生后Err和Erl才返回有意义的值，所以它们常在错误处理例程中用于决定发生了何种错误并采取何种行动。在任何形式的Resume 或On Error 语句之后，或者在错误处理例程中的Exit Sub 或Exit Function 语句之后，Err 和Erl 都重置为0。

警告   如果用On Error GoTo 启动了错误处理例程，而该错误处理例程又调用了另外一个过程，Err 和Erl 的值可能会重置为0。为防止该值改变，可在调用其它过程或执行Resume, On Error, Exit Sub, Exit Function, 或Exit Property语句之前将该值赋给某变量。

可用Err语句直接设置Err函数的返回值。可用Error语句间接设置Err和Erl的返回值。

Erl 函数仅返回行号，而非行标志，表示产生错误的代码行或该行之前的代码行。大于65,529 的行号被当作行标志，不能被Erl返回。如果过程没有任何行号，或产生错误的代码行之前没有任何行号，Erl 返回0。


Err 语句

将Err 设置为指定的值。

语法

Err = errornumber

元素

errornumber参数可以是任何合法的错误代码或0，0表示无运行错误产生。

注释

Err 用于记录是否产生了运行错误并标识该错误。可用Err 语句将Err 设置为非零整数值以在过程之间交换错误信息。例如，可将某未分配的运行错误代码用作特定应用程序的错误代码。要获知哪个错误代码正被使用，可用Error 函数，Error 语句或两者都用。为避免与现存的错误代码冲突，请从65,535 开始向下创建自定义错误代码。

使用任何形式的Resume 或On Error 语句或者在错误处理例程中执行Exit Sub 、Exit Function 或Exit Property 语句，也可以把Err 设置为0 。另外，Error 语句可将Err 设置为任何值以模拟任何运行错误。


Error 函数

返回相应于给定错误代码的错误信息。

语法

Error[(errornumber)]

元素

errornumber参数可以是任何合法的错误代码。如果errornumber未定义，将产生错误。如果省略，返回相应于最近的运行时 错误的错误信息；如果没有运行错误产生，Error 返回零长度字符串("")。

注释

可用Err 函数返回最近发生的运行错误的错误代码。


Error 语句

模拟错误的产生。

语法

Error errornumber

元素

errornumber 可以是任何合法的错误代码。

注释

如果errornumber已定义某错误的代码，Error语句模拟该错误的产生；亦即，它将Err的只设置为errornumber。

要定义自己的错误代码，应使用大于任何标准错误代码的数字。为避免与现存的错误代码冲突，请从65,535 开始向下创建自定义错误代码。

如果执行了Error 语句，而又没有任何错误处理例程激活，则显示一错误信息并停止程序。如果Error 指定了未定义的错误代码，则显示一错误信息。


On Error 语句

激活错误处理例程并指定该例程在过程内的位置；也可用于禁止错误处理例程。

语法

On Error GoTo line

On Error Resume Next

On Error GoTo 0

元素

On Error 语句的语法可有下列形式:

语句	描述

On Error GoTo line 	激活从line开始的错误处理例程，line 可以是任何行标志 或行号。从而，如果产生运行错误，控制转移到line。指定的line 必须与On Error 语句处于同一过程中，否则会产生编译时 错误。

On Error Resume Next	运行错误发生时，控制转移到紧接在发生错误的语句之后的语句。也就是说，继续执行。

On Error GoTo 0	在当前过程中禁止任何已激活的错误处理例程。

注释

如果不使用On Error 语句，任何运行时 错误都是致命的；亦即，产生错误信息并停止执行程序。

如果在错误处理例程执行期间(从错误的发生到执行Resume, Exit Sub, Exit Function, 或Exit Property 语句)产生了错误,当前过程的错误处理例程不能处理该错误。如果上一级过程有激活的错误处理例程，控制将返回到上一级过程并由上一级过程的错误处理例程处理该错误。如果上一级过程的错误处理例程也处于执行期间，控制将一直向上转移直至找到一个未处于执行状态的错误处理例程。如果未找到未处于执行状态的错误处理例程，该错误将成为致命的。每次错误处理例程把控制传回上一级过程，上一级过程就成为当前过程。一旦错误被任何过程中的错误处理例程所处理，程序将在当前过程中由Resume 语句指明的位置恢复执行。

注意错误处理例程并非Sub 或Function 过程。它是用行标志或行号标识的代码块。

错误处理例程根据Err 中的值决定错误发生的原因。错误处理例程应当在其它错误可能发生前或调用可能导致错误的过程前测试或保存该值。Err 中的值只反映最近的错误。可用Error 函数返回与Err 返回的错误代码相关联的错误信息。

On Error Resume Next 导致程序由产生错误的语句的下一条语句继续执行，或由包含错误处理例程的过程之外的最近一次调用的下一条语句继续执行。这样，就允许程序不理睬运行错误而继续执行。从而就可以用过程建立错误处理例程，而非将控制转移到过程中的另一处。

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语句之前，从而与普通过程流分开。这只是一种可行的解决方式；错误处理例程可放在过程中的任何地方。


Resume 语句

错误处理例程结束后恢复程序的执行。

语法

Resume [0]

Resume Next

Resume line

元素

Resume 语句的语法可有下列任一种形式:

语句	描述

Resume [0]	如果错误发生在错误处理例程所在的过程，程序在产生错误的代码行恢复执行。如果错误发生在另一过程，程序在包含错误处理例程的过程之外的最后一次调用的语句处恢复执行。

Resume Next	如果错误发生在错误处理例程所在的过程，程序在产生错误的代码行的下一条语句恢复执行。如果错误发生在另一过程，程序在包含错误处理例程的过程之外的最后一次调用的语句的下一条语句处恢复执行。

Resume line	程序在line(行标志或行号)处恢复执行，参数line 必须与错误处理例程处于同一过程。

注释

如果在错误处理例程之外使用Resume 语句，将产生错误。

如果在错误处理例程执行期间，没有Resume语句就到了过程的结尾(End Sub, End Function或End Property 语句)，将产生错误，因为此时可推定已无意间造成了逻辑错误。然而，如果在错误处理例程中遇到Exit Sub, Exit Function或Exit Property 语句，将认为是有意的控制流转移而不产生错误。


已达到列表最大项目
�_已达到列表最大项目

已达到监视窗格可容纳的最大监视项目数。


成员未定义

集合，对象或用户自定义类型未包含所引用成员defMember  对象名或成员名误拼。或错误引用了一个超界的集合下标。  检查Count 属性，确定集合成员存在。检查Type...End Type 语句或对象文档，确定成员和成员名，对象名是否正确拼写。


缺少结束括号

括号必须匹配。


未找到模块

在指定方案中未找着所需模块。例如，当MyModule 在方案MyProject不可见时，下列代码会产生本错误：

MyModule.SomeVar = 5


必须为一行中的第一个语句

 Sub, Function, 和 Property 语句必须为所在行中的第一个语句。此外, End If, Else (当 在 If 块结构中使用),和 ElseIf 必须为所在行第一个语句方可被使用。


和已存在模块名，方案名或对象库名冲突。

方案中已引用了同名的模块，方案或对象库，所以不能加入重复的引用。工具菜单的引用对话窗中文件名没有包含路径，所以不同目录下具有相同文件名的文件不能被区分。文件扩展名不作为文件名的一部分，所以不同的扩展名不能用来区分文件。为加入不能加入的文件，请将文件改名。

当试图引用与当前方案中模块重名的方案或库（不含扩展名），本错误也会发生。在这种情况下，可以将模块或文件改名。


已指定了命名参数

当使用命名参数时，在参数表中只能使用一次。例如，如果方案MySub需要命名参数Arg1,Arg2，如下两次调用会产生此错误。

Call MySub(1, Arg1:=3)

Call MySub(Arg1:=3, Arg1:=5)


不允许使用命名参数

在不允许使用命名参数的地方使用命名参数 例如

�	 MyVar2 是 Property Let 或 Property Set 过程:

MyVar1 = MyVar2(myNamedArg := 1)	'对于 Property Let 或

'Property Set 过程无效。

�	MyVar2 是 数组:

MyVar1 = MyVar2(myNamedArg := 1)	'对数组无效。

�	 MyVar2 是对象:

MyVar1 = MyVar2(myNamedArg := 1)	'对对象无效。

�	 MyVar2 是外部名称:

MyVar1 = [MyVar2](myNamedArg := 1)	'对外部名称无效。

�	MyVar2 是对象的数据成员:

MyVar1 = [MyVar2](myNamedArg := 1)	'对数据无效。


没有找到命名参数(错误448)

过程不能接收指定的命名参数。检查参数名的拼写。.


使用Next 却没有相应For

找不着与 Next 语句相对应的 For 语句。  检查For...Next 结构中的其他控制结构，以确正是否正确匹配。  例如，在For...Next 结构IF ,END IF 不匹配会产生本错误。


没有选中任何文本

执行本操作时必须选中文本。  把光标置于所要选择文本开头，按住SHIFT 键，使用光标键或用鼠标点所选文本末尾。


没有选择监视表达式

使用实时监视时选中一 表达式 。选择实时监视前，选定代码窗格口监视表达式 。


对象不支持当前场所配置(错误447)

试图使用的对象不支持当前方案的场所配置。例如，如果当前方案的场所配加拿大法语，则试图使用对象必须支持场所配置。检查对象支持的场所配置。

此外，对象有可能依赖于动态连接库的语言支持，(DLL), 例如OLE2NLS.DLL.  入果是这样,需要能够支持当前方案场所的最新版本


对象不支持命名参数(错误446)

当使用对象所含方法时，对象按位置不同，指定方式不同。参考对象文档，察看参数位置和类型的详细说明。


对象不支持本操作(Error 445)

对象不支持此方法或属性。参考对象文档，察看对象的详细说明并检查属性和方法的拼写。


对象库没有登记

试图加载Visual Basic对象库(VBAXX.OLB) 或 宿主应用程序 对象库。但是，系统登记项中找不着这些对象库的正确语言版本。为解决此问题，在Windows 目录或优先文件夹下删除VBA.INI文件,重新运行应用程序。


对象并非集合(错误451)

指定了集合特有的运算符或属性，但对象并非集合。检查对象名和属性名的拼写，或证实对象是集合。


通过ByVal得到的对象不能通过ByRef传给另一过程

对象通过ByVal (值传送)传给一过程, 而试图通过引用(ByRef,缺省方式)传给另一过程。例如：

Sub FirstOne(ByVal MyObject As Object)

NextOne MyObject

End Sub

Sub NextOne(ThisObject As Object)	' Note that default is ByRef.

. . .

End Sub

如果对象通过ByVal一过程，当传给另一过程时，必须采用 ByVal方式。如果接受对象的过程指定ByRef类型的对象次数，可在调用时指定ByVal参数传送方式。例如：

Sub FirstOne(ByVal MyObject As Object)

NextOne ByVal MyObject	' Override potential conflict.

End Sub


需要对象(错误424)

指定了对象属性或方法，却没有提供有效的对象标志符。


没有设置对象变量(错误91)

使用的对象变量没有引用有效的对象，或者对象变量设定为Nothing。为对象变量设定或重设定引用。例如，当下列代码中省略Set语句时，会产生本错误。

Dim MyObject As Object	' Creates object variable.

Set MyObject = Sheets(1)	' Creates valid object reference.

MyCount = MyObject.Count	' Assigns Count value to MyCount.


OLE自动化错误(错误440)

当使用对象变量的方法或访问对象变量属性时产生此错误。由生成该对象的应用程序报告错误。


对象不支持这个属性或方法。(错误438)

OLE自动化对象不包含这个属性或方法。查看对象文档并检查属性和方法的拼写。


在End Sub, End Function, or End Propert后只能跟注释

可执行代码不能在过程外。过程外任何非说明行前必须有注释分隔符(’)。说明性语句必须第一个过程声明前出现。代码执行时，注释被忽略。


可选参数必须是Variant类型

只有Variant类型变量是可选的。把所有可选参数改成Variant类型。


内存用完(错误7)

需要的内存比所能得到的多，或已达到64K的段边界。为防止此错误，试用下列方法：

�	关闭内存中所有不需要的应用程序，文档或源文件。

�	如果有特别大的模块或过程，考虑将其分为较小的块。这并不能节约内存，但可防止达到64K段边界。

�	如果在80386或80486计算机上以实模式运行Windows,用增强模式运行。

�	如果使用Microsoft Windows增强模式,释放一些硬盘空间，或至少确信有可用硬盘空间。

�	清除内存驻留程序。

�	清除不需要的设备驱动程序。

�	减少全局变量数目。


内存不够;一些监视项可能已被删除

当系统内存不够时，监视表达式被删除，从而获得足够内存以恢复。将不必要的成分从内存中删除，包括不必要的应用程序、方案、模块。


资源耗尽

句柄这样的资源，在许多操作的内部使用。代码可能已耗尽资源。保存、关闭、重加载代码。如果错误依然存在，减少代码中引用的对象数目。


堆栈溢出(错误28)

可能原因：

�	过多的Function或Sub调用。检查总的递归过程是否嵌套过深，是否正确终止。

�	局部变量需要比可获得的局部变量空间更多的空间。试着在模块级 定义变量。可在Property, Sub, 或 Function关键字前，用Static定义过程中所有静态变量。或可在过程中用Static语句分别定义静态变量。

�	固定长字符串比可变长字符串占据更多的堆栈空间。将部分固定长字符串重定义为可变长字符串。

�	嵌套了过多DoEvents语句。

使用调用对话框查看那个过程是活动(堆栈上)。要显示对话框，在调试窗口中选择过程框右边的按钮。


字符串空间不够(错误14)

系统用完了内存，造成无法给字符串分配空间。类似地，需要创建临时字符串以赋值的表达式也会产生此错误。例如，下列代码会产生字符串空间不够的错误。

MyString = "Hello"

For Count = 1 To 100

MyString = MyString & MyString

Next Count

Visual Basic最多可分配长达65,535个字节的字符串。然而在执行时，宿主应用程序需要使用一些字符串空间用于前导支持。前导支持所需空间随主机不同而不同，但不会超过50字节。如果需要分配特定机器所能支持的最大字符串，将最大字节数减去50，而后逐渐增加长度直至错误再度出现。错误出现前的值即是 特定机器的最大字符串长度。

Dim MyString As String * 65485	' 从(65535-50)开始。

' 在后续执行中，增加长度直至�字符串

'空间用完�的错误出现。

Sub MySub

MyString = "string"	'当超过最大长度时，错误出现。

End Sub


溢出(错误6)

可能原因:

�	赋值，计算，或数据类型转换结果超过变量类型可表达的范围。

�	对属性的赋值超过属性可接受的最大值。


参数队列必须被声明为Variant数组

在ParamArray中可提供任意数目的参数，但过程必须被定义为带ParamArray参数，且参数为Variant类型。当被调用时，调用时所提供参数成为Variant数组中的对应元素例如：

Sub MySub(ParamArray VarArg())

. . .

End Sub

Call MySub ("First arg", 2, 3.54)


未找到路径(错误76)

在文件操作或磁盘操作中，(例如, Open, MkDir, ChDir, 或 RmDir), 操作系统不能找到指定路径。在调试环境中，如果试图打开带有无效路径的方案或文本文件时，也会产生此错误。检查路径是否正确输入。


路径／文件访问出错(错误75)

在访问文件或磁盘的操作中，(例如，Open, MkDir, ChDir, 或RmDir),操作系统不能连接路径和文件名。

检查文件指定格式是否正确。文件名可包含全路径名或相对路径名。全路径名包括驱动器名（如果路径另一驱动器上）且明确指明从根目录到文件的路径。相对路径相对于当前驱动器和目录而言。

当试图覆盖已存在的只读文件时，错误也会出现。


请求驳回(错误码 70)
请求驳回(Error 70)

试图写已写保护的盘或访问加锁文件。例如，在一写保护文件上使用Open For Output 语句时会出错。


过程类型没有匹配

在需使用Function 过程处使用了Property 过程，反之亦然。


没有找到过程

指定的过程名没有找到。


属性或方法没有找到(错误423)

Object.method 或 object.property 被引用，但method、property没有定义,或对象名拼写错误。若要查看对象定义的属性和方法，从视图菜单中选择对象浏览器 。选择适当的库和对象以显示属性和方法。


在模块作用域中不允许标志名

在模块级.中只允许声明。


标志符必须是集合

感叹号（！）左边的名字不是集合的名字。检查名字是否拼写正确。


取值范围错误

错误地指定数组边界。例如，下列取值范围无效：

Dim MyArray(10 to -5)

Dim MyArray(0 to 0)

检查语法的正确性。例如，下列取值范围是有效的：

Dim MyArray(-5 to 10)


重新开始却没有错误(Error 20)

在错误处理例程代码外，或当前没有任何活动的错误处理例程情况下，遇到重新开始开始的语句。


Return 和 GoSub不匹配 (错误3)

Return 语句没有相对应的GoSub 语句。  与For...Next， While...Wend， 和Sub...End Sub 等在编译中匹配不 同， GoSub 和 Return 在运行中匹配。


RSet 只能在字符串中使用

RSet 用来右对齐定长或变长字符串。与LSet不同， RSet 不能用来将用户自定义类型变量的元素赋给一个不同，但兼容的用户自定义类型。


运行出错<数目>:

用户自定义错。


搜索字符串太长或太复杂

指定的搜索字符串或者太长，或者指定指定通配符的联合不能理解。


没有指定搜索字符串

没有可供比较的字符串，搜索操作不能进行。必须指定字符串。


搜索文本没有找到

在指定搜索范围内，没有找到匹配的文本。如果想继续搜索，扩大搜索范围。在使用模式匹配表达式时，没有提供右括号也会出现此错误。


Seek失败，不能读写磁盘

Seek 语句直接访问磁盘。如果磁盘写保护、只读、加锁，或找不着（例如，软盘已被换过），Seek 语句将失败。检查文件状态和物理盘的状态。在试图读已崩溃的方案文件或类库时，这种错误有时也会出现。


Select Case与End Select不匹配

 Select 语句没有对应的End Select 语句。检查在 Select...End Select 结构内部是否有不 匹配的Select...End Select 结构。如果嵌套 Select Case 语句，每个必须有相对应的 End Select语句。


所选监视表达式无效

选择了实时监视，但所选的表达式不是有效的表达式.。  例如，不能监视注释或Sub 过程调用。该监视表达式 必须有和包含被监视表达式的方案场所相对应的代码语法。


Set 不能给ByVal Variant 类型参数或ByVal 对象参数赋值

Set 不能和指定为ByVal 类型的参数或参数 连用。


需要SHARE.EXE

运行Visual Basic 时，必须运行SHARE.EXE 。为解决这个问题，关闭应用程序，运行SHARE.EXE，重新启动应用程序。以后为避免此类问题,在Autoexec.bat 中加入Share.exe以便开机后自动启动。


未找到指定动态连接库函数(错误53)

在用户引用的库中引用到动态连接库，(DLL)，但在动态连接库内未找到指定动态连接库函数 。可能在函数声明中，指定了一个错误的序数。也有可能为动态连接库名称正确，但不是包含指定函数的那个版本。


指定的库或方案已被引用

在浏览对话框内 选了一个已被引用的类库或方案。在引用对话框内包含了引用的库和方案。


在Type 块内有无效语句block

在 Type...End Type 内只能有注释和As type从句。


Type 在块外有无效语句

试图Type...End Type 块外，或 Dim, Redim, Static, Public, Private 语句外定义变量。例如，下列代码中第一个MyVar的声明会产生此错误，但第二个MyVar 声明有效：

MyVar As Double

Type AType

MyVar As Double

End Type

The error may also be caused by an End Type occurring without a corresponding Type statement.


语句太复杂

由于语句太复杂或在语句和函数中使用了太多的函数调用，Visual Basic 无法分析该语句。把语分成几小段，或用逻辑操作符和If...Then 语句取代复杂的条件从句。先调用函数并给指定参数赋值，然后在产生本错误的语句中使用指定参数。


在 Select Case 和第一个Case间的语句或卷标无效

Select Case 语句或必须立即跟第一个Case 语句。在 Select Case 和第一个Case 从句中只能有注释。


字符串表达式太复杂(错误16)

字符串表达式太复杂。未赋给变量的字符串（就象在函数中返回一样）在字符表达式分析时被分配临时位置。大量的这类字符串会产生此错误。将字符串赋给变量后在表达式中使用这些变量。


Sub或Function没有定义(错误35)

调用没有定义的Sub， Function， 或 Property 过程。

可能原因：

�	过程名拼写错误。

�	指定过程对于当前过程不可见。定义为 Private 类型的过程不能被模块外的其他过程调用。如果Option Private Module 有效 , 该模块中的 过程不能被其他方案访问。在编辑菜单中选择寻找以定位该过程。

�	声明了一个动态连接库(DLL) 例程，但在指定库中未找到该例程。


下标超界(错误9)

引用了一个不存在的数组元素或集合元素。下标比可取的范围偏大或偏小，或在应用程序中，数组维数还没有赋值。


语法错误

Visual Basic 不能确定采取什么动作。

可能原因：

�	关键字或变量拼错。

�	标点错误。

�	过程为定义。

�	在同一过程声明中，同时指定Optional 和 ParamArray 。


参数太多

过程中指定参数超过60个。


打开的代码窗格太多

超过模块最大可观察窗口数。


维数太多

数组至多有60个维数 。维数数目受可用内存的限制。


DLL 应用程序客户太多

Visual Basic的动态连接库(DLL) 同时可接受50个访问。 减少打开的访问Visual Baisc 的应用程序数目。


 文件太多(错误67)

可能原因：

�	同时只能打开有限数目的磁盘文件。对于Microsoft Windows, 这个限制由CONFIG.SYS中的Files= 设置决定。增大数目后重新引导。

�	操作系统对根目录下的文件数目有限制（通常为512）。如果程序在根目录进行文件操作，改变程序以便在子目录下进行操作。

�	在Macintosh上,标准限制为40个文件。这个限制可通过运行实用程序修改引导区的MaxFiles 参数而改变。


续行符太多

有10个以上的行由续行符连接。将后续行变长（减少所需续行符），或把这个结构分成多个语句。


类型声明的字符和声明的数据类型不匹配

如果变量声明为一特定类型，只有相匹配的类型声明的字符可使用。类型不能通过给另一类型附加类型定义字符 来达到。


不允许类型声明字符

用As从句，和Dim,Static,Public等声明的变量不能使用类型定义字符 Boolean, Date, Object, 和 Variant 类型没有相对应的类型声明字符。


需要类型声明字符

最初用类型定义字符 声明的变量引用时缺少类型声明字符。例如：

MyStr$ = "Implicit declaration"

MyStr = "Trying to refer to MyStr$ but calling it MyStr"

注意如果变量声明中包含由类型声明字符，在以后的引用中是否包含该字符是可选的。例如：

Dim MyStr$

MyStr = "Because it was explicitly declared, the $ is optional"

最后，注意如果MyStr As 用从句明确声明，无论在定义或引用中都不能使用类型定义字符：

Dim MyStr As String

MyStr$ = "This causes a Duplicate definition error!"


类型不匹配(错误13)

可能原因：

�	变量后或属性类型错误。例如，实数型变量不能接受字符型值。

�	对象传给只需要一个属性或值的过程。

�	在需要表达式的地方使用了模块或对象名，例如：

Debug.Print MyModule

�	试图混用常规的Basic错误处理和具有错误子类型 (10, vbError)的可变值；例如：

Error CVErr(n)

�	 CVErr 值不能被转化成Date 或数字 (Integer, Long类型，诸如此类)；例如：

MyVar = CInt(CVErr(9))

运行时，此错误典型地表现为表达式中使用的Variant 有不正确的子类型。或Variant 包含出现在在Print语句中的数组。


类型不匹配：需要数组或用户自定义类型

如果参数被声明为数组或用户自定义类型（记录变量），整个数组或用户自定义类型应被作为参数传递，而不止是一个元素或一个简单的变量、值或常数。


不能读磁盘

读盘是出现一般性错误。盘可能没有格式化。如果是可移动盘，检查驱动器门。如果是软盘，检查是否正确插入。


不能写磁盘

写盘时出现一般性错误。盘可能没有格式化。如果是可移动盘，检查驱动器门。如果是软盘，检查是否正确插入。


在搜索的字符串中括号不匹配

左括号和右括号需匹配。


无法辨认方案的语言

应用程序不支持被加载方案的指定代码语言环境 。如果方案在一支持特定代码场所的系统上生成，然后被移到不支持该特定代码场所的系统上，错误会发生。例如，当前机器上的OLE2NLS.DLL 可能为旧版本，不能辨认指定代码场所。查看是否可以得到正确的对象库。


不支持对象库的特征

试图VISUAL BASIC 访问不支持的对象库数据类型或函数。与对象库的开发者联系，询问任何适当使用对象库和应使用什么工具。


用户中断(错误18)

按了 CTRL+BREAK或其他中断键。


用户定义的错误(错误95)

应用程序执行了Error n 语句，,这产生了设陷的用户定义错。如果Error st语句指定了VISUAL BASIC 没有使用的错误号，Error函数返回用户定义错误的消息。


用户定义的类型不能ByVal通过传送

用户定义的类型只能通过引用传送，除去ByVal关键字。如果为避免变化传给调用者，可Dim 生成一临时变量然后将变量传给过程。为调用前不会报告此错误。


用户定义类型没有定义

变量或参数声明为未定义的类型。使用Type语句从定义新的数据类型。


不允许用户定义类不包含任何成员

用户定义类型不能不包含任何成员元素。检查Type...End Type 语句是否有无意的注释分隔符。


未找到变量

使用的Option Explicit 语句要求明确的变量声明，但却使用了没有声明的变量。使用这个选项，可防止应用程序使用没有声明的变量，并减因创建新变量产生排版错误的可能性。


需要变量

可能原因：

�	把数字表达式传递给Len函数。Len函数不接受数字表达式，但接受字符串变量、数字变量和字符串表达式。

�	把函数调用或表达式作为参数传递给 Input, Let, Get, 或 Put。 例如，使用了一个参数，表面是对一数组的合法引用，但实际上是对同名函数的调用。这些语句不接受函数调用作为参数。

这种错误主要出现在给不能接受值的东西赋值。例如，给Sub名或表达式赋值。For 结构中的循环计数器必须是一个变量。同样地，Len可以接受数字变量作为参数，当不能接受数字和二进制数字表达式未参数。


VBA对象库未找到

和方案的语言所对应的Visual Basic对象库(VBAXX.OLB)未找到。对象库有可能丢失，或不在所期望的目录下，或版本不对。搜索磁盘，检查对象库在宿主应用程序 文档指定的目录下。

如果丢失的库是机器应用程序安装的一个语言版本，最简单的方法是重新运行安装程序。如果方案需要与机器应用程序自带对象库不同的库。（例如，得到一个在安装不同语言版本的机器上写的方案），查看方案是否正确包含了正确语言版本的Visual Basic对象库且安装在所期望的地方。

应用程序可能支持不同版本语言的对象库。要寻找所需语言版本，选择参考，然后检查对话框底部所指的语言。

对象库随平台不同而版本不同。因此，当方案在不同平台间移动，（例如，从MACINTOSH移到WINDOWS)，所引用库的正确语言版本（特定于机器）必须在机器应用程序指定的地方可以找着。

Visual Basic对象库文件名组成如下：

�	Windows:	应用程序代码+语言代码+ [版本].OLB。例如：

�	VBAFR.OLB是法语的Visual Basic对象库。

�	Macintosh:	应用程序名语言代码 [版本] OLB。例如：

�	VBA FR OLB是法语的Visual Basic对象库。

如果找不到缺少的库或方案，与引用方案的作者联系。如果缺少的库Microsoft是应用程序对象库。可通过下列途径获得：

�	如果你可以访问Microsoft电子技术支持服务，参考帮助文件中的技术支持部分。在电子服务下，可以找到关于使用各种选择项的指导。

�	如果不能访问Microsoft电子技术支持服务，Microsoft对象库可通过申请得到。在帮助文件的技术支持部分，也可以当地Microsoft产品经销商联系的方法。


警告：定制的语言配置不能移植

如果给代码选择了定制的语言/国家配置，代码的语言习惯和你的系统控制面板设置是一样的。可以使用定制的代码场所设置，但在不能使用不同的设置的机器上不能工作。宿主应用程序 在运行机器控制面板设置的基础上分析某些字符串。

如果目标机器控制面板设置的和生成这些代码的机器不同，机器应用程序（例如，代码依赖与场所的十进制分隔符设置）的字符串分析不能工作。因此，除非不打算将代码给他人使用，否则不要使用定制的语言设置。


Wend和While不匹配

每个Wend语句前必须有相匹配的While。检查嵌套在产生错误的While...Wend循环中没有终止的循环结构。


While和Wend不匹配

While语句没有相对应的Wend语句。检查不匹配的While...Wend结构中的While...Wend结构。


With对象必须是用户定义类型或对象

在With块中，试图使用非对象变量（或非用户定义变量）。检查是否误拼对象名或用户定义变量名。


参数数目不对(错误450)

调用时传给过程的参数数目和过程所需要的参数数目不匹配。核对过程声明和调用的参数表。


维数数目不对

用和实际所含不同的维数引用了数组啊。例如，引用了X(2,4)数组，二维数组，但它被定义为 Dim X(5)，一维数组，会产生此错误。


编辑后需重新启动程序 [image] 继续运行?

在中断模式.中不能编辑。如果选择YES，运行会终止，可编辑代码。如果选择No，可继续运行代码直至中断点。


Err, Erl 函数实例

此例示范使用Err和Erl函数的错误处理例程。如果没有其它错误，Err返回错误代码11，Erl返回行号1030。

Sub ErrDemo()

1010  On Error GoTo ErrorHandler	' 设定错误处理例程。

1020  B = 1: C = 0	' 初始化变量。

1030  A = B \ C	' 引起"被零除"错误。

1040  Exit Sub

ErrorHandler:	' 错误处理例程。

ErrorNumber = Err 	' 取得运行错误代码。

ErrorLine = Erl	' 取得行号。

Resume Next	' 在下一行继续执行。

End Sub


Err 语句实例

此例示范将Err设为0，以清除错误。为示范其用法，产生了错误55。

On Error Resume Next	' 激活错误处理。

Open "TESTFILE" For Output as #1	' 打开输出文件。

Kill "TESTFILE"	' 试图删除打开的文件。

Select Case Err	' 测试错误代码。

Case 55	' "文件已打开" 错误。

Close #1	' 关闭打开的文件。

Kill "TESTFILE"	' 删除文件。

Err = 0	' 将Err重置为0。

Case Else

' 此处处理其它情况...

End Select


Error 函数实例

此例使用Error函数打印相应于指定错误代码的错误信息。

For ErrorNumber = 61 To 64	' 从61到64循环。

Debug.Print Error(ErrorNumber)	' 向调试窗口打印错误信息。

Next ErrorNumber


Error 语句实例

此例使用Error语句模拟错误11。

On Error Resume Next	' 激活错误处理。

Error 11	' 模拟"被零除"错误。


On Error 语句实例

此例使用On Error GoTo 语句在过程中指定错误处理例程的位置。试图删除已打开的文件将产生错误55。错误处理例程处理该错误，然后控制返回到产生该错误的语句。

Sub OnErrorStatementDemo()

On Error GoTo ErrorHandler	' 激活错误处理例程。

Open "TESTFILE" For Output as #1	' 打开输出文件。

Kill "TESTFILE"	' 试图删除打开的文件。

Exit Sub	' 在错误处理例程前退出Sub。

ErrorHandler:	' 错误处理例程。

Select Case Err	' 测试错误代码。

Case 55	' "文件已打开"错误。

Close #1	' 关闭打开的文件。

Case Else

' 此处处理其它情况...

End Select

Resume	' 在产生错误的代码行恢复执行。

End Sub


Resume 语句实例

此例使用Resume语句在过程中结束错误处理，并在产生错误的语句处恢复执行。为示范其用法，产生了错误55。

Sub ResumeStatementDemo()

On Error GoTo ErrorHandler	' 激活错误处理例程。

Open "TESTFILE" For Output As #1	' 打开输出文件。

Kill "TESTFILE"	' 试图删除打开的文件。

Exit Sub	' 在错误处理例程前退出Sub。

ErrorHandler:	' 错误处理例程。

Select Case Err	' 测试错误代码。

Case 55	' "文件已打开"错误。

Close #1	' 关闭打开的文件。

Case Else

' 此处处理其它情况...

End Select

Resume	' 在产生错误的代码行恢复执行。

End Sub


焈Close语句
�_�_�_�_Close语句

包括对用Open语句打开的文件的输入/输出(I/O)。

语法

Close [filenumberlis;]

元素

filenumberlist 变量可以是一个或多个使用下列语法的文件号码，其中filenumber 是一个有效的文件号:

[#]filenumber][,[#] filenumber] . . .

注释

如果省略filenumberlis, 由Open语句打开的所有活动文件关闭。

如果关闭了用于Output或Append的文件，输出的最后缓冲区写入操作系统分配给文件的缓冲区。和关闭文件相连的文件和文件缓冲区释放。

当Close语句执行时，和文件号相连的文件结束。


EOF函数

返回值，指明已到文件末尾。

语法

EOF(filenumber)

元素

filenumber命名参数 是任何有效的文件号。

注释

使用EOF已避免试图在文件结尾后获得输入。

没有到达文件末尾时，返回False值i。在文件末尾，返回True值。当打开的文件用于 Random或Binary访问。EOF返回False值，除非执行Get语句不能读入一个完整的记录；则返回True。


FileAttr函数

返回用Open语句打开的文件的文件模式或操作系统文件句柄信息。

语法

FileAttr(filenumber,returnType)

元素

FileAttr函数语法有如下命名参数成分：

成分	描述

filenumber	任何有效的文件号。

returnType	指明返回信息的数字：1表示返回值是文件模式，2表示返回值是操作系统句柄。

返回值

当returnType是1，下列返回值指明文件模式：

值	文件模式

1	输入

2	输出

4	随机

8	附加

32	二进制


FreeFile函数

返回可被Open语句使用的下一个文件号。.

语法

FreeFile[(rangenumber)]

元素

rangenumber参数指定了返回的空闲文件号的区域。指定为0 (缺省)返回文件号在1到255区域内。指定为1返回在256到511的区域内。

注释

当需要提供一个文件号且需明确知道文件号尚未使用时，使用FreeFile。


Get语句

从打开的磁盘文件读入到一个变量。

语法

Get [#]filenumber,[recnumber],varname

元素

Get语句语法的有如下成分：

成分	描述

filenumber	任何有效的文件号.

recnumber	开始读处的记录号(Random模式文件)或字节数 (Binary二进制文件)。

varname	有效的数据读入的变量名。

注释

文件中的第一个记录/字节在位置1，第二个记录/字节在位置2，以此类推。如果省略recnumber，下一个记录/文件（最后一个Get或Put语句后的下一个，或由Seek指定的那个)，被读入。必须有用于分隔的逗号，例如：

Get #4,,FileBuffer

对于以Random打开的文件，下列规则适用：

�	如果读入的数据长度小于Open语句Len从句指定的长度，Get仍然以记录长度边界读入后续记录。一个记录加速结束和下一个记录开始之间的空间被文件缓冲区内的现有内容填充。由于填充数据数目无法确认，最好让读入数据长度与记录长度一致。

�	如果读入的变量是一变长字符串，Get读入包含字符串长度的两个字节的描述符后将数据送给变量。因此，在Open语句中Len从句指定的记录长度至少应比实际字符串长度多两个字节。

�	如果读入的变量是Variant数字类型类型，Get读入两个字节指明有关Variant的VarType后数据送给变量。例如，当读入为VarType 3的Variant 类型，Get读入六个字节：两个字节指明Variant是VarType 3 (Long)和四字节包含了Long数据。因此，在Open语句中Len从句指定的记录长度至少应比容纳所需变量的字节数目多两个字节。

�	如果读入的变量是String Variant (VarType 8)类型，Get读入两个字节指明为VarType类型,两个字节指明字符串长度，而后是字符串数据。因此，在Open语句中Len从句指定的记录长度至少应比容纳所需字符串的字节数目多四个字节。

�	如果读入的变量是其他任何类型，（不是变长字符串或Variant),Get只读入变量数据。因此，在Open语句中Len从句指定的记录长度应比读入的数据长度多或相等。

�	Get读入用户自定义数据类型的元素时，和一个个单独读入一样，只是在元素间没有任何填充。在Open语句中Len从句指定的记录长度应比读入的各个元素的字节数总和多或相等。

对于以Binary模式打开的文件,除了下列情况外，所有Random规则适用

�	在Binary模式下,Open语句中Len从句无效。Get从磁盘上连续读入各个变量，记录之间没有任何填充。

�	Get在读入非用户定义类型元素的变长字符串时不需要两个字节长的描述符。所需的字节数字符串中存在的字符数相同。例如，下列语句从文件号1中读入10个字节：

VarString = String(10," ")

Get #1,,VarString


 Input #语句

从打开的顺序文件中读入数据并将数据传给变量。

语法

Input #filenumber,varlist

元素

Input #语句语法有下列成分：

成分	描述

filenumber	任何有效的文件号。

varlist	由逗号分隔的变量表，变量接受由文件读入的数据：不能为数组或对象变量。然而，描述数组元素或用户定义类型的变量可以适用。

注释

读入时，标准的字符串或数字数据被原样赋给变量。下表描述了其他输入数据任何被处理：read, standard string or numeric data is assigned to variables as is.  The following table illustrates how other input data is treated:

数据	赋给变量的值
分隔用的逗号或空行	Empty。
#NULL#	Null。
#TRUE# or #FALSE#	True或False。
#yyyy-mm-dd hh:mm:ss#	表达式代表的日期和/或时间。
#错误errornumber#	errornumber ( Variant 类型变量标志为一个)。
输入数据中双引号(")被被忽略。

文件中的数据项必须varlist以中的变量顺序相同，且和变量数据类型匹配。如果变量是数字类型而数据不是，变量被赋予零值。

如果数据项输入时已得到文件末尾，输入终止并产生一个错误。

附注   为了正确地将数据读入一个变量，通常应用Write #语句，而不应用Print #语句将数据写入文件。使用Write #保证每个分立的数据语被正确分隔。


Input函数

从打开的顺序文件中返回字符数（字节数）。

语法

Input(number,[#]filenumber)

元素

Input函数语法有下列成分：

成分	描述

number	任何有效的数字表达式指定返回的字符个数。

filenumber	任何有效的文件号。

注释

只在文件以 Input或Binary模式打开时使用。

与Input #语句不同,Input函数返回所有读入的字符，包括逗号、回车、换行、引号和前导空格。

附注   另一个函数(InputB)用来在某些亚洲场所与双字节字符集(DBCS)配合使用。number 指定了字节数而非字符数。在DBCS没有使用的情况下，InputB和Input一样。


Line Input #语句

从打开的顺序文件中读入一行并赋给字符串变量。

语法

Line Input #filenumber,varname

元素

Line Input # statement的语法有如下成分：

成分	描述

filenumber	任何有效的文件号。

varname	有效的字符串变量 name。

注释

Line Input #语句从文件中一次读入一个字符直到遇到回车符(Chr(13))或回车换行符。回车换行的顺序被跳过，没有附加在字符串上。


Loc函数

返回打开文件的当前读写位置。

语法

Loc(filenumber)

元素

filenumber 命名参数是任何有效的文件号。

注释

下面描述了各种文件返回模式的返回值：

文件访问模式	返回值

随机	最后一次文件读写的记录号。

顺序	文件的当前字节位置除以128。

二进制	最后读写的字节位置。


Lock...Unlock语句

控制其他进程访问由Open语句打开的文件的全部或部分。

语法

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

元素

Lock和Unlock语句的语法有如下成分：

成分	描述

filenumber	任何有效的文件号。

recordrange	加锁或解锁的范围。

recordrange变量有下列语法成分：

recnumber | [start] To end

Part	Description

recnumber	加锁或解锁的开始记录号(Random 模式文件)或字节号(Binary模式文件)。

start	加锁或解锁的第一个记录号或字节号。

end	加锁或解锁的最后一个记录号或字节号。

注释

Lock和Unlock语句在多个进程同时访问一个文件时使用。

Lock和Unlock语句通常成对使用。Lock和Unlock的参数必须正确匹配。

文件中的第一个记录/字节在位置1，第二个记录/字节在位置2，以次类推。如果只指定一个记录，则只有那个记录被加锁或解锁。如果指定了一个范围而省略了开始记录，(start),从第一个记录开始到指定范围结束(end)被加锁或解锁。使用Lock而未使用recnumber锁住整个文件;使用Unlock而没使用recnumber解锁整个文件。

如果打开的文件用于顺序输入或输出，Lock和Unlock影响整个文件，而不管 start和end指定的范围。

警告   在关闭文件或终止程序前，使用Unlock语句除去所有的锁。没有除去锁会产生不可预料的结果。


LOF函数

返回用Open语句打开的文件字节大小。

语法

LOF(filenumber)

元素

filenumber 命名参数是任何有效的文件号。

注释

要获得未打开文件的长度，使用FileLen函数。


Open语句

允许对文件的输入/输出(I/O)。

语法

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

元素

Open语句的语法有如下成分：

成分	描述

pathname	字符串表达式 指定一文件名 [image] 可能包含目录、文件夹和驱动器。

mode	指定文件模式的关键字：Append, Binary, Input, Output,或Random。

access	指定在打开文件上所允许的操作的关键字：Read, Write,或Read Write。

lock	指定在打开文件上允许其他进程操作的关键字：Shared, Lock Read, Lock Write, Lock Read Write。

filenumber	在1到511范围内的有效的文件号 。使用FreeFile函数以获得下一个可用的文件号。

reclength	比32，767小或相等的数字。对于用于随机访问的打开文件，本值为记录长度。对于顺序读写文件，本值为缓冲的字符数。

注释

在进行I/O任何操作之前需打开文件。Open给I/O文件分配缓冲区并决定和缓冲区一块使用的文件访问模式。

如果具有指定pathname的文件不存在，在Append, Binary, Output,或Random模式下文件被创建。

如果文件已被其他进程打开且指定访问模式不允许，Open操作失败并产生一个错误。

如果是Binary Len模式，从句被忽略。

重要内容   在Binary, Input, 和Random模式，可以用另一个文件号打开文件而无须先关闭该文件。在Append 和Output模式,在使用另应该文件号打开文件前需关闭文件。

在Macintosh上,用Open语句打开的文件模式决定了最初的Creator 和Type属性设置。

设置：

File mode	Creator 	Type

Output	????	TEXT

Append	????	TEXT

Random	????	OBIN

Binary	????	OBIN

Unspecified	????	OBIN


Print #语句

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

语法

Print #filenumber,[outputlist]

元素

 Print #语句的语法有下列成分：

成分	描述

filenumber	任何有效的文件号。

outputlist	表达式 被输出的表达式表。

outputlist参数有语法下列和成分：:

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

成分	描述

Spc(n)	用来在输出中插入空格字符，n是插入的空格字符数。

Tab(n)	用来定位插入点的绝对列号，n是列号。未带任何参数使用Tab可将插入点定位于下一打印区开头。

expression	数字或字符串表达式s 被输出。

charpos	指定下一个字符的插入点。使用分号以指定插入点紧接着上一个显示字符。使用Tab(n)定位插入点的绝对行号。不带任何参数使用Tab可将插入点定位于下一个输出区的开始。如果charpos省略，下一个字符被输出在下一行。

注释

如果省略了outputlist 且只在filenumber包含了一个表分隔符，一个空行被输出到文件。多个表达式可用空格或分号分隔。空格和分号作用相同。

所有用Print #写入文件的数据和国别设置有关；也就是说，所有的数据被正确格式化（使用相应的十进制分隔符）且关键字用与系统的国别设置语言环境.相应的语言输出。

对于Boolean数据, True或False被输出。True和False关键字根据系统的场所设置被翻译。

Date数据用系统所能识别的标准短日期格式写入文件。当日期或时间成员丢失或未零，只有非零部分写入文件。

如果outputlist数据是Empty，不往文件中写入任何东西。然而，如果outputlist数据是Null, Null 被写入文件。另外，Null 关键字被适当地翻译。

对于错误数据，输出表现未错误errorcode。Error关键字在写入文件被时，被适当翻译。

由于Print # 将数据映象写入文件，必须分隔数据以使其正确输出。如果使用Tab时不带任何参数将输出位置移到下一个输出区，Print # 也在输出域之间加入空格到文件中。

附注   如果在日后，需要用Input # 语句从文件中读入数据，使用Write # 语句而不要使用Print # 语句将数据写入文件中。使用Write # 通过正确地分隔分立的数据域保证了每个域的完整性，故Input #语句读入。使用Write # 也确保在任何场所可正确读入。


Put语句

从一个变量中写入磁盘文件。

语法

Put [#]filenumber,[recnumber],varname

元素

Put 语句的语法有如下成分：

成分	描述

filenumber	任何有效的文件号。

recnumber	写操作开始的记录号(Random 模式文件)或字节号(Binary模式文件)。

varname	包含被写入磁盘数据的变量名。

注释

文件中的第一个记录/字节在位置1，第二个在位置2，以此类推。如果省略recnumber,下一个记录或字节(紧接着最后一个Get 或Put 语句的那个或由最后一个Seek 函数指定的那个) 被写入。必须包含分隔的逗号，例如：

Put #4,,FileBuffer

对于用Random 模式打开的文件,下列规则适用：

�	如果写入的数据长度小于Open语句Len从句指定的长度，Put仍然以记录长度边界写入后续记录。一个记录加速结束和下一个记录开始之间的空间被文件缓冲区内的现有内容填充。由于填充数据数目无法确认，最好让写入数据长度与记录长度一致。

�	如果写入的变量是一变长字符串，Put写入包含字符串长度的两个字节的描述符后将数据送给变量。因此，在Open语句中Len从句指定的记录长度至少应比实际字符串长度多两个字节。

�	如果写入的变量是Variant数字类型类型，Put写入两个字节指明有关Variant的VarType后数据送给变量。例如，当写入为VarType 3的Variant 类型，Put写入六个字节：两个字节指明Variant是VarType 3 (Long)和四字节包含了Long数据。因此，在Open语句中Len从句指定的记录长度至少应比容纳所需变量的字节数目多两个字节。

�	如果写入的变量是String Variant (VarType 8)类型，Put写入两个字节指明为VarType类型,两个字节指明字符串长度，而后是字符串数据。因此，在Open语句中Len从句指定的记录长度至少应比容纳所需字符串的字节数目多四个字节。

�	如果写入的变量是其他任何类型，（不是变长字符串或Variant),Put只写入变量数据。因此，在Open语句中Len从句指定的记录长度应比读入的数据长度多或相等。

�	Put写入用户自定义数据类型的元素时，和一个个单独写入一样，只是在元素间没有任何填充。在Open语句中Len从句指定的记录长度应比写入的各个元素的字节数总和多或相等。

对于以Binary模式打开的文件,除了下列情况外，所有Random规则适用

�	在Binary模式下,Open语句中Len从句无效。Put从磁盘上连续写入各个变量，记录之间没有任何填充。

�	Put在写入非用户定义类型元素的变长字符串时不需要两个字节长的描述符。所需的字节数字符串中存在的字符数相同。例如，下列语句往文件号1中写入10个字节：

VarString$ = String$(10," ")

Put #1,,VarString$


Reset语句

关闭所有由Open语句打开的磁盘文件。

语法

Reset

注释

Reset关闭所有由Open语句打开的文件，并把文件缓冲区的内容写入磁盘。


Seek函数

Returns the current read/write position within a file opened using the Open statement.

语法

Seek(filenumber)

元素

filenumber 命名参数是任何有效的文件号。

注释

Seek返回一个在1和2,147,483,647（等于2^31-1）之间的值。对以Random模式打开的文件,Seek返回下一个读写的记录号。对以Binary, Output, Append,或Input模式打开的文件, Seek返回下一个操作所在的字节位置。第一个字节在位置1，第二个字节在物质2，以此类推。


Seek语句

在用Open语句打开的文件中确定下一个读写的位置。

语法

Seek [#]filenumber,position

元素

Seek语句的语法有如下成分：

成分	描述

filenumber	任何有效的文件号。

position	在1到2,147,483,647之间的数字，指明下一个读写操作的位置。

注释

在Get和Put语句中指定的记录号跨越Seek指定的文件位置。

如果Seek操作超出了文件末尾，并对文件进行写操作会使文件扩展。如果试图在Seek后指定负位置或零位置，会产生错误。


Spc函数

和Print #语句或Print方法连用以定位输出。

语法

Spc(n)

元素

n参数决定在显示或输出表中的下一个表达式之前插入的空格数。

注释

如果n比输出行宽小，下一个输出位置紧接着输出的空格数。如果n比输出行宽大，Spc 用下列公式计算下一个输出位置：

currentprintposition + (n Mod width)

例如，如果当前输出位置是24，输出行宽是80，指定Spc(90)，下一个输出会从位置34（当前位置+90/80的余数）开始。如果当前输出位置和输出行宽之间的差小于n(或n Mod width), Spc函数跳到下一行开头并产生和n - (width - currentprintposition)相等的空格数。

附注   应保证表格列的宽度足够容纳最宽的字母。

当用相称的空格字体使用Print方法时，用Spc函数输出的空格的宽度通常是所选择字体宽度的平均值。然而，在输出的字符数和他们所占据的固定宽度的列数之间没有什么固定关系。例如，大写W占据的位置超过了固定宽度的一列，而小写的i占据的要少的多。


Tab函数

与Print #语句或Print方法连用以定位输出。

语法

Tab[(n)]

元素

n参数是在显示或输出一个表中下一个表达式前跳到的列数。如果省略，Tab将光标移到下一个打印区.的开始。这可以允许Tab在逗号用作十进制分隔符的地方语言环境取代逗号。

注释

如果当前行中的当前输出位置比n大，Tab跳到下一个输出行的第n列。如果n比1小,Tab将输出位置移到第一列。如果n比输出行宽大，Tab用下列公式计算输出位置：

n Mod width

例如，行宽为80指定Tab(90)，下一个输出从第十列开始(90/80的余数)。如果n比当前输出位置小，输出从下一行的对应位置开始。如果n比当前输出位置大，输出从本行的对应位置开始。

输出行最左边的输出位置总是1。当使用Print #语句输出到文件时，最右边的输出位置为当前输出行文件的宽度，即用Width #语句设定的宽度。

附注   应保证表格列的宽度足够容纳最宽的字母。

当把Tab函数和Print方法连用时,输出表面被分成一致的定宽的列。列宽是所选择字体的平均宽度，以点数表示。然而，在输出的字符数和他们所占据的固定宽度的列数之间没有什么固定关系。例如，大写W占据的位置超过了固定宽度的一列，而小写的i占据的要少的多。


Width #语句

给Open用语句打开的文件设定输出行宽。

语法

Width #filenumber,width

元素

Width语句的语法有下列成分：

Part	Description

filenumber	任何有效的文件号。

width	数字表达式在0到255之间,这指明了在开始新行之前一行内有多少个字符。如果width等于0,一行的长度没有限制。缺省值为0。


Write #语句

往顺序文件中写入原始数据。

语法

Write #filenumber[,outputlist]

元素

Write语句的语法包含下列成分：

成分	描述

filenumber	任何有效的文件号。

outputlist	一个或多个由逗号分隔的被，被写入文件的数字或字符串表达式。

注释

如果省略了outputlist并在filenumber包含了逗号，一行空格被输出到文件。多个表达式可用空格、分号、或逗号分隔。空格和分号起相同作用。

当Write #用来输出数据到文件，应遵守一些通用的约定以便总可以用Input #读入并正确解释，与语言环境无关：

�	数字类数据总是用句号（。）作为十进制分隔符。

�	对于布尔型数据，#TRUE#或#FALSE#被输出。True和False关键字不被翻译，与场所无关。

�	日期数据用通用日期格式写入文件。当日期或时间成分丢失或为零时，只有非零部分写入文件。

�	如果outputlist数据为Empty，文件中不写入任何东西。但对于Null数据，#NULL#被输出。

�	对于错误数据，输出表示为 #ERROR errorcode#。Error关键字不被翻译，与场所无关。

与Print #语句不同，Write #语句在项与包含字符串的引号写入文件时在它们之间插入逗号。无须在表中指明分隔符，在将outputlist最后一个字符写入文件后，Write #自动插入一个新行符(回车或回车换行）。


ChDir语句
�_�_ChDir语句

改变当前目录或文件夹。

语法

ChDir path

元素

path 命名参数是一个字符串表达式指明哪个目录或文件夹成为缺省的目录或文件夹 [image] ，可能包含驱动器名。如果没有包含驱动器名，ChDir在当前驱动器上改变缺省目录或文件夹。

注释

在Microsoft Windows下，ChDir语句改变缺省目录但并不改变缺省驱动器。例如，如果缺省驱动器是C，下列语句改变了驱动器D上的缺省目录，但C仍然是缺省驱动器：

ChDir "D:\TMP"

在Macintosh上，缺省驱动器总是会变为path指定的驱动器。


ChDrive语句

改变当前驱动器。

语法

ChDrive drive

元素

drive 命名参数是字符串表达式指定一个已存在的驱动器。如果提供了零长度的参数（“”），当前驱动器没有变动。在Microsoft Windows下，如果参数drive是包含多个字符的字符串。ChDrive只使用第一个字符。在Macintosh上，ChDrive将当前驱动器变为指定驱动器的根文件夹。


CurDir函数

返回当前路径。

语法

CurDir[(drive)]

元素

drive参数是字符串表达式指定一个已存在的驱动器。在Microsoft Windows下,如果没有指定驱动器drive长度为零(“”),CurDir返回当前驱动器的路径。 在Macintosh上,CurDir忽略任何指定的drive，只是返回当前驱动器的路径。


Dir函数

返回与指定模式或文件属性匹配的文件名、目录名或文件夹名，或返回驱动器的卷标。

语法

Dir[(pathname[,attributes])]

元素

Dir函数的语法有下列成分：

成分	描述

pathname	字符串表达式that指定可能包含有目录、文件夹和驱动器的文件名。如果pathname没有找到，返回Null 。

attributes	常量或数字表达式，指定文件属性值，如果省略，返回所有和pathname相匹配的一般文件。

attributes参数有下列常数和值：

常数	值	文件属性

vbNormal	0	一般。

vbHidden	2	隐含。

vbSystem	4	系统 [image] Macintosh上无效。

vbVolume	8	卷标；如果指定，所有属性无效 [image] Macintosh上无效。

vbDirectory	16	目录或文件夹。

附注   下列常数在Visual Basic指定。所以，在代码中可以使用常数代替实际值。

注释

Dir支持'*'(多个字符)和'?' (单个字符)通配符的使用以指定多个文件。然而，在Macintosh上，这些字符被作为一般字符而非指定多个文件的通配字符使用。

由于Macintosh不支持通配符，使用文件类型区分组或文件。可以使用MacID函数指定文件类型而非文件名。例如，下列语句返回当前文件夹下第一个"TEXT"文件的文件名：

Dir("", MacID("TEXT"))

如果将MacID函数和Dir在Microsoft Windows下连用，会产生错误。

任何大于256的attribute值被认为是MacID值。

第一次调用Dir函数时，必须指定pathname，否则会产生错误。如果也指定了属性值，pathname必须包含。

Dir返回和pathname相匹配的第一个文件名。要得到和pathname和相匹配的其他文件名，, 不带任何参数再次调用Dir。当没有其他文件名匹配时，Di长度的字符串。一旦返回一个零长度的字符串，在以后的调用中必须指定pathname否则会产生错误r返回一个零。可以改变到新的pathname而并不需要得到所有和pathname当前匹配的文件名。但是，不能递归调用Dir函数。

提示 因为文件名以任意顺序被接收，可以暂时将文件名保存在数组中再对数组排序。


FileCopy语句

拷贝文件。

语法

FileCopy source, destination

元素

FileCopy语句的语法有下列命名参数成分：

成分	描述

source	字符串表达式被拷贝文件的文件名 [image] 可能包括目录、文件夹、驱动器。

destination	指明目标文件的字符串 [image] 可能包括目录、文件夹、驱动器。

注释

以只读模式打开的文件只能用于拷贝。


FileDateTime函数

返回Returns a 日期，指明文件被创建或最后一次修改时的时间。

语法

FileDateTime(pathname)

元素

pathname 命名参数是字符串表达式指定一文件名， [image] 可能包含目录，文件夹，驱动器。


FileLen函数

返回文件字节数。

语法

FileLen(pathname)

元素

pathname 命名参数是字符串表达式 指定一文件名， [image] 可能包含目录，文件夹，驱动器。

注释

如果FileLen函数调用时，指定的文件是打开的，返回值表明最后一次存盘的文件大小。

要获得打开文件的大小，使用LOF函数。


GetAttr函数

返回文件、目录、文件夹、和卷标的属性。

语法

GetAttr(pathname)

元素

pathname 命名参数是字符串表达式指定一文件名， [image] 可能包含目录，文件夹，驱动器。

返回值

GetAttr的返回值是下列的文件属性值：

值	常数	文件类型

0	vbNormal	一般。

1	vbReadonly	只读。

2	vbHidden	隐含。

4	vbSystem	系统文件 [image] 在Macintosh上无效。

8	vbVolume	卷标 [image] 在Macintosh上无效。

16	vbDirectory	文件夹或目录。

32	vbArchive	最后一次备份以来文件已经改变 [image] 在Macintosh上无效。

附注   下列常数在Visual Basic指定。所以，在代码中可以使用常数代替实际值。

注释

要确定设置了什么属性，用And操作符对GetAttr的返回值和所需文件属性值进行位比较操作。如果结果非零，该文件具有所需的属性。例如，如果存档属性没有被设置，下列And表达式的返回值为零：

Result = GetAttr(FName) And vbArchive

如果存档属性被设置，返回非零值。


Kill语句

从磁盘上删除文件。

语法

Kill pathname

元素

pathname 命名参数 是字符串表达式指定一文件名， [image] 可能包含目录，文件夹，驱动器。

注释

Kill支持'*'(多个字符)和'?' (单个字符)通配符的使用以指定多个文件。然而，在Macintosh上，这些字符被作为一般字符而非指定多个文件的通配字符使用。

由于Macintosh不支持通配符，使用文件类型区分组或文件。可以使用MacID函数指定文件类型而非文件名。例如，下列语句返回当前文件夹下第一个"TEXT"文件的文件名：

Kill MacID("TEXT")

如果Microsoft Windows下连用MacID和Kill函数，会产生错误。

试图Kill用删除一个打开的文件，会产生错误。

使用RmDir语句删除目录。


MacID函数

只在Macintosh使用，将一个四个字符的常数转化成可被Dir, Kill, Shell,和AppActivate使用的值。

语法

MacID(constant)

元素

constant 命名参数 有四个字符组成，指定某种资源类型、文件类型、应用程序标志或Apple事件。例如， TEXT, OBIN, MSWD (Microsoft Word), XCEL (Microsoft Excel)，诸如此类。

注释

MacID和Dir与Kill连用指定Macintosh文件类型。由于Macintosh不支持'*'和'?'作为通配符，可以使用四个字符的常数指定组或文件。例如，下列语句从当前文件夹中'TEXT'返回类型文件：

Dir("", MacID("TEXT"))

MacID和Shell与AppActivate连用，指定某一使用应用程序唯一标志的应用程序。


MkDir语句

创建新目录或文件夹。

语法

MkDir path

元素

path 命名参数是一字符串表达式 指明被创建的目录或文件夹 [image] 可能包含驱动器。如果没有指定驱动器，MkDir在当前驱动器上创建新目录或文件夹。

注释

在Microsoft Windows上，如果MkDir创建的目录名中有空格，可以通过某些应用程序访问，但不能通过标准的操作系统命令删除。要删除这样的目录，RmDir语句。


Name语句

给磁盘文件、目录、或文件夹改名。

语法

Name oldpathname As newpathname

元素

Name语句的语法有下列成分：

成分	描述

oldpathname	字符串表达式指定已存在的文件名和位置 [image] 可能包括目录、文件夹和驱动器。

newpathname	字符表达式，指明新的文件名和位置 [image] 可能包括目录、文件夹和驱动器。newpathname指定的文件不能已经存在。

注释

newpathname和oldpathname必须在同一个驱动器上。如果newpathname中的路径存在且和oldpathname的路径不同，Name语句将文件移到新的目录或文件夹并在需要时给文件改名。如果newpathname和oldpathname有不同的路径和相同的文件名，Name把文件移到新的位置，文件名不变。使用Name，可以把文件从一个目录或文件夹移到另一个目录或文件夹，但不能移动目录或文件夹。

Name支持'*' (多个字符）和'?'(单个字符)的通配符。但是，在Macintosh上，这些字符被当作有效文件名字符对待，不能作为通配符指定多个文件。

在打开的文件上使用Name会产生错误。改名前必须关闭文件。


RmDir语句

删除一个已存在的目录或文件夹。

语法

RmDir path

元素

path 命名参数是一字符串表达式 指明将被删除的目录或文件夹 [image] 可能包含驱动器。如果没有包含驱动器，RmDir删除当前驱动器上的目录或文件夹。

注释

试图使用RmDir删除包含文件的目录或文件夹时会产生错误。在删除目录或文件夹之前，Kill使用语句删除所有的文件。


SetAttr语句

设置文件属性信息。

语法

SetAttr pathname,attributes

元素

SetAttr语句的语法有下列命名参数成分：

成分	描述

pathname	字符串表达式指定一文件名， [image] 可能包含目录，文件夹，驱动器。

attributes	常量或数字表达式,指定的文件属性值。

attributes有如下常数和值：

常数	值	文件属性

vbNormal	0	一般(缺省)。

vbReadOnly	1	只读。

vbHidden	2	隐含。

vbSystem	4	系统 [image] 在Macintosh上无效。

vbArchive	32	最后一次备份以来文件已经改动 [image] 在Macintosh上无效。

附注   下列常数在Visual Basic指定。所以，在代码中可以使用常数代替实际值。

注释

如果试图打开的文件设置属性，会产生一个运行错误。


ChDir 语句实例

下例使用ChDir语句改变当前目录或文件夹。

' 将当前目录或文件夹变为"MYDIR"。

ChDir "MYDIR"

' 在Microsoft Windows内。

' 假设"C:"是当前驱动器。下列语句改变了

' "D:"上的缺省目录。 "C:"依然是当前驱动器。

ChDir "D:\WINDOWS\SYSTEM"

' 在Macintosh上。

'改变缺省文件夹和缺省驱动器。

ChDir "HD:MY FOLDER"


ChDrive语句实例

下例用ChDrive语句改变当前驱动器。

' 在Microsoft Windows下。

ChDrive "D"	' 将"D"变为当前驱动器。

' 在Macintosh上。

' 将"MY DRIVE"变为当前驱动器。

ChDrive "MY DRIVE:"

' 将"MY DRIVE"变为当前驱动器并改变当前文件夹

' 非根目录。

ChDrive "MY DRIVE:MY FOLDER"


CurDir 函数实例

下例使用CurDir函数返回当前路径。

' 在Microsoft Windows下。

' 假设C驱动器上的当前路径是"C:\WINDOWS\SYSTEM"。

' 假设D驱动器的当前目录是"D:\EXCEL"。

' 假设C是当前驱动器。

MyPath = CurDir	' 返回"C:\WINDOWS\SYSTEM"。

MyPath = CurDir("C")	' 返回"C:\WINDOWS\SYSTEM"。

MyPath = CurDir("D")	' 返回"D:\EXCEL"。

' 在Macintosh上。

' 驱动器字符被忽略。当前驱动器的路径被返回。

' 假设HD驱动器上的当前路径是"HD:MY FOLDER"。

' 假设HD是当前驱动器。驱动器MD 也在机器上存在。

MyPath = CurDir	' 返回"HD:MY FOLDER"。

MyPath = CurDir("HD")	' 返回"HD:MY FOLDER"。

MyPath = CurDir("MD")	' 返回"HD:MY FOLDER"。


Dir函数实例

下例使用Dir函数检查文件和目录是否存在。在Macintosh上，需使用MacID函数以指定文件类型。

' 在Microsoft Windows下。

' 返回"WIN.INI"，如果存在。

MyFile = Dir("C:\WINDOWS\WIN.INI")

' 返回具有指定扩展名的文件名。如果由不止一个的*.ini

' 文件存在，返回找到的第一个文件名。

MyFile = Dir("C:\WINDOWS\*.ini")

' 不跟任何参数再次调用Dir同一目录下的下一个*.ini文件。

MyFile = Dir

' 返回第一个具有指定隐含属性的*.txt文件。

MyFile = Dir("*.TXT", vbHidden)

' 在Macintosh上。

' 使用MacID函数指定文件类型。

' 下列语句返回在指定的目录或文件夹下找到的第一个"TEXT"文件。

MyFile = Dir("HD:MyFolder:", MacID("TEXT"))


FileCopy语句实例

下例使用FileCopy语句拷贝文件到另一个文件。在下例中，假定SRCFILE中包含有数据。

SourceFile = "SRCFILE"	' 定义原文件名。

DestinationFile = "DESTFILE"	' 定义目标文件名。

FileCopy SourceFile, DestinationFile	' 将原文件拷到目标文件。


FileDateTime函数实例

当文件被创建或修改是，使用FileDateTime函数获得日期和时间。日期和时间的显示公式基于系统的场所设置。

' 假设TESTFILE在1993年2月12日下午4:35:47被最后一次修改。

' 假设场所设置为美国/英语。

MyStamp = FileDateTime("TESTFILE")	' 返回"2/12/93 4:35:47 下午"。


FileLen函数实例

下例使用FileLen函数返回文件字节长度。在下例中，假定SRCFILE中包含有数据。

MySize = FileLen("TESTFILE")	' 返回文件长度(字节数)。


GetAttr语句实例

下例使用GetAttr语句确定文件、目录或文件夹的属性。

' 假设TESTFILE具有隐含属性。

MyAttr = GetAttr("TESTFILE")	' 返回2。

' 假设TESTFILE有隐含和只读属性。

MyAttr = GetAttr("TESTFILE")	' 返回3。

' 假设MYDIR为一目录或文件夹。

MyAttr = GetAttr("MYDIR")	' 返回16。


Kill语句实例

下例使用Kill语句从磁盘中删除文件。由于Macintosh不支持通配符，使用MacID函数指定文件类型而非文件名。

' 假设TESTFILE文件中包含有数据。

Kill "TestFile"	' 删除文件。

' 在Microsoft Windows下。

' 删除当前目录下的所有*.txt文件。

Kill "*.txt"

' 在Macintosh上。

' 使用MacID函数当前文件夹下的所有PICT文件。

Kill MacID("PICT")


MacID函数实例

下例说明了MacID函数的不同用法。MacID函数在Microsoft Windows下不能使用。

' 返回HD:My文件夹下的第一个文本文件。

FileName = Dir("HD:My Folder:", MacID("TEXT"))

' 删除当前文件夹下的所有"TEXT"文件。

Kill MacID("TEXT")

' 运行Microsoft Excel。

ReturnValue = Shell(MacID("XCEL"))

' 激活Microsoft Word。

AppActivate MacID("MSWD")


MkDir语句实例

下例使用MkDir语句创建目录或文件夹。如果没有指定驱动器，在当前驱动器上创建新目录或文件夹。

MkDir "MYDIR"	' 创建新的文件夹或目录。


Name语句实例

下例使用Name语句给文件改名。下例中假定指定的目录或文件夹已经存在。

OldName = "OLDFILE" : NewName = "NEWFILE"	' 定义文件名。

Name OldName As NewName	' 重命名文件。

' 在Microsoft Windows下。

OldName = "C:\MYDIR\OLDFILE" : NewName = "C:\YOURDIR\NEWFILE"

Name OldName As NewName	' 移动并重命名文件。

' 在Macintosh上。

OldName = "HD:MY FOLDER:OLDFILE" : NewName = "HD:YOUR FOLDER:NEWFILE"

Name OldName As NewName	' 移动并重命名文件。


RmDir语句实例

下例使用RmDir语句除去已存在的目录或文件夹。

' 假设MYDIR是一个空的目录或文件夹。

RmDir "MYDIR"	' 除去MYDIR。


SetAttr语句实例

下例使用SetAttr语句给文件设置属性。

SetAttr "TESTFILE", vbHidden	' 设置隐含属性。

SetAttr "TESTFILE", vbHidden + vbReadOnly	' 设定隐含和只读属性。


Close 语句实例

下例使用Close语句关闭三个用于Output的打开文件。

For I = 1 To 3	' 循环三次。

FileName = "TEST" & I	' 创建文件名。

Open FileName For Output As #I	' 打开文件。

Print #I, "This is a test."	' 将字符串写入文件。

Next I

Close	' 关闭所有三个文件。


EOF函数实例

下例使用EOF函数检测文件的结束。假定MyFile是包含数行文本的文本文件。

Open "MyFile" For Input As #1	' 打开文件用于输入。

Do While Not EOF(1)	' 检查文件结束。

Line Input #1, InputData	' 读入数据行。

Debug.Print InputData	' 输出到调试窗口。

Loop

Close #1	' 关闭文件。


FileAttr函数实例

下例使用FileAttr函数打开文件的文件模式和文件句柄。

FileNum = 1	' 赋予文件号。

Open "TESTFILE" For Append As FileNum	' 打开文件

Handle = FileAttr(FileNum, 1)	' 返回8（附加模式）。

Mode = FileAttr(FileNum, 2)	' 返回文件句柄。

Close FileNum	' 关闭文件。


FreeFile函数实例

下例使用FreeFile函数返回下一个可用的文件号。循环中有五个用于输出的文件被打开，每个被写入有些样例数据。

For MyIndex = 1 to 5	' 循环5次。

FileNumber = FreeFile	' 获得没有使用的文件

' 号码。

Open "TEST" & MyIndex For Output As #FileNumber	' 创建文件。

Write #FileNumber, "This is a sample"	' 输出文本。

Close #FileNumber	' 关闭文件。

Next MyIndex


Get语句实例

下例使用Get语句将数据从磁盘文件读入到变量中。假设TESTFILE文件中包含五个用户定义的类型的记录。

Type Record	' 定义用户定义的类型。

ID As Integer

Name As String * 20

End Type

Dim MyRecord As Record	' 变量声明。

' 打开随机访问的样例文件。

Open "TESTFILE" For Random As #1 Len = Len(MyRecord)

' Get语句从样例文件中读入。

Position = 3	' 定义记录号。

Get #1, Position, MyRecord	' 读入第三个记录。

Close #1	' 关闭文件。


Input #语句实例

下例使用Input #语句将数据从文件读入到两个变量。假设，TESTFILE包含有数行Write # 用语句输入的数据。每行包含一个带引号的字符串和一个用逗号分隔的数字，例如 ("Hello", 234)。

Open "TESTFILE" For Input As #1	' 打开用于输入的文件。

Do While Not EOF(1)	' 循环直到文件结束。

Input #1, MyString, MyNumber	' 读入数据到变量。

Debug.Print MyString, MyNumber	' 输出数据到调试窗口。

Loop

Close #1	' 关闭数据。


Input函数实例

下例使用Input函数从文件中一次读入一字符并输出到调试窗口。假设TESTFILE是包含有数行样例数据的文本文件。

Open "TESTFILE" For Input As #1	' 打开文件。

Do While Not EOF(1)	' 循环直到文件结尾。

MyChar = Input(1, #1)	' 读入一个字符。

Debug.Print MyChar	' 输出到调试窗口。

Loop

Close #1	' 关闭文件。


Line Input #语句实例

下例使用Line Input #语句从一顺序文件中读入一行并赋给一个变量。假设TESTFILE是包含有数行样例数据的文本文件。

Open "TESTFILE" For Input As #1	' 打开文件。

Do While Not EOF(1)	' 循环直到文件结束。

Line Input #1, TextLine	' 读入行到变量中。

Debug.Print TextLine	' 输出到调试窗口。

Loop

Close #1	' 关闭文件。


Loc 函数实例

下例使用Loc函数返回打开文件中的当前读写位置。假设TESTFILE是包含有数行样例数据的文本文件。

Open "TESTFILE" For Input As #1	' 打开刚创建的文件。

Do While Not EOF(1)	' 循环直到文件结束。

Line Input #1, MyLine	' 读入行到变量中。

MyLocation = Loc(1)	' 获得文件中的当前位置。

' Print to Debug window.

Debug.Print MyLine; Tab; MyLocation

Loop


Lock, Unlock语句实例

下例描述Lock和Unlock语句的使用。当一个记录被修改时，不也许其他进程访问该记录。假设TESTFILE文件中包含五个用户定义的类型的记录。

Type Record	' 定义用户定义类型。

ID As Integer

Name As String * 20

End Type

Dim MyRecord As Record	' 变量声明。

' 打开用与随机访问的样例文件。

Open "TESTFILE" For Random Shared As #1 Len = Len(MyRecord)

RecordNumber = 4	' 定义记录号。

Lock #1, RecordNumber	' 锁定记录。

Get #1, RecordNumber, MyRecord	' 读入记录。

MyRecord.ID = 234	' 修改记录。

MyRecord.Name = "John Smith"

Put #1, RecordNumber, MyRecord	' 写入当前记录。

Unlock #1, RecordNumber	' 解锁记录。

Close #1	' 关闭文件。


LOF函数实例

下例使用LOF函数确定打开磁盘文件的大小。假设TESTFILE是包含有数行样例数据的文本文件。

Open "TESTFILE" For Input As #1	' 打开文件。

FileLength = LOF(1)	' 获得文件长度。

Close #1	' 关闭文件。


Open语句实例

下例描述使用Open语句对文件进行输入/输出的不同方法。

' 以顺序输入模式打开文件。

Open "TESTFILE" For Input As #1

' 以二进制模式打开文件，只用于写操作。

Open "TESTFILE" For Binary Access Write As #1

' 以随机访问模式打开文件。文件包含用户定义类型记录。

Type Record	' 定义用户定义类型。

ID As Integer

Name As String * 20

End Type

Dim MyRecord As Record	' 变量声明。

Open "TESTFILE" For Random As #1 Len = Len(MyRecord)

' 打开文件，用于顺序输出，任何进程可以读写文件。

Open "TESTFILE" For Output Shared As #1

' 以二进制模式打开，用于读入，其他进程不能读文件。

Open "TESTFILE" For Binary Access Read Lock Read As #1


Print #语句实例

下例使用Print #语句将数据写入文件。

Open "TESTFILE" For Output As #1	' 打开用于输出的文件。

Print #1, "This is a test"	' 输出文本到文件。

Print #1,	' 输出空行到文件。

Print #1, "Zone 1"; Tab ; "Zone 2"	' 输出到两个输出区。

Print #1, "Hello" ; " " ; "World"	' 用空格分隔字符串。

Print #1, Spc(5) ; "5 leading spaces "	' 输出5个前导空格。

Print #1, Tab(10) ; "Hello"	' 在第10列处输出单词。

' 赋予布尔型、日期、Null和错误值。

MyBool = False : MyDate = #February 12, 1969# : MyNull = Null

MyError = CVErr(32767)

' True, False, Null和错误用系统的场所设置翻译。日期使用标准的短日期公式。

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	' 关闭文件。


Put语句实例

使用Put语句将数据写入文件。5个用户定义类型的记录被写入文件。

' 定义用户定义类型。

Type Record

ID As Integer

Name As String * 20

End Type

Dim MyRecord As Record	' 变量声明。

' 打开用于随机访问的文件。

Open "TESTFILE" For Random As #1 Len = Len(MyRecord)

For RecordNumber = 1 To 5	' 循环5次。

MyRecord.ID = RecordNumber	' 定义ID。

MyRecord.Name = "My Name" & RecordNumber	' 创建字符串。

Put #1, RecordNumber, MyRecord	' 将记录写入文件。

Next RecordNumber

Close #1	' 关闭文件。


Reset语句实例

下例使用Reset语句所有打开的文件并将文件缓冲区中的内容写入文件。

For FileNumber = 1 To 5	' 循环5次。

' 打开用于输出的文件。

Open "TEST" & FileNumber For Output As #FileNumber

Write #FileNumber, "Hello World"	' 将数据写入文件。

Next FileNumber

Reset	' 关闭文件并将内容写入磁盘


Seek函数实例

下例使用Seek函数返回当前文件位置。

' 对于以随机模式打开的文件，Seek返回下一个记录号。假设TESTFILE是包含有5个用户定义类型的记录的文件。

Type Record	' 定义用户定义类型。

ID As Integer

Name As String * 20

End Type

Dim MyRecord As Record	' 变量声明。

' Open file in random-file mode.

Open "TESTFILE" For Random As #1 Len = Len(MyRecord)

Do While Not EOF(1)	' 循环直到文件结束。

Get #1, , MyRecord	' 读下一个记录。

Debug.Print Seek(1)	' 输出到调试窗口

Loop

Close #1	' 关闭文件。

' 对于以其他方式打开的文件Seek返回下一个操作发生的字节位置。假设TESTFILE是包含有数行文本的文件。

Open "TESTFILE" For Input As #1	' 打开用于读入的文件。

Do While Not EOF(1)	' 循环到文件结尾。

MyChar = Input(1,#1)	' 读入下一个数据字符。

Debug.Print Seek(1)	' 输出字节位置到调试窗口。

Loop

Close #1	' 关闭文件。


Seek 语句实例
Seek Statement Example

下例使用Seek语句确定文件中的下一个读写位置。

' 对于以随机模式打开的文件，Seek设定为下一个记录。假设TESTFILE是包含有5个用户 定义类型的记录的文件。

Type Record	' 定义用户定义类型。

ID As Integer

Name As String * 20

End Type

Dim MyRecord As Record	' 变量声明。

' 以随机模式打开。

Open "TESTFILE" For Random As #1 Len = Len(MyRecord)

MaxSize = LOF(1) \ Len(MyRecord)	' 获得文件中的所有记录数。

' 循环从最后一个开始，读入所有记录。

For RecordNumber = MaxSize To 1 Step - 1

Seek #1, RecordNumber	' 设置位置。

Get #1, , MyRecord	' 读入记录。

Next RecordNumber

Close #1	' 关闭文件。

' 对于以其他方式打开的文件Seek返回下一个操作发生的字节位置。假设TESTFILE是包含有数行文本的文件。

Open "TESTFILE" For Input As #1	' 打开输入文件。

MaxSize = LOF(1)	' 获得文件总的字节数。

' 循环从最后一个开始读入全部字符。

For NextChar = MaxSize To 1 Step -1

Seek #1, NextChar	' 设置位置。

MyChar = Input(1,#1)	' 读入字符。

Next NextChar

Close #1	' 关闭文件。


Spc函数实例

下例使用Spc函数定位输出到文件和到调试窗口的位置。

' Spc函数可以和Print #语句连用。

Open "TESTFILE" For Output As #1	' 打开用于输出的文件。

Print #1, "10 spaces between here"; Spc(10); "and here."

Close #1	' 关闭文件。

' 下列语句使文本在调试窗口中输出，之前有30个空格。

Debug.Print Spc(30); "Thirty spaces later..."


Tab函数实例

下例使用Tab函数定位文件或调试窗口中的输出位置。

' Tab函数可以和Print #语句连用。

Open "TESTFILE" For Output As #1	' 打开用于输出的文件。

' 第二个单词在第20列输出。

Print #1, "Hello"; Tab(20); "World."

' 如果省略参数，光标移到下一个输出区。

Print #1, "Hello"; Tab ; "World"

Close #1	' 关闭文件。

' Tab函数可以和Print方法连用。

' 下列语句在第10列输出文本。

Debug.Print Tab(10); "10 columns from start."


Width #语句实例

下例使用Width语句给文件设置输出行宽。

Open "TESTFILE" For Output As #1	' 打开用于输出的文件。

Width #1, 5	' 将输出行宽设置为5。

For I = 0 To 9	' 循环10次。

Print #1, Chr(48 + I);	' 每行输出5个字符。

Close #1	' 关闭文件。


Write #语句实例

下例使用Write #语句在一顺序文件中写入原始数据。

Open "TESTFILE" For Output As 1	' 打开用于输出的文件。

Write #1, "Hello World", 234	' 写入的数据用逗号分隔。

Write #1,	' 写入空行。

' 赋予布尔型、日期、Null和错误值。

MyBool = False : MyDate = #February 12, 1969# : MyNull = Null

MyError = CVErr(32767)

'  布尔型数据以#TRUE#或#FALSE#形式写入。日期用通用的日期格式写入。

' 错误数据以#ERROR errorcode#的形式写入。

Write #1, MyBool ; " is a Boolean value"

Write #1, MyDate ; " is a date"

Write #1, MyNull ; " is a null value"

Write #1, MyError ; " is an error value"

Close #1	' 关闭文件。


IsArray 函数
�_�_IsArray 函数

返回的值指明某变量是否为数组。

语法

IsArray(varname)

元素

命名参数 varname 可以是任何变量。

注释

如果变量是数组，IsArray 返回True ；否则返回False。


IsDate 函数

返回的值指明某表达式是否可转换为日期。

语法

IsDate(expression)

元素

命名参数 expression 可以是任何可被识别为日期或时间的日期 或字符串表达式 。

注释

如果表达式是日期或可合法地转换为日期，IsDate 返回True ；否则返回False。合法日期的范围是公元100年1月1日到公元9999年12月31日。


IsEmpty 函数

返回的值指明变量是否已初始化。

语法

IsEmpty(expression)

元素

命名参数 expression 可以是任何数字 或字符串表达式。然而，由于IsEmpty用于判断单独的变量是否初始化，故expression参数经常是单个变量名。

注释

如果变量是Empty，IsEmpty返回True，否则返回False。如果expression包含一个以上的变量，总返回False。


IsError 函数

返回的值指明变量是否一个错误值。

语法

IsError(expression)

元素

命名参数 expression可以是任何用于指示错误值的数字表达式 。

注释

要创建错误值，可用CVErr 函数将实数转换为错误值。IsError 函数用于判断某数字表达式是否代表一个错误。如果expression表示错误，IsError返回True；否则返回False。


IsMissing 函数

返回的值指明可选参数是否传递到了过程。

语法

IsMissing(argname)

元素

命名参数 argname 是可选过程参数的名称。

注释

IsMissing 函数用在有可选参数(包括ParamArray参数)的过程中，以判断某参数是否传递到了该过程。如果对指定的参数没有传递任何值，IsMissing返回True；否则返回False。


IsNull 函数

返回的值指明是否变量不包含任何合法值(Null)。

语法

IsNull(expression)

元素

命名参数 expression可以是任何数字 或字符串表达式。

注释

如果expression为Null，亦即它不包含合法数据，IsNull返回True；否则IsNull 返回False。如果expression由若干变量组成，其中任一变量为Null都将导致返回True。

Null值指明Variant量不包含合法数据。Null与Empty不同，Empty表示变量还未初始化。它也不同于零长字符串，零长字符串有时被当作空字符串。

重要内容   应使用IsNull函数判断表达式是否包含Null值。在某些条件下看似应取值为True的表达式，例如If Var = Null和If Var <> Null，却总是False。这是因为任何包含Null的表达式，其本身也是Null，从而是False。


IsNumeric 函数

返回的值指明表达式是否取值为数字。

语法

IsNumeric(expression)

元素

命名参数 expression可以是任何数字或字符串表达式。

注释

如果整个expression被识别为数字，IsNumeric返回True；否则返回False。

如果expression是日期表达式，IsNumeric返回False。


IsObject 函数

返回的值指明表达式是否指向合法的OLE自动化对象。

语法

IsObject(expression)

元素

命名参数 expression可以是任何表达式。

注释

如果expression是对实际对象的合法引用，IsObject返回True；否则返回False。


TypeName 函数

返回包含关于变量的信息的字符串。

语法

TypeName(varname)

元素

命名参数 varname可以是任何变量，但自定义类型变量除外。

注释

TypeName 返回的字符串可以是下列之一:

返回的字符串	变量包含的内容
objecttype	类型为objecttype的OLE自动化对象。
Integer	整数。
Long	长整数。
Single	单精度浮点数。
Double	双精度浮点数。
Currency	货币值。
Date	日期。
String	字符串。
Boolean	布尔值。
Error	错误值。
Empty	未初始化。
Null	无合法数据。
Object	不支持OLE自动化的对象。
Unknown	未知类型的OLE自动化对象。
Nothing	未指向实际对象的对象变量。
如果varname是数组，返回的字符串是上列返回值之一(或Variant)加一空括号。例如，如果varname 是整数数组，TypeName 返回"Integer()"。


VarType 函数

返回的值指明变量的子类型。

语法

VarType(varname)

元素

命名参数 varname可以是任何变量 ，但自定义类型变量除外。

返回值

返回值	对应常量	变量类型
0	vbEmpty	Empty (未初始化)。
1	vbNull	Null (无合法数据)。
2	vbInteger	整数。
3	vbLong	长整数。
4	vbSingle	单精度浮点数。
5	vbDouble	双精度浮点数。
6	vbCurrency	货币。
7	vbDate	日期。
8	vbString	字符串。
9	vbObject	OLE 自动化对象。
10	vbError	错误。
11	vbBoolean	布尔值。
12	vbVariant	变体型(仅用于变体型数组)。
13	vbDataobject	非OLE 自动化对象。
8192	vbArray	数组。
附注   上述常量由Visual Basic定义。故可用在代码中取代实际值。

注释

VarType 函数从不单独返回vbArray。vbArray总是加在其它值上，以表示特定类型的数组。常量vbVariant仅与vbArray一起返回，以表示VarType函数的参数是Variant型数组。例如，表示整数数组的返回值为vbInteger + vbArray，即8194。


IsArray 函数实例

本例使用IsArray函数检查变量是否为数组。

Dim MyArray(1 To 5) As Integer	' 声明数组变量。

YourArray = Array(1, 2, 3)	' 使用Array函数。

MyCheck = IsArray(MyArray)	' 返回True。

MyCheck = IsArray(YourArray)	' 返回True。


IsDate 函数实例

本例使用IsDate函数判断表达式是否可转换为日期。

MyDate = "February 12, 1969" : YourDate = #2/12/69# : NoDate = "Hello"

MyCheck = IsDate(MyDate)	' 返回True。

MyCheck = IsDate(YourDate)	' 返回True。

MyCheck = IsDate(NoDate)	' 返回False。


IsEmpty 函数实例

本例使用IsEmpty函数判断变量是否已初始化。

MyCheck = IsEmpty(MyVar)	' 返回True。

MyVar = Null	' 赋值以Null。

MyCheck = IsEmpty(MyVar)	' 返回False。

MyVar = Empty	' 赋值以Empty。

MyCheck = IsEmpty(MyVar)	' 返回True。


IsError 函数实例

本例使用IsError函数检查数字表达式是否一错误值。CVErr函数用于从自定义函数中返回Error Variant。

' 假定UserFunction是返回错误值的自定义函数过程；例如，用下列语句赋以返回值：

' UserFunction = CVErr(32767)，其中32767自定义的数字。

ReturnVal = UserFunction()

MyCheck = IsError(ReturnVal)	' 返回True。


IsMissing 函数实例

本例使用IsMissing函数检查可选的参数是否传递到了自定义过程。

' 下列语句调用自定义函数过程。

ReturnValue = ReturnTwice()	' 返回Null。

ReturnValue = ReturnTwice(2)	' 返回4。

' 函数过程定义。

Function ReturnTwice(Optional A)

If IsMissing(A) Then

' 如果未传递该参数，返回Null。

ReturnTwice = Null

Else

' 如果传递了该参数，返回其值的两倍。

ReturnTwice = A * 2

End If

End Function


IsNull 函数实例

本例使用IsNull函数判断变量是否等于Null。

MyCheck = IsNull(MyVar)	' 返回False。

MyVar = ""

MyCheck = IsNull(MyVar)	' 返回False。

MyVar = Null

MyCheck = IsNull(MyVar)	' 返回True。


IsNumeric 函数实例

本例使用IsNumeric函数判断变量是否可取值为数字。

MyVar = "53"	' 赋值以value。

MyCheck = IsNumeric(MyVar)	' 返回True。

MyVar = "459.95"	' 赋值以value。

MyCheck = IsNumeric(MyVar)	' 返回True。

MyVar = "45 Help"	' 赋值以value。

MyCheck = IsNumeric(MyVar)	' 返回False。


IsObject 函数实例

本例使用IsObject函数判断变量是否指向合法对象。MyObject和YourObject是同一类型的对象变量。此处它们是普通的名称，仅用于演示。

Dim MyInt As Integer	' 声明变量。

Set YourObject = MyObject	' 赋值以对象引用。

MyCheck = IsObject(YourObject)	' 返回True。

MyCheck = IsObject(MyInt)	' 返回False。


TypeName 函数实例

本例使用TypeName函数返回关于变量的信息。

' 声明变量。

Dim StrVar As String, IntVar As Integer, CurVar As Currency

Dim ArrayVar (1 To 5) As Integer

NullVar = Null	' 赋值以Null。

MyType = TypeName(StrVar)	' 返回"String"。

MyType = TypeName(IntVar)	' 返回"Integer"。

MyType = TypeName(CurVar)	' 返回"Currency"。

MyType = TypeName(NullVar)	' 返回"Null"。

MyType = TypeName(ArrayVar)	' 返回"Integer()"。


VarType 函数实例

本例使用VarType判断变量的子类型。

' 初始化变量。

IntVar = 459: StrVar = "Hello World": DateVar = #2/12/69#

MyCheck = VarType(IntVar)	' 返回2。

MyCheck = VarType(DateVar)	' 返回7。

MyCheck = VarType(StrVar)	' 返回8。


As
�_�_�_As

As关键字用在下列地方:

Const 语句

Declare 语句

Dim 语句

Function 语句

Name 语句

Open 语句

Private 语句

Public 语句

ReDim 语句

Static 语句

Sub 语句

Type 语句


Binary

Binary 关键字用在下列地方:

Open 语句

Option Compare 语句


ByRef

ByRef 关键字用在下列地方:

Call 语句

Declare 语句

Function 语句

Property Get 语句

Property Let 语句

Property Set 语句

Sub 语句


ByVal

ByVal 关键字用在下列地方:

Call 语句

Declare 语句

Function 语句

Property Get 语句

Property Let 语句

Property Set 语句

Sub 语句


Date

Date 关键字用在下列地方:

Date 数据类型

Date 函数

Date 语句


Else

Else 关键字用在下列地方:

If...Then...Else 语句

Select Case 语句


Empty

Variant 变量的一种子类型，表示未初始化变量的值。


Err

Err 关键字用在下列地方:

Err 函数

Err 语句


Error

Error 关键字用在下列地方:

Error 函数

Error 语句

On Error 语句


False

限制性关键字 ，其值为0。


For

For 关键字用在下列地方:

For...Next 语句

For Each...Next 语句

Open 语句


Get

Get 关键字用在下列地方:

Get 语句

Property Get 语句


Input

Input 关键字用在下列地方:

Input 函数

Input # 语句

Line Input # 语句


Is

Is 关键字用在下列地方:

Is Operator

Select Case 语句


Let

Let 关键字用在下列地方:

Property Let 语句

Let 语句


Lock

Lock 关键字用在下列地方:

Lock...Unlock 语句

Open 语句


Mid

Mid 关键字用在下列地方:

Mid 函数

Mid 语句


Next

Next 关键字用在下列地方:

For...Next 语句

For Each...Next 语句

On Error 语句

Resume 语句


Null

Variant 变量的一种子类型，表示变量不包含合法数据。


On

On 关键字用在下列地方:

On Error 语句

On...GoSub 语句

On...GoTo 语句


Option

Option 关键字用在下列地方:

Option Base 语句

Option Compare 语句

Option Explicit 语句

Option Private 语句


Optional

Optional 关键字用在下列地方:

Declare 语句

Fuction 语句

Property Get 语句

Property Let 语句

Property Set 语句

Sub 语句


ParamArray

ParamArray 关键字用在下列地方:

Declare 语句

Function 语句

Property Get 语句

Property Let 语句

Property Set 语句

Sub 语句


Print

Print 关键字用在下列地方:

Print Method

Print # 语句


Private

Private 关键字用在下列地方:

Const 语句

Declare 语句

Function 语句

Option Private 语句

Private 语句

Property Get 语句

Property Let 语句

Property Set 语句

Sub 语句

Type 语句


Property

Property 关键字用在下列地方:

Property Get 语句

Property Let 语句

Property Set 语句


Public

Public 关键字用在下列地方:

Const 语句

Declare 语句

Function 语句

Property Get 语句

Property Let 语句

Property Set 语句

Public 语句

Sub 语句

Type 语句


Resume

Resume 关键字用在下列地方:

On Error 语句

Resume 语句


Seek

Seek 关键字用在下列地方:

Seek 函数

Seek 语句


Set

Set 关键字用在下列地方:

Set 语句

Property Set 语句


Static

Static 关键字用在下列地方:

Function 语句

Static 语句

Sub 语句


Step

Step 关键字用在下列地方:

For Each...Next 语句

For...Next 语句


String

String 关键字用在下列地方:

String 数据类型

String 函数


To

To 关键字用在下列地方:

Dim 语句

For...Next 语句

Lock, Unlock 语句s

Private 语句

Public 语句

ReDim 语句

Select Case 语句

Static 语句


Time

Time 关键字用在下列地方:

Time 函数

Time 语句


True

限制性关键字 ，其值为-1。


数学函数
�_�_数学函数

Abs 函数

Atn 函数

Cos 函数

Exp 函数

Fix 函数

Int 函数

Log 函数

Rnd 函数

Sgn 函数

Sin 函数

Sqr 函数

Tan 函数

派生数学函数


Abs 函数

返回数字的绝对值。

语法

Abs(number)

元素

number参数可以是任何合法的数字表达式。如果number 不包含合法数据，返回Null ；如果它是未初始化的变量，返回Empty 。

注释

数字的绝对值是其无符号的大小值。例如，ABS(-1)和ABS(1)均返回1。


EE Atn;Atn 函数
Atn 函数

返回数字的反正切。

语法

Atn(number)

元素

命名参数 number可以是任何合法的数字表达式。

注释

Atn函数由直角三角形的两边之比(number)以弧度为单位返回相应的角度。该比值为角的对边长度除以角的邻边长度。

结果的取值范围为-pi/2到pi/2弧度。

将角度乘以pi/180可将角度转换为弧度。将弧度乘以180/pi可将弧度转换为角度。

附注   Atn是Tan的反三角函数，Tan 以角度为参数，返回直角三角形两边之比。请勿混淆Atn 和余切，余切是正切的倒数(1/正切)。


Cos 函数

返回角度的余弦。

语法

Cos(number)

元素

命名参数 number可以是任何以弧度为单位表示角度的合法的数字表达式 。

注释

Cos函数以角度为参数，返回直角三角形两边之比。该比值为角的邻边长度除以斜边长度。

结果的取值范围为-1到1。

将角度乘以pi /180可将角度转换为弧度。将弧度乘以180/pi可将弧度转换为角度。


Exp 函数

返回e(自然对数的底数)的幂。

语法

Exp(number)

元素

命名参数 number可以是任何合法的数字表达式。

注释

如果number的值超出709.782712893，将产生错误。常量e 约为2.718282。

附注   Exp函数是Log函数的反运算，有时被称为反对数。


Int 函数, Fix 函数

返回数字的整数部分。

语法

Int(number)
Fix(number)

元素

number 参数可以是任何合法的数字表达式。如果number 不包含合法数据，返回Null 。

注释

Int和Fix都去掉number的小数部分，返回所得整数。

Int和Fix的不同之处在于，如果number是负数，Int返回小于或等于number的第一个负整数，而Fix返回大于或等于number的第一个负整数。例如，Int将-8.4转换为-9，而Fix将-8.4转换为-8。

Fix(number)与下列语句等价:

Sgn(number) * Int(Abs(number))


Log 函数

返回数字的自然对数。

语法

Log(number)

元素

命名参数 number可以是任何大于0的合法的数字表达式 。

注释

自然对数是以e为底的对数。常量e 约为2.718282。

用n 的自然对数除x的自然对数，可以得到任何数字x的以n为底的对数，如下所示:

Logn(x) = Log(x) / Log(n)

Log10(X)

Log10 = L

下例示范了计算以10为底的对数的自定义Function:

Static Function og(X) / Log(10#)

End Function


Randomize 语句

初始化随机数发生器。

语法

Randomize [number]

元素

命名参数 number可以是任何合法的数字表达式。

注释

Randomize用number初始化随机数发生器，给它以新的种子值。若省略number，将用Timer函数的返回值作为新的种子值。

如果不用Randomize，就总用同样的初始种子值开始随机序列。

使用不带参数的Randomize语句可提供基于系统时钟的随机种子，以在调用Rnd之前初始化随机数发生器。


Rnd 函数

返回随机数。

语法

Rnd[(number)]

元素

命名参数 number可以是任何合法的数字表达式。

注释

Rnd函数返回0到1之间的值。

number的值决定了Rnd产生随机数的方式:

number的值:	Rnd产生的数:

小于0	每次都相同的数字，以number作为种子。

大于0	序列中下一个随机数。

等于0	最近产生的数字。

省略	序列中下一个随机数。

对于任何给定的初始种子，将产生相同的数字序列，因为每次对Rnd函数的成功调用都使用前一次的数字作为序列中下一个数字的种子。

使用不带参数的Randomize语句可提供基于系统时钟的随机种子，以在调用Rnd之前初始化随机数发生器。

要产生给定范围内的随机整数，使用下列公式:

Int((upperbound - lowerbound + 1) * Rnd + lowerbound)

此处，upperbound 是该范围的最大值，lowerbound 是该范围的最小值。


Sgn 函数

返回表示数字符号的整数。

语法

Sgn(number)

元素

number参数可以是任何合法的数字表达式。

返回值

number的值	Sgn的返回值

大于0	1

等于0	0

小于0	-1

注释

number 参数的符号决定了Sgn 函数的返回值。


Sin 函数

返回角度的正弦。

语法

Sin(number)

元素

命名参数 number可以是任何以弧度为单位表示角度的合法的数字表达式 。

注释

Sin函数以角度为参数，返回直角三角形两边之比。该比值为角的对边长度除以斜边长度。

结果的取值范围为-1到1。

将角度乘以pi /180可将角度转换为弧度。将弧度乘以180/pi可将弧度转换为角度。


Sqr 函数

返回数字的平方根。

语法

Sqr(number)

元素

命名参数 number可以是任何大于或等于0的合法的数字表达式 。


Tan 函数

返回角度的正切。

语法

Tan(number)

元素

命名参数 number可以是任何以弧度为单位表示角度的合法的数字表达式 。

注释

Tan函数以角度为参数，返回直角三角形两边之比。该比值为角的对边长度除以角的邻边长度。

将角度乘以pi /180可将角度转换为弧度。将弧度乘以180/pi可将弧度转换为角度。


Derived Math 函数

下表是可由内部数学函数派生的非内部数学函数:

函数	派生的等价形式

正割	Sec(X) = 1 / Cos(X)

余割	Cosec(X) = 1 / Sin(X)

余切	Cotan((X) = 1 / Tan(X)

反正弦	Arcsin(X) = Atn(X / Sqr(-X * X + 1))

反余弦	Arccos(X) = Atn(-X / Sqr(-X * X + 1)) + 1.5708

反正割	Arcsec(X) = Atn(X / Sqr(X * X - 1)) + Sgn((X) -1) * 1.5708

反余割	Arccosec(X) = Atn(X / Sqr(X * X - 1)) + (Sgn(X) - 1) * 1.5708

反余切	Arccotan(X) = Atn(X) + 1.5708

双曲正弦	HSin(X) = (Exp(X) - Exp(-X)) / 2

双曲余弦	HCos(X) = (Exp(X) + Exp(-X)) / 2

双曲正切	HTan(X) = (Exp(X) - Exp(-X)) / (Exp(X) + Exp(-X))

双曲正割	HSec(X) = 2 / (Exp(X) + Exp(-X))

双曲余割	HCosec(X) = 2 / (Exp(X) - Exp(-X))

双曲余切	HCotan(X) = (Exp(X) + Exp(-X)) / (Exp(X) - Exp(-X))

双曲反正弦	HArcsin(X) = Log(X + Sqr(X * X + 1))

双曲反余弦	HArccos(X) = Log(X + Sqr(X * X - 1))

双曲反正切	HArctan(X) = Log((1 + X) / (1 - X)) / 2

双曲反正割	HArcsec(X) = Log((Sqr(-X * X + 1) + 1) / X)

双曲反余割	HArccosec(X) = Log((Sgn(X) * Sqr(X * X + 1) +1) / X)

双曲反余切	HArccotan(X) = Log((X + 1) / (X - 1)) / 2

以N为底的对数	LogN(X) = Log(X) / Log(N)


Abs 函数实例

本例使用Abs函数计算数字的绝对值。

MyNumber = Abs(50.3)	' 返回50.3。

MyNumber = Abs(-50.3)	' 返回50.3。


Atn 函数实例

本例使用Atn函数返回数字的反正切。

Pi = 4 * Atn(1)	' 计算pi的值。


Cos 函数实例

本例使用Cos函数返回角度的余弦。

MyAngle = 1.3	' 以弧度为单位定义角度。

MySecant = 1 / Cos(MyAngle)	' 计算正割。


Exp 函数实例

本例使用Exp函数返回e的幂。

' 以弧度为单位定义角度。

MyAngle = 1.3

' 计算双曲正弦。

MyHSin = (Exp(MyAngle) - Exp(- 1 * MyAngle)) / 2


Int 函数, Fix 函数实例

本例示范Int和Fix 函数如何返回数字的整数部分。如果参数为负数， Int 函数返回小于或等于该数的第一个负数；而 Fix 函数返回大于或等于该数的第一个负数。

MyNumber = Int(99.8)	' 返回99。

MyNumber = Fix(99.2)	' 返回99。

MyNumber = Int(-99.8)	' 返回-100。

MyNumber = Fix(-99.8)	' 返回-99。

MyNumber = Int(-99.2)	' 返回-100。

MyNumber = Fix(-99.2)	' 返回-99。


Log 函数实例

本例使用Log函数返回数字的自然对数。

' 以弧度为单位定义角度。

MyAngle = 1.3

' 计算反双曲正弦。

MyLog = Log(MyAngle + Sqr(MyAngle * MyAngle + 1))


Randomize 语句实例

本例使用Randomize 语句初始化随机数发生器。由于省略了数字参数，Randomize 使用 Timer 函数的返回值作为新的种子值。

' 初始化随机数发生器。

Randomize

' 产生1到6之间的随机数。

MyAngle = Int((6 * Rnd) + 1)


Rnd 函数实例

本例使用Rnd函数产生1到6之间的随机数。

MyValue = Int((6 * Rnd) + 1)	' 产生1到6之间的随机数。


Sgn 函数实例

本例使用Sgn函数判断数字的符号。

MyVar1 = 12: MyVar2 = -2.4: MyVar3 = 0

MySign = Sgn(MyVar1)	' 返回1。

MySign = Sgn(MyVar2)	' 返回-1。

MySign = Sgn(MyVar3)	' 返回0。


Sin 函数实例

本例使用Sin函数返回角度的正弦。

MyAngle = 1.3	' 以弧度为单位定义角度。

MyCosecant = 1 / Sin(MyAngle)	' 计算余割。


Sqr 函数实例

本例使用Sqr函数计算数字的平方根。

MySqr = Sqr(4)	' 返回2。

MySqr = Sqr(23)	' 返回4.795832。

MySqr = Sqr(0)	' 返回0。

MySqr = Sqr(-4)	' 产生运行错误。


Tan 函数实例

本例使用Tan函数返回角度的正切。

MyAngle = 1.3	' 以弧度为单位定义角度。

MyCotangent = 1 / Tan(MyAngle)	' 计算余切。


字符集 (0 - 127)

 0	�	 32	[空格] 	 64	@	 96	`

 1	�	 33	!	 65	A	 97	a

 2	�	 34	"	 66	B	 98	b

 3	�	 35	#	 67	C	 99	c

 4	�	 36	$	 68	D	 100	d

 5	�	 37	%	 69	E	 101	e

 6	�	 38	&	 70	F	 102	f

 7	�	 39	'	 71	G	 103	g

 8	* *	 40	(	 72	H	 104	h

 9	* *	 41	)	 73	I	 105	i

 10	* *	 42	*	 74	J	 106	j

 11	�	 43	+	 75	K	 107	k

 12	�	 44	,	 76	L	 108	l

 13	* *	 45	-	 77	M	 109	m

 14	�	 46	.	 78	N	 110	n

 15	�	 47	/	 79	O	 111	o

 16	�	 48	0	 80	P	 112	p

 17	�	 49	1	 81	Q	 113	q

 18	�	 50	2	 82	R	 114	r

 19	�	 51	3	 83	S	 115	s

 20	�	 52	4	 84	T	 116	t

 21	�	 53	5	 85	U	 117	u

 22	�	 54	6	 86	V	 118	v

 23	�	 55	7	 87	W	 119	w

 24	�	 56	8	 88	X	 120	x

 25	�	 57	9	 89	Y	 121	y

 26	�	 58	:	 90	Z	 122	z

 27	�	 59	;	 91	[	 123	{

 28	�	 60	<	 92	\	 124	|

 29	�	 61	=	 93	]	 125	}

 30	�	 62	>	 94	^	 126	~

 31	�	 63	?	 95	_	 127	�

* *	8, 9, 10和13分别转换为回退符, 制表符, 换行符和回车符。它们是不可见字符，但依赖于特定的应用程序，它们可影响文本的显示。

�	Microsoft Windows 不支持这些字符。


限制性关键字

下列 关键字 是限制性的:

Abs	And	Any	As

B*	BF*	Boolean	ByRef

ByVal	Call	Case	CBool

CCur	CDate	CDbl	CDecl

CInt	Circle*	CLng	Close

Const	Command*	CSng	CStr

CurDir	Currency	CVar	CVDate

CVErr	Date	Debug	Declare

DefBool	DefCur	DefDate	DefDbl

DefInt	DefLng	DefObj	DefSng

DefStr	DefVar	Dim	Dir

Do	Double	Each	Else

ElseIf	Empty	End	EndIf

Environ*	Eqv	Erase	Error

Exit	F*	False	Fix

For	Format	FreeFile	Function

Get	Global*	Go	GoSub

GoTo	If	Imp	In

Input	InputB	Instr	InstrB

Int	Integer	Is	LBound

Len	LenB	Let	Like

Line*	Load*	LoadPicture*	Local*

Lock	Long	Loop	LSet

Me*	Mid	MidB	Mod

Name	New*	Next	Not

Nothing	Null	Object	On

Open	Option	Optional	Or

ParamArray	Point*	Preserve	Print

Private	Property	PSet*	Public

Put	QBColor*	ReDim	Rem

Resume	Return	RSet	Scale*

SavePicture*	Seek	Select	Set

Sgn	Shared	Single	Spc

Static	Stop	StrComp	String

Sub	Tab	Then	To

True	Type	TypeOf*	UBound

Unload*	Unlock	Until	Variant

Wend	While	Width	With

Write	Xor

*为语言的未来扩展或与先前版本的 Visual Basic 保持兼容而限制使用的关键字。


关键字

关键字是识别为编程语言一部分的单词或符号；例如，语句，函数或运算符。

Visual Basic中有两类关键字:

类型	描述

限制性	不能用于命名过程的关键字。

非限制性	可自由使用的关键字。许多非限制性关键字是系统或应用程序提供的函数，方法，属性和语句的名称，这些名称对编译器是未知的。这就允许用同样的名称定义自己的过程。例如，如果创建了FileCopy过程，并从自己的应用程序中调用之，则使用自定义的FileCopy ，而非系统提供的 FileCopy 语句。


CreateObject 函数

创建OLE 自动化对象。

语法

CreateObject(class)

元素

class 命名参数 的语法为: "appname.objecttype" ，有下列成分:

成分	描述

appname	提供对象的应用程序名称。

objecttype	要创建的对象的类型或类。

注释

附注   如果支持 OLE 自动化的应用程序提供了对象库，最好使用库中定义的函数创建对象，而不用 CreateObject。

每个支持 OLE 自动化的应用程序至少提供一种类型的对象。 例如，字处理程序可能提供应用程序对象，文档对象和工具栏对象。

可用本函数创建 OLE 自动化对象并将其赋给某对象变量。 应使用 Set 语句将 CreateObject 返回的对象赋给对象变量。例如:

Set WordBasicObject = CreateObject("Word.Basic")

执行此代码时，如果创建该对象的应用程序(本例中即 Microsoft Word) 未处于运行状态，将自动启动，且创建指定类型的对象。一旦创建了对象，就可在代码中用所定义的对象变量引用之。在上例中，可用对象变量WordBasicObject访问新对象的属性和方法。例如:

WordBasicObject.Insert "Hello, world."

WordBasicObject.FilePrint

WordBasicObject.FileSaveAs "C:\DOCS\TEST.DOC"


GetObject 函数

从文件中获取 OLE自动化对象。

语法

GetObject([pathname][,class])

元素

GetObject 函数有如下 命名参数 成分:

成分	描述

pathname	包含要获取对象的文件的完整路径和名称。如果省略 pathname ，class 就是必选项。

class	代表对象的类的字符串。

class 命名参数 的语法为: "appname.objecttype" ，有下列成分:

成分	描述

appname	提供对象的应用程序名称。

objecttype	要创建的对象的类型或类。

注释

附注   如果支持 OLE 自动化的应用程序提供了对象库，最好使用库中定义的函数访问对象，而不用 GetObject。

可用 GetObject 函数访问文件中的OLE 自动化对象并将其赋给某对象变量。 应使用 Set 语句将 GetObject 返回的对象赋给对象变量。例如:

Set CADObject = GetObject("C:\CAD\SCHEMA.CAD")

执行此代码时，与指定文件名相关联的应用程序将被启动，且激活指定文件中的对象。

如果 pathname 为零长字符串 ("")，GetObject 返回指定类型对象的新实例。如果完全省略 pathname 参数，GetObject 返回指定类型的当前活动对象。如果不存在指定类型的对象，将产生错误。

上例示范如何激活整个文件。然而，某些应用程序允许激活文件的一部分。若想这样做，将惊叹号 (!) 加在文件名尾部，再加表示所要激活部分的字符串。关于如何创建此字符串的信息，请参阅创建该对象的应用程序的文档。

例如，在绘图程序中，单个图形可能有多个层面存储在文件中。可用下列代码激活名为 SCHEMA.CAD 的图形的某个层面:

Set LayerObject = GetObject("C:\CAD\SCHEMA.CAD!Layer3")

如果未指定对象的 class， OLE.DLLs 根据所提供的文件名决定要引用的应用程序和要激活的对象。但有些文件可能支持多种类型的对象。例如，图形可能支持三类不同对象: 应用程序对象、图形对象和工具栏对象，所有这些都是同一文件的一部分。可用可选的 class 参数指定要激活文件中哪个对象。例如:

Set MyObject = GetObject("C:\DRAWINGS\SAMPLE.DRW", "FIGMENT.DRAWING")

上例中，FIGMENT 是绘图程序的名称， DRAWING 是所支持的对象类型之一。

一旦激活了对象，就可在代码中用所定义的对象变量引用之。在上例中，可用对象变量MyObject 访问新对象的属性和方法。例如:

MyObject.Line 9, 90

MyObject.InsertText 9, 100, "Hello, world."

MyObject.SaveAs "C:\DRAWINGS\SAMPLE.DRW"


MacScript 语句

执行AppleScript 手写体；在运行System 7.0 或更新版本的Macintosh 机上可用。

语法

MacScript script

元素

命名参数 script 是指定AppleScript 手写体名称的字符串表达式 。

注释

可插入回车符(Chr(13))以创建多行的手写体。


Visual Basic 常量

Visual Basic 指定了下列常量。从而可在代码中任何地方用它们取代实际值。

Dir, GetAttr, and SetAttr Constants

MsgBox Constants

StrConv Constants

VarType Constants


VarType 常量(Variant 变量类型标签)

常量	值	描述
vbEmpty	0	未初始化。
vbNull	1	不包含合法数据。
vbInteger	2	整数。
vbLong	3	长整数。
vbSingle	4	单精度浮点数。
vbDouble	5	双精度浮点数。
vbCurrency	6	货币。
vbDate	7	日期。
vbString	8	字符串。
vbObject	9	OLE 自动化对象。
vbError	10	错误。
vbBoolean	11	布尔值。
vbVariant	12	变体型(仅用于变体型数组)。
vbDataObject	13	非OLE 自动化对象。
vbArray	8192	数组。


MsgBox 常量

MsgBox 参数

常量	值	描述
vbOKOnly	0	仅�确定�按钮。
vbOKCancel	1	�确定�和�取消�按钮。
vbAbortRetryIgnore	2	�放弃�, �重试�,和�忽略� 按钮。
vbYesNoCancel	3	�是�, �否�,和�取消�按钮。
vbYesNo	4	�是�和�否�按钮。
vbRetryCancel	5	�重试�和�取消�按钮。
vbCritical	16	关键消息。
vbQuestion	32	警告性询问。
vbExclamation	48	警告性消息。
vbInformation	64	信息性消息。
vbApplicationModal	0	应用程序模型消息框。
vbDefaultButton1	0	第一个按钮是缺省的。
vbDefaultButton2	256	第二个按钮是缺省的。
vbDefaultButton3	512	第三个按钮是缺省的。
vbSystemModal	4096	系统模型消息框。
MsgBox 返回值

常量	值	描述
vbOK	1	按下了�确定�按钮。
vbCancel	2	按下了�取消�按钮。
vbAbort	3	按下了�放弃�按钮。
vbRetry	4	按下了�重试�按钮。
vbIgnore	5	按下了�忽略�按钮。
vbYes	6	按下了�是�按钮。
vbNo	7	按下了�否�按钮。


Dir, GetAttr,和SetAttr 常量

常量	值	描述
vbNormal	0	普通。
vbReadOnly	1	只读。
vbHidden	2	隐藏。
vbSystem	4	系统 [image] 不能用于Macintosh。
vbVolume	8	卷标 [image] 不能用于Macintosh。
vbDirectory	16	目录或文件夹。
vbArchive	32	上次备份以来文件已修改 [image] 不能用于Macintosh。


StrConv 常量

常量	值	描述
vbUpperCase	1	将字符串变为大写。
vbLowerCase	2	将字符串变为小写。
vbProperCase	3	将字符串中每个单词的第一个字母变为大写。
vbWide	4	将字符串中窄(单字节)字符转换为宽(双字节)字符。
vbNarrow	8	将字符串中宽(双字节) 字符转换为窄(单字节)字符。
vbKatakana	16*	将字符串中平假名转换为片假名。
vbHiragana	32*	将字符串中片假名转换为平假名。
*仅适用于日本语言环境。


IMEStatus 函数

返回Microsoft Windows中当前输入方法编辑器(IME)的模式；仅用于远东版本。

语法

IMEStatus

返回值

日本语言环境:

值	描述

0	无操作。

1	IME打开。

2	IME关闭。

3	IME禁止。

4	平假名双字节字符(DBC)。

5	片假名DBC。

6	片假名单字节字符(SBC)。

7	字母数字式的DBC。

8	字母数字式的SBC。

朝鲜语言环境:

值	描述

0	无操作。

1	IME打开。

2	IME关闭。

3	IME禁止。

4	Hangeul DBC。

5	Hanja转换。

6	为IMEStatus信息的一致性和将来的Hanja 单词转换要求而保留。

7	字母数字式的DBC。

8	字母数字式的SBC。


StrConv 函数

返回转换后的字符串；仅用于远东版本。

语法

StrConv(string,conversion)

元素

StrConv 函数有下列命名参数 成分:

成分	描述

string	要转换的字符串表达式。

conversion	常量值之和，这些常量表示所要进行的转换类型。

命名参数conversion 可用下列常量和值:

常量	值	描述

vbUpperCase	1	将字符串变为大写。

vbLowerCase	2	将字符串变为小写。

vbProperCase	3	将字符串中每个单词的第一个字母变为大写。

vbWide	4	将字符串中窄(单字节)字符转换为宽(双字节)字符。

vbNarrow	8	将字符串中宽(双字节)字符转换为窄(单字节)字符。

vbKatakana	16*	将字符串中平假名转换为片假名。

vbHiragana	32*	将字符串中片假名转换为平假名。

*仅适用于日本语言环境。

附注   这些常量由Visual Basic 指定。从而可在代码中任何地方用它们取代实际值。


文档约定

Visual Basic 使用下列印刷约定。

约定	描述

Sub, If, ChDir, Print, True, Debug	粗体且第一个字母大写的单词表示特定于编程语言的关键字。

setup	应由您键入的单词以粗体显示。

object, varname, arglist	斜体的小写字母表示要由您提供的信息。

pathname, filenumber	粗体且斜体的小写字母表示可按顺序提供或使用命名参数 语法的参数。

[expressionlist]	语法说明中，方括号中的项目表示可选项。

{While | Until}	语法说明中，花括号和竖线表示两个或多个项目之间的强制选择。必须从中择一，除非所有的项目又括在方括号中。例如:

[{This | OrThat}]

VBA.INI, ESC, ENTER	大写字母组成的单词表示文件名，键和键序列。

ALT+F1, CTRL+R	键名称之间的加号(+)表示键的组合。例如，ALT+F1 表示按住ALT键并按下F1键。

MyString = "Hello, world!"	这种字体用于代码，变量和错误消息的文本。

' This is a comment.	代码中的注释以单引号(')开始。

MyVar = "This is an " _	SPACE+UNDERSCORE (空格加下划线)用作续行符。

& "实例" _

& _"of how to continue code"


常量(对象浏览器)

常量模块显示用于Dir, GetAttr, MsgBox和VarType 函数以及SetAttr 语句的预定义常量。


转换过程(对象浏览器)

转换模块显示用于转换操作的过程。

若要获得关于特定过程的帮助

1.	在“方法/属性”列表框中选取该过程。

2.	选择?按钮。


日期/时间过程(对象浏览器)

日期/时间模块显示进行日期和时间操作的过程。

若要获得关于特定过程的帮助

1.	在“方法/属性”列表框中选取该过程。

2.	选择?按钮。


文件系统过程(对象浏览器)

文件系统模块显示用于进行文件，目录或文件夹及系统操作的过程。

若要获得关于特定过程的帮助

1.	在“方法/属性”列表框中选取该过程。

2.	选择?按钮。


信息过程(对象浏览器)

信息模块显示用于返回，检测或校验信息的过程。

若要获得关于特定过程的帮助

1.	在“方法/属性”列表框中选取该过程。

2.	选择?按钮。


交互过程(对象浏览器)

交互模块显示用于与对象，应用程序和系统交互的过程。

若要获得关于特定过程的帮助

1.	在“方法/属性”列表框中选取该过程。

2.	选择?按钮。


数学过程(对象浏览器)

数学模块显示用于进行数学操作的过程。

若要获得关于特定过程的帮助

1.	在“方法/属性”列表框中选取该过程。

2.	选择?按钮。


文本过程(对象浏览器)

文本模块显示用于进行字符串操作的过程。

若要获得关于特定过程的帮助

1.	在“方法/属性”列表框中选取该过程。

2.	选择?按钮。


AppActivate 语句

激活应用程序的窗口。

语法

AppActivate title [,wait]

元素

AppActivate 语句的语法有下列命名参数成分:

成分	描述

title	在Microsoft Windows中，title参数是要激活的应用程序窗口标题栏中的字符串。

在Macintosh机上(System 7.0 或更晚版本)，title参数是应用程序的名称。可用MacID 函数指定应用程序的署名而非名称。例如,

AppActivate MacID("MSWD")

另外，Shell 函数返回的任务标识(task ID)可用于取代title以激活应用程序。

wait	布尔值，指明激活其它应用程序前本应用程序是否拥有输入焦点。如果是False (缺省)，将立即激活指定的应用程序，即便本应用程序没有输入焦点。如果是True，则一直等到本应用程序获得输入焦点才激活指定的应用程序。

注释

AppActivate 语句将输入焦点交给指定的应用程序或窗口，但并不影响它是最大化还是最小化。当用户执行某些修改输入焦点的操作或关闭该窗口后，激活的应用程序就丢失输入焦点。可用Shell 函数启动应用程序并设置其窗口状态。

试图寻找要激活的应用程序时，将进行比较操作以查找标题字符串正好匹配title的应用程序。如果未找到，标题字符串以title 打头的应用程序将激活。在Microsoft Windows中，如果 名为title 的应用程序有多个实例，将激活任意一个。

如果在Microsoft Windows 中使用MacID 函数，将产生错误。


Beep 语句

用计算机的扬声器发出声音。

语法

Beep

注释

发声的频率和持续时间依赖于硬件，对各种计算机可有不同。


InputBox 函数

在对话框中显示一提示，等待用户输入文本或选择按钮，并返回文本框中的内容。

语法

InputBox(prompt[,title][,default][,xpos][,ypos][,helpfile,context])

元素

InputBox 函数的语法有下列命名参数 成分:

成分	描述

prompt	在对话框中当作消息显示的字符串表达式 。prompt 的最大长度约1024个字符，依赖于所用字符的宽度。如果prompt 包含多行，一定要在各行间插入回车符(字符码13)或换行符(字符码10)。

title	显示在对话框的标题栏 中的字符串。如果省略title，标题栏中将空无一物。

default	显示在文本框中，没有其它输入时当作缺省应答的字符串。如果省略default，文本框置空。

xpos	以缇为单位指定对话框的左边到屏幕左边的水平距离的数字表达式 。如果省略xpos，对话框处在水平方向的中央。

ypos	以缇为单位指定对话框的上边到屏幕顶部的垂直距离的数字表达式。如果省略ypos，对话框处在屏幕垂直方向约三分之一的地方。

helpfile	标识用于对话框的上下文敏感帮助的帮助文件的字符串表达式。如果提供了helpfile ，context 也必须提供。

context	数字表达式，是帮助的作者赋给适当帮助主题的帮助上下文代号。如果提供了context ，helpfile也必须提供。

注释

如果提供了helpfile 和context ，对话框中将自动加上“帮助”按钮。

如果用户按下“确定”或回车，InputBox 函数返回文本框中的内容。如果用户按下“取消”，该函数返回零长字符串("")。


MsgBox 函数

在对话框中显示消息，等待用户选择一个按钮，并返回表示哪个按钮被按下了的值。

语法

MsgBox(prompt[,buttons][,title][,helpfile,context])

元素

MsgBox 函数的语法有下列命名参数 成分:

成分	描述

prompt	在对话框中当作消息显示的字符串表达式 。prompt 的最大长度约1024个字符，依赖于所用字符的宽度。如果prompt 包含多行，一定要在各行间插入回车符(字符码13)或换行符(字符码10)。

buttons	数字表达式 ，该表达式是一些常量值的和，这些常量表示要显示的按钮的个数和种类，使用的图标样式，哪个按钮是缺省按钮，及模型种类。若省略，buttons缺省为0。

title	显示在对话框的标题栏 中的字符串。如果省略title，标题栏中将空无一物。

helpfile	标识用于对话框的上下文敏感帮助的帮助文件的字符串表达式。如果提供了helpfile ，context 也必须提供。

context	数字表达式，是帮助的作者赋给适当帮助主题的帮助上下文代号。如果提供了context ，helpfile也必须提供。

buttons命名参数有下列值:

常量	值	描述

vbOKOnly	0	仅�确定�按钮。

vbOKCancel	1	�确定�和�取消�按钮。

vbAbortRetryIgnore	2	�放弃�, �重试�,和�忽略� 按钮。

vbYesNoCancel	3	�是�, �否�,和�取消�按钮。

vbYesNo	4	�是�和�否�按钮。

vbRetryCancel	5	�重试�和�取消�按钮。

vbCritical	16	显示关键消息图标。

vbQuestion	32	显示警告性询问图标。

vbExclamation	48	显示警告性消息图标。

vbInformation	64	显示信息性消息图标。

vbDefaultButton1	0	第一个按钮是缺省的。

vbDefaultButton2	256	第二个按钮是缺省的。

vbDefaultButton3	512	第三个按钮是缺省的。

vbApplicationModal	0	应用程序模型消息框；用户必须首先回答了本消息框才能继续在当前应用程序中工作。

vbSystemModal	4096	系统模型消息框；所有应用程序都挂起，直至用户回答了本消息框。

第一组值(0-5)描述了要显示在对话框中的按钮的个数和种类；第二组值(16, 32, 48, 64)描述了图标样式；第三组值(0, 256, 512)决定了哪个按钮是缺省按钮；第四组值(0, 4096)决定了消息框的模型种类。创建buttons 的值时，每组最多只能选一个值加到buttons上。

附注   这些常量由Visual Basic 指定。从而可在代码中任何地方用它们取代实际值。

返回值

常量	值	按下的按钮

vbOK	1	确定

vbCancel	2	取消

vbAbort	3	放弃

vbRetry	4	重试

vbIgnore	5	忽略

vbYes	6	是

vbNo	7	否

注释

如果提供了helpfile 和context ，对话框中将自动加上“帮助”按钮。

如果对话框中有“取消”按钮，按下ESC 键与选择“取消”按钮效果相同。如果对话框中有“帮助”按钮，就提供了该对话框的上下文敏感帮助。但只有按下其它按钮后才会返回值。


RGB 函数

返回代表RGB 颜色值的整数。

语法

RGB (red, green, blue)

元素

RGB 函数语法有下列命名参数 成分:

成分	描述

red	0到255间的整数，包括0和255，代表颜色中的红色成分。

green	0到255间的整数，包括0和255，代表颜色中的绿色成分。

blue	0到255间的整数，包括0和255，代表颜色中的蓝色成分。

注释

接受颜色规格的应用程序方法和属性，需要该规格以代表RGB颜色值的整数表示。RGB颜色值指定了红、绿、蓝的相对强度，三色组合形成显示的特定颜色。

RGB的任一超过255的参数都假定为255。

下表列出一些标准颜色及其所包含的红、绿、蓝颜色值:

颜色	红色值	绿色值	蓝色值

黑色	0	0	0

蓝色	0	0	255

绿色	0	255	0

紫色	0	255	255

红色	255	0	0

品红色	255	0	255

黄色	255	255	0

白色	255	255	255

附注   本函数返回的RGB值与Macintosh操作系统所用的不兼容。它们可在Macintosh 机上的Microsoft应用程序中使用，但不能用于与Macintosh操作系统之间的直接修改颜色值的通讯中。


SendKeys 语句

向活动窗口发送一个或多个击键，就象在键盘上键入一样；不能用于Macintosh机。

语法

SendKeys string[,wait]

元素

SendKeys 语句的语法有下列命名参数 成分:

成分	描述

string	指定要发送的击键的字符串表达式 。

wait	指定等待模式的布尔值。如果是False(缺省)，发送击键后控制立即返回当前过程。如果是True，等击键处理完后控制才返回当前过程。

注释

每个键由一个或多个字符代表。使用字符本身指定单个的键盘字符。例如，在string中用"A"代表字母A。若要发送多个字符，应将每个字符按顺序排列。例如，在string中用"ABC"代表字母A, B,和C。

加号(+)、脱字号(^)、百分号(%)、波浪号(~)和圆括号 ( ) 对SendKeys有特殊含义。若要指定这些字符，可将其放在花括号中。例如，用{+}表示加号。方括号([ ])对SendKeys没有特殊含义，但也必须将其放在花括号中，因为在其它应用程序中，方括号对于动态数据交换(DDE)有特殊的意义。要用{{}和{}}发送花括号字符。

要指定击键时不回显的字符(例如ENTER或TAB)及蹿蓖操作敦非字粉的架，使用下蓖速示的蹿滤：

键	代码

BACKSPACE	{BACKSPACE}, {BS}, 或{BKSP}

BREAK	{BREAK}

CAPS LOCK	{CAPSLOCK}

DEL	{DELETE} 或{DEL}

DOWN ARROW	{DOWN}

END	{END}

ENTER	{ENTER}

ESC	{ESC}

HELP	{HELP}

HOME	{HOME}

INS	{INSERT}

LEFT ARROW	{LEFT}

NUM LOCK	{NUMLOCK}

PAGE DOWN	{PGDN}

PAGE UP	{PGUP}

PRINT SCREEN	{PRTSC}

RIGHT ARROW	{RIGHT}

SCROLL LOCK	{SCROLLLOCK}

TAB	{TAB}

UP ARROW	{UP}

F1	{F1}

F2	{F2}

F3	{F3}

F4	{F4}

F5	{F5}

F6	{F6}

F7	{F7}

F8	{F8}

F9	{F9}

F10	{F10}

F11	{F11}

F12	{F12}

F13	{F13}

F14	{F14}

F15	{F15}

F16	{F16}

若要指定击键与SHIFT和/或CTRL和/或ALT的咨合，用下蓖速列的蹿滤之一灰仍干作为前缀:

键	代码

SHIFT	+

CTRL (CONTROL)	^

ALT	%

若要指定敲若干其它键时，SHIFT, CTRL, 和ALT 或其任意组合应被摁住，应将这些键的代码用圆括号括起来。例如，使用"+(EC)"指定敲E键和C键时应摁住SHIFT。使用"+EC"指定敲E键时应摁住SHIFT，然后放开SHIFT 再按下C键。

用{key number}指定重复键。必须在key和number间加一空格。例如, {LEFT 42} 表示摁LEFT ARROW键42次；{h 10} 表示摁h键10次。

附注   SendKeys 不能向非Microsoft Windows应用程序发送击键。Sendkeys 也不能向任何应用程序发送PRINT SCREEN (PRTSC)键。


AppActivate 语句实例

本例示范用AppActivate 语句激活应用程序窗口。在Macintosh机上，可用MacID 函数指定应用程序的署名而非名称。AppActivate 语句在运行System 7.0 或更晚版本的Macintosh 机上可用。

' 在Microsoft Windows中。

AppActivate "Microsoft Word"	' 激活Word。

' AppActivate也可使用Shell函数的返回值。

MyAppID = Shell("C:\WORD\WINWORD.EXE", 1)	' 运行Microsoft Word。

AppActivate MyAppID	' 激活Microsoft Word。

' 在Macintosh机上。

AppActivate "Microsoft Word"	' 激活Microsoft Word。

' MacID("MSWD") 返回Microsoft Word的署名。

AppActivate MacID("MSWD")	' 激活Microsoft Word。

'也可使用Shell函数的返回值。

ReturnValue = Shell("Microsoft Excel")	' 运行Microsoft Excel。

AppActivate ReturnValue	' 激活Microsoft Excel。


Beep 语句实例

本例使用Beep 语句使计算机扬声器连续发出三声。

For I = 1 to 3	' 循环3次。

Beep	' 发声。

Next I


InputBox 函数实例

本例示范使用InputBox 函数提示用户输入的多种方式。如果省略x 和y 方向的位置，对话框分别处在各坐标的中央。如果用户选择了“确定”或按下了ENTER，变量MyValue 包含用户输入的值。如果用户选择了“取消”，返回零长字符串。

Message = "Enter a value between 1 and 3"	' 设置提示消息。

Title = "InputBox Demo"	' 设置标题。

Default = "1"	' 设置缺省值。

' 显示提示消息，标题和缺省值。

MyValue = InputBox(Message, Title, Default)

' 使用帮助文件和上下文。将自动加上“帮助”按钮。

MyValue = InputBox(Message, Title, , , , "DEMO.HLP", 10)

' 在100,100的位置显示对话框。

MyValue = InputBox(Message, Title, Default, 100, 100)


MsgBox 函数实例

本例使用MsgBox 函数在有“是”和“否”按钮的对话框中显示关键错误消息。“否”按钮设置为缺省按钮。MsgBox 函数的返回值取决于用户选择的按钮。本例中，假定DEMO.HLP 是包含上下文代号等于1000的帮助主题的帮助文件。

Msg = "Do you want to continue ?"	' 定义消息。

Style = vbYesNo + vbCritical + vbDefaultButton2	' 定义按钮。

Title = "MsgBox Demonstration"	' 定义标题。

Help = "DEMO.HLP"	' 定义帮助文件。

Ctxt = 1000	' 定义主题上下文。

' 显示消息。

Response = MsgBox(Msg, Style, Title, Help, Ctxt)

If Response = vbYES Then	' 用户选择“是”按钮。

MyString = "Yes"	' 执行一些操作。

Else	' 用户选择“否”按钮。

MyString = "No"	' 执行一些操作。

End If


RGB 函数实例

本例示范使用RGB 函数返回代表RGB颜色值的整数。它用于接受颜色规格的应用程序方法和属性。对象MyObject 及其属性在此处仅用于演示。

Red = RGB(255, 0, 0)	' 返回红色值。

I = 75	' 初始化偏移量。

RGBValue = RGB(I, 64 + I, 128 + I) 	' 等同于RGB(75, 139, 203)。

MyObject.Color = RGB(255, 0, 0)	' 将MyObject的Color属性设置为红色。


SendKeys 语句实例

本例使用Shell 函数运行Microsoft Windows中包含的计算器应用程序；然后使用SendKeys 语句向其发送击键以对数字求和，随即退出计算器。SendKeys 语句不能用于Macintosh机上。

ReturnValue = Shell("Calc.exe", 1)	' 运行计算器。

AppActivate ReturnValue 	' 激活计算器。

For I = 1 To 100	' 设定计数循环。

SendKeys I & "{+}", True	' 向计算器发送击键，将每个值加到I上。

Next I

SendKeys "=", True	' 得到总和。

SendKeys "%{F4}", True	' 发送Alt+F4以关闭计算器。


Print 方法

向调试窗口的“即时”窗格打印文本。

语法

[object.]Print [outputlist]

元素

Print 方法的语法有下列成分:

成分	描述

object	取值为Debug对象的对象表达式。

outputlist	要打印的表达式或表达式列表。若省略，打印一空行。

outputlist参数有下列语法和成分:

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

成分	描述

Spc(n)	用于在输出中插入空格字符，n是要插入的空格的数目。

Tab(n)	用于将插入点置于某绝对列号n。使用无参数的Tab可将插入点置于下一个打印区的开始处。

expression	要打印的数字或字符串表达式 。

charpos	指定下一个字符的插入点。可用分号指定插入点紧跟在最后一个显示的字符之后。可用Tab(n)将插入点置于某绝对列号。使用无参数的Tab可将插入点置于下一个打印区的开始处。如果省略charpos，下一个字符打印在下一行。

注释

多个表达式可用空格或分号隔开，空格与分号作用相同。

打印到“即时”窗格的数据均为国际公用格式；亦即数据已适当地格式化(使用合适的十进制分隔符)且输出关键字时使用的语言对系统的语言环境设定是适当的。

对于Boolean数据，打印True或False。关键字True和False按系统的语言环境设定适当地翻译。

Date数据按系统识别的标准短日期格式输出。如果日期或时间成分缺失或为零，就只输出所提供的数据。

如果outputlist为Empty，不输出任何东西。然而，如果outputlist为Null，则输出Null。同样关键字Null输出时也适当地翻译了。

对于错误数据，输出为Error errorcode。关键字Error输出时适当地翻译了。

附注   因为Print方法一般用均匀间距字符打印，故一定要记住打印字符的数目与这些字符所占的定宽度列的数目并无相互关系。例如"W"之类的宽字符占据的空间超过一个定宽度列，而"i"之类的窄字符占据的空间较少。考虑到超过平均宽度的字符的使用，必须保证表格列的位置足够远。另外，可用定宽字体(例如Courier)打印以保证每个字符仅占一列。


Debug 对象

Debug对象用关键字Debug访问，用于在运行时向调试窗口输出。


Print 方法实例

本例使用Print方法向Debug对象输出文本；亦即在调试窗口显示文本。

For I = 11 To 20	' 循环10次。

' 把每个值打印到新行

Debug.Print I

Next I

For I = 11 To 20	' 循环10次。

' 把每个值一个接一个地打印到同一行。

Debug.Print I;

Next I

Debug.Print Spc(10) ; "Hello there"	' 先打印10个空格。

Debug.Print Tab(20) ; "This is a test"	' 在第20列打印。

Debug.Print "Hello"; Tab; Tab; "There"	' 在2个打印区之外打印。


焈运算符摘要
运算符摘要

算术运算符

用于执行数学计算的运算符。

比较运算符

用于进行比较的运算符。

连接运算符

用于组合字符串的运算符。

逻辑运算符

用于执行逻辑操作的运算符。


运算符优先级

当表达式中有若干运算时，每个部分按预定的顺序取值和解析。该顺序称为运算符优先级。可用圆括号超越运算符优先级顺序，强制表达式的某些部分较其它部分先取值。圆括号内的运算总是先于圆括号外的运算。但在圆括号内部，还保持一般的运算符优先级。

如果表达式中包含多类运算符，首先执行算术运算符，其次是比较运算符，最后是逻辑运算符。所有比较运算符的优先级相同；亦即它们按从左到右的顺序执行。算术和逻辑运算符按下列优先级顺序执行:

算术	比较	逻辑

指数(^)	等于(=)	Not

取负(-)	不等(<>)	And

乘除(*,/)	小于(<)	Or

整除(\)	大于(>)	Xor

取余(Mod)	小于或等于(<=)	Eqv

加减(+,-)	大于或等于(>=)	Imp

字符串连接(&)	Like

Is

当乘除出现在同一表达式中时，按从左到右的顺序执行。同样，当加减出现在同一表达式中时，按从左到右的顺序执行。

字符串连接运算符(&)并非真正的算术运算符，但从优先级的角度讲，它确实处于算术运算符和逻辑运算符之间。同样地，Like运算符的优先级等同于所有比较运算符，但实际上是模式匹配运算符。Is运算符是对象引用比较运算符。它并不比较对象或对象的取值；它仅仅检查两个对象引用是否指向同一对象。


算术运算符

^ 运算符

* 运算符

/ 运算符

\ 运算符

Mod 运算符

+ 运算符

- 运算符


连接运算符

& 运算符

+ 运算符


逻辑运算符

And 运算符

Eqv 运算符

Imp 运算符

Not 运算符

Or 运算符

Xor 运算符


^ 运算符

用于指数运算。

语法

result = number^exponent

元素

^ 运算符的语法有下列成分:

成分	描述

result	数字变量。

number	数字表达式。

exponent	数字表达式。

注释

仅当exponent为整数时Number才能取负值。如果单个表达式中有多个指数运算，^ 运算符按从左到右的顺序执行。

通常，result的数据类型为Double或包含Double的Variant。不过，如果number或exponent取值为Null，result也等于Null。


+ 运算符

对两个数求和。

语法

result = expression1+expression2

元素

+ 运算符的语法有下列成分:

成分	描述

result	数字变量。

expression1	表达式。

expression2	表达式。

注释

虽然也可用+ 运算符连接两个字符串，但最好使用& 运算符，这样可消除歧义性及提供自编文件代码。

使用+ 运算符时，可能无法判断将进行求和还是字符串连接。如果至少有一个表达式不是Variant，可用下列规则判断:

如果	那么
两个表达式均为数字数据类型 (Boolean、Integer、Long、Single、Double、Date或Currency)	求和。
两个表达式均为String	连接。
一个表达式为数字数据类型，另一个为Variant(Null除外)	求和。
一个表达式为String，另一个为Variant (Null除外)	连接。
一个表达式为Empty Variant	将另一个表达式毫不修改地作为result。
一个表达式为数字数据类型，另一个为String	产生“类型不匹配”错误。
任一表达式为Null	result为Null。
如果两个表达式均为Variant表达式，其子类型以下列方式决定了+ 运算符的行为:

如果	那么
两个Variant表达式均为数字	求和。
两个Variant表达式均为字符串	连接。
一个Variant表达式为数字，另一个为字符串	求和。
对于仅有数字数据类型表达式的简单算术相加，result的数据类型通常与表达式中最精确的数据类型相同。精确性的顺序从低到高为Integer, Long, Single, Double和Currency。下面是该顺序的例外:

�	Single变量和Long变量相加，result的数据类型为Double。

�	如果result为Long, Single或Date变体型变量，且超出其合法取值范围，则result转换为Double变体型变量。

�	如果result为Integer变体型变量，且超出其合法取值范围，则result转换为Long变体型变量。

�	如果Date变量与其它类型的变量相加，result的数据类型总是Date。

如果两个表达式之一或两者均为Null表达式，result等于Null。如果两个表达式均为Empty，result成为Integer。然而，如果只有一个表达式为Empty，另一个表达式毫不修改地作为result。


- 运算符

对两个数求差，或表示表达式的相反数。

语法 1

result = number1-number2

语法 2

-number

元素

- 运算符的语法有下列成分:

成分	描述

result	数字变量。

number	数字表达式。

number1	数字表达式。

number2	数字表达式。

注释

在语法1中，- 运算符是对两个数字求差的算术相减运算符。在语法2中，- 运算符用作单目求反运算符，表示表达式的相反数。

result的数据类型 通常与表达式中最精确的数据类型相同。精确性的顺序从低到高为Integer, Long, Single, Double和Currency。下面是该顺序的例外:

�	Single变量和Long变量相减，result的数据类型为Double。

�	如果result为Long, Single或Date变体型变量，且超出其合法取值范围，则result转换为Double变体型变量。

�	如果result为Integer变体型变量，且超出其合法取值范围，则result转换为Long变体型变量。

�	如果Date变量与其它类型的变量相减，result的数据类型总是Date。

�	如果两个Date变量相减，result的数据类型Double。

如果两个表达式之一或两者均为Null表达式，result等于Null。如果有一个表达式为Empty，该表达式作为0看待。


* 运算符

对两个数求积。

语法

result = number1*number2

元素

* 运算符的语法有下列成分:

成分	描述

result	数字变量。

number1	数字表达式。

number2	数字表达式。

注释

result的数据类型 通常与表达式中最精确的数据类型相同。精确性的顺序从低到高为Integer, Long, Single, Double和Currency。下面是该顺序的例外:

�	Single变量和Long变量相乘，result的数据类型为Double。

�	如果result为Long, Single或Date变体型变量，且超出其合法取值范围，则result转换为Double变体型变量。

�	如果result为Integer变体型变量，且超出其合法取值范围，则result转换为Long变体型变量。

如果两个表达式之一或两者均为Null表达式，result等于Null。如果有一个表达式为Empty，该表达式就作为0看待。


/ 运算符

对两个数求商且返回浮点数结果。

语法

result = number1/number2

元素

/ 运算符的语法有下列成分:

成分	描述

result	数字变量。

number1	数字表达式。

number2	数字表达式。

注释

result的数据类型通常是Double或Double变体型。下面是一些例外:

�	如果两个表达式均为Integer或Single表达式，result为Single量，但如果超出其合法取值范围时将产生错误。

�	如果两个表达式均为Integer或Single变体型，result为Single量，但如果超出其合法取值范围，result成为包含Double的Variant量。

如果两个表达式之一或两者均为Null表达式，result等于Null。Empty表达式作为0看待。


\ 运算符

对两个数求商且返回整数结果。

语法

result = number1\number2

元素

\ 运算符的语法有下列成分:

成分	描述

result	数字变量。

number1	数字表达式。

number2	数字表达式。

注释

相除之前，数字表达式首先近似为Integer或Long表达式。

通常，无论result是否为整数，其数据类型均为Integer、Integer变体型、Long或Long变体型。小数部分都截去了。然而，如果有一个表达式为Null表达式，result等于Null。Empty表达式作为0看待。


Mod 运算符

将两个数相除，返回其余数。

语法

result = number1 Mod number2

元素

Mod 运算符的语法有下列成分:

成分	描述

result	数字变量。

number1	数字表达式。

number2	数字表达式。

注释

取余运算符将number1除以number2(浮点数近似为整数)，但仅返回其余数作为result。例如，下列表达式中A(即result)等于5。

A = 19 Mod 6.7

通常，无论result是否为整数，其数据类型均为Integer、Integer变体型、Long或Long变体型。小数部分都截去了。然而，如果有一个表达式为Null表达式，result等于Null。Empty表达式作为0看待。


& 运算符

强制两个表达式进行字符串连接。

语法

result = expression1 & expression2

元素

& 运算符的语法有下列成分:

成分	描述

result	数字变量。

expression1	表达式。

expression2	表达式。

注释

任一不是字符串的expression将转换为String变体型。如果两个表达式均为String表达式，result的数据类型为String；否则，result成为String变体型。如果两个表达式均为Null，result也等于Null。然而，如果仅有一个expression为Null，该表达式将看作零长字符串。Empty表达式也作为零长字符串看待。


比较运算符

用于比较表达式。

语法

result = expression1 comparisonoperator expression2
result = object1 Is object2
result = string Like pattern

元素

比较运算符有有下列成分:

成分	描述

result	数字变量。

expression	表达式。

comparisonoperator	比较运算符。

object	对象名称。

string	字符串表达式。

pattern	字符串表达式或字符的范围。

注释

Is和Like运算符有与下表所列运算符不同的特定的功能。下表包含比较运算符及result取值为True、False或Null的条件:

运算符	描述	下列条件下为True	下列条件下为False	下列条件下为Null
<	小于	expression1 < expression2	expression1 >= expression2	expression1或expression2 = Null
<=	小于或等于	expression1 <= expression2	expression1 > expression2	expression1或expression2 = Null
>	大于	expression1 > expression2	expression1 <= expression2	expression1或expression2 = Null
>=	大于或等于	expression1 >= expression2	expression1 < expression2	expression1或expression2 = Null
=	等于	expression1 = expression2	expression1 <> expression2	expression1或expression2 = Null
<>	不等于	expression1 <> expression2	expression1 = expression2	expression1或expression2 = Null
比较两表达式时，可能不易判断表达式将作为数字还是字符串来比较。下表显示表达式如何比较，或当任一表达式不为Variant返回何种结果:

如果	那么
两表达式均为数字数据类型 (Integer, Long, Single, Double或Currency)	进行数字比较。
两表达式均为String	进行字符串比较。
一个表达式为数字数据类型，另一个是，或可以作为，数字型Variant	进行数字比较。
一个表达式为数字数据类型，另一个为无法转换为数字的字符串Variant	产生“类型不匹配”错误。
一个表达式为String，另一个是任意Variant (Null除外)	进行字符串比较。
一个表达式为Empty，另一个为数字数据类型	进行数字比较，把Empty表达式看作0。
一个表达式为Empty，另一个为String	进行字符串比较，把Empty表达式看作零长字符串。
如果两个表达式均为Variant表达式，其子类型决定了它们如何比较。下表显示依赖于Variant量的子类型，表达式如何比较，或该比较返回何种结果:

如果	那么
两个Variant表达式均为数字型	进行数字比较。
两个Variant表达式均为字符串	进行字符串比较。
一个Variant表达式为数字型，另一个为字符串	数字表达式小于字符串表达式。
一个Variant表达式为Empty，另一个为数字型	进行数字比较，把Empty表达式看作0。
一个Variant表达式为Empty，另一个为字符串	进行字符串比较，把Empty表达式看作零长字符串。
两个Variant表达式均为Empty	两表达式相等。
附注   如果Currency量与Single或Double量比较，Single或Double量将转换为Currency量。这将导致Single或Double值的小于0.0001的小数部分丢失，从而可能造成两个不等的值被比较为相等。当Single与Double比较时，Double量近似为Single的精确度。


And 运算符

对两表达式进行逻辑与运算。

语法

result = expression1 And expression2

元素

And 运算符的语法有下列成分:

成分	描述

result	数字变量。

expression1	表达式。

expression2	表达式。

注释

当且仅当两表达式均取值为True时，result才为True。如果任一表达式为False，result即等于False。下表显示result如何取值:

如果expression1为	且expression2为	则result为

True	True	True

True	False	False

True	Null	Null

False	True	False

False	False	False

False	Null	False

Null	True	Null

Null	False	False

Null	Null	Null

And运算符也进行两个数字表达式 的相应位的位比较，并按下列真值表设置result的相应位:

expression1中的位	expression2中的位	result

0	0	0

0	1	0

1	0	0

1	1	1


Eqv 运算符

对两表达式进行逻辑等价运算。

语法

result = expression1 Eqv expression2

元素

Eqv 运算符的语法有下列成分:

成分	描述

result	数字变量。

expression1	表达式。

expression2	表达式。

注释

如果任一表达式为Null，result也为Null。当两表达式均不为Null时，按下表决定result的值:

如果expression1为	且expression2为	result为

True	True	True

True	False	False

False	True	False

False	False	True

Eqv运算符进行两个数字表达式 的相应位的位比较，并按下列真值表设置result的相应位:

expression1中的位	expression2中的位	result

0	0	1

0	1	0

1	0	0

1	1	1


Imp 运算符

对两表达式进行逻辑隐含运算。

语法

result = expression1 Imp expression2

元素

Imp 运算符的语法有下列成分:

成分	描述

result	数字变量。

expression1	表达式。

expression2	表达式。

注释

下表显示如何决定result的取值:

如果expression1为	且expression2为	result为

True	True	True

True	False	False

True	Null	Null

False	True	True

False	False	True

False	Null	True

Null	True	True

Null	False	Null

Null	Null	Null

Imp运算符进行两个数字表达式 的相应位的位比较，并按下列真值表设置result的相应位:

expression1中的位	expression2中的位	result

0	0	1

0	1	1

1	0	0

1	1	1


Not 运算符

对表达式进行逻辑非运算。

语法

result = Not expression

元素

Not 运算符的语法有下列成分:

成分	描述

result	数字变量。

expression	表达式。

注释

下表显示如何决定result的取值:

如果expression为	那么result为

True	False

False	True

Null	Null

另外，Not运算符将变量的位取反，并按下列真值表设置result的相应位:

expression中的位	result中的位

0	1

1	0


Or 运算符

对两表达式进行逻辑或运算。

语法

result = expression1 Or expression2

元素

Or 运算符的语法有下列成分:

成分	描述

result	数字变量。

expression1	表达式。

expression2	表达式。

注释

如果任一表达式为或两表达式均为True，result为True。下表显示如何决定result的取值:

如果expression1为	且expression2为	result为

True	True	True

True	False	True

True	Null	True

False	True	True

False	False	False

False	Null	Null

Null	True	True

Null	False	Null

Null	Null	Null

Or运算符进行两个数字表达式 的相应位的位比较，并按下列真值表设置result的相应位:

expression1中的位	expression2中的位	result

0	0	0

0	1	1

1	0	1

1	1	1


Xor 运算符

对两表达式进行逻辑异或运算。

语法

result = expression1 Xor expression2

元素

Xor 运算符的语法有下列成分:

成分	描述

result	数字变量。

expression1	表达式。

expression2	表达式。

注释

当且仅当两表达式之一取值为True时，result为True。然而，如果任一表达式为Null，result也为Null。当两表达式均不为Null时，按下表决定result的值:

如果expression1为	且expression2为	result为

True	True	False

True	False	True

False	True	True

False	False	False

Xor运算符进行两个数字表达式 的相应位的位比较，并按下列真值表设置result的相应位:

expression1中的位	expression2中的位	result

0	0	0

0	1	1

1	0	1

1	1	0


Like 运算符

用于比较两字符串。

语法

result = string Like pattern

元素

Like 运算符的语法有下列成分:

成分	描述

result	数字变量。

string	字符串表达式。

pattern	与下面所述的模式匹配约定一致的字符串表达式。

注释

如果string与pattern匹配，result为True；若不匹配，result为False；如果string或pattern之一为Null，result也为Null。

Like运算符的行为取决于Option Compare语句。若非另外指定，每个模块 的缺省string-comparison 方式为Option Compare Binary。

Option Compare Binary 导致字符串比较基于字符的内部二进制表示所引出的排序顺序 。在Microsoft Windows中，排序顺序取决于代码页。在Macintosh机上，排序顺序取决于字符集。下面的例子演示典型的二进制排序顺序:

A < B < E < Z < a < b < e  < z < � < � < � < � < � < �

Option Compare Text 导致字符串比较基于大小写不敏感的文本排序顺序，该顺序取决于系统的语言环境。上面所示的字符，如果用Option Compare Text排序，将产生如下结果:

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

内置的模式匹配提供了多方面的字符串比较工具。模式匹配的特性允许比较字符串时使用任意组合的通配符、字符列表或字符范围。下表列出了模式匹配允许使用的字符及其所匹配的字符:

pattern中的字符	在string中匹配的字符

?	单个的字符。

*	零个或多个字符。

#	单个的数字(0-9)。

[charlist]	属于charlist的单个字符。

[!charlist]	不属于charlist的单个字符。

括在方括号([ ])中的一个或多个字符组成的字符组(charlist)可用于匹配string中的任何单个字符，包括几乎任何字符码，包括数字。

附注   特殊字符左括号([)、问号 (?)、数字号(#)和星号 (*)可直接放在方括号中匹配其自身。右括号(])不能放在字符组内匹配其自身，但可作为单独的字符用在字符组外。

除括在方括号内的简单字符列表外，charlist还可用连字符(-)连接上下限字符以指定字符范围。例如，在pattern中指定[A-Z]，则string中相应位置的字符如果是A到Z之间的任意大写字母，都将认为匹配。在方括号中不用分隔符可包含多个字符范围。

指定字符范围的含义依赖于运行时有效的字符顺序(由Option Compare和系统的语言环境设置所决定)。对上面所示的例子，如果使用Option Compare Binary，范围[A-E]将匹配A、B和E。而如果使用Option Compare Text，[A-E]将匹配A、a、馈⑧、B、b、E、e。注意 驶� 瓴⑽雌ヅ洌�这是因为排序顺序中重音字符处于非重音字符之后��

下面是模式匹配的其它一些重要规则:

�	charlist开始处的惊叹号 (!)表示，如果在string中找到charlist之外的字符，就认为是匹配。用在方括号之外时，惊叹号匹配其自身。

�	连字符(-)可用在charlist的开始(如果使用惊叹号，则在惊叹号之后)或结尾处以匹配其自身。其它位置的连字符用于表示字符范围。

�	指定字符范围时，必须以升序排列(从低到高)。[A-Z]是有效的模式，而[Z-A]则不是。

�	字符序列[]将被忽略；它被认为是零长字符串。


Is 运算符

用于比较两个对象引用变量。

语法

result = object1 Is object2

元素

Is 运算符的语法有下列成分:

成分	描述

result	数字变量。

object1	对象名称。

object2	对象名称。

注释

如果object1和object2都指向同一对象，result为True；否则result为False。可用多种方式令两个变量指向同一对象。

下例中，将A设置为与B指向同一对象:

Set A = B

下例令A和B设置为与C指向同一对象:

Set A = C

Set B = C


^ 运算符实例

本例使用^ 运算符求指数。

MyValue = 2 ^ 2	' 返回4。

MyValue = 3 ^ 3 ^ 3	' 返回19683。

MyValue = (-5) ^ 3	' 返回-125。


+ 运算符实例

本例使用+ 运算符对数字求和。+ 运算符还可用于连接字符串，但为防止歧义，最好使用& 运算符。

MyNumber = 2 + 2	' 返回4。

MyNumber = 4257.04 + 98112	' 返回102369.04。

Var1 = "34" : Var2 = 6	' 初始化变量。

MyNumber = Var1 + Var2	' 返回40。

Var1 = "34" : Var2 = "6"	' 初始化变量。

MyNumber = Var1 + Var2	' 返回"346"(字符串连接)。


- 运算符实例

本例使用- 运算符对两数求差。

MyResult = 4 - 2	' 返回2。

MyResult = 459.35 - 334.90	' 返回124.45。


* 运算符实例

本例使用* 运算符对两数求积。

MyValue = 2 * 2	' 返回4。

MyValue = 459.35 * 334.90 	' 返回153836.315。


运算符实例
/ 运算符实例

本例使用/ 运算符进行浮点数除法。

MyValue = 10 / 4	' 返回2.5。

MyValue = 10 / 3	' 返回3.333333。


\ 运算符实例

本例使用\ 运算符进行整除。

MyValue = 11 \ 4	' 返回2。

MyValue = 9 \ 3	' 返回3。

MyValue = 100 \ 3	' 返回33。


Mod 运算符实例

本例使用Mod 运算符求余数。如果任一数字为浮点数，将首先被近似为整数。

MyResult = 10 Mod 5	' 返回0。

MyResult = 10 Mod 3	' 返回1。

MyResult = 12 Mod 4.3	' 返回0。

MyResult = 12.6 Mod 5	' 返回3。


& 运算符实例

本例使用& 运算符强制字符串连接。

MyStr = "Hello" & " World"	' 返回"Hello World"。

MyStr = "Check " & 123 & " Check"	' 返回"Check 123 Check"。


比较运算符实例

本例示范比较运算符的各种用法。比较运算符用于比较表达式。

MyResult = (45 < 35)	' 返回False。

MyResult = (45 = 45)	' 返回True。

MyResult = (4 <> 3)	' 返回True。

MyResult = ("5" > "4")	' 返回True。

Var1 = "5" : Var2 = 4	' 初始化变量。

MyResult = (Var1 > Var2)	' 返回True。

Var1 = 5 : Var2 = Empty

MyResult = (Var1 > Var2)	' 返回True。

Var1 = 0 : Var2 = Empty

MyResult = (Var1 = Var2)	' 返回True。


And 运算符实例

本例使用And 运算符对两表达式执行逻辑与运算。

A = 10: B = 8: C = 6 : D = Null	' 初始化变量。

MyCheck = A > B And B > C	' 返回True。

MyCheck = B > A And B > C	' 返回False。

MyCheck = A > B And B > D	' 返回Null。

MyCheck = A And B	' 返回8 (位比较)。


Eqv 运算符实例

本例使用Eqv 运算符对两表达式执行逻辑等价运算。

A = 10: B = 8: C = 6 : D = Null	' 初始化变量。

MyCheck = A > B Eqv B > C	' 返回True。

MyCheck = B > A Eqv B > C	' 返回False。

MyCheck = A > B Eqv B > D	' 返回Null。

MyCheck = A Eqv B	' 返回-3 (位比较)。


Imp 运算符实例

本例使用Imp 运算符对两表达式执行逻辑隐含运算。

A = 10: B = 8: C = 6 : D = Null	' 初始化变量。

MyCheck = A > B Imp B > C	' 返回True。

MyCheck = A > B Imp C > B	' 返回False。

MyCheck = B > A Imp C > B	' 返回True。

MyCheck = B > A Imp C > D	' 返回True。

MyCheck = C > D Imp B > A	' 返回Null。

MyCheck = B Imp A	' 返回-1 (位比较)。


Not 运算符实例

本例使用Not 运算符对两表达式执行逻辑非运算。

A = 10: B = 8: C = 6 : D = Null	' 初始化变量。

MyCheck = Not(A > B)	' 返回False。

MyCheck = Not(B > A)	' 返回True。

MyCheck = Not(C > D)	' 返回Null。

MyCheck = Not A	' 返回-11 (位比较)。


Or 运算符实例

本例使用Or 运算符对两表达式执行逻辑或运算。

A = 10: B = 8: C = 6 : D = Null	' 初始化变量。

MyCheck = A > B Or B > C	' 返回True。

MyCheck = B > A Or B > C	' 返回True。

MyCheck = A > B Or B > D	' 返回True。

MyCheck = B > D Or B > A	' 返回Null。

MyCheck = A Or B	' 返回10 (位比较)。


Xor 运算符实例

本例使用Xor 运算符对两表达式执行逻辑异或运算。

A = 10: B = 8: C = 6 : D = Null	' 初始化变量。

MyCheck = A > B Xor B > C	' 返回False。

MyCheck = B > A Xor B > C	' 返回True。

MyCheck = B > A Xor C > B	' 返回False。

MyCheck = B > D Xor A > B	' 返回Null。

MyCheck = A Xor B	' 返回2 (位比较)。


Like 运算符实例

本例使用Like 运算符比较字符串与模式。

MyCheck = "aBBBa" Like "a*a"	' 返回True。

MyCheck = "F" Like "[A-Z]"	' 返回True。

MyCheck = "F" Like "[!A-Z]"	' 返回False。

MyCheck = "a2a" Like "a#a"	' 返回True。

MyCheck = "aM5b" Like "a[L-P]#[!c-e]"	' 返回True。

MyCheck = "BAT123khg" Like "B?T*"	' 返回True。

MyCheck = "CAT123khg" Like "B?T*"	' 返回False。


Is 运算符实例

本例使用Is 运算符比较两对象引用。此处所用的对象变量名称是通用的，仅用于演示目的。

Set YourObject = MyObject	' 对象引用赋值。

Set ThisObject = MyObject

Set ThatObject = OtherObject

MyCheck = YourObject Is ThisObject	' 返回True。

MyCheck = ThatObject Is ThisObject	' 返回False。

' Assume MyObject <> OtherObject

MyCheck = MyObject Is ThatObject	' 返回False。


代码窗格

代码窗格用于显示、编辑和编写模块级和过程代码。在模块中，代码窗格可拆分为二。

拆分模块的方法

从“窗口”菜单中选择“拆分窗口”。

去掉拆分条的方法

从“窗口”菜单中选择“删除拆分窗口”，或双击拆分条 ，或将拆分条拖曳到窗口的顶部或底部。


调试窗口

可用调试窗口执行单个代码行，显示变量值，查看监视表达式，及执行其它调试任务。

�	若要显示调试窗口，从“视图”菜单中选取“调试窗口”。

当遇到断点或手工进入中断模式时，调试窗口自动打开。

�	关闭调试窗口的方法:

在Microsoft Windows中，双击控制菜单框 或摁下CTRL+F4。

在Macintosh机上，单击关闭框。

附注   代码运行时不能在调试窗口的代码窗格键入语句；不过，可用Debug对象和Print方法将内部值打印到调试窗口以供查看。例如，下列代码将变量A的值打印到调试窗口:

Debug.Print A

然而在中断模式下，可在调试窗口的即时窗格键入语句。

调试窗口包括:

即时窗格

即时窗格中键入的代码可立即执行。第一次打开调试窗口时缺省显示的是即时窗格。

若要在监视窗格显示的情况下显示即时窗格，可选择“即时”标签。

监视窗格

监视窗格显示所有已定义的监视表达式的信息。

若要显示监视窗格，选择“监视”标签。

过程框

在中断模式下，过程框显示断点所在的方案、模块和过程的名称。过程框之右的按钮用于显示“调用”对话框。

拆分条

拆分条把调试窗口一分为二。上部为即时或监视窗格。拆分条之下的代码窗格显示断点所在的代码。

可上下移动拆分条以改变上下两部分的大小。

代码窗格

代码窗格显示断点所在的过程代码。


即时窗格

即时窗格中键入的代码可立即执行。在即时窗格中，可键入或粘贴语句并摁下ENTER以执行之。例如，下列代码显示变量A的值，本例中它等于5。

?A

5

在等待模式中，代码在全局执行。在中断模式中，即时窗格中的代码在调试窗口的标题栏中所显示的上下文中执行。例如，如果键入Print variablename，输出的是局部变量的值。这与在过程框中指定的过程中使用Print方法的效果一样。

第一次打开调试窗口时缺省显示的是即时窗格。

若要在监视窗格显示的情况下显示即时窗格，可选择“即时”标签。


滚动条

滚动条是在垂直和水平方向用鼠标滚动窗口时所用的图形设备。滚动条位于窗口的右边和下边。

滚动窗口的方法

执行下列操作之一:

滚动方式:	操作:

上滚一行	单击向上滚动箭头。

上滚一页	在垂直滚动条的滚动框的上方单击。

滚动到某大概位置	拖曳滚动框。

下滚一行	单击向下滚动箭头。

下滚一页	在垂直滚动条的滚动框的下方单击。

向左滚动	单击向左滚动箭头。

左滚一页	在水平滚动条的滚动框的左方单击。

向右滚动	单击向右滚动箭头。

右滚一页	在水平滚动条的滚动框的右方单击。

滚动条包括:

滚动箭头

滚动条两端带有箭头的按钮。箭头表示滚动时窗口内容移动的方向。例如，向上滚动箭头使窗口向上滚动，向下滚动箭头使窗口向下滚动，以此类推。

滚动框

滚动条中表示窗口相对位置的方框。

�	要在窗口中迅速移动，可沿滚动条拖曳滚动框。


拆分条

拆分条把窗口一分为二，各部分可单独滚动。在调试窗口中，拆分条把代码窗格和即时或监视窗格分开。在模块中，拆分条将模块一分为二 [image] 当希望同时查看代码的不同部分时十分有用。

�	若要拆分窗口，从“窗口”菜单中选择“拆分窗口”。

�	若要去掉拆分条，从“窗口”菜单中选择“删除拆分窗口”，或双击拆分条。


监视窗格

监视窗格显示所有已定义的监视表达式的信息，包括该表达式本身，监视表达式的上下文及切入中断模式时该表达式的值。如果表达式未处于作用域，不显示当前值。

显示监视窗格的方法

在调试窗口中选择“监视”标签。

表达式的值不可用时显示下列信息:

无法编译模块 [image] 监视表达式所在的模块包含语法错误，无法编译，或监视表达式的上下文定义为“所有模块”，但其中有一个模块无法编译。

无效的监视表达式 [image] 监视表达式是无效表达式。有效的监视表达式可包含常量、变量、函数过程调用和自定义类型的元素，但不能包含Sub过程调用或自定义类型。

不在上下文中 [image] 监视表达式的值在当前上下文中不可用。例如，在等待模式中，所有监视表达式均不在上下文中。

不能把数组作为监视表达式 [image] 监视表达式是一个数组。只能监视数组元素。


焈Chr 函数
牜��_�_�_�_Chr 函数

返回与指定字符代码对应的字符。

语法

Chr(charcode)

元素

charcode 命名参数 是一个范围在0到255之间的数，用于识别一个character。

注释

 0到31之间的数是标准的不可打印的 ASCII。例如，Chr(10)返回一个换行符。


Format 函数

按照包含在格式表达式中的说明格式化一个表达式。

语法

Format(expression[,format])

元素

Format函数的语法有以下组成部分：

组成部分	描述

expression	任何合法的 表达式.

format	合法的被命名的或自定义的格式表达式。

注释

为了格式化以下内容	按如下操作

数字 	使用预定义的 命名的数字格式 或创建 自定义数字格式。

日期和时间  	使用预定义 命名的数字格式 的或创建 自定义数字格式。

日期和时间序号 	使用日期和时间格式或数字格式。

字符串 	创建用户的自定义字符串格式。

如果没有指定format而试图格式化一个数，Format函数提供与Str 函数相同的功能。然而，使用Format将正数格式化为字符串时，用于显示正负符号的起始空格会被去掉；而使用Str进行转换时则会保留起始空格。


命名的数字格式(Format 函数)

下表指定了预定义的数字格式名：

格式名	描述

GeneracNumber 	照原样显示数字，不用千位分隔符。

Currency 	在适当情况下，用千位分隔符显示数字；负数显示在圆括号内，在小数分隔符右边显示两位。注意输出是以系统设置为基础。

Fixed 	在小数分隔符左边显示至少一位，右边至少显示两位。

Stardard 	用千位分隔符显示数，小数分隔符左边至少一位，右边至少两位。

Percent 	显示被100相乘以后的数，并在其后加一个百分号（%）。总是显示小数分隔符右边的两位。

Scientific 	使用标准科学记数法。

Yes/No	如果数为零显示“否”，否则显示“是”。

True/False	如果数为零显示False，否则显示True。

On/off	如果数为零显示Off，否则显示On。


自定义的数字格式(Format 函数)

用户可以使用下表中所列的字符创建自定义的数字格式：

字符	描述

None	未格式化

显示未格化数。

0	数字保留区

显示一位数或一个零。如果表达式有一位数处在格式字符串中0出现的位置则显示它。否则，在该位置显示0。

如果数的位数小于格式表达式中零的个数（在小数的任意一侧），则显示起始或结尾的0。如果小数分隔符右边数的位数多于格式表达式中小数分隔符右边0的个数，则将该数四舍五入为与0同样多的小数位。如果小数分隔符左边数的位数多于格式表达式中小数分隔符左边0的个数， 则不做修改显示多余的数。

#	数字保留区

显示一位数或什么也不显示。如果表达式有一位数处在格式字符串中# 出现的位置。则显示它。否则在那个位置什么也不显示。

如果数的位数少于或等于格式表达式中小数分隔符两边的#数，则不显示起始或结尾的0。除此之外，该字符的功能与0数字保留区相同。

.	小数保留区

在某些语言环境中，逗号被用于小数分隔符。小数保留区决定有多少位显示在小数分隔符的两侧。如果格式表达式在该符号的左边仅包含数的正负号，则小于1的数以小数分隔符开头。如果希望起始的0与小数部分同时显示，可以用0代替小数分隔符左边数字保留区的第一位。在格式化的输出中，用作小数保留区的实际字符取决于用户系统所能识别的数字格式。

%	百分数保留区

表达式被100相乘，百分号(%)被插在格式字符串中其出现的位置。

,	千位分隔符

在某些语言环境下，句号被用作千位分隔符。千位分隔符将一个在小数分隔符左边有四位或多于四位数的数字的千位与百位分开。千位分隔符的标准用法是在格式中用数字保留区(0或#)包围千位分隔符。两个相邻的千位分隔符或千位分隔符紧跟在小数分隔符的左边（无论是否指定了小数）意味着“将该数除以1000，然后按要求四舍五入”。可以用这种技术缩小大数。例如，可以使用格式字符串“##0,,”将1亿表示为100。小于1百万的数显示为0。不紧跟在小数分隔符左边的其它位置的两个相邻千位分隔符仅用作简单的千位分隔符。在格式化输出中，用作千位分隔符的实际字符取决于用户系统所能识别的数字格式。

:	时间分隔符

在某些语言环境下，其它字符也可用作时间分隔符。时间分隔符用于划分小时、分、秒。在格式化的输出中，用作时间分隔符的实际字符取决于用户系统的设置。

/	日期分隔符

在某些语言环境下，其它字符也可用作日期分隔符。日期分隔符用于划分日、月、年。在格式化的输出中，用作日期分隔符的实际字符取决于用户系统的设置。

E- E+ e- e+	科学记数法

如果在E-、E+、e-或e+的右边，格式表达式包含至少一位数字保留区（0或#），则以科学表示法显示数字并在此数和它的指数之间显示E或e。右边的数字保留区决定了指数的位数。使用E-或e-则紧挨负指数放置一个负号。使用E+或e+则紧挨负指数放置一个负号且紧挨正指数放置一个正号。

- + $ ( ) space	显示文字字符

若显示非下面所列的字符，在它之前用一个反斜杠（\）或用双引号（"" ）将其括在里面。

\	显示格式化字符串中的下一个字符

格式表达式中的许多字符都有特殊的含义，不能做为文字符显示。除非前面加一个反斜杠。反斜杠自身不会显示。使用反斜杠与将一个字符括在双引号里效果一样。为了显示一个反斜杠，可使用两个反斜杠（\\）。不能象文字符那样被显示的字符，有日期和时间格式符（a，c，d，h，m，n，p，q，s，t，w，y，和/：），数字格式符（#，0，%，E，e，逗号，句号）及字符串格式符（@，&，<，>和!）。

"ABC"	显示双引号中的字符串

为了在代码中包含format中的字符串，必须用Chr（34）将文字括在里面（34 为双引号的字符码 ）。


不同数字值的不同格式(Format 函数)

数字的格式表达式可以含有被分号分开的一至四段。（如果format参数包含了预先定义的某一格式，则只允许有一段）。

如果使用	结果为

仅一段 	格式表达式用于所有值。

两段	第一段用于正值和零，第二段用于负值。

三段	第一段用于正值，第二段用于负值，第三段用于零。

四段	第一段用于正值，第二段用于负值，第三段用于零，第四段用于Null 值。

下面的实例有两段：第一段定义正值和零格式，第二段定义负值格式。

"$#,##0;($#,##0)"

如果在分号之间什么也没有，则缺失的段用正值格式打印。例如，下列格式使用第一段中的格式显示正值和负值，如果值为零则显示“Zero”。

"$#,##0;;\Z\e\r\o"


自定义的数字格式实例

某些数字格式表达式实例如下所示，（这些实例均假设用户系统的语言环境设置为美国英语）。第一列包含格式字符串。列标题中给出被格式化的数据的值，其它列为结果的输出。

格式(format)	正5	负5	十进制0.5	Null

零长字符串	5	-5	0.5

0	5	-5	1

0.00	5.00	-5.00	0.50

#,##0	5	-5	1

#,##0.00;;;Nil	5.00	-5.00	0.50	Nil

$#,##0;($#,##0)	$5	($5)	$1

$#,##0.00;($#,##0.00)	$5.00	($5.00)	$0.50

0%	500%	-500%	50%

0.00%	500.00%	-500.00%	50.00%

0.00E+00	5.00E+00	-5.00E+00	5.00E-01

0.00E-00	5.00E00	-5.00E00	5.00E-01


命名的日期/时间格式(Format 函数)

下表列出了预定义的日期和时间格式名：

格式名	描述

General Date	显示一个日期和/或时间。对于实数，显示一个日期和时间（例如，4/3/93 05:34 PM）；如果没有小数部分，只显示日期（例如，4/3/93）；如果没有整数部分，只显示时间（例如，05:34 PM）。日期的显示取决于用户系统设置。

Long Date	根据用户系统的长日期格式显示日期。

Medium Date	使用对宿主应用程序.语言版本适当的中型日期格式显示日期。

Short Date	使用用户系统的短日期格式显示日期。

Long Time	使用用户系统的长时间格式：包括小时、分、秒显示时间。

Medium Time	使用小时和分的12小时制及AM/PM指示符显示时间。

Short Time	使用24小时制（例如，17:45）显示时间。


自定义的日期/时间格式(Format 函数)

用户可以使用下表所列的字符创建自定义的日期/时间格式：

字符	描述

:	时间分隔符。在某些语言环境下，其它字符也可以用于表示时间分隔符。当时间值被格式化后,时间分隔符划分小时、分、秒。在被格式化后的输出中用作时间分隔符的实际字符取决于用户系统的设置。

/	日期分隔符。在某些地区，其它字符也可以用于表示日期分隔符。当日期值被格式化后，日期分隔符划分日、月、年。在被格式化后的输出中用作日期分隔符的实际字符取决于用户系统的设置。

c	按先日期后时间次序将日期显示为ddddd形式，将时间显示为t t t t t形式。如果日期序号没有小数部分，则只显示日期信息。如果没有整数部分，则只显示时间信息。

d	将日显示为一个数，前面不加0（1-31）。

dd	将日显示为一个数，前面加0（01-31）。

ddd	显示星期的缩写（Sun-Sat）。

dddd	显示星期的全名（Sunday-Saturday）。

ddddd	显示完整的日期（包括日、月、年）。 根据用户系统的短日期格式设置进行格式化。对于Microsoft  Windows，默认短日期格式为m/d/yy。

dddddd	将日期系列号显示为完整的日期（包括日、月、年）。按照用户系统识别的长日期设置进行格式化。对于Microsoft Windows，默认长日期格式为mmmm dd,yyyy。

w	将星期几显示为一个数（1为星期天，7为星期六）。

ww	将一年中的某一星期显示为一个数（1-53）。

m	将月显示为一个数，不加前边的0（1-12）。如果m直接跟在h或hh后， 则显示分钟而不是显示月。

mm	将月显示为一个数，前边加0（01-12）。如果m有接跟在h或hh后，则显示分钟而不是显示月。

mmm	将月显示为缩写（Jan-Dec）。

mmmm	将月显示为月的全名（January-December）。

q	将一年中的某一季度显示为一个数（1-4）。

y	将一年中的某一天显示为一个数（1-366）。

yy	将年显示为一个二位数（00-99）。

yyyy	将年显示为一个四位数（100-9999）。

h	将小时显示为一个数，不带前边的0（0-23）。

hh	将小时显示为一个数，带前边的0（00-23）。

n	将分显示为一个数，不带前边的0（0-59）。

nn	将分显示为一个数，带前边的0（00-59）。

s	将秒显示为一个数，不带前边的0（0-59）。

ss	将秒显示为一个数，带前边的0（00-59）。

t t t t t	将时间显示为一个完整时间（包括小时、分、秒），使用用户系统识别的、用时间格式定义了的时间分隔符进行格式化。如果选择了前边加0 选项，并且时间为上午或晚上10点之前，则显示前边的0。默认时间格式为h:mm:ss。

AM/PM	使用12小时时制，在中午之前将大写字母AM与时间一起显示，在中午和 11:59 P.M之间将大写字母PM与时间一起显示。

am/pm	使用12小时时制，在中午之前将小写字母am与时间一起显示， 在中午和11:59 P.M之间将小写字母pm与时间一起显示。

A/P	使用12小时时制，在中午之前将大写字母A与时间一起显示， 在中午和 11:59 P.M之间将大写字母P与时间一起显示。

a/p	使用12小时时制，在中午之前将小写字母a与时间一起显示，在中午和 11:59 P.M之间将小写字母p与时间一起显示。

AMPM	使用12小时时制，在中午之前将用户系统定义的AM 字符串文字与时间一起显示，在中午和11:59 P.M之间将用户系统定义的PM字符串文字与时间一起显示。AMPM可以是大写，也可以是小写，但是被显示字符串的大小写要与用户系统设置的已定义了的字符串相匹配，对于Microsoft Windows，默认格式为AM/PM。


自定义的日期/时间格式实例

下面是自定义的1958年12月7日的日期和时间格式实例：

格式	显示

m/d/yy	12/7/58

d-mm	7-Dec

d-mmmm-yy	7-December-58

d-mmmm	7 December

mmmm-yy	December 58

hh:mm AM/PM	08:50 PM

h:mm:ss a/p	8:50:35 p

h:mm	20:50

h:mm:ss	20:50:35

m/d/yy h:mm	12/7/58 20:50


自定义的字符串格式(Format 函数)

用户可以使用下列任意字符为字符串创建格式表达式。

字符	描述

@	字符保留区

显示一个字符或一个空格。如果字符串有一个字符处于格式字符串中@出现的位置，则显示该字符；否则在该位置显示空格。除非格式字符串中有!字符，否则从右到左填充保留区。参见下面说明。

&	字符保留区

显示一个字符或什么也不显示。如果字符串有一个字符处于格式字符串中&出现的位置，则显示该字符。否则什么也不显示。除非格式字符串中有!字符，否则从右到左填充保留区。参见下面说明。

<	强制小写

以小写格式显示所有字符。

>	强制大写

以大写格式显示所有字符。

!	强制从左到右填充保留区

默认为从右到左填充。


不同字符串值的不同格式(Format 函数)

字符串的格式表达式可以有一段，或用分号隔开的两段。

如果使用	结果为

仅一段	格式用于所有字符串数据。

两段	第一段用于字符串数据，第二段用于Null 值和零长度字符串。


Hex 函数

返回表示数字的十六进制值的字符串。

语法

Hex(number)

元素

number 命名参数 为任意合法的数字表达式。

注释

如果 number 不是整数，在被运算之前将其四舍五入为最接近的整数。

如果number 是	Hex 返回

Null	错误信息。

Empty	零(0)。

其他数	最大到8位的十六进制字符。

用户也可以直接通过在数前适当位置加上&H来表示十六进制数。例如，&H10在十六

进制计数法中表示十进制16。


InStr 函数

返回某字符串在另一个字符串中第一次出现的位置。

语法

InStr([start,]string1,string2[,compare])

元素

InStr 函数的语法具有下列组成部分：

组成部分	描述

start	数字表达式 设置每一次搜索的开始位置。如果省略，则从第一个字符位置开始搜索。如果start包含非法数据，则出现错误信息。如果指定了compare，则start是必选项。

string1	被搜索的字符串表达式。如果string1包含非法数据，则返回Null 。

string2	欲搜索的字符串表达式。如果string2包含非法数据，则返回Null。

compare	指定字符串比较类型的数。指定1则进行大小写无关的文字比较，指定0（默认）则进行二进制比较。如果compare为Null，则出现一个错误信息。如果指定了compare，则start也是必选项。如果省略compare，则Option Compare 设置用于决定比较类型。

返回值

值	描述

0	string1 长度为零。

start	string2 长度为零。

0	string2 未找到。

发现匹配位置	在string1找到string2。

0	start > string2.

注释

附注   当指定Option Compare Text后，该比较为文字比较且与大小写无关。当指定Option Compare Binary后，该比较为严格的二进制比较。

附注   提供另一个函数（InStrB）用于使用双字节字符集（DBCS ）的一些亚洲地区，InStrB返回字节位置而不是在另一个字符串中该字符串第一次出现的字符位置。在不使用DBCS的地区，InStrB与InStr性能一样。


LCase 函数

返回一个字符串的小写形式。

语法

LCase(string)

元素

 string 命名参数 为任何合法的 字符串表达式.  如果 string 包含无效数据, 将返回Null 。

注释

只有大写字母被转换成小写字母；所有小写字母和非字母字符保持不变。


Left 函数

从字符串左边返回指定数目的字符。

语法

Left(string,length)

元素

 Left 函数的语法具有如下命名参数 部分：

组成部分	描述

string	字符串表达式 最左边的字符将被返回。如果string包含无效数据，则返回Null 。

length	数字表达式 指明要返回多少字符。如果是0，则返回一个长度为零字符串。如果大于或等于string的字符数，则返回整个字符串。

注释

欲确定string中的字符数，可使用Len函数。

附注   提供另一个函数（LeftB）用于使用双字节字符集（DBCS ）的一些亚洲地区，length指定要返回的字节数而不是字符数。在不使用DBCS的地区，LeftB性能与Left一样。


Len 函数

返回一个字符串的字符数或存储一个变量所需的字节数。

语法

Len(string | varname)

元素

 Len函数的语法具有下列组成部分：

组成部分	描述

string	任何合法的字符串表达式.  如果string 包含无效数据，则返回Null 。

varname	任何合法的变量 名。如果varname 包含无效数据，则返回Null 。

注释

警告   当用于自定义 数据类型时，Len或许不能决定实际存储所需的字节数。

附注   提供另一个函数（LenB）用于使用双字节字符集（DBCS ）的一些亚洲地区，

LenB返回用于表示字符串的字节数而不是字符串中的字符数。在不使用DBCS的地区，LenB与Len的性能一样。


LSet 语句

在一个字符串变量内左对齐字符串，或将一个自定义类型的变量复制到另一个自定义类型的变量。

语法

LSet stringvar = string

LSet varname1 = varname2

元素

 LSet 语句的语法具有如下组成部分：

组成部分	描述

stringvar	字符串变量名。

string	stringvar中要左对齐的字符串表达式。

varname1	被复制到的自定义类型的变量名。

varname2	被复制的自定义类型的变量名。

注释

LSet将stringvar内的任何剩余字符用空格代替。如果string长于 stringvar，则LSet仅将从最左边开始的、长度为stringvar的字符放在stringvar内。

只有包含Integer，Long，Double，Single，String (固定长度)，或者Currency类型的自定义类型可以被复制。下面的实例用于将RecTwo（自定义类型变量）内的内容复制到RecOne（另一个自定义类型变量）中。

Type TwoString

StrFld As String * 2

End Type

Type ThreeString

StrFld As String * 3

End Type

Dim RecOne As TwoString, RecTwo As ThreeString

LSet RecOne = RecTwo

因为RecOne 为2个字节长，故仅从RecTwo中复制出2个字节。LSet复制的字节数是这两个自定义类型变量中字节数目较短变量的字节数。


LTrim, RTrim, and Trim 函数

返回不带起始空格（LTrim），结尾空格（RTrim）或起始和结尾空格（Trim ）的字符串拷贝。

语法

LTrim(string)

RTrim(string)

Trim(string)

元素

 string 命名参数 为任何合法的字符串表达式。如果 string 包含无效数据，返回Null。


Mid 函数

从一个字符串返回指定数目的字符。

语法

Mid(string,start[,length])

元素

 Mid 函数的语法具有如下组成部分：

组成部分	描述

string	字符串表达式 中的字符将被返回。如果string包含无效数据，则返回Null。

start	string中开始返回字符的位置。如果start大于string 中的字符数，Mid返回一个长度为零的字符串。

length	要返回的字符数，如果省略或文字中的字符数（包括start处的字符）少于length。则从start位置开始直到字符串结尾的所有字符均被返回。

注释

欲确定string中的字符数，可使用Len函数。

附注   提供另一个函数（MidB）用于使用双字节字符集（DBCS ）的一些亚洲地区，

length指定要返回的字节数而不是字符数。在不使用DBCS的地区，MidB的性能与Mid一样。


Mid 语句

用另一字符串中的字符取代字符串变量中指定数目的字符。

语法

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

元素

 Mid 语句的语法具有如下组成部分：

组成部分	描述

stringvar	欲改变的字符串变量名。

start	stringvar 中文字替换开始的位置.

length	欲替换的字符数。如果省略，则使用string的全部。

string	用于替换stringvar中部分的字符串表达式。

注释

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


Oct 函数

返回表示数字的八进制值的字符串。

语法

Oct(number)

元素

 number 命名参数 为任何合法的数字表达式。

注释

 如果number 不是一个整数，在被运算之前，它被四舍五入为最接近的整数。

如果number 为	Oct 返回

Null	一个错误信息。

Empty	零(0).

任意其他数	最大到11位的八进制字符。

用户也可以通过直接在数前加上&O表示八进制数。例如，&O10为十进制8 的

八进制表示法。


Right 函数

从字符串右边返回指定数目的字符。

语法

Right(string,length)

元素

 Right 函数的语法具有如下命名参数 部分：

组成部分	描述

string	字符串表达式 最右左边的字符将被返回。如果string包含无效数据，则返回Null。

length	数字表达式 指明要返回多少字符。如果是0，则返回一个长度为零字符串。如果大于或等于string的字符数，则返回整个字符串。

注释

欲确定string中的字符数，可使用Len函数。

附注  提供另一个函数（RightB）用于使用双字节字符集（DBCS ）的一些亚洲地区，length指定要返回的字节数而不是字符数。在不使用DBCS的地区，RightB性能与Right一样.


RSet 语句

右对齐字符串变量中的字符串。

语法

RSet stringvar = string

元素

The RSet 语句 语法具有如下组成部分：

组成部分	描述

stringvar	字符串变量名。

string	stringvar中欲右对齐的字符串表达式。

注释

RSet 将stringvar内从后到开始的任何剩余字符用空格代替。RSet不能用于自定义类型。


Space 函数

返回由指定数目的空格组成的字符串。

语法

Space(number)

元素

 number 命名参数 为字符串中用户想要的空格数。

注释

Space 函数可用于格式化输出及清除固定长度字符串内的数据。


Str 函数

返回一个数的字符串表示。

语法

Str(number)

元素

 number 命名参数 为任何合法的数字表达式。

注释

当数字被转换为字符串时，一个起始空格一直保留着用于number的正负号。如果number为正，被返回的字符串包含一个起始空格，意味着加号。

使用Format函数可以将数值转换为用户希望的格式，如：日期、时间、货币或其它用

户自定义格式。与Str不同，Format函数不包含用于number 正负号的起始空格。

附注   Str 函数仅将句号（.）看作合法小数分隔符，当有可能要使用不同的小数分隔符时（例如，在国际应用程序中），可以使用CStr将数据转换成字符串。


StrComp 函数

返回表示字符串比较结果的值。

语法

StrComp(string1,string2[,compare])

元素

 StrComp 函数的语法具有如下组成部分：

组成部分	描述

string1	任何合法的字符串表达式。

string2	任何合法的字符串表达式。

compare	用于指定字符串比较类型的数值。指定1，则进行文字比较。指定0（默认），则进行二进制比较。如果compare为Null，则出现一个错误。如果compare省略，Option Compare的设置用于确定比较类型。

返回值

值	描述

-1	string1 小于string2.

0	string1 等于string2.

1	string1 大于string2.

Null	string1 或string2 为Null.

注释

附注   当指定Option Compare Text后，比较为与大小写无关的文字比较。当指定Option Compare Binary后，比较为严格的二进制比较。


String 函数

返回具有指定长度的、重复字符组成的字符串。

语法

String(number,character)

元素

 String 函数的语法有以下命名参数 部分：

组成部分	描述

number	被返回字符串的长度。如果number 包含无效数据，则返回Null 。

character	指定字符或字符串表达式的字符码，其第一个字符用于组成返回的字符串。如果character包含无效数据，则返回Null。

注释

如果用户指定的Character值大于255，则String用下面的公式将该数转换成一个有效字符代码：

character Mod 256


UCase 函数

返回一个字符串的大写形式。

语法

UCase(string)

元素

 string 命名参数 为任何合法的字符串表达式。  如果 string 包含无效数据，则返回Null 。

注释

只有小写字母被转换成大写字母，所有大写字母和非字母字符均保持不变。


Chr 函数实例

该实例用Chr 函数返回与指定字符代码相对应的字符。

MyChar = Chr(65)	' 返回A。

MyChar = Chr(97)	' 返回a。

MyChar = Chr(62)	' 返回>。

MyChar = Chr(37)	' 返回%。


Format 函数实例

该实例显示了用Format函数使用命名的和用户自定义的格式对数值进行格式化的多种不同方法。对于日期分隔符（／），时间分隔符（：）和AM／PM文字，实际的格式化输出依赖于当时用户系统的时间设置。当时间和日期显示在开发环境中时，使用代码locale 的短时间和短日期格式。而当代码运行时,使用系统语言环境的短时间和短日期格式显示日期和时间，它与代码语言环境可能是不同的。在该例中，假定为English-US。

' MyTime和MyDate在开发环境中以当前系统短日期和短时间格式显示。

MyTime = #17:04:23#

MyDate = #January 27, 1993#

' 以系统定义的长时间格式返回当前系统时间。

MyStr = Format(Time, "Long Time")

' 以系统定义的长日期格式返回当前系统日期。

MyStr = Format(Date, "Long Date")

MyStr = Format(MyTime, "h:m:s")	' 返回"17:4:23"。

MyStr = Format(MyTime, "hh:mm:ss AMPM")	' 返回"05:04:23 PM"。

MyStr = Format(MyDate, "dddd, mmm d yyyy")	' 返回"Wednesday, Jan 27

'  1993"。

' 如果未提供格式，返回字符串。

MyStr = Format(23)	' 返回"23"。

' 自定义格式。

MyStr = Format(5459.4, "##,##0.00")	' 返回"5,459.40"。

MyStr = Format(334.9, "###0.00")	' 返回"334.90"。

MyStr = Format(5, "0.00%")	' 返回"500.00%"。

MyStr = Format("HELLO", "<")	' 返回"hello"。

MyStr = Format("This is it", ">")	' 返回"THIS IS IT"。


Hex 函数实例

该实例用Hex函数返回数字的16进制值。

MyHex = Hex(5)	' 返回5。

MyHex = Hex(10)	' 返回A。

MyHex = Hex(459)	' 返回1CB。


InStr 函数实例

该实例用InStr函数返回一个字符串在另一个字符串中第一次出现的位置。

SearchString ="XXpXXpXXPXXP"	' 要查找的字符串。

SearchChar = "P"	' 查找"P"。

' 从第四个字符开始进行文本比较。 返回6。

MyPos = InStr(4, SearchString, SearchChar, 1)

' 从第一个字符开始进行二进制比较。 返回9。

MyPos = InStr(1, SearchString, SearchChar, 0)

' 缺省比较方式为二进制(如果省略最后一个参数)。

MyPos = InStr(SearchString, SearchChar)	' 返回9。

MyPos = InStr(1, SearchString, "W")	' 返回0。


LCase 函数实例

该实例用LCase函数返回字符串的小写形式。

Uppercase = "Hello World 1234"	' 要转换的字符串。

Lowercase = LCase(UpperCase)	' 返回"hello world 1234"。


Left 函数实例

该实例用left函数从字符串的左边返回指定数目的字符。

AnyString = "Hello World"	' 定义字符串。

MyStr = Left(AnyString, 1)	' 返回"H"。

MyStr = Left(AnyString, 7)	' 返回"Hello W"。

MyStr = Left(AnyString, 20)	' 返回"Hello World"。


Len 函数实例

该实例用len函数返回字符串中的字符数或存储变量所需的字节数。

Type CustomerRecord	' 定义自定义类型。

ID As Integer

Name As String * 10

Address As String * 30

End Type

Dim Customer As CustomerRecord	' 声明变量。

Dim MyInt As Integer, MyCur As Currency

MyString = "Hello World"	' 初始化。

MyLen = Len(MyInt)	' 返回2。

MyLen = Len(Customer)	' 返回42。

MyLen = Len(MyString)	' 返回11。

MyLen = Len(MyCur)	' 返回8。


LSet 语句实例

该实例用LSet语句左对齐字符串变量内的字符串，然后将一个自定义类型的变量复制到另一个不同的自定义类型的变量中。

MyString = "0123456789"	' 初始化字符串。

LSet MyString = "<-Left"	' MyString包含"<-Left    "。

' LSet也用于将一个自定义类型的变量拷贝到另一个不同的自定义类型的变量。

' 模块级。

Type AType	' 定义类型。

AName As String * 10

AAdd As String * 10

End Type

Type BType

BName As String * 5

BAdd As String * 5

End Type

' 过程级。

Dim AVar As AType, BVar As BType	' 声明变量。

AVar.AName = "John Smith"	' 定义元素。

AVar.AAdd = "Rodeo Drv."

LSet BVar = AVar	' 拷贝变量。

' 拷贝后，字符串截短了。

Debug.Print BVar.BName	' 打印"John "。

Debug.Print BVar.BAdd	' 打印"Smith"。


LTrim, RTrim, and Trim 函数实例

该实例用LTrim和RTrim函数从字符串变量中去掉前后空格，单独使用Trim函数可得到同样的结果。

MyString = "  <-Trim->  "   	' 初始化。

TrimString = LTrim(MyString)	' TrimString = "<-Trim->  "。

TrimString = RTrim(MyString)	' TrimString = "  <-Trim->"。

TrimString = LTrim(RTrim(MyString))	' TrimString = "<-Trim->"。

' 单独使用Trim函数有同样效果。

TrimString = Trim(MyString)	' TrimString = "<-Trim->"。


Mid 函数实例

该实例用Mid函数从某字符串中返回指定数目的字符串。

MyString = "Mid Function Demo"	' 创建文本字符串。

FirstWord = Mid(MyString, 1, 3)	' 返回"Mid"。

LastWord = Mid(MyString, 14, 4)	' 返回"Demo"。

MidWords = Mid(MyString, 5)	' 返回"Function Demo"。


Mid 语句实例

该实例用Mid语句以另一个字符串中的字符替代一个字符串变量中指定数目的字符。

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 jumps"。


Oct 函数实例

该实例用Oct函数返回数字的八进制值。

MyOct = Oct(4) 	' 返回4。

MyOct = Oct(8)	' 返回10。

MyOct = Oct(459)	' 返回713。


Right 函数实例

该实例用Right函数返回从字符串的右边开始指定数目的字符串。

AnyString = "Hello World"	' 定义字符串。

MyStr = Right(AnyString, 1)	' 返回"d"。

MyStr = Right(AnyString, 6)	' 返回" World"。

MyStr = Right(AnyString, 20)	' 返回"Hello World"。


RSet 语句实例

该实例用Rset语句右对齐字符串变量中的字符串。

MyString = "0123456789"	' 初始化字符串。

RSet MyString = "Right->"	' MyString包含"   Right->"。


Space 函数实例

该实例用Space函数返回由指定空格数构成的字符串。

' 返回包含10个空格的字符串。

MyString = Space(10)

' 在两字符串之间插入10个空格。

MyString = "Hello" & Space(10) & "World"


Str 函数实例

该实例用Str返回数字的字符串表示。当数字转换成字符串时,它的起始位置始终保留用于正负号。

MyString = Str(459)	' 返回" 459"。

MyString = Str(-459.65)	' 返回"-459.65"。

MyString = Str(459.001)	' 返回" 459.001"。


StrComp 函数实例

该实例用StrComp函数返回字符串比较的结果。如果第三个参数是1,则进行文本比较；如果第三个参数为0或省略，则进行二进制比较。

MyStr1 = "ABCD": MyStr2 = "abcd"	' 定义变量。

MyComp = StrComp(MyStr1, MyStr2, 1)	' 返回0。

MyComp = StrComp(MyStr1, MyStr2, 0)	' 返回-1。

MyComp = StrComp(MyStr2, MyStr1)	' 返回1。


String 函数实例

该实例用String函数返回指定长度的重复字符的字符串。

MyString = String(5, "*")	' 返回"*****"。

MyString = String(5, 42)	' 返回"*****"。

MyString = String(10, "ABC")	' 返回"AAAAAAAAAA"。


UCase 函数实例

该实例用UCase函数返回字符串的大写形式。

LowerCase = "Hello World 1234"	' 要转换的字符串。

UpperCase = UCase(LowerCase)	' 返回"HELLO WORLD 1234"。


字符集(128 - 255)

 128	�	 160	[space]	 192	�	 224	�

 129	�	 161	�	 193	�	 225	�

 130	�	 162	�	 194	�	 226	�

 131	�	 163	�	 195	�	 227	�

 132	�	 164	�	 196	�	 228	�

 133	�	 165	�	 197	�	 229	�

 134	�	 166	�	 198	�	 230	�

 135	�	 167	�	 199	�	 231	�

 136	�	 168	�	 200	�	 232	�

 137	�	 169	�	 201	�	 233	�

 138	�	 170	�	 202	�	 234	�

 139	�	 171	�	 203	�	 235	�

 140	�	 172	�	 204	�	 236	�

 141	�	 173	�	 205	�	 237	�

 142	�	 174	�	 206	�	 238	�

 143	�	 175	�	 207	�	 239	�

 144	�	 176	�	 208	�	 240	�

 145	�	 177	�	 209	�	 241	�

 146	�	 178	�	 210	�	 242	�

 147	�	 179	�	 211	�	 243	�

 148	�	 180	�	 212	�	 244	�

 149	�	 181	�	 213	�	 245	�

 150	�	 182	�	 214	�	 246	�

 151	�	 183	�	 215	�	 247	�

 152	�	 184	�	 216	�	 248	�

 153	�	 185	�	 217	�	 249	�

 154	�	 186	�	 218	�	 250	�

 155	�	 187	�	 219	�	 251	�

 156	�	 188	�	 220	�	 252	�

 157	�	 189	�	 221	�	 253	�

 158	�	 190	�	 222	�	 254	�

 159	�	 191	�	 223	�	 255	�

�	Microsoft Windows 不支持这些字符。


Glossary

A

ANSI 字符集

参数

数组

ASCII 字符集

自动格式化

B

位比较

布尔表达式

中断模式

断点

传址

传值

C

字符码

剪贴板

关闭框

集合

注释

比较运算符

编译时

常量

控制面板

控制菜单框

D

数据类型

数据类型的表示范围

日期表达式

日期直接量

日期分隔符

日期和时间

声明

动态链接库 (DLL)

E-F-G

Empty

错误代码

表达式

文件号

H-I-J-K

宿主应用程序

插入点

关键字

L

行标志

行号

续行符

语言环境

逻辑错误

M

成员

方法

模块

模块级

模块级变量

N

命名参数

Null

数字表达式

数字类型

O-P-Q

对象表达式

对象类型

参数

路径

路径名

pi

打印区

过程

过程级

方案

属性

R

被引用方案

运行时

运行时错误

S

作用域

种子

排序顺序

拆分条

语句

字符串比较

字符串常量

字符串表达式

字符串直接量

字符串类型

语法检查

语法错误

T

时间表达式

标题栏

类型定义字符

U

通用日期格式

自定义类型

V

变量

变量名

VarType

W-X-Y-Z

等待模式

监视表达式


_ 数组关键字摘要
�_�_�__数组关键字摘要

请参阅

作用	关键字

验证数组。	IsArray

创建数组。	Array

改变默认下界。	Option Base

声明和初始化数组。	Dim, Public, Private, ReDim, Static

查找数组的上下界。	LBound, UBound

重新初始化数组。	Erase, ReDim


转换关键字摘要

请参阅

作用	关键字

ANSI 值到字符串。	Chr

转换大小写。	Format, LCase, UCase

日期到序数。	DateSerial, DateValue

十进制到其他进制。	Hex, Oct

数到字符串。	Format, Str

任一数据类型到其他类型。	CBool, CCur, CDate, CDbl, CInt, CLng, CSng, CStr, CVar, CVErr,Fix, Int

序数到日期。	Date, Month, Weekday, Year

序数到时间。	Hour, Minute, Second

字符串到ASCII值。	Asc

字符串到数。	Val

时间到序数。	TimeSerial, TimeValue


数据类型关键字

请参阅

作用	关键字

数据类型间转换。	CBool, CCur, CDate, CDbl, CInt, CLng, CSng, CStr, CVar, CVErr,Fix, Int

设置内部数据类型。	Boolean, Integer, Long, Currency, Single, Double, Date, String, Object, Variant (default)

验证数据类型。	IsArray, IsDate, IsEmpty, IsError, IsMissing, IsNull, IsNumeric, IsObject


日期和时间关键字摘要

请参阅

作用	关键字

获取当前日期或时间。	Date, Now, Time

返回日期。	DateSerial, DateValue

返回时间。	TimeSerial, TimeValue

设置日期或时间。	Date, Time

过程计时。	Timer


控制流关键字摘要

请参阅

作用	关键字

跳转。	GoSub...Return, GoTo, On Error, On...GoSub, On...GoTo

退出或暂停程序。	DoEvents, End, Stop

循环。	Do...Loop, For...Next, For Each...Next, While...Wend

判断。	If...Then...Else, Select Case


目录和文件关键字摘要

请参阅

作用	关键字

改变目录或文件夹。	ChDir

改变驱动器。	ChDrive

复制文件。	FileCopy

建立目录或文件夹。	MkDir

删除目录或文件夹。	RmDir

返回当前路径。	CurDir

返回文件、目录或标记属性。	GetAttr

返回文件名或卷标。	Dir

返回文件日期/时间标志。	FileDateTime

更改文件名、目录或文件夹。 	Name

设置文件的属性信息。       	SetAttr


错误关键字摘要

请参阅

作用	关键字

获取错误消息。	Error

获取错误状态数据。	Erl, Err

模拟运行错误。	Error

捕获运行错误。	On Error, Resume

类型验证。	IsError

返回Error变体型。	CVErr


输入和输出关键字摘要

请参阅

作用	关键字

访问或创建文件。	Open

关闭文件。	Close, Reset

控制输出外观。	Format, Print, Print #, Spc, Tab, Width #

复制文件。	FileCopy

获取文件信息。	EOF, FileAttr, FileDateTime, FileLen, FreeFile, GetAttr, Loc, LOF, Seek

管理文件。	Dir, Kill, Lock...Unlock, Name

从文件中读。	Get, Input, Input #, Line Input #

返回文件长度。	FileLen

设置或获取文件属性。	FileAttr, GetAttr, SetAttr

设置文件的读写位置。	Seek

写入文件。	Print #, Put, Write #


数学关键字摘要

请参阅

作用	关键字

派生三角函数。	Atn, Cos, Sin, Tan

一般计算。	Exp, Log, Sqr

产生随机数。	Randomize, Rnd

获取绝对值。	Abs

获取表达式符号。	Sgn

进行数字转换。	Fix, Int


杂用关键字摘要

请参阅

作用	关键字

处理迫近的事件。	DoEvents

运行其他程序。	AppActivate, Shell

发送击键到应用程序。	SendKeys

使计算机发声。	Beep


运算符关键字摘要

请参阅

作用	关键字

算术。	^, -, *,  /, \, Mod, +, &

比较。	=, <>, <, >, <=, >=, Like, Is

逻辑运算。	Not, And, Or, Xor, Eqv, Imp


字符串处理关键字摘要

请参阅

作用	关键字

比较两字符串。	StrComp

转换大小写。	Format, LCase, UCase

创建重复字符的字符串。	Space, String

确定字符串长度。	Len

格式化字符串。	Format

对齐字符串。	LSet, RSet

处理字符串。	Instr, Left, LTrim, Mid, Right, RTrim, Trim

设置字符串比较规则。	Option Compare

处理ASCII 和 ANSI 值。	Asc, Chr


变量和常量关键字摘要

请参阅

作用	关键字

赋值。	Let

声明变量和常量。	Const, Dim, Private, Public, Static

声明模块为私有。	Option Private Module

获取变量信息。	IsArray, IsDate, IsEmpty, IsError, IsMissing, IsNull, IsNumeric, IsObject, TypeName, VarType

强制显式声明变量。	Option Explicit

设置默认数据类型。	Deftype


可捕获的错误

当应用程序运行时，可捕获的错误可能发生，其中一些也可在开发和编译期间发生。使用On Error语句和Err函数可测试和响应可捕获的错误 。

代码	消息

3	没有 GoSub返回

5	无效的程序调用

6	溢出

7	内存不够

9	下标超界

10	多重定义

11	用零除

13	类型不匹配

14	超出字符串

16	字符串公式太复杂

17	不能执行需要的操作

18	出现用户中断

20	没有错误重新开始

28	栈溢出

35	Sub 或 Function 没定义

48	加载 DLL出错

49	错误的DLL 调用约定

51	内部错误

52	文件名或编号出错

53	文件没有找到

54	文件模式出错

55	文件已经打开

57	设备 I/O 出错

58	文件已经存在

59	错误的记录长度

61	磁盘已满

62	输入超过了文件结尾

63	记录号出错

67	文件太多

68	没有得到设备

70	权限不够

71	磁盘没有准备好

74	不能用不同的驱动器命名

75	Path/File 权限出错

76	没有找到路径

91	没有设置对象变量

92	循环没有初始化

93	无效字符图案

94	无效使用 Null

95	用户定义出错

323	不能加载模型；无效的格式

423	没有找到属性或方法

424	必选对象

430	类不支持OLE自动化

438	对象不支持该属性或方法

440	OLE 自动出错

445	对象不支持该操作

446	对象不支持命名变量

447	对象不支持当前场所配置

448	命名变量没有

449	参数不可选

450	参数号出错

451	对象不是集合

452	无效序数

453	没有找到指定的DLL函数

454	没有找到源代码

455	源代码锁定出错


关键字未找到

Visual Basic 帮助中找不到选定的关键字。可能该关键字有拼写错误，或者选定文本太多或太少，或者该单词并非合法的 Visual Basic 关键字。

获得指定关键字的帮助的最容易的方法是把插入点置于该关键字内任何位置，然后按F1。不必选定该关键字。事实上，如果仅选定了该关键字的一部分，或选定了多于一个的单词，将找不到所需的帮助。

在下面的例子中，当插入点位于字母“a”和“l”之间并按下F1时，将显示Value属性的帮助主题。

要使用内部的帮助查找对话框，请单击工具栏上的"帮助主题" 按钮。