Calendar 常数

可在代码中的任何地方用下列常数代替实际值：

常数 | 值 | 描述
vbCalGreg | 0 | 指出使用的是阳历。
vbCalHijri | 1 | 指出使用的是伊斯兰历法。


CallType 常数

可在代码中的任何地方用下列常数代替实际值：

常数 | 值 | 描述
vbMethod | 1 | 指出已经调用了一个方法。
vbGet | 2 | 指出一个Property Get 过程。
vbLet | 4 | 指出一个 Property Let 过程。
vbSet | 8 | 指出一个 Property Set 过程。


Color 常数

可在代码中的任何地方用下列常数代替实际值：

常数 | 值 | 描述
vbBlack | 0x0 | 黑色
vbRed | 0xFF | 红色
vbGreen | 0xFF00 | 绿色
vbYellow | 0xFFFF | 黄色
vbBlue | 0xFF0000 | 蓝色
vbMagenta | 0xFF00FF | 紫红色
vbCyan | 0xFFFF00 | 青色
vbWhite | 0xFFFFFF | 白色


ColorConstants （“对象浏览器”）

Color Constants 模块含有预先定义的颜色常数。这些常数可以用在代码中的任何地方。

要取得某个常数的联机帮助，请按照以下步骤执行：

  1. 从“'ColorConstants' 的成员”列表中选择此常数。

  2. 单击 {but_Help.bmp} 按钮。


Comparison常数

下列常数由 Visual Basic for Applications 中的类型库定义，可用来在代码中的任何地方代替实际值：

常数 | 值 | 描述
VbUseCompareOption | -1 | 使用Option Compare语句的设置进行比较。
VbBinaryCompare | 0 | 进行二进制的比较。
VbTextCompare | 1 | 进行文字的比较。
vbDatabaseCompare | 2 | 用于 Microsoft Access(仅限于Windows)，进行以数据库所含信息为基础的比较。


Compiler 常数

Visual Basic for Applications 定义了一些不能与 #If...Then...#Else 指令一起使用的常数。这些常数除了其范围是全局的；也就是说，除了可在工程中到处应用，在功能上与 #If...Then...#Else 指令定义的常数相同。

在 16 位开发平台上，编译常数定义如下：

常数 | 值 | 描述
Win16 | True | 指出开发环境是 16 位。
Win32 | False | 指出开发环境不是 32 位。

在 32 位开发平台上，编译常数定义如下：

常数 | 值 | 描述
Vba6 | True | 指出开发环境是 Visual Basic for Applications, version 6.0。
Vba6 | False | 指出开发环境不是Visual Basic for Applications, version 6.0。
Win16 | False | 指出开发环境不是 16 位。
Win32 | True | 指出开发环境是 32 位。

Mac | False | 指出开发环境不是 Macintosh。
Win16 | False | 指出开发环境不是 16位的。
Win32 | False | 指出开发环境不是 32位的。
Mac | True | 指出开发环境是 Macintosh。

注意 这些常数是由 Visual Basic 提供的，所以不能在任何层次中用相同名称定义自己的常数。


Date 常数

可在代码中的任何地方用下列常数代替实际值：

参数值

firstdayofweek 参数具有以下这些值：

常数 | 值 | 描述
vbUseSystem | 0 | 使用 NLS API 设置。
vbSunday | 1 | 星期日（缺省）
vbMonday | 2 | 星期一
vbTuesday | 3 | 星期二
vbWednesday | 4 | 星期三
vbThursday | 5 | 星期四
vbFriday | 6 | 星期五
vbSaturday | 7 | 星期六

firstdayofyear 参数具有以下这些值：

常数 | 值 | 描述
vbUseSystem | 0 | 使用 NLS API 设置。
VbUseSystemDayOfWeek | 0 | 使用系统设置中为星期的第一天指定的星期数。
VbFirstJan1 | 1 | 由 1 月 1 日所在的那个星期开始（缺省）。
vbFirstFourDays | 2 | 由新的一年中第一个至少有 4 天的星期开始。
vbFirstFullWeek | 3 | 由一年中第一个完整的星期开始。

返回值

常数 | 值 | 描述
vbSunday | 1 | 星期日
vbMonday | 2 | 星期一
vbTuesday | 3 | 星期二
vbWednesday | 4 | 星期三
vbThursday | 5 | 星期四
vbFriday | 6 | 星期五
vbSaturday | 7 | 星期六


日期格式常数

仅当您的工程对包含这些常数定义的相应类型库有一个显式引用时，才可以使用这些常数 。

常数 | 值 | 描述
vbGeneralDate | 0 | 显示日期和/或时间。对于一个实数，显示日期和时间。如果没有小数部分，则仅显示日期。如果没有整数部分，则仅显示时间。日期和时间的显示由系统设置值确定。
vbLongDate | 1 | 用计算机区域设置值指定的长日期格式显示日期。
vbShortDate | 2 | 用计算机区域设置值指定的短日期格式显示日期。
vbLongTime | 3 | 用计算机区域设置值指定的长时间格式显示时间。
vbShortTime | 4 | 用计算机区域设置值指定的短时间格式显示时间。


Dir、GetAttr 和 SetAttr 常数

可在代码中的任何地方用下列常数代替实际值：

常数 | 值 | 描述
vbNormal | 0 | 正常的（Dir 和 SetAttr 的缺省值）
vbReadOnly | 1 | 只读的
vbHidden | 2 | 隐藏的
vbSystem | 4 | 系统文件
vbVolume | 8 | 卷标
vbDirectory | 16 | 目录或文件夹
vbArchive | 32 | 文件自上一次备份后已经改变
vbAlias | 64 | 在 Macintosh上，标识符是一个别名。

在Macintosh上，只有VbNormal、 vbReadOnly、 vbHidden 和vbAlias是可用的。


驱动器类型常数

仅当您的工程对包含这些常数定义的相应类型库有一个显式引用时，才可以使用这些常数。

常数 | 值 | 描述
Unknown | 0 | 不能确定驱动器类型。
Removable | 1 | 驱动器具有可删除介质。包括所有软盘驱动器和许多其它种类的存储设备。
Fixed | 2 | 驱动器具有固定介质（不可删除的）。包括可删除硬盘在内的所有硬盘驱动器。
Remote | 3 | 网络驱动器。包括在网络上任何地方都可以共享的驱动器。
CDROM | 4 | 驱动器是一个CD-ROM。包括只读的CD-ROM和可读写的CD-ROM。
RAMDisk | 5 | 驱动器是本地计算机上的一块随机存取内存（RAM），它工作起来就象是磁盘驱动器一样。


文件属性常数

仅当您的工程对包含这些常数定义的相应类型库有一个显式引用时，才可以使用这些常数。

常数 | 值 | 描述
Normal | 0 | 普通文件。没有设置属性。
ReadOnly | 1 | 只读文件。属性是可读/写。
Hidden | 2 | 隐藏文件。属性是可读/写。
System | 4 | 系统文件。属性是可读/写。
Volume | 8 | 磁盘驱动器卷标。属性是只读。
Directory | 16 | 文件夹或目录。属性是只读。
Archive | 32 | 自上次备份后已经改变的文件。属性是可读/写。
Alias | 64 | 链接或快捷方式。属性是只读。
Compressed | 128 | 压缩文件。属性是只读。


文件输入/输出常数

仅当您的工程对包含这些常数定义的相应类型库有一个显式引用时，才可以使用这些常数。

常数 | 值 | 描述
ForReading | 1 | 打开文件用于只读操作。不能对文件进行写操作。
ForWriting | 2 | 打开文件用于写操作。如果存在具有相同文件名的文件，文件原有的内容被覆盖。
ForAppending | 8 | 打开文件并向文件的结尾写入。


Form 常数

可在代码中的任何地方用下列常数代替实际值：

常数 | 值 | 描述
vbModeless | 0 | UserForm 是无模式的。
vbModal(缺省的) | 1 | UserForm 是模态的。


IMEStatus 常数

可在代码中的任何地方用下列常数代替实际值。

日文区域的常数如下所示：

常数 | 值 | 描述
vbIMEModeNoControl | 0 | 没有安装 IME（缺省）
vbIMEModeOn | 1 | 打开 IME
vbIMEModeOff | 2 | 关闭 IME
vbIMEModeDisable | 3 | 无效的 IME
vbIMEModeHiragana | 4 | 完整宽度 Hiragana 模式
vbIMEModeKatakana | 5 | 完整宽度 Katakana 模式
vbIMEModeKatakanaHalf | 6 | 半宽度 Katakana 模式
vbIMEModeAlphaFull | 7 | 完整宽度 Alphanumeric 模式

vbIMEModeAlpha 8 半宽度 Alphanumeric 模式

韩国地区的常数如下所示：

常数 | 值 | 描述
vbIMEModeAlphaFull | 7 | 完整宽度 Alphanumeric 模式
vbIMEModeAlpha | 8 | 半宽度 Alphanumeric 模式
vbIMEModeHangulFull | 9 | 完整宽度 Hangul 模式
vbIMEModeHangul | 10 | 半宽度 Hangul 模式

中文地区的常数值如下：

常数 | 值 | 描述
vbIMEModeNoControl | 0 | 没有安装 IME （缺省）
vbIMEModeOn | 1 | IME 打开
vbIMEModeOff | 2 | IME off


Keycode 常数

可在代码中的任何地方用下列常数代替实际值：

常数 | 值 | 描述
vbKeyLButton | 0x1 | 鼠标左键
vbKeyRButton | 0x2 | 鼠标右键
vbKeyCancel | 0x3 | CANCEL 键
vbKeyMButton | 0x4 | 鼠标中键
vbKeyBack | 0x8 | BACKSPACE 键
vbKeyTab | 0x9 | TAB 键
vbKeyClear | 0xC | CLEAR 键
vbKeyReturn | 0xD | ENTER 键
vbKeyShift | 0x10 | SHIFT 键
vbKeyControl | 0x11 | CTRL 键
vbKeyMenu | 0x12 | MENU 键
vbKeyPause | 0x13 | PAUSE 键
vbKeyCapital | 0x14 | CAPS LOCK 键
vbKeyEscape | 0x1B | ESC 键
vbKeySpace | 0x20 | SPACEBAR 键
vbKeyPageUp | 0x21 | PAGE UP 键
vbKeyPageDown | 0x22 | PAGE DOWN 键
vbKeyEnd | 0x23 | END 键
vbKeyHome | 0x24 | HOME 键
vbKeyLeft | 0x25 | LEFT ARROW 键
vbKeyUp | 0x26 | UP ARROW 键
vbKeyRight | 0x27 | RIGHT ARROW 键
vbKeyDown | 0x28 | DOWN ARROW 键
vbKeySelect | 0x29 | SELECT 键
vbKeyPrint | 0x2A | PRINT SCREEN 键
vbKeyExecute | 0x2B | EXECUTE 键
vbKeySnapshot | 0x2C | SNAPSHOT 键
vbKeyInsert | 0x2D | INSERT 键
vbKeyDelete | 0x2E | DELETE 键
vbKeyHelp | 0x2F | HELP 键
vbKeyNumlock | 0x90 | NUM LOCK 键

A 至 Z 键与 A – Z 字母的 ASCII 码相同：

常数 | 值 | 描述
vbKeyA | 65 | A 键
vbKeyB | 66 | B 键
vbKeyC | 67 | C 键
vbKeyD | 68 | D 键
vbKeyE | 69 | E 键
vbKeyF | 70 | F 键
vbKeyG | 71 | G 键
vbKeyH | 72 | H 键
vbKeyI | 73 | I 键
vbKeyJ | 74 | J 键
vbKeyK | 75 | K 键
vbKeyL | 76 | L 键
vbKeyM | 77 | M 键
vbKeyN | 78 | N 键
vbKeyO | 79 | O 键
vbKeyP | 80 | P 键
vbKeyQ | 81 | Q 键
vbKeyR | 82 | R 键
vbKeyS | 83 | S 键
vbKeyT | 84 | T 键
vbKeyU | 85 | U 键
vbKeyV | 86 | V 键
vbKeyW | 87 | W 键
vbKeyX | 88 | X 键
vbKeyY | 89 | Y 键
vbKeyZ | 90 | Z 键

0 至 9 键与数字 0 – 9 的 ASCII 码相同：

常数 | 值 | 描述
vbKey0 | 48 | 0 键
vbKey1 | 49 | 1 键
vbKey2 | 50 | 2 键
vbKey3 | 51 | 3 键
vbKey4 | 52 | 4 键
vbKey5 | 53 | 5 键
vbKey6 | 54 | 6 键
vbKey7 | 55 | 7 键
vbKey8 | 56 | 8 键
vbKey9 | 57 | 9 键

下列常数代表数字键盘上的键：

常数 | 值 | 描述
vbKeyNumpad0 | 0x60 | 0 键
vbKeyNumpad1 | 0x61 | 1 键
vbKeyNumpad2 | 0x62 | 2 键
vbKeyNumpad3 | 0x63 | 3 键
vbKeyNumpad4 | 0x64 | 4 键
vbKeyNumpad5 | 0x65 | 5 键
vbKeyNumpad6 | 0x66 | 6 键
vbKeyNumpad7 | 0x67 | 7 键
vbKeyNumpad8 | 0x68 | 8 键
vbKeyNumpad9 | 0x69 | 9 键
vbKeyMultiply | 0x6A | MULTIPLICATION SIGN (*) 键
vbKeyAdd | 0x6B | PLUS SIGN (+) 键
vbKeySeparator | 0x6C | ENTER 键
vbKeySubtract | 0x6D | MINUS SIGN (–) 键
vbKeyDecimal | 0x6E | DECIMAL POINT (.) 键
vbKeyDivide | 0x6F | DIVISION SIGN (/) 键

下列常数代表功能键：

常数 | 值 | 描述
vbKeyF1 | 0x70 | F1 键
vbKeyF2 | 0x71 | F2 键
vbKeyF3 | 0x72 | F3 键
vbKeyF4 | 0x73 | F4 键
vbKeyF5 | 0x74 | F5 键
vbKeyF6 | 0x75 | F6 键
vbKeyF7 | 0x76 | F7 键
vbKeyF8 | 0x77 | F8 键
vbKeyF9 | 0x78 | F9 键
vbKeyF10 | 0x79 | F10 键
vbKeyF11 | 0x7A | F11 键
vbKeyF12 | 0x7B | F12 键
vbKeyF13 | 0x7C | F13 键
vbKeyF14 | 0x7D | F14 键
vbKeyF15 | 0x7E | F15 键
vbKeyF16 | 0x7F | F16 键


KeycodeConstants （“对象浏览器”）

KeyCodeConstants 模块含有预先定义的按键码常数，可用在程序中的任何地方。

要取得某个常数的联机帮助，请按照以下步骤执行：

  1. 从“'KeyCodeConstants' 的成员”列表中选择此常数。

  2. 单击 {but_Help.bmp} 按钮。


Miscellaneous 常数

下列常数由 Visual Basic for Applications 中的类型库定义，可用来在代码中的任何地方代替实际值：

常数 | 等于 | 描述
vbCrLf | Chr(13) + Chr(10) | 回车符与换行符结合
vbCr | Chr(13) | 回车符
vbLf | Chr(10) | 换行符
vbNewLine | Chr(13) + Chr(10) or, on the Macintosh, Chr(13) | 平台指定的新行字符；适用于当前平台
vbNullChar | Chr(0) | 值为 0 的字符
vbNullString | 值为 0 的字符串 | 用来调用外部过程；与长度为零的字符串 ("") 不同
vbObjectError | -2147221504 | 用户定义的错误号应当大于该值，例如： Err.Raise Number = vbObjectError + 1000
vbTab | Chr(9) | Tab 字。
vbBack | Chr(8) | 退格字符
vbFormFeed | Chr(12) | 在 Microsoft Windows or on the Macintosh 中没有作用
vbVerticalTab | Chr(11) | 在 Microsoft or on the Macintosh Windows 中没有作用


MsgBox 常数

可在代码中的任何地方使用下列常数代替实际值：

MsgBox 参数

常数 | 值 | 描述
vbOKOnly | 0 | 只有 OK 按钮（缺省值）
vbOKCancel | 1 | OK 和 Cancel 按钮
vbAbortRetryIgnore | 2 | Abort、Retry，和 Ignore 按钮
vbYesNoCancel | 3 | Yes、No，和 Cancel 按钮
vbYesNo | 4 | Yes 和 No 按钮
vbRetryCancel | 5 | Retry 和 Cancel 按钮
vbCritical | 16 | 关键消息
vbQuestion | 32 | 警告询问
vbExclamation | 48 | 警告消息
vbInformation | 64 | 通知消息
vbDefaultButton1 | 0 | 第一个按钮是缺省的（缺省值）
vbDefaultButton2 | 256 | 第二个按钮是缺省的
vbDefaultButton3 | 512 | 第三个按钮是缺省的
vbDefaultButton4 | 768 | 第四个按钮是缺省的
vbApplicationModal | 0 | 应用程序形态的消息框（缺省值）
vbSystemModal | 4096 | 系统强制返回的消息框
vbMsgBoxHelpButton | 16384 | 添加Help按钮到消息框
VbMsgBoxSetForeground | 65536 | 指定消息框窗口作为前景窗口
vbMsgBoxRight | 524288 | 文本是右对齐的
vbMsgBoxRtlReading | 1048576 | 指定在希伯来语和阿拉伯语系统中，文本应当显示为从右到左读

MsgBox 返回值

常数 值 描述

vbOK | 1 | 按下 OK 按钮
vbCancel | 2 | 按下 Cancel 按钮
vbAbort | 3 | 按下 Abort 按钮
vbRetry | 4 | 按下 Retry 按钮
vbIgnore | 5 | 按下 Ignore 按钮
vbYes | 6 | 按下 Yes 按钮
vbNo | 7 | 按下 No 按钮


QueryClose常数

下列常数可以用于代码中的任何位置以代替实际值：

常数 | 值 | 描述
vbFormControlMenu | 0 | 用户从窗体上的Control 菜单选择Close 命令。
vbFormCode | 1 | Unload 语句被从代码中调用。
vbAppWindows | 2 | 当前 Microsoft Windows 操作环境会话结束。
vbAppTaskManager | 3 | Windows Task Manager 正在关闭应用程序。


Shell 常数

可在代码中的任何地方使用下列常数代替实际值：

常数 | 值 | 描述
vbHide | 0 | 窗口是隐藏的，并且焦点被传递给隐藏窗口。
vbNormalFocus | 1 | 窗口拥有焦点，并且恢复到原来的大小与位置。
vbMinimizedFocus | 2 | 窗口缩小为图符并拥有焦点。
vbMaximizedFocus | 3 | 窗口最大化并拥有焦点。
vbNormalNoFocus | 4 | 窗口被恢复到最近一次的大小与位置。当前活动窗口仍为活动窗口。
vbMinimizedNoFocus | 6 | 窗口缩小为图符。当前活动窗口仍为活动窗口。

在Macintosh中，vbNormalFocus、 vbMinimizedFocus 和vbMaximizedFocus 都将应用程序放于前景；vbHide、vbNoFocus、vbMinimizedFocus 都将应用程序放在背景。


特殊文件夹常数

仅当您的工程对包含这些常数定义的相应类型库有一个显式引用时，才可以使用这些常数。

常数 | 值 | 描述
WindowsFolder | 0 | Windows文件夹包含由Windows操作系统安装的文件。
SystemFolder | 1 | System（系统）文件夹包含库、字体和设备驱动程序。
TemporaryFolder | 2 | Temp（临时）文件夹用于存储临时文件。它的路径可在TMP环境变量中找到。


StrConv 常数

可在代码中的任何地方使用下列常数代替实际值：

Constant | 值 | 描述
vbUpperCase | 1 | 将字符串转换成大写字符。
vbLowerCase | 2 | 将字符串转换成小写字符。
vbProperCase | 3 | 将字符串中每个词的第一个字母转换成大写。
vbWide | 4 | 将字符串中的窄（单字节）字符转换成宽（双字节）字符。适用于远东地区。
vbNarrow | 8 | 将字符串中的宽（双字节）字符转换成窄（单字节）字符。适用于远东地区。
vbKatakana | 16 | 将字符串中的 Hiragana 字符转换成 Katakana 字符；只适用于日文地区。
vbHiragana | 32 | 将字符串中的 Katakana 字符转换成 Hiragana 字符；只适用于日文地区。
vbUnicode | 64 | 利用缺省的系统代码页将字符串转换成 Unicode (在Macintosh 中不可用。)。
vbFromUnicode | 128 | 将字符串由 Unicode 转换成缺省的系统代码页 (在Macintosh 中不可用。)。


系统颜色常数

可在代码中的任何地方用下列常数代替实际值：

常数 | 值 | 描述
vbScrollBars | 0x80000000 | 滚动条颜色
vbDesktop | 0x80000001 | 桌面颜色
vbActiveTitleBar | 0x80000002 | 活动窗口的标题栏颜色
vbInactiveTitleBar | 0x80000003 | 非活动窗口的标题栏颜色
vbMenuBar | 0x80000004 | 菜单背景色
vbWindowBackground | 0x80000005 | 窗口背景色
vbWindowFrame | 0x80000006 | 窗口框架颜色
vbMenuText | 0x80000007 | 菜单文本颜色
vbWindowText | 0x80000008 | 窗口文本颜色
vbTitleBarText | 0x80000009 | 标题、调整框和滚动箭头的文本颜色
vbActiveBorder | 0x8000000A | 活动窗口边框颜色
vbInactiveBorder | 0x8000000B | 非活动窗口边框颜色
vbApplicationWorkspace | 0x8000000C | 多文档界面 (MDI) 应用程序的背景色
vbHighlight | 0x8000000D | 控件中选中项目的背景色
vbHighlightText | 0x8000000E | 控件中选中项目的文本颜色
vbButtonFace | 0x8000000F | 命令按钮表面阴影颜色
vbButtonShadow | 0x80000010 | 命令按钮边缘阴影颜色
vbGrayText | 0x80000011 | 灰色（无效）文本
vbButtonText | 0x80000012 | 下压按钮文本颜色
vbInactiveCaptionText | 0x80000013 | 非活动标题文本颜色
vb3DHighlight | 0x80000014 | 3-D 显示元素的突出显示颜色
vb3DDKShadow | 0x80000015 | 3-D 显示元素的最深阴影颜色
vb3DLight | 0x80000016 | vb3Dhighlight 之外最亮的 3-D 颜色
vbInfoText | 0x80000017 | 工具提示文本颜色
vbInfoBackground | 0x80000018 | 工具提示背景色


SystemColorConstants （“对象浏览器”）

System ColorConstants 模块中的常数，可用来识别图形化用户界面的各部分。这些常数可以用在代码中的任何地方。

要取得某个常数的联机帮助，请按照以下步骤执行：

  1. 从“'SystemColorConstants' 的成员”列表中选择此常数。

  2. 单击 {but_Help.bmp} 按钮。


三态常数

仅当您的工程对包含这些常数定义的相应类型库有一个显式引用时，才可以使用这些常数。

常数 | 值 | 描述
vbTrue | –1 | True
vbFalse | 0 | False
vbUseDefault | –2 | 使用缺省设置值。


VarType 常数

可在代码中的任何地方用下列常数代替实际值：

常数 | 值 | 描述
vbEmpty | 0 | 未初始化（缺省值）
vbNull | 1 | 不含任何有效数据
vbInteger | 2 | Integer
vbLong | 3 | 长整数
vbSingle | 4 | 单精度浮点数
vbDouble | 5 | 双精度浮点数
vbCurrency | 6 | Currency
vbDate | 7 | Date
vbString | 8 | String
vbObject | 9 | 对象
vbError | 10 | 错误
vbBoolean | 11 | Boolean
vbVariant | 12 | Variant（只用于变体的数组类型）
vbDataObject | 13 | 数据访问对象
vbDecimal | 14 | Decimal
vbByte | 17 | Byte
vbUserDefinedType | 36 | 包含用户定义类型的变量
vbArray | 8192 | 数组


Visual Basic 常数

Visual Basic for Applications 定义了一些常数，使程序设计变得更为简单。下列常数可在程序代码中的任何地方代替实际值：

Calendar 常数

CallType 常数

Color 常数

Compiler 常数

Date 常数

Dir、GetAttr 和 SetAttr 常数

IMEStatus 常数

Instr、StrComp 常数

Keycode 常数

Miscellaneous 常数

MsgBox 常数

QueryClose 常数

QueryClose 常数

Shell 常数

StrConv 常数

系统颜色常数

VarType 常数

Visual Basic 常数


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。


Byte 数据类型

Byte 变量存储为单精度型、无符号整型、8 位（1个字节）的数值形式，范围在 0 至 255 之间。

Byte 数据类型在存储二进制数据时很有用。


Currency 数据类型

Currency 变量存储为 64 位（8 个字节）整型的数值形式，然后除以 10,000 给出一个定点数，其小数点左边有 15 位数字，右边有 4 位数字。这种表示法的范围可以从 -922,337,203,685,477.5808 到 922,337,203,685,477.5807。Currency 的类型声明字符为at号 (@)。

Currency 数据类型在货币计算与定点计算中很有用，在这种场合精度特别重要。


Date 数据类型

Date 变量存储为 IEEE 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 日之前的日期。


Decimal 数据类型

Decimal 变量存储为 96 位（12 个字节）带符号的整型形式，并除以一个 10 的幂数。这个变比因子决定了小数点右面的数字位数，其范围从 0 到 28。变比因子为 0（没有小数位）的情形下，最大的可能值为 +/-79,228,162,514,264,337,593,543,950,335。而在有 28 个小数位的情况下，最大值为 +/-7.9228162514264337593543950335，而最小的非零值为 +/-0.0000000000000000000000000001。

注意 此时，Decimal 数据类型只能在 Variant中使用，也就是说，不能声明一变量为 Decimal 的类型。不过可用 Cdec 函数，创建一个子类型为 Decimal 的 Variant。


Double 数据类型

Double（双精度浮点型）变量存储为 IEEE 64 位（8 个字节）浮点数值的形式，它的范围在负数的时候是从 -1.79769313486231E308 到 -4.94065645841247E-324，而正数的时候是从 4.94065645841247E-324 到 1.79769313486232E308。Double 的类型声明字符是数字符号 (#)。


Integer 数据类型

Integer 变量存储为 16位（2 个字节）的数值形式，其范围为 -32,768 到 32,767 之间。Integer 的类型声明字符是百分比符号 (%)。

也可以用 Integer 变量来表示枚举值。枚举值可包含一个有限集合，该集合包含的元素都是唯一的整数，每一个整数都在它使用时的上下文当中有其特殊意义。枚举值为在已知数量的选项中做出选择提供了一种方便的方法，例如，black = 0，white = 1 等等。较好的编程作法是使用 Const 语句将每个枚举值定义成常数。


Long 数据类型

Long（长整型）变量存储为 32 位（4 个字节）有符号的数值形式，其范围从 -2,147,483,648 到 2,147,483,647。Long 的类型声明字符为和号 (&)。


Object 数据类型

Object 变量存储为 32 位（4 个字节）的地址形式，其为对象的引用。利用 Set 语句，声明为 Object 的变量可以赋值为任何对象的引用。

注意 虽然以 Object 类型声明的变量足以适应包含对各种对象的引用，但是绑定到变量引用的对象总是在晚期（运行时）绑定。要强迫在早期（编译时间）绑定的话，须将对象的引用赋值给用特定类名称声明的变量。


Single 数据类型

Single（单精度浮点型）变量存储为 IEEE 32 位（4 个字节）浮点数值的形式，它的范围在负数的时候是从 -3.402823E38 到 -1.401298E-45，而在正数的时候是从 1.401298E-45 到 3.402823E38。Single 的类型声明字符为感叹号 (!)。


String 数据类型

字符串有两种：变长与定长的字符串。

  • 变长字符串最多可包含大约 20 亿 ( 2^31)个字符。

  • 定长字符串可包含 1 到大约 64K ( 2^16 ) 个字符。

    注意 Public 定长字符串不能在类模块中使用。

String 之字符码的范围是 0 到 255。字符集的前 128 个字符（0 到 127）对应于标准的 U.S. 键盘上的字符与符号。这前 128 个字符与 ASCII 字符集中所定义的相同。后 128 个字符（128 到 255）则代表特殊字符，例如国际字符，重音符号，货币符号及分数。String 的类型声明字符为美元号 ($)。


用户定义数据类型

可以是任何用 Type 语句定义的数据类型。用户自定义类型可包含一个或多个某种数据类型的数据元素、数组或一个先前定义的用户自定义类型。例如：

Type MyType
    MyName As String    '定义字符串变量存储一个名字。
    MyBirthDate As Date    '定义日期变量存储一个生日。
    MySex As Integer    '定义整型变量存储性别
End Type                '（0 为女，1 为男）


Variant 数据类型

Variant 数据类型是所有没被显式声明（用如 Dim、Private、Public 或 Static等语句）为其他类型变量的数据类型。Variant 数据类型并没有类型声明字符。

Variant 是一种特殊的数据类型，除了定长 String 数据及用户定义类型外，可以包含任何种类的数据。Variant 也可以包含 Empty、Error、Nothing 及 Null等特殊值。可以用 VarType 函数或 TypeName 函数来决定如何处理 Variant 中的数据。

数值数据可以是任何整型或实型数，负数时范围从
-1.797693134862315E308 到 -4.94066E-324，正数时则从 4.94066E-324 到 1.797693134862315E308。通常，数值 Variant 数据保持为其 Variant 中原来的数据类型。例如，如果把一个 Integer赋值给 Variant，则接下来的运算会把此 Variant 当成 Integer 来处理。然而，如果算术运数针对含 Byte、Integer、Long 或 Single 之一的Variant 执行，并当结果超过原来数据类型的正常范围时，则在 Variant 中的结果会提升到较大的数据类型。如 Byte 则提升到 Integer，Integer 则提升到 Long，而 Long和Single 则提升为 Double。当 Variant 变量中有 Currency、Decimal 及 Double 值超过它们各自的范围时，会发生错误。

可以用 Variant 数据类型来替换任何数据类型，这样会更有适应性。如果 Variant 变量的内容是数字，它可以用字符串来表示数字或是用它实际的值来表示，这将由上下文来决定，例如：

Dim MyVar As Variant
MyVar = 98052

在前面的例子中，MyVar 内有一实际值为 98052 的数值。像期望的那样，算术运算子可以对 Variant 变量运算，其中包含数值或能被解释为数值的字符串数据。如果用 + 运算子来将 MyVar 与其他含有数字的 Variant 或数值类型的变量相加，结果便是一算术和。

Empty 值用来标记尚未初始化（给定初始值）的 Variant 变量。内含 Empty 的 Variant 在数值的上下文中表示 0，如果是用在字符串的上下文中则表示零长度的字符串 ("")。

不应将 Empty 与 Null 弄混。Null 是表示 Variant 变量确实含有一个无效数据。

在 Variant 中，Error 是用来指示在过程中出现错误时的特殊值。然而，不像对其他种类的错误那样，程序并不产生普通的应用程序级的错误处理。这可以让程序员，或应用程序本身，根据此错误值采取另外的行动。可以用 CVErr 函数将实数转换为错误值来产生 Error 值。


#Const 指令

用来定义 Visual Basic 的条件编译常数。

语法

#Const constname = expression

#Const 编译指令的语法具有以下几个部分：

部分 | 描述
constname | 必要；Variant (String)。常数；名称要遵守变量命名的约定。
expression | 必要。文字、其他的条件编译常数或包含除了 Is 以外的算术或逻辑运算符的任意组合。

说明

条件编译常数在其出现的模块中总是 Private。不可能利用 #Const 指令建立 Public 编译常数。Public 编译常数只能在用户接口中建立。

在 expression 中只能使用编译常数及文字。使用一个用 Const 定义的标准常数，或者使用一个未定义的常数，都会导致错误发生。反之，用 #Const 关键字定义的常数也只能用于条件编译。

不管条件编译常数在程序中的位置如何，都总是在模块级别中进行计算。


#Const 指令示例

本示例使用 #Const 伪指令声明条件式编译器常数，以便在 #If...#Else...#End If 构造中使用。

#Const DebugVersion = 1    ' DebugVersion 常数在 #If 块中计为 TRUE 。


#If...Then...#Else 指令

条件编译已选择的 Visual Basic 代码块。

语法

#If expression Then

statements

[#ElseIf expression-n Then

[elseifstatements]]

[#Else

[elsestatements]]

#End If

#If...Then...#Else 指令的语法具有以下几个部分：

部分 | 描述
expression | 必要。包含一个或多个条件编译常数、文字与运算符的任何表达式，其值为 True 或 False。
statements | 必要。Visual Basic 程序行或编译指令，如果关联的表达式为 True，则运行它们。
expression-n | 可选。由一或多个条件编译常数、文字和运算符组成的任何一个表达式，其值为 True 或 False。
elseifstatements | 可选。一个或多个程序行或编译命令，如果 expression-n 为 True，则运行它们。
elsestatements | 可选。一个或多个程序行或编译命令，如果以前的expression 或 expression-n 中没有一个为 True，则运行它们。

说明

#If...Then...#Else 指令的作用与 If...Then...Else 语句相同，其差异在于 #If、#Else、#ElseIf，及 #End If 指令没有单独成行的形式，也就是说，在指令所在的那一行，不能有其他代码出现。条件编译通常用来编译不同平台上的同一个程序。也可以用来避免调试程序代码出现在可执行程序中。条件编译时被排除的程序代码在最后的可执行文件中被完全略去，所以不会对程序的大小或功能有任何影响。

无论结果如何，都要计算所有表达式。所以，在表达式中用到的所有常数都必须加以定义— 任何未定义的常数都会被当作 Empty 来计算取值。

注意 Option Compare 语句不会影响 #If 及 #ElseIf 语句中的表达式。条件编译指令中的表达式总是用 Option Compare Text 计算值。


#If...Then...#Else 指令示例

本示例在 #If...Then...#Else构造中引用条件式编译器常数，来决定编译那部分语句。

' 如果 Mac 常数为 true，则编译 #If后面的语句。
#If Mac Then
    '. 将 Mac 语句写在此处。
    '.
    '.
' 否则，如果是 32 位窗口程序，则编译这个语句：
#ElseIf Win32 Then
    '. 将 32 位窗口程序语句写在此处。
    '.
    '.
' 再否则，则编译以下语句：
#Else
    '. 将其他作业平台适用的语句写在此处。
    '.
    '.
#End If


Activate、 Deactivate 事件

在对象变成活动窗口的时候就会发生 Activate 事件。而当对象不再是活动窗口时，则会发生 Deactivate 事件。

语法

Private Sub object_Activate()

Private Sub object_Deactivate()

object 代表一个对象表达式，其值为“应用于”列表中的对象。

说明

对象可使用代码中的 Show 方法变成活动的。

只有在对象是可见的时候才会发生 Activate 事件。除非使用 Show 方法，否则用 Load 加载的 UserForm是不可见的。

只有在应用程序中移动焦点时才会发生 Activate 及 Deactivate 事件。而将焦点移出或移动到另一个应用程序中的对象并不会触发此事件。

在卸载对象时，并不会发生 Deactivate 事件。


Activate 及 Deactivate 事件示例

下列代码使用两个窗体 UserForms：UserForm1 及 UserForm2。将这些过程复制到 UserForm1 模块中，再添加 UserForm2。而 UserForm1 的标题是在其 Activate 事件过程中指定的。当用户单击 UserForm1 的客户区域时，就会加载 UserForm2 ，并将其显示出来，此时 UserForm1 会触发 Deactivate 事件，而在此事件中两个窗体的标题都会改变。

' UserForm1 的 Activate 事件
Private Sub UserForm_Activate()
    UserForm1.Caption = "Click my client area"
End Sub

' UserForm1 的 Click 事件
Private Sub UserForm_Click()
    Load UserForm2
    UserForm2.StartUpPosition = 3
    UserForm2.Show
End Sub

' UserForm1 的 Deactivate 事件
Private Sub UserForm_Deactivate()
    UserForm1.Caption = "I just lost the focus!"
    UserForm2.Caption = "Focus just left UserForm1 and came to me"
End Sub


Initialize 事件

发生在加载对象之后、显示这个对象之前。

语法

Private Sub object_Initialize()

object 代表一个对象表达式，其值为“应用于”列表中的对象。

说明

通常用 Initialize 提供应用程序或 UserForm 以备用。可为变量指定初始值，而且可以移动控件或调整其大小，使之与初始数据协调。


Initialize 事件示例

下列示例假设程序中已有两个窗体UserForms。在 UserForm1 的 Initialize 事件中加载 UserForm2 ，并将其显示出来。当用户单击 UserForm2 时，就会将其隐含起来，而 UserForm1 将会出现。而当用户单击 UserForm1 时，UserForm2 便会再次出现。

‘ 这是 UserForm1 的 Initialize 事件过程
Private Sub UserForm_Initialize()
    Load UserForm2
    UserForm2.Show
End Sub
'这是 UserForm2 的 Click 事件过程
Private Sub UserForm_Click()
    UserForm2.Hide
End Sub

' 这是 UserForm1 的 Click 事件
Private Sub UserForm_Click()
    UserForm2.Show
End Sub


QueryClose 事件

发生在 UserForm 关闭之前。

语法

Private Sub UserForm_QueryClose(cancel As Integer, closemode As Integer)

QueryClose 事件的语法具有以下几部分：

单元 | 描述
cancel | 一个整数。将此参数设置成 0 以外的任意值，在所有加载的用户窗体中停止 QueryClose 事件，并防止关闭 UserForm 与应用程序。
closemode | 一个值或常数，用来指示引起 QueryClose 事件的原因。

返回值

closemode 参数返回下列值：

常数 | 值 | 描述
vbFormControlMenu | 0 | 用户在 UserForm.上选择“控制”菜单中的“关闭”命令。
VbFormCode | 1 | 由代码调用 Unload 语句。
vbAppWindows | 2 | 正在结束当前 Windows 操作环境的过程。(仅用于Visual Basic 5.0 。)
vbAppTaskManager | 3 | Windows 的“任务管理器”正在关闭这个应用。(仅用于Visual Basic 5.0 。)

这些常数都详列在 Visual Basic for Applications 的对象浏览器中的对象库。注意， vbFormMDIForm 也在“对象浏览器”中，只是当前尚未得到支持。

说明

通常用这个事件确保在关闭应用程序之前，在应用程序包含的用户窗体中没有未完成的任务。例如，如果用户尚未在任何一个 UserForm 中保存新数据，则应用程序可以提示用户保存。

关闭应用程序时，可用 QueryClose 事件过程将 Cancel 属性设置成 True，停止关闭过程。


QueryClose 事件示例

下列代码强制用户单击UserForm的客户区域内，以关闭窗体窗口。如果用户试用标题栏上的“关闭”框来关闭窗口，则参数 Cancel 的值会被设置成非零值，即该窗口拒绝关闭。然而，如果用户已单击客户区域，则参数 CloseMode 的值为 1，Mod Unload Me ，成功关闭窗口。

Private Sub UserForm_Activate()
    UserForm1.Caption = "You must Click me to kill me!"
End Sub

Private Sub UserForm_Click()
  Unload Me
End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    'e 用户并完成防上的“关闭”框止关闭。
    If CloseMode <> 1 Then Cancel = 1
    UserForm1.Caption = "The Close box won't work! Click me!"
End Sub


Resize 事件

当用户窗体改变大小时发生。

语法

Private Sub UserForm_Resize()

说明

当改变父 UserForm 大小时，可利用 Resize 事件过程来移动控件或改变其大小。也可使用这个事件过程重新计算变量或属性。


Resize 事件示例

下列示例使用 Activate 及 Click 事件来演示如何触发题栏来说明 UserForm 的 Resize 事件。当用户单击窗体的客户区域U，窗体会改变大小并将新的高度值显示在ser上。Form 时标题 Tag 属性来记录UserForm的初始高度。

' UserForm1 的 Activate 事件
Private Sub UserForm_Activate()
    UserForm1.Caption = "Click me to make me taller!"
    Tag = Height    ‘ 栏注初始高度。
End Sub

' UserForm1 的 Click 事件
Private Sub UserForm_Click()
    Dim NewHeight As Single
    NewHeight = Height
    ' 如果窗体小，意让它变，。
    If NewHeight = Val(Tag) Then
        Height = Val(Tag) * 2
    Else
    ' 如果窗体程，序中它变小。
        Height = Val(Tag)
    End If
End Sub

' UserForm1 的 Resize 事件
Private Sub UserForm_Resize()
    UserForm1.Caption = "New Height: " & Height & "  " & "Click to resize me!"
End Sub


Terminate 事件

将所有引用对象的变量设置成 Nothing，从而删除对象示例的所有引用，或者，对象的最后一个引用超出范围，在这两种情况下都会发生此事件。

语法

Private Sub object_Terminate( )

object 代表一个对象表达式，其值为“应用于”列表中的对象。

说明

Terminate 事件发生在卸载对象之后。如果由于应用程序不正常退出而从内存中删除 UserForm 的示例或类，则不会触发 Terminate 事件。例如，如果从内存中删除类的所有示例或 UserForm 之前，应用程序调用了 End 语句，则该类或 UserForm 并不会触发 Terminate 事件。


Terminate 事件示例

在下列事件过程中，当用户单击客户区域来解除窗体时， UserForm 会发出一阵声响後关闭。

Private Sub UserForm_Activate()
    UserForm1.Caption = "Click me to kill me!"
End Sub

Private Sub UserForm_Click()
  Unload Me
End Sub

Private Sub UserForm_Terminate()
    Dim Count As Integer
    For Count = 1 To 100
        Beep
    Next
End Sub


Abs 函数

返回参数的绝对值，其类型和参数相同。

语法

Abs(number)

必要的 number 参数是任何有效的数值表达式，如果 number 包含 Null，则返回 Null，如果 number 是未初始化的变量，则返回 0。

说明

一个数的绝对值是将正负号去掉以后的值。例如，ABS(-1) 和 ABS(1) 都返回 1。


Abs 函数示例

本示例使用 Abs 函数计算数的绝对值。

Dim MyNumber
MyNumber = Abs(50.3)    ' 返回 50.3。
MyNumber = Abs(-50.3)    ' 返回 50.3。


Array 函数

返回一个包含数组的 Variant。

语法

Array(arglist)

所需的 arglist 参数是一个用逗号隔开的值表，这些值用于给 Variant 所包含的数组的各元素赋值。如果不提供参数，则创建一个长度为 0 的数组。

说明

用来表示数组元素的符号由变量名、圆括号以及括号中的所需元素的索引号组成。在下面的示例中，第一条语句创建一个 Variant 的变量 A。第二条语句将一个数组赋给变量 A。最后一条语句将该数组的第二个元素的值赋给另一个变量。

Dim A As Variant
A = Array(10,20,30)
B = A(2)

使用 Array 函数创建的数组的下界受 Option Base 语句指定的下界的决定, 除非 Array 是由类型库（例如 VBA.Array )名称限定。如果是由类型库名称限定，则 Array 不受 Option Base 的影响。

注意 没有作为数组声明的 Variant 也可以表示数组。除了长度固定的字符串以及用户定义类型之外，Variant 变量可以表示任何类型的数组。尽管一个包含数组的 Variant 和一个元素为 Variant 类型的数组在概念上有所不同，但对数组元素的访问方式是相同的。


Array 函数示例

该示例使用 Array 函数来返回一个包含 Variant 的数组。

Dim MyWeek, MyDay
MyWeek = Array("Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun")
'返回值假设下界的设置为 1（使用 Option Base
' 语句）。
MyDay = MyWeek(2)    'MyDay 的值为 "Tue"。
MyDay = MyWeek(4)    'MyDay 的值为 "Thu"。


Asc 函数

返回一个 Integer，代表字符串中首字母的字符代码。

语法

Asc(string)

必要的 string 参数可以是任何有效的字符串表达式。如果 string 中没有包含任何字符，则会产生运行时错误。

说明

在非 DBCS 系统下，返回值范围为 0 – 255 。在 DBCS 系统下，则为 -32768 – 32767。

注意 AscB 函数作用于包含在字符串中的字节数据，AscB 返回第一个字节的字符代码，而非字符的字符代码。AscW 函数返回 Unicode 字符代码，若平台不支持 Unicode，则与 Asc 函数功能相同。


Asc 函数示例

本示例使用 Asc 函数返回字符串首字母的字符值（ASCII 值）。

Dim MyNumber
MyNumber = Asc("A")    ' 返回 65。
MyNumber = Asc("a")    ' 返回 97。
MyNumber = Asc("Apple")    ' 返回 65。


Atn 函数

返回一个 Double，指定一个数的反正切值。

语法

Atn(number)

必要的 number 参数是一个 Double或任何有效的数值表达式。

说明

Atn 函数的参数值 (number) 为直角三角形两边的比值并返回以弧度为单位的角。这个比值是角的对边长度除以角的邻边长度之商。

值的范围在 - pi/2 和 pi/2 弧度之间。

为了将角度转换为弧度，请将角度乘以 pi/180。为了将弧度转换为角度，请将弧度乘以 180/pi。

注意 Atn 是 Tan 的反三角函数，Tan 的参数值为角度，返回直角三角形的两条边的比值。不要将 Atn 和余切函数混淆，余切函数值是正切函数值的倒数，cotangent = (1/tangent)。


Atn 函数示例

本示例使用 Atn 函数计算圆周率。

Dim pi
pi = 4 * Atn(1)    ' 计算圆周率。


CallByName 函数

执行一个对象的方法，或者设置或返回一个对象的属性。

语法

CallByName(object, procname, calltype,[args()])

CallByName 函数的语法有以下命名参数：

部分 | 描述
object | 必需的；变体型（对象）。函数将要执行的对象的名称。
procname | 必需的；变体型（字符串）。一个包含该对象的属性名称或者方法名称的字符串表达式。
calltype | 必需的；常数。一个 vbCallType 类型的常数，代表正在被调用的过程的类型。
args() | 可选的：变体型（数组）。

说明

CallByName 函数用于获取或者设置一个属性，或者在运行时使用一个字符串名称来调用一个方法。

在下面的例子中，第一行使用 CallByName 来设置一个文本框的 MousePointer 属性，第二行得到 MousePointer 属性的值，第三行调用 Move 方法来移动文本框：

CallByName Text1, "MousePointer", vbLet, vbCrosshair
Result = CallByName (Text1, "MousePointer", vbGet)
CallByName Text1, "Move", vbMethod, 100, 100


CallByName 函数示例

这个例子使用 CallByName 函数来调用一个命令按纽的 Move 方法。

这个例子也使用了带有一个按纽 (Command1) 以及一个标签 (Label1)的窗体 (Form1)。当这个窗体被加载时，该标签的 Caption 属性被设置为 Move，即所要调用的方法的名称。当单击这个按纽时，CallByName 函数就会调用这个方法来改变该按纽的位置。

Option Explicit

Private Sub Form_Load()
    Label1.Caption = "Move"        ' Move 方法的名称。
End Sub

Private Sub Command1_Click()
    If Command1.Left <> 0 Then
        CallByName Command1, Label1.Caption, vbMethod, 0, 0
    Else
        CallByName Command1, Label1.Caption, vbMethod, 500, 500
    End If


类型转换函数

每个函数都可以强制将一个表达式转换成某种特定数据类型。

语法

CBool(expression)

CByte(expression)

CCur(expression)

CDate(expression)

CDbl(expression)

CDec(expression)

CInt(expression)

CLng(expression)

CSng(expression)

CStr(expression)

CVar(expression)

CStr(expression)

必要的 expression 参数可以是任何字符串表达式或数值表达式。

返回类型

函数名称决定返回类型，如下所示：

函数 | 返回类型 | expression 参数范围
CBool | Boolean | 任何有效的字符串或数值表达式。
CByte | Byte | 0 至 255。
CCur | Currency | -922,337,203,685,477.5808 至922,337,203,685,477.5807。
CDate | Date | 任何有效的日期表达式。
CDbl | Double | 负数从 -1.79769313486231E308 至 -4.94065645841247E-324；正数从 4.94065645841247E-324 至 1.79769313486232E308。
CDec | Decimal | 零变比数值，即无小数位数值，为 +/-79,228,162,514,264,337,593,543,950,335。对于 28 位小数的数值，范围则为 +/-7.9228162514264337593543950335；最小的可能非零值是 0.0000000000000000000000000001。
CInt | Integer | -32,768 至 32,767，小数部分四舍五入。
CLng | Long | -2,147,483,648 至 2,147,483,647，小数部分四舍五入。
CSng | Single | 负数为 -3.402823E38 至 -1.401298E-45；正数为 1.401298E-45 至 3.402823E38。
CStr | String | 依据 expression 参数返回 Cstr。
CVar | Variant | 若为数值，则范围与 Double 相同；若不为数值，则范围与 String 相同。

说明

如果传递给函数的 expression 超过转换目标数据类型的范围，将发生错误。

通常，在编码时可以使用数据类型转换函数，来体现某些操作的结果应该表示为特定的数据类型，而不是缺省的数据类型。例如，当单精度、双精度或整数运算发生的情况下，使用 CCur 来强制执行货币运算。

应该使用数据类型转换函数来代替 Val，以使国际版的数据转换可以从一种数据类型转换为另一种。例如，当使用 Ccur 时，不同的小数点分隔符、千分位分隔符和各种货币选项，依据系统的区域设置都会被妥善识别。

当小数部分恰好为 0.5 时，Cint 和 CLng 函数会将它转换为最接近的偶数值。例如，0.5 转换为 0、1.5 转换为 2。Cint 和 CLng 函数不同于 Fix 和 Int 函数，Fix 和 Int 函数会将小数部分截断而不是四舍五入。并且 Fix 和 Int 函数总是返回与传入的数据类型相同的值。

使用 IsDate 函数，可判断 date 是否可以被转换为日期或时间。Cdate 可用来识别日期文字和时间文字，以及落入可接受的日期范围内的数值。当转换一个数字成为日期时，是将整数部分转换为日期，小数部分转换为从午夜起算的时间。

CDate 依据系统上的区域设置来决定日期的格式。如果提供的格式为不可识别的日期设置，则不能正确判断年、月、日的顺序。另外，长日期格式，若包含有星期的字符串，也不能被识别。

CVDate 函数也提供对早期 Visual Basic 版本的兼容性。CVDate 函数的语法与 CDate 函数是完全相同的，不过，CVDate 是返回一个 Variant，它的子类型是 Date，而不是实际的 Date 类型。因为现在已有真正的 Date 类型，所以 CVDate 也不再需要了。转换一个表达式成为 Date，再赋值给一个 Variant，也可以达到同样的效果。也可以使用这种技巧将其他真正的数据类型转换为对等的 Variant 子类型。

注意 CDec 函数不能返回独立的数据类型，而总是返回一个 Variant，它的值已经被转换为 Decimal 子类型。


Choose 函数

从参数列表中选择并返回一个值。

语法

Choose(index, choice-1[, choice-2, ... [, choice-n]])

Choose 函数的语法具有以下几个部分：

部分 | 描述
index | 必要参数，数值表达式或字段，它的运算结果是一个数值，且界于 1 和可选择的项目数之间。
choice | 必要参数，Variant 表达式，包含可选择项目的其中之一。

说明

Choose 会根据 index 的值来返回选择项列表中的某个值。如果 index 是 1，则 Choose 会返回列表中的第 1 个选择项。如果 index 是 2，则会返回列表中的第 2 个选择项，以此类推。

可以使用 Choose 来查阅一个列表中的项目。例如，如果 index 所指定的值为 3，而 choice-1 = "one"、choice-2 = "two"、且 choice-3 = "three"，那么 Choose 将返回 "three"。当 index 代表一选项组中的值时，则这项功能将会特别有用。

即使它只返回一个选项值，Choose 仍然会计算列表中的每个选择项。所以应该注意到这项副作用。例如，当在每个选择项表达式中使用了 MsgBox 函数作为其中的一部分时，每计算一个选择项，就会显示一次消息框。

当 index小于 1 或大于列出的选择项数目时，Choose 函数返回 Null。

如果 index 不是整数，则会先四舍五入为与其最接近的整数。


Choose 函数示例

本示例使用 Choose 函数来显示一个名称，该名称对应於用 Ind 参数传递到过程之中的索引。

Function GetChoice(Ind As Integer)
    GetChoice = Choose(Ind, "Speedy", "United", "Federal")
End Function


Chr 函数

返回 String，其中包含有与指定的字符代码相关的字符 。

语法

Chr(charcode)

必要的 charcode 参数是一个用来识别某字符的 Long。

说明

0 到 31 之间的数字与标准的非打印 ASCII 代码相同。例如，Chr(10) 可以返回换行字符。charcode 的正常范围为 0 – 255。然而，在 DBCS 系统，charcode 的实际范围为 -32768 到 65535。

注意 ChrB 函数作用于包含在 String 中的字节数据。ChrB 总是返回一个单字节，而不是返回一个字符，一个字符可能是一个或两个字节。ChrW 函数返回包含 Unicode 的 String，若在不支持 Unicode 的平台上，则其功能与 Chr 函数相同。

注意 Visual Basic for the Macintosh 不支持Unicode 字符串。因此，当n 值在128 – 65,535 范围内时， ChrW(n) 不能像在Windows环境中那样返回所有的 Unicode 字符。相反地，当Unicode 的n 值大于127 时，ChrW(n) 会试图做一个“最好的猜测”。因此，在Macintosh 环境中，不能使用ChrW 。


Chr 函数示例

本示例使用 Chr 函数来返回指定字符码所代表的字符。

Dim MyChar
MyChar = Chr(65)    ' 返回 A。
MyChar = Chr(97)    ' 返回 a。
MyChar = Chr(62)    ' 返回 >。
MyChar = Chr(37)    ' 返回 %。


Command 函数

返回命令行的参数部分，该命令行用于装入 Microsoft Visual Basic 或 Visual Basic 开发的可执行程序。Visual Basic Command 函数在 Microsoft Office 应用程序中不可用。

语法

Command

说明

当从命令行装入 Visual Basic 时，/cmd 之后的命令行的任何部分作为命令行的参数传递给程序。下面的示例中，cmdlineargs 代表 Command 函数返回的参数信息。

VB /cmd cmdlineargs

对于使用 Visual Basic 开发并编译为 .exe 文件的应用程序，Command 返回出现在命令行中应用程序名之后的任何参数。例如：

MyApp cmdlineargs

想知道如何在正在使用的应用程序的用户界面中改变命令行参数，请搜寻关于“命令行参数”的帮助。


Command 函数示例

本示例在某个函数中用 Command 函数获得命令行参数，并将命令行参数以 Variant 类型之数组返回。在 Microsoft Office中不可用。

Function GetCommandLine(Optional MaxArgs)
    '声明变量。
    Dim C, CmdLine, CmdLnLen, InArg, I, NumArgs
    '检查是否提供了 MaxArgs 参数。
    If IsMissing(MaxArgs) Then MaxArgs = 10
    ' 使数组的大小合适。
    ReDim ArgArray(MaxArgs)
    NumArgs = 0: InArg = False
    '取得命令行参数。
    CmdLine = Command()
    CmdLnLen = Len(CmdLine)
    '以一次一个字符的方式取出命令行参数。
    For I = 1 To CmdLnLen
        C = Mid(CmdLine, I, 1)
        '检测是否为 space 或 tab。
        If (C <> " " And C <> vbTab) Then
            '若既不是 space 键，也不是 tab 键，
            '则检测是否为参数内含之字符。
            If Not InArg Then
            '新的参数。
            '检测参数是否过多。
                If NumArgs = MaxArgs Then Exit For
                    NumArgs = NumArgs + 1
InArg = True
                End If
            '将字符连接到当前参数中。
            ArgArray(NumArgs) = ArgArray(NumArgs) & C
        Else
            '找到 space 或 tab。
            '将 InArg 标志设置成 False。
            InArg = False
        End If
    Next I
    '调整数组大小使其刚好符合参数个数。
    ReDim Preserve ArgArray(NumArgs)
    '将数组返回。
    GetCommandLine = ArgArray()
End Function


Cos 函数

返回一个 Double，指定一个角的余弦值。

语法

Cos(number)

必要的 number 参数是一 Double 或任何有效的数值表达式，表示一个以弧度为单位的角。

说明

Cos 函数的参数为一个角，并返回直角三角形两边的比值。该比值为角的邻边长度除以斜边长度之商。

结果的取值范围在 -1 到 1 之间。

为了将角度转换成弧度，请将角度乘以 pi/180。为了将弧度转换成角度，请将弧度乘以 180/pi。


Cos 函数示例

本示例使用 Cos 函数计算一个角的余弦。

Dim MyAngle, MySecant
MyAngle = 1.3    ' 定义角度（以“弧度”为单位）。
MySecant = 1 / Cos(MyAngle)    ' 利用余弦计算正割（sec()）。


CreateObject 函数

创建并返回一个对 ActiveX 对象的引用。

语法

CreateObject(class,[servername])

CreateObject 函数的语法有如下部分：

部分 | 描述
class | 必需的； Variant (String). 要创建的应用程序名称和类。
servername | 可选的； Variant (String). 要在其上创建对象的网络服务器名称。如果servername 是一个空字符串("")，即使用本地机器。

class 参数使用 appname.objecttype 这种语法，包括以下部分：

部分 | 描述
appname | 必需的；Variant（字符串）。提供该对象的应用程序名。
objecttype | 必需的；Variant（字符串）。待创建对象的类型或类。

说明

每个支持自动化的应用程序都至少提供一种对象类型。例如，一个字处理应用程序可能会提供 Application 对象，Document 对象，以及 Toolbar 对象。

要创建 ActiveX 对象，只需将 CreateObject 返回的对象赋给一个对象变量：

'声明一个对象变量来存放该对象
'的引用。Dim as Object 采用后期绑定方式。
Dim ExcelSheet As Object
Set ExcelSheet = CreateObject("Excel.Sheet")

上述代码将启动该应用程序创建该对象，在本例中就是创建一个 Microsoft Excel 电子数据表。对象创建后，就可以在代码中使用自定义的对象变量来引用该对象。在下面的示例中，可以使用对象变量 ExcelSheet 来访问新建对象的属性和方法，以及访问 Microsoft Excel 的其它对象，包括应用程序对象和单元格集合。

'设置 Application 对象使 Excel 可见
ExcelSheet.Application.Visible = True
'在表格的第一个单元中写些文本
ExcelSheet.Application.Cells(1, 1).Value = "This is column A, row 1"
'将该表格保存到C:\test.xls 目录
ExcelSheet.SaveAs "C:\TEST.XLS"
'使用应用程序对象的 Quit 方法关闭 Excel。
ExcelSheet.Application.Quit
'释放该对象变量
Set ExcelSheet = Nothing

使用 As Object 子句声明对象变量，可以创建一个能包含任何类型对象引用的变量。不过，该变量访问对象是后期绑定的，也就是说，绑定在程序运行时才进行。要创建一个使用前期绑定方式的对象变量，也就是说，在程序编译时就完成绑定，则对象变量在声明时应指定类 ID。例如，可以声明并创建下列 Microsoft Excel 引用：

Dim xlApp As Excel.Application

Dim xlBook As Excel.Workbook

Dim xlSheet As Excel.WorkSheet

Set xlApp = CreateObject("Excel.Application")

Set xlBook = xlApp.Workbooks.Add

Set xlSheet = xlBook.Worksheets(1)

前期绑定的变量引用可以提供更好的性能，但该变量只能存放声明中所指定的类的引用。

可以将 CreateObject 函数返回的对象传给一个参数为对象的函数。例如，下面的代码创建并传递了一个 Excel.Application 对象的引用：

Call MySub (CreateObject("Excel.Application"))

可以在一个远端连网的计算机上创建一个对象，方法是把计算机的名称传递给 CreateObject 的 servername 参数。这个名称与共享名称的机器名部份相同：对于一个共享名称为"\\MyServer\Public," 的 servername 参数是 "MyServer" 。

注意 关于使应用程序在远程网络计算机上可见的详细信息，请参阅 COM 文档 (参阅Microsoft Developer Network)。您可能必须给应用程序添加注册号。

下面的代码返回在一个名为 MyServer 的远端计算机上运行的 Excel 实例的版本号：

Dim xlApp As Object
Set xlApp = CreateObject("Excel.Application", "MyServer")
Debug.Print xlApp.Version

如果远端服务器不存在或者不可用，则会发生一个运行时错误。

注意 当该对象当前没有实例时，应使用 CreateObject。如果该对象已有实例在运行，就会启动一个新的实例，并创建一个指定类型的对象。要使用当前实例，或要启动该应用程序并加载一个文件，可以使用 GetObject 函数。

如果对象已登记为单个实例对象，则不管执行多少次 CreateObject，都只能创建该对象的一个实例。


CreateObject 函数示例

该示例使用 CreateObject 函数设置一个对 Microsoft Excel 的引用 (xlApp)。它使用该引用来访问 Microsoft Excel 的 Visible 属性，并使用 Microsoft Excel 的 Quit 方法将其关闭，最后再释放该引用。

Dim xlApp As Object    '定义存放引用对象的变量。

Set xlApp = CreateObject("excel.application")
    '如果要让该应用程序可见，
    则需将 Visible 属性设为 True。
xlApp.Visible = True
    '可以使用 xlApp 访问 Microsoft Excel 的
    '其它对象。
xlApp.Quit    '完成时，调用 Quit 方法关闭
Set xlApp = Nothing    '该应用程序，然后释放该引用。


CurDir 函数

返回一个 Variant (String)，用来代表当前的路径。

语法

CurDir[(drive)]

可选的 drive 参数是一个字符串表达式，它指定一个存在的驱动器。如果没有指定驱动器，或 drive 是零长度字符串 ("")，则 CurDir 会返回当前驱动器的路径。 在 Macintosh上，CurDir 忽略任何指定的 drive ,并只简单地返回当前驱动器的路径。


CurDir 函数示例

本示例使用 CurDir 函数来返回当前的路径 在 Macintosh 中， 使用CurDir可以省略驱动器名称。 默认驱动器名称是 “HD” 并且路径部分由冒号取代反斜线隔开。 同样，可以指定 Macintosh 的文件夹代替 \Windows。。

' 假设 C 驱动器的当前路径为“C:\WINDOWS\SYSTEM”(在 Microsoft Windows 中)。
' 假设 D 驱动器的当前路径为“D:\EXCEL”。
' 假设 C 为当前的驱动器。
Dim MyPath
MyPath = CurDir    ' 返回“C:\WINDOWS\SYSTEM”。
MyPath = CurDir("C")    ' 返回“C:\WINDOWS\SYSTEM”。
MyPath = CurDir("D")    ' 返回“D:\EXCEL”。


CVErr 函数

返回 Error 子类型的 Variant，其中包含指定的错误号。

语法

CVErr(errornumber)

必要的 errornumber 参数可以是任何有效的错误号代码。

说明

可以在过程中，使用 CVErr 函数来创建用户自定义错误。例如，如果创建一个函数，它可以接受若干个参数，且正常返回一个字符串，则可以让函数来判断输入的参数，确认它们是在可接受的范围内。如果不是的话，此函数将不会返回所要的字符串。在这种情况下，CVErr 可以返回一个错误号，并告知应该采取的行动。

注意，Error 的隐式转换是不允许的，例如，不能直接把 CVErr 的返回值赋值给一个非 Variant 的变量。然而，可以对 CVErr 的返回值进行显式转换（使用 CInt、CDbl 等等），并赋值给适当的数据类型变量。


CVErr 函数示例

本示例使用 CVErr 函数返回一 Variant 类型的值，其 VarType 为 vbError (10)。如果传进去的参数不是一个数字，用户自定义函数 CalculateDouble 将会返回错误信息。可用 CVErr 返回来自用户自定义过程的自定义错误，或改变处理运行时错误的方式。IsError 函数可用来测试返回值是否代表错误状态。

' 调用 CalculateDouble，且传入一会产生错误的参数。
Sub Test()
    Debug.Print CalculateDouble("345.45robert")
End Sub
' 定义 CalculateDouble 函数过程。
Function CalculateDouble(Number)
    If IsNumeric(Number) Then
        CalculateDouble = Number * 2    ' 返回结果。
    Else
        CalculateDouble = CVErr(2001)    ' 返回一自定义错误码。
    End If
End Function


Date 函数

返回包含系统日期的 Variant (Date)。

语法

Date

说明

为了设置系统日期，请使用 Date 语句。


DateAdd 函数

返回包含一个日期的 Variant (Date)，这一日期还加上了一段时间间隔。

语法

DateAdd(interval, number, date)

DateAdd 函数语法中有下列命名参数：

部分 | 描述
interval | 必要。字符串表达式，是所要加上去的时间间隔。
number | 必要。数值表达式，是要加上的时间间隔的数目。其数值可以为正数（得到未来的日期），也可以为负数（得到过去的日期）。
date | 必要。Variant (Date) 或表示日期的文字，这一日期还加上了时间间隔。

设置

interval 参数具有以下设定值：

设置 | 描述
yyyy | 年
q | 季
m | 月
y | 一年的日数
d | 日
w | 一周的日数
ww | 周
h | 时
n | 分钟
s | 秒

说明

可以使用 DateAdd 函数对日期加上或减去指定的时间间隔。例如，可以用 DateAdd 来计算距今天为三十天的日期；或者计算距现在为 45 分钟的时间。

为了对 date 加上“日”，可以使用“一年的日数” (“y”)，“日” (”d”) 或“一周的日数” (”w”)。

DateAdd 函数将不返回有效日期。在以下实例中将 1 月31 日加上一个月：

DateAdd(m, 1, 31-Jan-95)

上例中，DateAdd 返回 1995 年 2 月 28 日，而不是 1995 年 2 月 31 日。如果 date 是 1996 年 1 月 31 日，则由于 1996 年是闰年，返回值是 1996 年 2 月 29 日。

如果计算的日期超前 100 年（减去的年度超过 date 中的年份），就会导致错误发生。

如果 number 不是一个 Long 值，则在计算时取最接近的整数值来计算。

注意 DateAdd 返回值的格式由 Control Panel设置决定，而不是由传递到date 参数的格式决定。


DateAdd 函数示例

本示例先取得一个日期，再用 DateAdd 函数显示未来数月后的日期。

Dim FirstDate As Date    ' 声明变量。
Dim IntervalType As String
Dim Number As Integer
Dim Msg
IntervalType = "m"    ' "m"指定以“月份”作为间隔。
FirstDate = InputBox("Enter a date")
Number = InputBox("Enter number of months to add")
Msg = "New date: " & DateAdd(IntervalType, Number, FirstDate)
MsgBox Msg


DateDiff 函数

返回 Variant (Long) 的值，表示两个指定日期间的时间间隔数目。

语法

DateDiff(interval, date1, date2[, firstdayofweek[, firstweekofyear]])

DateDiff 函数语法中有下列命名参数：

部分 | 描述
interval | 必要。字符串表达式，表示用来计算date1 和 date2 的时间差的时间间隔
Date1□date2 | 必要；Variant (Date)。计算中要用到的两个日期。
Firstdayofweek | 可选。指定一个星期的第一天的常数。如果未予指定，则以星期日为第一天。
firstweekofyear | 可选。指定一年的第一周的常数。如果未予指定，则以包含 1 月 1 日的星期为第一周。

设置

interval 参数的设定值如下：

设置 | 描述
yyyy | 年
q | 季
m | 月
y | 一年的日数
d | 日
w | 一周的日数
ww | 周
h | 时
n | 分钟
s | 秒

firstdayofweek 参数的设定值如下：

常数 | 值 | 描述
vbUseSystem | 0 | 使用 NLS API 设置。
vbSunday | 1 | 星期日（缺省值）
vbMonday | 2 | 星期一
vbTuesday | 3 | 星期二
vbWednesday | 4 | 星期三
vbThursday | 5 | 星期四
vbFriday | 6 | 星期五
vbSaturday | 7 | 星期六

常数 | 值 | 描述
vbUseSystem | 0 | 用 NLS API 设置。
vbFirstJan1 | 1 | 从包含 1 月 1 日的星期开始（缺省值）。
vbFirstFourDays | 2 | 从第一个其大半个星期在新的一年的一周开始。
vbFirstFullWeek | 3 | 从第一个无跨年度的星期开始。

说明

DateDiff 函数可用来决定两个日期之间所指定的时间间隔数目。例如，可以使用 DateDiff 来计算两个日期之间相隔几日，或计算从今天起到年底还有多少个星期。

为了计算 date1 与 date2 相差的日数，可以使用“一年的日数”(y) 或“日”(d)。当 interval 是“一周的日数”(w) 时，DateDiff 返回两日期间的周数。如果 date1 是星期一，DateDiff 计算到 date2 为止的星期一的个数。这个数包含 date2 但不包含 date1。不过，如果 interval 是“周”(ww)，则 DateDiff 函数返回两日期间的“日历周”数。由计算 date1 与 date2 之间星期日的个数而得。如果 date2 刚好是星期日，则 date2 也会被加进 DateDiff 的计数结果中；但不论 date1 是否为星期日，都不将它算进去。

如果 date1 比 date2 来得晚，则 DateDiff 函数的返回值为负数。

firstdayofweek 参数会影响使用时间间隔符号 “W” 或 “WW” 计算的结果。

如果 date1 或 date2 是日期文字，则指定的年份成为该日期的固定部分。但是，如果 date1 或 date2 用双引号 (" ") 括起来，且年份略而不提，则在每次计算表达式 date1 或 date2 时，当前年份都会插入到代码之中。这样就可以书写适用于不同年份的程序代码。

在计算 12 月 31 日和来年的 1 月 1 日的年份差时，DateDiff 返回 1 表示相差一个年份，虽然实际上只相差一天而已。


DateDiff 函数示例

本示例使用 DateDiff 函数来显示某个日期与今日相差几天。

Dim TheDate As Date    ' 声明变量。
Dim Msg
TheDate = InputBox("Enter a date")
Msg = "Days from today: " & DateDiff("d", Now, TheDate)
MsgBox Msg


DatePart 函数

返回一个包含已知日期的指定时间部分的 Variant (Integer)。

语法

DatePart(interval, date[,firstdayofweek[, firstweekofyear]])

DatePart 函数语法中有下列命名参数：

部分 | 描述
interval | 必要。字符串表达式，是要返回的时间间隔。
date | 必要。要计算的 Variant (Date) 值。
Firstdayofweek | 可选。指定一个星期的第一天的常数。如果未予指定，则以星期日为第一天。
firstweekofyear | 可选。指定一年第一周的常数。如果未予指定，则以包含 1 月 1 日的星期为第一周。

设置

interval 参数的设定值如下：

设置 | 描述
yyyy | 年
q | 季
m | 月
y | 一年的日数
d | 日
w | 一周的日数
ww | 周
h | 时
n | 分钟
s | 秒

firstdayofweek 参数的设定值如下：

常数 | 值 | 描述
vbUseSystem | 0 | 使用 NLS API 设置。
vbSunday | 1 | 星期日（缺省值）
vbMonday | 2 | 星期一
vbTuesday | 3 | 星期二
vbWednesday | 4 | 星期三
vbThursday | 5 | 星期四
vbFriday | 6 | 星期五
vbSaturday | 7 | 星期六

firstweekofyear 参数的设定值如下：

常数 | 值 | 描述
vbUseSystem | 0 | 使用 NLS API 设置。
vbFirstJan1 | 1 | 从包含 1 月 1 日的星期开始（缺省值）。
vbFirstFourDays | 2 | 从第一个其大半个星期在新的一年的一周开始。
vbFirstFullWeek | 3 | 从第一个无跨年度的星期开始。

说明

DatePart 函数可以用来计算日期并返回指定的时间间隔。例如，可以使用DatePart 计算某个日期是星期几或目前为几点钟。

firstdayofweek 参数会影响使用时间间隔符号 “W” 或 “WW” 计算的结果。

如果 date 是日期文字，则指定的年份成为该日期的固定部分。但是，如果 date 用双引号 (" ") 括起来，且年份略而不提，则在每次计算 date 表达式时，当前年份都会插入到代码之中。这样就可以书写适用于不同年份的程序代码。


DatePart 函数示例

本示例先取得一个日期，然后使用 DatePart 函数显示该日期是发生在该年的哪一季。

Dim TheDate As Date    ' 声明变量。
Dim Msg
TheDate = InputBox("Enter a date:")
Msg = "Quarter: " & DatePart("q", TheDate)
MsgBox Msg


DateSerial 函数

返回包含指定的年、月、日的 Variant (Date)。

语法

DateSerial(year, month, day)

DateSerial 函数语法有下列的命名参数：

部分 | 描述
year | 必要；Integer。从 100 到 9999 间的整数，或一数值表达式。
month | 必要；Integer。任何数值表达式。
day | 必要；Integer。任何数值表达式。

说明

为了指定某个日期，如 1991 年 12 月 31 日，DateSerial 函数中的每个参数的取值范围应该是可接受的；即，日的取值范围应在 1-31 之间，而月的取值范围应在 1-12 之间。但是，当一个数值表达式表示某日之前或其后的年、月、日数时，也可以为每个使用这个数值表达式的参数指定相对日期。

以下示例中使用了数值表达式代替绝对日期。这里，DateSerial 函数返回 1990 年 8 月 1 日的 十 年 (1990 - 10) 零两个月 (8 - 2) 又一天 (1 - 1) 之前的日期；换句话说，就是 1980 年 5 月 31 日。

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

year 参数的数值若介于 0 与 29 之间，则将其解释为 2000–2029年，若介于 30 和 99 之间则解释为1930–1999年。而对所有其它 year 参数，则请用四位数值表示（如 1800）。

当任何一个参数的取值超出可接受的范围时，它会适时进位到下一个较大的时间单位。例如，如果指定了 35 天，则这个天数被解释成一个月加上多出来的日数，多出来的日数将由其年份与月份来决定。如果一个参数值超出 -32，768 到 32，767 的范围，就会导致错误发生。


DateSerial 函数示例

本示例使用 DateSerial 函数来将指定的年月日转换为 Date 类型的表达式。

Dim MyDate
' MyDate 的值为 February 12，1969， Date 类型。
MyDate = DateSerial(1969, 2, 12)    ' 返回日期。


DateValue 函数

返回一个 Variant (Date)。

语法

DateValue(date)

必要的 date 参数 date 通常是字符串表达式，表示从 100 年 1 月 1 日到 9999 年 12 月 31 日之间的一个日期。但是，date 也可以是任何表达式，其所代表的日期、时间在上述范围内。

说明

如果 date 是一个字符串，且其内容只有数字以及分隔数字的日期分隔符，则 DateValue 就会根据系统中指定的短日期格式来识别月、日、年的顺序。DateValue 也识别明确的英文月份名称，全名或缩写均可。例如，除了 12/30/1991 和 12/30/91 之外，DateValue 也识别 December 30, 1991 和 Dec 30, 1991。

如果 date 中略去了年这一部分，DateValue 就会使用由计算机系统日期设置的当前年份。

如果 date 参数包含时间信息，则 DateValue 不会返回它。但是，如果 date 包含无效时间信息（如 89:98），则会导致错误发生。


DateValue 函数示例

本示例使用 DateValue 函数将字符串转换为日期。也可以使用日期原义直接 给 Variant 或 Date 类型的变量赋值日期，例如 MyDate = #2/12/69# 。

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


Day 函数

返回一个 Variant (Integer)，其值为 1 到 31 之间的整数，表示一个月中的某一日。

语法

Day(date)

必要的 date 参数，可以是任何能够表示日期的 Variant、数值表达式、字符串表达式或它们的组合。如果 date 包含 Null，则返回 Null。


Day 函数示例

本示例使用 Day 函数将指定的日期转换为该月的第几天。在开发环境中，日期原义会根据系统的地区设置，以短式日期格式显示。。

Dim MyDate, MyDay
MyDate = #February 12, 1969#    ' 指定一日期。
MyDay = Day(MyDate)    ' MyDay 的值为 12。


DDB 函数

返回一个 Double，指定一笔资产在一特定期间内的折旧。可使用双下落收复平衡方法或其它指定的方法进行计算。

语法

DDB(cost, salvage, life, period[, factor])

DDB 函数具有下列命名参数：

部分 | 描述
cost | 必要。Double 指定资产的初始成本。
salvage | 必要。Double.指定使用年限结束时的资产价值。
life | 必要。Double 指定资产可用的可用年限。
period | 必要。Double 指定计算资产折旧所用的那一期间。
factor | 可选。Variant 指定收复平衡下落时的速度。如果省略的话，2（双下落方法）为缺省值。

说明

双下落收复平衡方法用加速利率法计算折旧。在第一段时期，折旧为最高，而在接下来的期间内降低。

life 和 period 参数必须用相同的单位表示。例如，如果 life 用月份表示，则 period 也必须用月份表示。所有参数都必须是正值。

DDB 函数使用下列公式计算在一定时期后的折旧：

折旧 / period = ((cost – alvage) * factor) / life


DDB 函数示例

本示例使用 DDB 函数来计算某项资产在一特定期间内的折旧。计算时需给定资产的初始成本（InitCost），使用年限退出时所余的价值（SalvageVal），以“年”为单位之可用的生命长度（LifeTime），以及所要计算折旧的期间年限（Depr）。

Dim Fmt, InitCost, SalvageVal, MonthLife, LifeTime, DepYear, Depr
Const YRMOS = 12    ' 一年之中的月份数。
Fmt = "###,##0.00"
InitCost = InputBox("What's the initial cost of the asset?")
SalvageVal = InputBox("Enter the asset's value at end of its life.”)
MonthLife = InputBox("What's the asset's useful life in months?")
Do While MonthLife < YRMOS    ' 确保计算期间大于等于一年 。
    MsgBox "Asset life must be a year or more."
    MonthLife = InputBox("What's the asset's useful life in months?")
Loop
LifeTime = MonthLife / YRMOS    ' 将月份数转成年份数。
If LifeTime <> Int(MonthLife / YRMOS) Then
    LifeTime = Int(LifeTime + 1)    ' 四舍五入至最接近的年份。
End If
DepYear = CInt(InputBox("Enter year for depreciation calculation."))
Do While DepYear < 1 Or DepYear > LifeTime
    MsgBox "You must enter at least 1 but not more than " & LifeTime
    DepYear = InputBox("Enter year for depreciation calculation.")
Loop
Depr = DDB(InitCost, SalvageVal, LifeTime, DepYear)
MsgBox "The depreciation for year " & DepYear & " is " & _
Format(Depr, Fmt) & "."


Dir 函数

返回一个 String，用以表示一个文件名、目录名或文件夹名称，它必须与指定的模式或文件属性、或磁盘卷标相匹配。

语法

Dir[(pathname[, attributes])]

Dir 函数的语法具有以下几个部分：

部分 |  | 描述
pathname | 可选参数。用来指定文件名的字符串表达式，可能包含目录或文件夹、以及驱动器。如果没有找到 pathname，则会返回零长度字符串 ("")。
attributes | 可选参数。常数或数值表达式，其总和用来指定文件属性。如果省略，则会返回匹配 pathname 但不包含属性的文件。

设置值

attributes 参数的设置可为：

常数 | 值 | 描述
vbNormal | 0 | (缺省) 指定没有属性的文件。
vbReadOnly | 1 | 指定无属性的只读文件
vbHidden | 2 | 指定无属性的隐藏文件
VbSystem | 4 | 指定无属性的系统文件 在Macintosh中不可用。
vbVolume | 8 | 指定卷标文件；如果指定了其它属性，则忽略vbVolume 在Macintosh中不可用。
vbDirectory | 16 | 指定无属性文件及其路径和文件夹。
vbAlias | 64 | 指定的文件名是别名，只在Macintosh上可用。

注意 这些常数是由 VBA 所指定的，在程序代码中的任何位置，可以使用这些常数来替换真正的数值。

说明

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

在 Macintosh 中，这些字符作为合法文件名字符并且不能作为通配符来指定多个文件

由于 Macintosh 不支持通配符，使用文件类型指定文件组。可以使用 MacID 函数指定文件类型而不用文件名。比如，下列语句返回当前文件夹中第一个TEXT文件的名称:

Dir("SomePath", MacID("TEXT"))

为选中文件夹中所有文件，指定一空串:

Dir("")

在 Microsoft Windows 中，如果在Dir函数中使用MacID函数，将产生错误。

任何大于256的attribute值都被认为是MacID 函数的值。

在第一次调用 Dir 函数时，必须指定 pathname，否则会产生错误。如果也指定了文件属性，那么就必须包括 pathname。

Dir 会返回匹配 pathname 的第一个文件名。若想得到其它匹配 pathname 的文件名，再一次调用 Dir，且不要使用参数。如果已没有合乎条件的文件，则 Dir 会返回一个零长度字符串 ("")。一旦返回值为零长度字符串，并要再次调用 Dir 时，就必须指定 pathname，否则会产生错误。不必访问到所有匹配当前 pathname 的文件名，就可以改变到一个新的 pathname 上。但是，不能以递归方式来调用 Dir 函数。以 vbDirectory 属性来调用 Dir 不能连续地返回子目录。

提示 由于文件名并不会以特别的次序来返回，所以可以将文件名存储在一个数组中，然后再对这个数组排序。


Dir 函数示例

本示例使用 Dir 函数来检查某些文件或目录是否存在。在 Macintosh 计算机上，默认驱动器名称是 “HD” ，并且路径部分由冒号取代反斜线隔开。而且 Microsoft Windows 的通配符在 Mac 中可以作为有效字符出现在文件名中。也可以使用 MacID 函数来指定文件组。

Dim MyFile, MyPath, MyName

' 返回“WIN.INI”(在 Microsoft Windows 中) （如果该文件存在）。
MyFile = Dir("C:\WINDOWS\WIN.ini")

' 返回带指定扩展名的文件名。如果超过一个 *.ini 文件存在，
' 函数将返回按条件第一个找到的文件名。
MyFile = Dir("C:\WINDOWS\*.ini")

' 若第二次调用 Dir 函数，但不带任何参数，则函数将返回同一目录下的下一个 *.ini 文件。
MyFile = Dir

' 返回找到的第一个隐式 *.TXT 文件。
MyFile = Dir("*.TXT", vbHidden)

' 显示 C:\ 目录下的名称。
MyPath = "c:\"    ' 指定路径。
MyName = Dir(MyPath, vbDirectory)    ' 找寻第一项。
Do While MyName <> ""    ' 开始循环。
    ' 跳过当前的目录及上层目录。
    If MyName <> "." And MyName <> ".." Then
        ' 使用位比较来确定 MyName 代表一目录。
        If (GetAttr(MyPath & MyName) And vbDirectory) = vbDirectory Then
            Debug.Print MyName    ' 如果它是一个目录，将其名称显示出来。
        End If
    End If
    MyName = Dir    ' 查找下一个目录。
Loop


DoEvents 函数

转让控制权，以便让操作系统处理其它的事件。

语法

DoEvents( )

说明

DoEvents 函数会返回一个 Integer，以代表 Visual Basic 独立版本中打开的窗体数目，例如，Visual Basic，专业版，在其它的应用程序中，DoEvents 返回 0。

DoEvents 会将控制权传给操作系统。当操作系统处理完队列中的事件，并且在 SendKeys 队列中的所有键也都已送出之后，返回控制权。

DoEvents 对于简化诸如允许用户取消一个已启动的过程 — 例如搜寻一个文件 — 特别有用。对于长时间过程，放弃控制权最好使用定时器或通过委派任务给 ActiveX EXE 部件来完成。以后，任务还是完全独立于应用程序，多任务及时间片由操作系统来处理。

小心 确保以 DoEvents 放弃控制权的过程，在第一次 DoEvents 返回之前，不能再次被其他部分的代码调用；否则会产生不可预料的结果。此外，如果其它的应用程序可能会和本过程以不可预知的方式进行交互操作，那么也不要使用 DoEvents，因为此时不能放弃控制权。


DoEvents 函数示例

下列示例在循环中使用 DoEvents 函数，每当循环完成 1000 次时，将执行让给操作系统。DoEvents 返回仅当主应用程序是 Visual Basic时，打开的窗体个数。

' 创建一个变量来保存加载的 Visual Basic 可见窗体的个数。
Dim I, OpenForms
For I = 1 To 150000    ' 循环开始。
    If I Mod 1000 = 0 Then     ' 如果循环一已完成了 1000 次。
        OpenForms = DoEvents    ' 将执行让给操作系统。
    End If
Next I    ' 将循环计数器加一。


Environ 函数

返回 String，它关连于一个操作系统环境变量。 在 Macintosh 中不可用

语法

Environ({envstring | number})

Environ 函数的语法含有以下这些命名参数：

部分 | 描述
envstring | 可选参数。包含一个环境变量名的字符串表达式。
number | 可选参数。数值表达式，用来表示环境字符串在环境字符串表格中的数值顺序。number 参数可以是任意的数值表达式，不过在计算前，它会先转换为一个整数。

说明

如果在环境字符串表格中找不到 envstring，则会返回一个零长度字符串 ("")。如果找到，则 Environ 会返回一段文本，文本是赋值给指定的 envstring 的，也就是说，在环境字符串表格中对应那个环境变量的等号 (=) 后面的那段文本。

如果指定了 number，则在环境字符串表格中相应位置上的字符串会返回。在这种情况下，Environ 会返回整个文本，包括 envstring。如果在指定位置上没有环境字符串，那么 Environ 会返回一个零长度字符串。


Environ 函数示例

本示例使用 Environ 函数来提供来自环境变量表中 PATH 语句的长度及路径项目数。在 Macintosh中不可用。

Dim EnvString, Indx, Msg, PathLen    ' 声明变量。
Indx = 1    ' 设置索引值的初值为 1。
Do
    EnvString = Environ(Indx)    ' 取得环境变量。
    If Left(EnvString, 5) = "PATH=" Then    ' 检查 PATH 项。
        PathLen = Len(Environ("PATH"))    ' 取得长度。
        Msg = "PATH entry = " & Indx & " and length = " & PathLen
        Exit Do
    Else
        Indx = Indx + 1    ' 不是 PATH 项，
    End If    ' 则跳过此项，继续检查下一项。
Loop Until EnvString = ""
If PathLen > 0 Then
    MsgBox Msg    ' 显示消息。
Else
    MsgBox "No PATH environment variable exists."
End If


EOF 函数

返回一个 Integer，它包含 Boolean 值 True，表明已经到达为 Random 或顺序 Input 打开的文件的结尾。

语法

EOF(filenumber)

必要的 filenumber 参数是一个 Integer，包含任何有效的文件号。

说明

使用 EOF 是为了避免因试图在文件结尾处进行输入而产生的错误。

直到到达文件的结尾，EOF 函数都返回 False。对于为访问 Random 或 Binary 而打开的文件，直到最后一次执行的 Get 语句无法读出完整的记录时，EOF 都返回 False。

对于为访问 Binary 而打开的文件，在 EOF 函数返回 True 之前，试图使用 Input 函数读出整个文件的任何尝试都会导致错误发生。在用 Input 函数读出二进制文件时，要用 LOF 和 Loc 函数来替换 EOF 函数，或者将 Get 函数与 EOF 函数配合使用。对于为 Output 打开的文件，EOF 总是返回 True。


EOF 函数示例

本示例使用 EOF 函数来检测文件尾。示例中假设 MYFILE 为有数个文本行的文本文件。

Dim InputData
Open "MYFILE" For Input As #1    ' 为输入打开文件。
Do While Not EOF(1)    ' 检查文件尾。
    Line Input #1, InputData    ' 读入一行数据。
    Debug.Print InputData    ' 在立即窗口中显示。
Loop
Close #1    ' 关闭文件。


Error 函数

返回对应于已知错误号的错误信息。

语法

Error[(errornumber)]

这个可选的 errornumber 参数可以为任何有效的错误号。如果 errornumber 是有效的错误号，但尚未被定义，则 Error 将返回字符串“应用程序定义的错误或对象定义的错误”。如果 errornumber 不是有效的错误号，则会导致错误发生。如果省略 errornumber，就会返回与最近一次运行时错误对应的消息。如果没有发生运行时错误，或者 errornumber 是 0，则 Error 返回一个长度为零的字符串 ("")。

说明

请检查 Err 对象的属性设置，以便认定最近一次运行时错误。Error 函数的返回值对应于 Err 对象的 Description 属性。


Error 函数示例

本示例使用 Error 函数来显示指定的错误代号所代表之错误信息。

Dim ErrorNumber
For ErrorNumber = 61 To 64    ' 从错误代号 61 循环到 64。
    Debug.Print Error(ErrorNumber)    ' 将错误信息在立即窗口中显示。
Next ErrorNumber


Exp 函数

返回 Double，指定 e（自然对数的底）的某次方。

语法

Exp(number)

必要的 number 参数 number 是 Double或任何有效的数值表达式。

说明

如果 number 的值超过 709.782712893，则会导致错误发生。常数 e 的值大约是 2.718282。

注意 Exp 函数的作用和 Log 的作用互补，所以有时也称做反对数。


Exp 函数示例

本示例使用 Exp 函数计算 e（e ~ 2.71828）的某次方。

Dim MyAngle, MyHSin
' 定义角度（以“弧度”为单位）。
MyAngle = 1.3
' 计算双曲正弦函数值（sin()）。
MyHSin = (Exp(MyAngle) - Exp(-1 * MyAngle)) / 2


FileAttr 函数

返回一个 Long，表示使用 Open 语句所打开文件的文件方式。

语法

FileAttr(filenumber, returntype)

FileAttr 函数的语法具有以下几个命名参数：

部分 | 描述
filenumber | 必要。Integer 类型，任何有效的文件号。
returntype | 必要。Integer 类型。它是数字，指出返回信息的类型。指定 1 则可返回一个代表文件方式的数值。而仅仅在 16 位系统中， 指定 2 才可以恢复操作系统的文件句柄。在 32 位系统中不支持 Returntype 2，它会导致错误发生。

返回值

当 returntype 参数值为 1 时，下列返回值指出文件访问方式：

方式 | 值
Input | 1
Output | 2
Random | 4
Append | 8
Binary | 32


FileAttr 函数示例

本示例使用 FileAttr 函数来返回一个已打开文件的文件模式以及文件句柄。返回文件句柄只适用于 16位系统; 在 32位 系统中, 把 2 作为第二个参数时将产生错误。

Dim FileNum, Mode, Handle
FileNum = 1    ' 指定文件号。
Open "TESTFILE" For Append As FileNum    ' 打开文件。
Mode = FileAttr(FileNum, 1)    ' 返回 8（增加文件方式）。
Handle = FileAttr(FileNum, 2)    ' 返回文件句柄。
Close FileNum    ' 关闭文件。


FileDateTime 函数

返回一个 Variant (Date)，此为一个文件被创建或最后修改后的日期和时间。

语法

FileDateTime(pathname)

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


FileDateTime 函数示例

本示例使用 FileDateTime 函数来得知文件创建或最近修改的日期与时间。日期与时间的显示格式依系统的地区设置而定。

Dim MyStamp
' 假设 TESTFILE 上次被修改的时间为 1993 年 2 月 12 日下午 4 时 35 分 47 秒。
' 假设 English/U.S. 地区设置。
MyStamp = FileDateTime("TESTFILE")Filedatetime("TESTFILE")    ' 返回“2/12/93 4:35:47 PM”。


FileLen 函数

返回一个 Long，代表一个文件的长度，单位是字节。

语法

FileLen(pathname)

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

说明

当调用 FileLen 函数时，如果所指定的文件已经打开，则返回的值是这个文件在打开前的大小。

注意 若要取得一个打开文件的长度大小，使用 LOF 函数。


FileLen 函数示例

本示例使用 FileLen 来返回文件的字节长度。示例中假设 TESTFILE 为含有数据的文件。

Dim MySize
MySize = FileLen("TESTFILE")Filelen("TESTFILE")    ' 返回文件的字节长度。


Filter函数

描述

返回一个下标从零开始的数组，该数组包含基于指定筛选条件的一个字符串数组的子集。

语法

Filter(sourcesrray, match[, include[, compare]])

Filter函数语法有如下的命名参数：

部分 | 描述
sourcearray | 必需的。要执行搜索的一维字符串数组。
match | 必需的。要搜索的字符串。
include | 可选的。Boolean值，表示返回子串包含还是不包含match字符串。如果include是True，Filter返回的是包含match子字符串的数组子集。如果include是False，Filter返回的是不包含match子字符串的数组子集。
compare | 可选的。数字值，表示所使用的字符串比较类型。有关其设置，请参阅下面的“设置值”部分。

设置值

Compare参数的设置值如下：

常数 | 值 | 描述
vbUseCompareOption | –1 | 使用Option Compare语句的设置值来执行比较。
vbBinaryCompare | 0 | 执行二进制比较。
vbTextCompare | 1 | 执行文字比较。
vbDatabaseCompare | 2 | 只用于Microsoft Access。基于您的数据库信息来执行比较。

说明

如果在sourcearray中没有发现与match相匹配的值，Filter返回一个空数组。如果sourcearray是Null或不是一个一维数组，则产生错误。

Filter函数所返回的数组，其元素数目刚好是所找到的匹配项目数。


Int、Fix 函数

返回参数的整数部分。

语法

Int(number)

Fix(number)

必要的 number 参数是 Double 或任何有效的数值表达式。如果 number 包含 Null，则返回 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))


Int 函数，Fix 函数示例

本示例说明 Int 及 Fix 函数在返回某数值的整数部分时有何不同。当参数为负数时，Int 函数返回小于或等于该参数之最大整数，而 Fix 函数则返回大于或等于该参数之最小整数。

Dim MyNumber
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。


Format 函数

返回 Variant (String)，其中含有一个表达式，它是根据格式表达式中的指令来格式化的。

语法

Format(expression[, format[, firstdayofweek[, firstweekofyear]]])

Format 函数的语法具有下面几个部分：

部分 | 说明
expression | 必要参数。任何有效的表达式。
format | 可选参数。有效的命名表达式或用户自定义格式表达式。
firstdayofweek | 可选参数。常数，表示一星期的第一天。
firstweekofyear | 可选参数。常数，表示一年的第一周。

设置值

firstdayofweek 参数有下面设置：

常数 | 值 | 说明
vbUseSystem | 0 | 使用 NLS API 设置。
VbSunday | 1 | 星期日（缺省）
vbMonday | 2 | 星期一
vbTuesday | 3 | 星期二
vbWednesday | 4 | 星期三
vbThursday | 5 | 星期四
vbFriday | 6 | 星期五
vbSaturday | 7 | 星期六

firstweekofyear 参数有下面设置：

常数 | 值 | 说明
vbUseSystem | 0 | 使用 NLS API 设置。
vbFirstJan1 | 1 | 从包含一月一日的那一周开始（缺省）。
vbFirstFourDays | 2 | 从本年第一周开始，而此周至少有四天在本年中。
VbFirstFullWeek | 3 | 从本年第一周开始，而此周完全在本年中。

说明

格式化 | 作法
数字 | 使用预先定义的命名数值格式或创建用户自定义数值格式。
日期和时间 | 使用预先定义的命名日期/时间格式或创建用户自定义日期/时间格式。
日期和时间序数 | 使用日期和时间格式或数值格式。
字符串 | 创建自定义的字符串格式。

如果在格式化数字时没有指定 format，Format 会提供与 Str 函数类似的功能，尽管它是国际化的。然而，以 Format 作用在正数上不会保留正负号空间，而以 Str 的话则会。

如果要格式化一个没有本地化的数值字符串，应该使用一个用户自定义的数值格式，以保证得到需要的外观。

注意 如果 Calendar 属性设置是Gregorian ，并且format 指定了日期格式，那么，提供的 expression 必须是Gregorian 。如果Visual Basic Calendar 属性设置是 Hijri，则提供的的 expression 必须是Hijri 。

如果日历是Gregorian，则 format 表达式的意义没有改变。如果日历是Hijri ，则所有的日期格式符号（例如，dddd, mmmm, yyyy ）有相同的意义，这些意义只应用于Hijri 日历。格式符号保持英文，用于文本显示的符号（例如，AM 和PM ）显示与该符号有关的字符串（英文或阿拉伯数字）。当日历是Hijri 时，一些符号的范围会改变。

符号 | 范围
d | 1-30
dd | 1-30
ww | 1-51
mmm | 显示完整的月份名称（Hijri 月份名称无缩写形式）
y | 1-355
yyyy | 100-9666


FormatCurrency函数

描述

返回一个货币值格式的表达式，它使用系统控制面板中定义的货币符号。

语法

FormatCurrency(Expression[,NumDigitsAfterDecimal [,IncludeLeadingDigit [,UseParensForNegativeNumbers [,GroupDigits]]]])

FormatCurrency函数语法有如下几部分：

部分 | 描述
Expression | 必需的。要格式化的表达式。
NumDigitsAfterDecimal | 可选的。数字值，表示小数点右边的显示位数。缺省值为–1，表示使用计算机的区域设置值。
IncludeLeadingDigit | 可选的。三态常数，表示小数点前是否显示一个零。关于其值，请参阅“设置值”部分。
UseParensForNegativeNumbers | 可选的。三态常数，表示是否把负数值放在园括号内。关于其值，请参阅“设置值”部分。
GroupDigits | 可选的。三态常数，表示是否用组分隔符对数字进行分组，组分隔符由计算机的区域设置值指定。关于其值，请参阅“设置值”部分。

设置值

IncludeLeadingDigit、UseParensForNegativeNumbers 和 GroupDigits参数的设置值如下：

常数 | 值 | 描述
vbTrue | –1 | True
vbFalse | 0 | False
vbUseDefault | –2 | 使用计算机区域设置中的设置值。

说明

当忽略一个或多个选项参数时，被忽略的参数值由计算机的区域设置值提供。

货币符号相对货币值的位置由计算机的区域设置值确定。

注意 除起始的零外，所有设置值信息都来自“区域设置”的“货币”选项卡，起始的零来自“数字”选项卡。


FormatDateTime函数

描述

返回一个日期或时间格式的表达式。

语法

FormatDateTime(Date[,NamedFormat])

FormatDateTime函数语法有如下几部分：

部分 | 描述
Date | 必需的。要被格式化的日期表达式。
NamedFormat | 可选的。数字值，表示日期/时间所使用的格式。如果忽略该值，则使用vbGeneralDate。

设置值

NamedFormat参数的设置值如下：

常数 | 值 | 描述
vbGeneralDate | 0 | 显示日期和/或时间。如果有日期部分，则用短日期格式显示。如果有时间部分，则用长时间格式显示。如果都有，两部分都显示。
vbLongDate | 1 | 用计算机区域设置值中指定的长日期格式显示日期。
vbShortDate | 2 | 用计算机区域设置值中指定的短日期格式显示日期。
vbLongTime | 3 | 用计算机区域设置值中指定的时间格式显示时间。
vbShortTime | 4 | 用24小时格式（hh：mm）显示时间。


FormatNumber函数

描述

返回一个数字格式的表达式。

语法

FormatNumber(Expression[,NumDigitsAfterDecimal [,IncludeLeadingDigit [,UseParensForNegativeNumbers [,GroupDigits]]]])

FormatNumber函数语法有如下几部分：

部分 | 描述
Expression | 必需的。要被格式化的表达式。
NumDigitsAfterDecimal | 可选的。数字值，表示小数点右边的显示位数。缺省值为–1，表示使用计算机的区域设置值。
IncludeLeadingDigit | 可选的。三态常数，表示小数点前是否显示零。关于其值，请参阅“设置值”部分。
UseParensForNegativeNumbers | 可选的。三态常数，表示是否把负数值放在圆括号内。关于其值，请参阅“设置值”部分。
GroupDigits | 可选的。的三态常数，表示是否用组分隔符对数字分组，组分隔符在计算机的区域设置值中指定。关于其值，请参阅“设置值”部分。

设置值

IncludeLeadingDigit、UseParensForNegativeNumbers和GroupDigits参数的设置值如下：

常数 | 值 | 描述
vbTrue | –1 | True
vbFalse | 0 | False
vbUseDefault | –2 | 用计算机区域设置值中的设置值。

说明

当忽略一个或多个选项参数时，被忽略的参数值由计算机的区域设置值提供。

注意 所有设置值信息都来自“区域设置”的“数字”选项卡。


FormatPercent函数

描述

返回一个百分比格式（乘以100）的表达式，后面有%符号。

语法

FormatPercent(Expression[,NumDigitsAfterDecimal [,IncludeLeadingDigit [,UseParensForNegativeNumbers [,GroupDigits]]]])

FormatPercent函数语法有如下几部分：

部分 | 描述
Expression | 必需的。要格式化的表达式。
NumDigitsAfterDecimal | 可选的。表示小数点右边的显示位数。缺省值为–1，表示使用计算机的区域设置值。
IncludeLeadingDigit | 可选的。三态常数，表示小数点前是否显示零。关于其值，请参阅“设置值”部分。
UseParensForNegativeNumbers | 可选的。三态常数，表示是否把负数放在圆括号内。关于其值，请参阅“设置值”部分。
GroupDigits | 可选的。三态常数，表示是否用组分隔符对数字进行分组，组分隔符在计算机的区域设置值中指定。关于其值，请参阅“设置值”部分。

设置值

IncludeLeadingDigit、UseParensForNegativeNumbers和GroupDigits参数的设置值如下：

常数 | 值 | 描述
vbTrue | –1 | True
vbFalse | 0 | False
vbUseDefault | –2 | 使用计算机区域设置值中的设置值。

说明

当忽略一个或多个选项参数时，被忽略的参数值由计算机的区域设置值提供。

注意 所有的设置值信息都来自“区域设置”的“数字”选项卡。


FreeFile 函数

返回一个 Integer ，代表下一个可供 Open 语句使用的文件号。

语法

FreeFile[(rangenumber)]

可选的参数 rangenumber 是一个 Variant ，它指定一个范围，以便返回该范围之内的下一个可用文件号。指定 0（缺省值）则返回一个介于 1 – 255 之间的文件号。指定 1 则返回一个介于 256 – 511 之间的文件号。

说明

使用 FreeFile 提供一个尚未使用的文件号。


FreeFile 函数示例

本示例使用 FreeFile 函数来返回下一个可用的文件号。在循环中，共打开五个输出文件，并在每个文件中写入一些数据。

Dim MyIndex, FileNumber
For MyIndex = 1 To 5    ' 循环五次。
    FileNumber = FreeFile    ' 取得未使用的文件号。
    Open "TEST" & MyIndex For Output As #FileNumber    ' 创建文件名。
    Write #FileNumber, "This is a sample."    ' 输出文本至文件中。
    Close #FileNumber    ' 关闭文件。
Next MyIndex


FV 函数

返回一个 Double，指定未来的定期定额支付且利率固定的年金。

语法

FV(rate, nper, pmt[, pv[, type]])

FV 函数有下列命名参数：

部分 | 描述
rate | 必要。Double，指定每一期的利率。例如，如果有一笔贷款年百分率 (APR) 为百分之十且按月付款的汽车贷款，则利率为 0.1/12 或 0.0083。
nper | 必要。Integer，指定一笔年金的付款总期限。例如，如果对一笔为期四年的汽车贷款选择按月付款方式，则贷款期限共有 4 * 12（或 48）个付款期。
pmt | 必要。Double 指定每一期的付款金额。付款金额通常包含本金和利息，而且此付款金额在年金的有效期间是不会改变的。
pv | 可选。Variant ，指定未来一系列付款（或一次付清款项）的现值。例如，当借钱买一辆汽车时时，向贷方所借的金额为未来每月付款给贷方的现值。如果省略的话，缺省值为 0。
type | 可选。Variant，指定贷款到期时间。如果贷款在贷款周期结束时到期，请使用 0。如果贷款在周期开始时到期，请使用 1。如果省略的话，缺省值为 0。

说明

年金是一段时间内一系列固定现金支付。年金可以是贷款（如房屋抵押贷款），也可以是一笔投资（如按月储蓄计划）。

在支付期间，必须用相同的单位来计算 rate 和 nper 参数。例如，如果 rate 用月份来计算，则 nper 也必须用月份来计算。

对所有参数，用负数表示现金支出（如储蓄存款），而用正数表示现金收入（如红利支票）。


FV 函数示例

本示例使用 FV 函数计算某项投资的未来价值，计算时给定每期的利率（APR / 12），投资的总期数（TotPmts），每期的投资额（Payment），已投资的现额（PVal）及付款方式（以数值表示期初或期末付款（PayType））。请注意，因为 Payment 代表支付出去的现金，故其为负数。

Dim Fmt, Payment, APR, TotPmts, PayType, PVal, FVal
Const ENDPERIOD = 0, BEGINPERIOD = 1    ' 付款方式。
Fmt = "###,###,##0.00"    ' 定义金额格式。
Payment = InputBox("How much do you plan to save each month?")
APR = InputBox("Enter the expected interest 年利率.")
If APR > 1 Then APR = APR / 100    ' 确保格式正确。
TotPmts = InputBox("For how many months do you expect to save?")
PayType = MsgBox("Do you make payments at the end of month?", vbYesNo)
If PayType = vbNo Then PayType = BEGINPERIOD Else PayType = ENDPERIOD
PVal = InputBox("How much is in this savings account now?")
FVal = FV(APR / 12, TotPmts, -Payment, -PVal, PayType)
MsgBox "Your savings will be worth " & Format(FVal, Fmt) & "."


GetAllSettings 函数

从 Windows 注册表 或 (Macintosh中)应用程序初始化文件中的信息中返回应用程序项目的所有注册表项设置及其相应值（开始是由 SaveSetting 产生）。

语法

GetAllSettings(appname, section)

GetAllSettings 函数的语法具有下列命名参数：

部分 |  | 描述
appname | 必要。字符串表达式，包含应用程序或工程的名称，并要求这些应用程序或工程有注册表项设置 在Macintosh中，这是System文件夹中Preferences文件夹中初始化文件的文件名。
section | 必要。字符串表达式，包含区域名称，并要求该区域有注册表项设置。GetAllSettings 返回 Variant，其内容为字符串的二维数组，该二维数组包含指定区域中的所有注册表项设置及其对应值。

说明

如果 appname 或 section 不存在，则 GetAllSettings 返回未初始化的 Variant。


GetAllSettings 函数示例

本示例首先使用 SaveSetting 语句来建立 Windows注册区里 appname 应用程序的项目，然后再使用 GetAllSettings 函数来取得设置值并显示出来。请注意，应用程序名和 section 名称不能用 GetAllSettings 函数取得。最后，使用 DeleteSetting 语句将该应用程序项删除。

' 用来保存 GetAllSettings 函数所返回之二维数组数据的变量
' 整型数是用来计数用。
Dim MySettings As Variant, intSettings As Integer
' 在注册区中添加设置值。
SaveSetting appname := "MyApp", section := "Startup", _
key := "Top", setting := 75
SaveSetting "MyApp","Startup", "Left", 50
' 取得输入项的设置值。
MySettings = GetAllSettings(appname := "MyApp", section := "Startup")
    For intSettings = LBound(MySettings, 1) To UBound(MySettings, 1)
        Debug.Print MySettings(intSettings, 0), MySettings(intSettings, 1)
    Next intSettings
DeleteSetting "MyApp", "Startup"


GetAttr 函数

返回一个 Integer，此为一个文件、目录、或文件夹的属性。

语法

GetAttr(pathname)

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

返回值

由 GetAttr 返回的值，是下面这些属性值的总和：

常数 | 值 | 描述
vbNormal | 0 | 常规
vbReadOnly | 1 | 只读
vbHidden | 2 | 隐藏
vbSystem | 4 | 系统文件 在 Macintosh 中不可用。
vbDirectory | 16 | 目录或文件夹
vbArchive | 32 | 上次备份以后 在 Macintosh 中不可用.，文件已经改变
vbalias | 64 | 指定的文件名是别名。 只在 Macintosh中可用。

注意 这些常数是由 VBA 指定的，在程序代码中的任何位置，可以使用这些常数来替换真正的值。

说明

若要判断是否设置了某个属性，在 GetAttr 函数与想要得知的属性值之间使用 And 运算符与逐位比较。如果所得的结果不为零，则表示设置了这个属性值。例如，在下面的 And 表达式中，如果档案 (Archive) 属性没有设置，则返回值为零：

Result = GetAttr(FName) And vbArchive

如果文件的档案属性已设置，则返回非零的数值。


GetAttr 函数示例

本示例使用 GetAttr 函数来得知文件及目录或文件夹的属性。 在 Macintosh 中，只有常量 vbNormal、 vbReadOnly、 vbHidden 和vbAlias 是可用的。

Dim MyAttr
' 假设 TESTFILE 具有隐含属性。
MyAttr = GetAttr("TESTFILE")    ' 返回 2。

' 如果 TESTFILE 有隐含属性，则返回非零值。
Debug.Print MyAttr And vbHidden

' 假设 TESTFILE 具有隐含的只读属性。
MyAttr = GetAttr("TESTFILE")    ' 返回 3 。

' 如果 TESTFILE 含有隐含属性，则返回非零值。
Debug.Print MyAttr And (vbHidden + vbReadOnly)

' 假设 MYDIR 代表一目录或文件夹。
MyAttr = GetAttr("MYDIR")    ' 返回 16。


GetObject 函数

返回文件中的 ActiveX 对象的引用。

语法

GetObject([pathname] [, class])

GetObject 函数的语法包含下面几个命名参数：

部分 | 描述
pathname | 可选的；Variant (String)。包含待检索对象的文件的全路径和名称。如果省略 pathname，则 class 是必需的。
class | 可选的；Variant (String)。代表该对象的类的字符串。

其中，class 参数的语法格式为 appname.objecttype，且语法的各个部分如下：

部分 | 描述
appname | 必需的；Variant (String)。提供该对象的应用程序名称。
objecttype | 必需的；Variant (String)。待创建对象的类型或类。

说明

使用 GetObject 函数可以访问文件中的 ActiveX 对象，而且可以将该对象赋给对象变量。可以使用 Set 语句将 GetObject 返回的对象赋给对象变量。例如：

Dim CADObject As Object
Set CADObject = GetObject("C:\CAD\SCHEMA.CAD")

当执行上述代码时，就会启动与指定的 pathname 相关联的应用程序，同时激活指定文件中的对象。

如果 pathname 是一个零长度的字符串 ("")，则 GetObject 返回指定类型的新的对象实例。如果省略了 pathname 参数，则 GetObject 返回指定类型的当前活动的对象。如果当前没有指定类型的对象，就会出错。

有些应用程序允许只激活文件的一部分，其方法是在文件名后加上一个惊叹号 (!) 以及用于标识想要激活的文件部分的字符串。关于如何创建这种字符串的信息，请参阅有关应用程序创建对象的文档。

例如，在绘图应用程序中，一个存放在文件中的图可能有多层。可以使用下述代码来激活图中被称为 SCHEMA.CAD 的层：

Set LayerObject = GetObject("C:\CAD\SCHEMA.CAD!Layer3")

如果不指定对象的 class，则自动化会根据所提供的文件名，来确定被启动的应用程序以及被激活的对象。不过，有些文件可能不止支持一种对象类。例如，图片可能支持三种不同类型的对象：Application 对象，Drawing 对象，以及 Toolbar 对象，所有这些都是同一个文件中的一部分。为了说明要具体激活文件中的哪种对象，就应使用这个可选的 class 参数。例如：

Dim MyObject As Object
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"

注意 当对象当前已有实例，或要创建已加载的文件的对象时，就使用 GetObject 函数。如果对象当前还没有实例，或不想启动已加载文件的对象，则应使用 CreateObject 函数。

如果对象已注册为单个实例的对象，则不管执行多少次 CreateObject，都只能创建该对象的一个实例。若使用单个实例对象，当使用零长度字符串 ("") 语法调用时，GetObject 总是返回同一个实例，而若省略 pathname 参数，就会出错。不能使用 GetObject 来获取 Visual Basic 创建的类的引用。


GetObject 函数示例

该示例使用 GetObject 函数来获取对指定的 Microsoft Excel 的工作表 (MyXL) 的引用。它使用工作表的 Application 属性来显示或关闭 Microsoft Excel 等等。DetectExcel Sub 过程通过调用两个 API 函数，来查找 Microsoft Excel。如果 Microsoft Excel 正在运行，则将其放入运行对象表（Running Object Table）中。如果 Microsoft Excel 不在运行，则第一次调用 GetObject 将导致错误。在本例中，出现该错误则把 ExcelWasNotRunning 标志设为 True。第二次调用 GetObject 是指定要打开的一个文件。如果 Microsoft Excel 不在运行，则这个第二次的调用将启动该程序，并返回一个指定文件 (mytest.xls) 所对应的工作表的引用。该文件必须位于指定的位置；否则将产生 Visual Basic 错误及自动化错误。随后的示例代码将 Microsoft Excel 及包含指定工作表的窗口设为可见。最后，如果在此前没有 Microsoft Excel 的副本在运行，代码就使用 Application 对象的 Quit 方法来关闭 Microsoft Excel。如果该应用程序原来就在运行，则不要试图关闭它。引用本身在设为 Nothing 后被释放。

'声明必要的 API 例程：
Declare Function FindWindow Lib "user32" Alias _
"FindWindowA" (ByVal lpClassName as String, _
                    ByVal lpWindowName As Long) As Long

Declare Function SendMessage Lib "user32" Alias _
"SendMessageA" (ByVal hWnd as Long,ByVal wMsg as Long _
                    ByVal wParam as Long, _
                    ByVal lParam As Long) As Long

Sub GetExcel()
    Dim MyXL As Object    '用于存放
                                'Microsoft Excel 引用的变量。
    Dim ExcelWasNotRunning As Boolean    '用于最后释放的标记。

'测试 Microsoft Excel 的副本是否在运行。
    On Error Resume Next    '延迟错误捕获。
'不带第一个参数调用 Getobject 函数将
'返回对该应用程序的实例的引用。
'如果该应用程序不在运行，则会产生错误。
    Set MyXL = Getobject(, "Excel.Application")
    If Err.Number <> 0 Then ExcelWasNotRunning = True
    Err.Clear    '如果发生错误则要清除 Err 对象。

'检测 Microsoft Excel。如果 Microsoft Excel 在运行，
'则将其加入运行对象表。
    DetectExcel

'将对象变量设为对要看的文件的引用。
    Set MyXL = Getobject("c:\vb4\MYTEST.XLS")

'设置其 Application 属性，显示 Microsoft Excel。
'然后使用 MyXL 对象引用的 Windows 集合
'显示包含该文件的实际窗口。
    MyXL.Application.Visible = True
    MyXL.Parent.Windows(1).Visible = True
    '在此处对文件
    '进行操作。
    ' ...
'如果在启动时，Microsoft Excel 的这份副本不在运行中，
'则使用 Application 属性的 Quit 方法来关闭它。
'注意，当试图退出 Microsoft Excel 时，
'标题栏会闪烁，并显示一条消息
'询问是否保存所加载的文件。
    If ExcelWasNotRunning = True Then
        MyXL.Application.Quit
    End IF

    Set MyXL = Nothing    '释放对该应用程序
                                '和电子数据表的引用。
End Sub

Sub DetectExcel()
'该过程检测并登记正在运行的 Excel。
    Const WM_USER = 1024
    Dim hWnd As Long
'如果 Excel 在运行，则该 API 调用将返回其句柄。
    hWnd = FindWindow("XLMAIN", 0)
    If hWnd = 0 Then    '0 表示没有 Excel 在运行。
        Exit Sub
    Else
    'Excel 在运行，因此可以使用 SendMessage API
    '函数将其放入运行对象表。
        SendMessage hWnd, WM_USER + 18, 0, 0
    End If
End Sub


GetSetting 函数

从 Windows 注册表中 或 (Macintosh中)应用程序初始化文件中的信息的应用程序项目返回注册表项设置值。

语法

GetSetting(appname, section, key[, default])

GetSetting 函数的语法具有下列命名参数：

部分 |  | 描述
appname | 必要。字符串表达式，包含应用程序或工程的名称，要求这些应用程序或工程有注册表项设置。 在Macintosh中，这是System文件夹中Preferences文件夹中初始化文件的文件名。
section | 必要。字符串表达式，包含区域名称，要求该区域有注册表项设置。
key | 必要。字符串表达式，返回注册表项设置的名称。
default | 可选。表达式，如果注册表项设置中没有设置值，则返回缺省值。如果省略，则 default 取值为长度为零的字符串 ("")。

说明

如果 GetSetting 的参数中的任何一项都不存在，则 GetSetting 返回 default 的值。


GetSetting 函数示例

本示例首先使用 SaveSetting 语句来建立Windows注册区（或 16位 Windows 平台的.ini档）里 appname 应用程序的项目，然后使用 GetSetting 函数来得到其中一项设置并显示出来。因为有传入参数 default，GetSetting 函数一定会有返回值。请注意，section 名称不能用 GetSetting 函数取得。最后，使用 DeleteSetting 语句将该应用程序项删除。

' 用来保存 GetSetting 函数所返回之二维数组数据的变量。
Dim MySettings As Variant
' 在注册区中添加项目。
SaveSetting "MyApp","Startup", "Top", 75
SaveSetting "MyApp","Startup", "Left", 50

Debug.Print GetSetting(appname := "MyApp", section := "Startup", _
                       key := "Left", default := "25")

DeleteSetting "MyApp", "Startup"


Hex 函数

返回代表十六进制数值的 String。

语法

Hex(number)

必要的 number 参数为任何有效的数值表达式或字符串表达式。

说明

如果 number 还不是一个整数，那么在执行前会先被四舍五入成最接近的整数。

如果 number 为 | 所得为
Null | Null
Empty | 零 (0)
任何其他的数字 | 最多可到八个十六进制字符。

适当范围内的数字，前缀以 &H，可以直接表示十六进制数字。例如，十六进制表示法的 &H10 代表十进制的 16。


Hex 函数示例

本示例使用 Hex 函数来得到某数值的 16 进制值。

Dim MyHex
MyHex = Hex(5)    ' 返回 5。
MyHex = Hex(10)    ' 返回 A。
MyHex = Hex(459)    ' 返回 1CB。


Hour 函数

返回一个 Variant (Integer)，其值为 0 到 23 之间的整数，表示一天之中的某一钟点。

语法

Hour(time)

必要的 time 参数，可以是任何能够表示时刻的 Variant、数值表达式、字符串表达式或它们的组合。如果 time 包含 Null，则返回 Null。


Hour 函数示例

本示例使用 Hour 函数将指定的时间转换为小时数。在开发环境中，日期和时间的原义会根据系统的地区设置，以短式日期和时间格式显示。

Dim MyTime, MyHour
MyTime = #4:35:17 PM#    ' 指定一时间。
MyHour = Hour(MyTime)    ' MyHour 的值为 16。


IIf 函数

根据表达式的值，来返回两部分中的其中一个。

语法

IIf(expr, truepart, falsepart)

IIf 函数的语法含有下面这些命名参数：

部分 | 描述
expr | 必要参数。用来判断真伪的表达式。
truepart | 必要参数。如果 expr 为 True，则返回这部分的值或表达式。
falsepart | 必要参数。如果 expr 为 False，则返回这部分的值或表达式。

说明

由于 IIf 会计算 truepart 和 falsepart，虽然它只返回其中的一个。因此要注意到这个副作用。例如，如果 falsepart 产生一个被零除错误，那么程序就会发生错误，即使 expr 为 True。


IIf 函数示例

本示例使用 IIf 函数来判断 CheckIt 过程之 TestMe 参数的值，如果参数值大于 1000 则传回“Large”；否则传回“小图标”。

Function CheckIt (TestMe As Integer)
    CheckIt = IIf(TestMe > 1000, "Large", "Small")
End Function


IMEStatus 函数

返回一个 Integer，用来指定当前 Microsoft Windows 的输入法 (IME) 方式；只对东亚区版本有效。

语法

IMEStatus

返回值

下面是日本区域的返回值：

常数 | 值 | 描述
vbIMEModeNoControl | 0 | 不控制IME（缺省）
vbIMEModeOn | 1 | 打开 IME
vbIMEModeOff | 2 | 关闭 IME
vbIMEModeDisable | 3 | IME 无效
vbIMEModeHiragana | 4 | 完整宽度 Hiragana 模式
vbIMEModeKatakana | 5 | 完整宽度 Katakana 片假名模式
vbIMEModeKatakanaHalf mode | 6 | 半宽 Katakana 模式
vbIMEModeAlphaFull mode | 7 | 完整宽度 Alphanumeric 模式
vbIMEModeAlpha mode | 8 | 半宽 Alphanumeric 模式

下面是韩国地区的返回值：

常数 | 值 | 描述
vbIMEModeAlphaFull | 7 | 完整宽度 Alphanumeric 模式
vbIMEModeAlpha | 8 | 半宽 Alphanumeric 模式
vbIMEModeHangulFull | 9 | 完整宽度 Hangul 模式
vbIMEModeHangul | 10 | 半宽 Hangul 模式

下面是中文地区的返回值：

常数 | 值 | 描述
vbIMEModeNoControl | 0 | 不控制IME（缺省）
vbIMEModeOn | 1 | 打开 IME
vbIMEModeOff | 2 | 关闭 IME


Input 函数

返回 String，它包含以 Input 或 Binary 方式打开的文件中的字符。

语法

Input(number, [#]filenumber)

Input 函数的语法具有以下几个部分：

部分 | 描述
number | 必要。任何有效的数值表达式，指定要返回的字符个数。
filenumber | 必要。任何有效的文件号。

说明

通常用 Print # 或 Put 将 Input 函数读出的数据写入文件。Input 函数只用于以 Input 或 Binary 方式打开的文件。

与 Input # 语句不同，Input 函数返回它所读出的所有字符，包括逗号、回车符、空白列、换行符、引号和前导空格等。

对于 Binary 访问类型打开的文件，如果试图用 Input 函数读出整个文件，则会在 EOF 返回 True 时产生错误。在用 Input 读出二进制文件时，要用 LOF 和 Loc 函数代替 EOF 函数，而在使用 EOF 函数时要配合以 Get 函数。

注意 对于文本文件中包含的字节数据要使用 InputB 函数。对于 InputB 来说，number 指定的是要返回的字节个数，而不是要返回的字符个数。


InputBox 函数

在一对话框来中显示提示，等待用户输入正文或按下按钮，并返回包含文本框内容的 String。

语法

InputBox(prompt[, title] [, default] [, xpos] [, ypos] [, helpfile, context])

InputBox 函数的语法具有以下几个命名参数：

部分 | 描述
Prompt | 必需的。作为对话框消息出现的字符串表达式。prompt 的最大长度大约是 1024 个字符，由所用字符的宽度决定。如果 prompt 包含多个行，则可在各行之间用回车符 (Chr(13))、换行符 (Chr(10)) 或回车换行符的组合 (Chr(13) & Chr(10)) 来分隔。
Title | 可选的。显示对话框标题栏中的字符串表达式。如果省略 title，则把应用程序名放入标题栏中。
Default | 可选的。显示文本框中的字符串表达式，在没有其它输入时作为缺省值。如果省略 default，则文本框为空。
Xpos | 可选的。数值表达式，成对出现，指定对话框的左边与屏幕左边的水平距离。如果省略 xpos，则对话框会在水平方向居中。
Ypos | 可选的。数值表达式，成对出现，指定对话框的上边与屏幕上边的距离。如果省略 ypos，则对话框被放置在屏幕垂直方向距下边大约三分之一的位置。
Helpfile | 可选的。字符串表达式，识别帮助文件，用该文件为对话框提供上下文相关的帮助。如果已提供 helpfile，则也必须提供 context。
Context | 可选的。数值表达式，由帮助文件的作者指定给某个帮助主题的帮助上下文编号。如果已提供 context，则也必须要提供 helpfile。

说明

如果同时提供了 helpfile 与 context，用户可以按 F1 (Windows) or HELP (Macintosh) 来查看与 context 相应的帮助主题。某些主应用程序，例如，Microsoft Excel，会在对话框中自动添加一个 Help 按钮。如果用户单击 OK 或按下ENTER ，则 InputBox 函数返回文本框中的内容。如果用户单击 Cancel，则此函数返回一个长度为零的字符串 ("")。

注意 如果还要指定第一个命名参数以外的参数，则必须在表达式中使用 InputBox。如果要省略某些位置参数，则必须加入相应的逗号分界符。


InputBox 函数示例

本示例说明使用 InputBox 函数来显示用户输入数据的不同用法。如果省略 x 及 y 坐标值，则会自动将对话框放置在两个坐标的正中。如果用户单击“确定”按钮或按下“ENTER”按键，则变量 MyValue 保存用户输入的数据。如果用户单击“取消”按钮，则返回一零长度字符串。

Dim Message, Title, Default, 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)


InStr 函数

返回 Variant (Long)，指定一字符串在另一字符串中最先出现的位置。

语法

InStr([start, ]string1, string2[, compare])

InStr 函数的语法具有下面的参数：

部分 | 说明
start | 可选参数。为数值表达式，设置每次搜索的起点。如果省略，将从第一个字符的位置开始。如果 start 包含 Null，将发生错误。如果指定了 compare 参数，则一定要有 start 参数。
string1 | 必要参数。接受搜索的字符串表达式。
string2 | 必要参数。被搜索的字符串表达式。
Compare | 可选参数。指定字符串比较。如果 compare 是 Null，将发生错误。如果省略 compare，Option Compare 的设置将决定比较的类型。指定一个有效的LCID (LocaleID) 以在比较中使用与区域有关的规则。

设置

compare 参数设置为：

常数 | 值 | 描述
vbUseCompareOption | -1 | 使用Option Compare 语句设置执行一个比较。
vbBinaryCompare | 0 | 执行一个二进制比较。
vbTextCompare | 1 | 执行一个按照原文的比较。
vbDatabaseCompare | 2 | 仅适用于Microsoft Access，执行一个基于数据库中信息的比较。

返回值

如果 | InStr返回
string1 为零长度 | 0
string1 为 Null | Null
string2 为零长度 | Start
string2 为 Null | Null
string2 找不到 | 0
在 string1 中找到string2 | 找到的位置
start > string2 | 0

说明

InStrB 函数作用于包含在字符串中的字节数据。所以 InStrB 返回的是字节位置，而不是字符位置。


InStrRev函数

描述

返回一个字符串在另一个字符串中出现的位置，从字符串的末尾算起。

语法

InstrRev(stringcheck, stringmatch[, start[, compare]])

InstrRev函数语法有如下命名参数：

部分 | 描述
stringcheck | 必需的。要执行搜索的字符串表达式。
stringmatch | 必需的。要搜索的字符串表达式。
start | 可选的。数值表达式，设置每次搜索的开始位置。如果忽略，则使用–1，它表示从上一个字符位置开始搜索。如果start包含 Null，则产生一个错误。
compare | 可选的。数字值，指出在判断子字符串时所使用的比较方法。如果忽略，则执行二进制比较。关于其值，请参阅“设置值”部分。

设置值

compare参数值如下：

常数 | 值 | 描述
vbUseCompareOption | –1 | 用Option Compare语句的设置值来执行比较。
vbBinaryCompare | 0 | 执行二进制比较。
vbTextCompare | 1 | 执行文字比较。
vbDatabaseCompare | 2 | 只用于Microsoft Access。基于您的数据库信息执行比较。

返回值

InStrRev返回值如下：

如果 | InStrRev返回
stringcheck 长度为零。 | 0
stringcheck 为Null。 | Null
stringmatch 长度为零 | Start
stringmatch 为Null | Null
stringmatch 没有找到。 | 0
stringmatch 在 stringcheck 中找到。 | 找到匹配字符串的位置。
start > Len(stringmatch) | 0

说明

请注意，InstrRev函数的语法和Instr函数的语法不相同。


IPmt 函数

返回一个 Double，指定在一段时间内对定期定额支付且利率固定的年金所支付的利息值。

语法

IPmt(rate, per, nper, pv[, fv[, type]])

IPmt 函数有下列命名参数：

部分 | 描述
rate | 必要。Double 指定每一期的利率。例如，如果有一笔贷款年百分率 (APR) 为百分之十且按月付款的汽车贷款，则每一期的利率为 0.1/12，或 0.0083。
per | 必要。Double 指定在 nper 间范围 1 中的付款周期。
nper | 必要。Double 指定一笔年金的付款总期数。例如，如果在一笔为期四年的汽车贷款中选择按月付款方式，则贷款共有 4 * 12（或 48）个付款期。
pv | 必要。Double，指定未来一系列付款或收款的现值。例如，当借钱买汽车时，向贷方所借金额为将来每月偿付给贷方款项的现值。
fv | 可选。Variant 指定在付清贷款后所希望的未来值或现金结存。例如，贷款的未来值在贷款付清后为 0 美元。但是，如果想要在 18 年间存下 50，000 美元作为子女教育基金，那么 50，000 美元为未来值。如果省略的话，缺省值为 0。
type | 可选。Variant 指定贷款到期时间。如果贷款在贷款周期结束时到期，请使用 0。如果贷款在周期开始时到期，请使用 1。如果省略的话，缺省值为 0。

说明

年金是指在一段时间内的一系列固定现金支付。年金可以是贷款（如房屋抵押贷款），也可以是一笔投资（如按月储蓄计划）。

在支付期间必须用相同的单位计算 rate 和 nper 参数。例如，如果 rate 用月份计算，则 nper 也必须用月份计算。

对所有参数，用负数表示现金支出（如储蓄存款），而用正数表示现金收入（如红利支票）。


IPmt 函数示例

本示例使用 IPmt 函数来计算每期的付款中有多少是属于利息，其中每期付款金额相同。计算时需给定每期利率（APR / 12），利息的付款周期（Period），付款总期数（TotPmts），贷款现值或本金（PVal），贷款的未来值（FVal）及付款方式，以数值表示期初或期末付款（PayType）。

Dim FVal, Fmt, PVal, APR, TotPmts, PayType, Period, IntPmt, TotInt, Msg
Const ENDPERIOD = 0, BEGINPERIOD = 1    ' 付款方式。
FVal = 0    ' 对贷款而言通常为零。
Fmt = "###,###,##0.00"    ' 定义金额格式。
PVal = InputBox("How much do you want to borrow?")
APR = InputBox("What is the annual percentage rate of your loan?")
If APR > 1 Then APR = APR / 100    ' 确保格式正确。
TotPmts = InputBox("How many monthly payments?")
PayType = MsgBox("Do you make payments at end of the month?", vbYesNo)
If PayType = vbNo Then PayType = BEGINPERIOD Else PayType = ENDPERIOD
For Period = 1 To TotPmts    ' 将所有利息求和。
    IntPmt = IPmt(APR / 12, Period, TotPmts, -PVal, FVal, PayType)
    TotInt = TotInt + IntPmt
Next Period
Msg = "You'll pay a total of " & Format(TotInt, Fmt)
Msg = Msg & " in interest for this loan."
MsgBox Msg    ' 显示结果。


IRR 函数

返回一个 Double，指定一系列周期性现金流（支出或收入）的内部利率。

语法

IRR(values()[, guess])

IRR 函数有下列命名参数：

部分 | 描述
values() | 必要。Double 数组，指定现金流值。此数组必须至少含有一个负值（支付）和一个正值（收入）。
Guess | 可选。Variant，指定 IRR 返回的估算值。如果省略，guess 为 0.1 (10%)。

说明

返回的内部利率是在正常的时间间隔内，一笔含有支出及收入的投资得到的利率。

IRR 函数使用数组中数值的顺序来解释支付和收入的顺序。要确保支付和收入的顺序正确。每一时期的现金流不必像年金那样固定不变。

IRR 是利用叠代进行计算。先从 guess 的值开始，IRR 反复循环进行计算，直到精确度达到 0.00001%。如果经过 20 次反复叠代测试还不能得到结果，则 IRR 计算失败。


IRR 函数示例

在本示例中，IRR 函数会计算由数组 Values() 内所含一系列期间的5笔现金流量之实质报酬率（internal rate of return）。第一个数组元素为一负数现金流，代表事业初始成本（事业初始成本）。其余4个正数现金流代表后续4年内的收入状况。Guess 为实质报酬率之估计值。

Dim Guess, Fmt, RetRate, Msg
Static Values(5) As Double    ' 声明数组。
Guess = .1    ' Guess 由 10% 开始。
Fmt = "#0.00"    ' 定义百分比的显示格式。
Values(0) = -70000    ' 事业初始成本。
' 正数现金流代表连续四年的收入状况。
Values(1) = 22000 : Values(2) = 25000
Values(3) = 28000 : Values(4) = 31000
RetRate = IRR(Values(), Guess) * 100    ' 计算实质报酬率。
Msg = "The internal rate of return for these five cash flows is "
Msg = Msg & Format(RetRate, Fmt) & " percent."
MsgBox Msg    ' 显示实质报酬率。


IsArray 函数

返回 Boolean 值，指出变量是否为一个数组。

语法

IsArray(varname)

必要的 varname 参数是一个指定变量的标识符。

说明

如果变量是数组，则 IsArray 返回 True；否则返回 False。对于包含数组的 variant 表达式来说，IsArray 尤为有用。


IsArray 函数示例

本示例使用 IsArray 函数来检查变量是否为数组。

Dim MyArray(1 To 5) As Integer, YourArray, MyCheck    ' 声明数组变量。
YourArray = Array(1, 2, 3)    ' 使用数组函数。
MyCheck = IsArray(MyArray)    ' 返回 True。
MyCheck = IsArray(YourArray)    ' 返回 True。


IsDate 函数

返回 Boolean 值，指出一个表达式是否可以转换成日期。

语法

IsDate(expression)

必要的 expression 参数是一个 Variant，包含日期表达式或字符串表达式，这里的字符串表达式是可以作为日期或时间来认定的。

说明

如果表达式是一个日期，或可以作为有效日期识别，则 IsDate 返回 True；否则返回 False。在 Microsoft Windows 中，有效日期的范围介于公元 100 年 1 月 1 日与公元 9999 年 12 月 31 日之间；其有效范围随操作系统不同而不同。


IsDate 函数示例

本示例使用 IsDate 函数判断表达式是否可以转换为日期格式。

Dim MyDate, YourDate, NoDate, MyCheck
MyDate = "February 12, 1969": YourDate = #2/12/69#: NoDate = "Hello"
MyCheck = IsDate(MyDate)    ' 返回 True。
MyCheck = IsDate(YourDate)    ' 返回 True。
MyCheck = IsDate(NoDate)    ' 返回 False。


IsEmpty 函数

返回 Boolean 值，指出变量是否已经初始化。

语法

IsEmpty(expression)

必要的 expression 参数是一个 Variant，包含一个数值或字符串表达式。但是，因为 IsEmpty 被用来确定个别变量是否已初始化，所以 expression 参数通常是单一变量名。

说明

如果变量未初始化或已明确设置为 Empty，则 IsEmpty 返回 True；否则返回 False。如果 expression 含有多个变量，则 IsEmpty 总是返回 False。IsEmpty 只返回对 variant 表达式有意义的信息。


IsEmpty 函数示例

本示例使用 IsEmpty 函数检查变量是否已经初始化。

Dim MyVar, MyCheck
MyCheck = IsEmpty(MyVar)    ' 返回 True。

MyVar = Null    ' 赋以 Null。
MyCheck = IsEmpty(MyVar)    ' 返回 False。

MyVar = Empty    ' 赋以 Empty。
MyCheck = IsEmpty(MyVar)    ' 返回 True。


IsError 函数

返回 Boolean 值，指出表达式是否为一个错误值。

语法

IsError(expression)

必需的 expression 参数，可以是任何有效表达式。

说明

利用 CVErr 函数将实数转换成错误值就会建立错误值。IsError 函数被用来确定一个数值表达式是否表示一个错误。如果 expression 参数表示一个错误，则 IsError 返回 True；否则返回 False。


IsError 函数示例

本示例使用 IsError 函数检查数值表达式的结果是否为错误代号。用 CVErr 函数从用户自定义函数返回 Error Variant 。假设 UserFunction 为返回错误值的用户自定义函数过程的名称。例如，函数中返回值写法可用 UserFunction = CVErr(32767)，其中 32767 为用户自定义的数。

Dim ReturnVal, MyCheck
ReturnVal = UserFunction()
MyCheck = IsError(ReturnVal)    ' 返回 True。


IsMissing 函数

返回 Boolean 值，指出一个可选的 Variant 参数是否已经传递给过程。

语法

IsMissing(argname)

必要的 argname 参数包含一个可选的 Variant 过程参数名。

说明

使用 IsMissing 函数来检测在调用一个程序时是否提供了可选 Variant 参数。如果对特定参数没有传递值过去，则 IsMissing 返回 True；否则返回 False。如果 IsMissing 对某个参数返回 True，则在其它代码中使用这个丢失的参数将产生一个用户自定义的错误。如果对 ParamArray 参数使用 IsMissing，则函数总是返回 False。为了检测空的 ParamArray，可试看一下数组的上界是否小于它的下界。

注意 IsMissing 对简单数据类型（例如 Integer或Double）不起作用，因为与Variants不同，它们没有“丢失”标志位的前提。正由于此，对于可选参数类型，可以指定缺省值。如果调用过程时，参数被忽略，则该参数将具有该缺省值，如下列示例中所示：

Sub MySub(Optional MyVar As String = "specialvalue")
    If MyVar = "specialvalue" Then
        ' MyVar 被忽略。
    Else
    ...
End Sub

在许多情况下，如果用户从函数调用中忽略，则可以通过使缺省值等于希望 MyVar 所包含的值来完全忽略 If MyVar 测试。这将使您的代码更简洁有效。


IsMissing 函数示例

本示例使用 IsMissing 函数检查是否把可选参数传送给用户自定义过程。请注意，除了 Variant 类型以外，其它皆可当作 Optional 参数的缺省值及类型。

Dim ReturnValue
' 下列语句调用用户自定义函数。
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 Funciton


IsNull 函数

返回 Boolean 值，指出表达式是否不包含任何有效数据 (Null)。

语法

IsNull(expression)

必要的 expression 参数是一个 Variant，其中包含数值表达式或字符串表达式。

说明

如果 expression 为 Null，则 IsNull 返回 True；否则 IsNull 返回 False。如果 expression 由多个变量组成，则表达式的任何作为变量组成成分的 Null 都会使整个表达式返回 True。

Null 值指出 Variant 不包含有效数据。Null 与 Empty 不同，后者指出变量尚未初始化。Null 与长度为零的字符串 (““) 也不同，长度为零的字符串指的是空串。

重要 使用 IsNull 函数是为了确定表达式是否包含 Null 值的。在某些情况下，希望表达式取值为 True，比如希望 If Var = Null 和 If Var <> Null 取值为 True，而它们总取值为 False。这是因为任何包含 Null 的表达式本身就是 Null，所以为 False。


IsNull 函数示例

本示例使用 IsNull 函数检查变量值是否为 Null。

Dim MyVar, MyCheck
MyCheck = IsNull(MyVar)    ' 返回 False。

MyVar = ""
MyCheck = IsNull(MyVar)    ' 返回 False。

MyVar = Null
MyCheck = IsNull(MyVar)    ' 返回 True。


IsNumeric 函数

返回 Boolean 值，指出表达式的运算结果是否为数。

语法

IsNumeric(expression)

必要的 expression 参数是一个 Variant，包含数值表达式或字符串表达式。

说明

如果整个 expression 的运算结果为数字，则 IsNumeric 返回 True；否则返回 False。

如果 expression 是日期表达式，则 IsNumeric 返回 False。


IsNumeric 函数示例

本示例使用 IsNumeric 函数判断变量的值是否可为数值。

Dim MyVar, MyCheck
MyVar = "53"    ' 指定值。
MyCheck = IsNumeric(MyVar)    ' 返回 True。

MyVar = "459.95"    ' 指定值。
MyCheck = IsNumeric(MyVar)    ' 返回 True。

MyVar = "45 Help"    ' 指定值。
MyCheck = IsNumeric(MyVar)    ' 返回 False。


IsObject 函数

返回 Boolean 值，指出标识符是否表示对象变量。

语法

IsObject(identifier)

必要的 identifier 参数是一个变量名。

说明

IsObject 只用于确定 Variant 是否属于 VarType vbObject。如果 Variant 实际引用（或曾经引用过）一个对象，或者如果 Variant 包含 Nothing，则可能出现这种情况。

如果 identifier 是 Object类型或任何有效的类类型，或者，如果 identifier 是 VarType vbObject 的 Variant 或用户自定义的对象，则 IsObject 返回 True；否则返回 False。即使变量已设置成 Nothing，IsObject 也仍返回 True。

使用错误捕获方法可以确认对象引用是否有效。


IsObject 函数示例

本示例使用 IsObject 函数判断标识符是否代表对象变量。 MyObject 及 YourObject 是同类型的对象变量。它们是只用来说明用途的一般名称。

Dim MyInt As Integer, YourObject, MyCheck    ' 声明变量。
Dim MyObject As Object
Set YourObject = MyObject    ' 指定对象引用。
MyCheck = IsObject(YourObject)    ' 返回 True。
MyCheck = IsObject(MyInt)    ' 返回 False。


Join函数

描述

返回一个字符串，该字符串是通过连接某个数组中的多个子字符串而创建的。

语法

Join(sourcearray[, delimiter])

Join函数语法有如下命名参数：

部分 | 描述
sourcearray | 必需的。包含被连接子字符串的一维数组。
delimiter | 可选的。在返回字符串中用于分隔子字符串的字符。如果忽略该项，则使用空格(" ")来分隔子字符串。如果delimiter是零长度字符串("")，则列表中的所有项目都连接在一起，中间没有分隔符。


LBound 函数

返回一个 Long 型数据，其值为指定数组维可用的最小下标。

语法

LBound(arrayname[, dimension])

LBound 函数的语法包含下面部分：

部分 | 描述
arrayname | 必需的。数组变量的名称，遵循标准的变量命名约定。
dimension | 可选的；Variant (Long)。指定返回哪一维的下界。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 语句的设置。使用 Array 函数创建的数组的下界为 0；它不受 Option Base 的影响。

对于那些在 Dim 中用 To 子句来设定维数的数组而言，Private、Public、ReDim 或 Static 语句可以用任何整数作为下界。


LBound 函数示例

该示例使用 LBound 函数来返回数组的指定维数的最小可用下标。可以使用 Option Base 语句取代数组缺省下标值 0。

Dim Lower
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 的设置。


LCase 函数

返回转成小写的 String。

语法

LCase(string)

必要的 string 参数可以是任何有效的字符串表达式。如果 string 包含 Null，将返回 Null。

说明

只有大写的字母会转成小写；所有小写字母和非字母字符保持不变。


LCase 函数示例

本示例使用 LCase 函数来将某字符串转成全部小写。

Dim UpperCase, LowerCase
Uppercase = "Hello World 1234"    ' 要输送的字符串。
Lowercase = Lcase(UpperCase)    ' 返回 "hello world 1234"。


Left 函数

返回 Variant (String)，其中包含字符串中从左边算起指定数量的字符。

语法

Left(string, length)

Left 函数的语法有下面的命名参数：

部分 | 说明
string | 必要参数。字符串表达式其中最左边的那些字符将被返回。如果 string 包含 Null，将返回 Null。
length | 必要参数；为 Variant (Long)。数值表达式，指出将返回多少个字符。如果为 0，返回零长度字符串 ("")。如果大于或等于 string 的字符数，则返回整个字符串。

说明

欲知 string 的字符数，使用 Len 函数。

注意 LeftB 函数作用于包含在字符串中的字节数据。所以 length 指定的是字节数，而不是要返回的字符数。


Left 函数示例

本示例使用 Left 函数来得到某字符串最左边的几个字符。

Dim AnyString, MyStr
AnyString = "Hello World"    ' 定义字符串。
MyStr = Left(AnyString, 1)    ' 返回 "H"。
MyStr = Left(AnyString, 7)    ' 返回 "Hello W"。
MyStr = Left(AnyString, 20)    ' 返回 "Hello World"。


Len 函数

返回 Long，其中包含字符串内字符的数目，或是存储一变量所需的字节数。

语法

Len(string | varname)

Len 函数的语法有下面这些部分：

部分 | 说明
string | 任何有效的字符串表达式。如果 string 包含 Null，会返回 Null。
Varname | 任何有效的变量名称。如果 varname 包含 Null，会返回 Null。如果 varname 是 Variant，Len 会视其为 String 并且总是返回其包含的字符数。

说明

两个可能的参数必须有其一（而且只能有其一）。如为用户定义类型，Len 会返回其写至文件的大小。

注意 LenB 函数作用于字符串中的字节数据，如同在双字节字符集(DBCS)语言中一样。所以 LenB 返回的是用于代表字符串的字节数，而不是返回字符串中字符的数量。如为用户自定义类型，LenB 返回在内存中的大小，包括元素之间的衬垫。对于使用 LenB的示例代码，请参阅示例主题中的第二个示例。

注意 当在用户自定义数据类型中使用变长字符串时，Len 可能不能确定实际存储所需的字节数目。


Len 函数示例

本示例使用 Len 函数来得知某字符串的长度（字符数）或某变量的大小（位数）。Type...End Type 程序区块定义一个自定义数据类型 CustomerRecord。如果该数据类型定义在对象类模块中，则必需以关键字 Private 开头（表示为私有）。若定义在常规模块中，Type 定义就可以为 Public。

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
Dim MyString, MyLen
MyString = "Hello World"    ' 设置变量初值。
MyLen = Len(MyInt)    ' 返回 2。
MyLen = Len(Customer)    ' 返回 42。
MyLen = Len(MyString)    ' 返回 11。
MyLen = Len(MyCur)    ' 返回 8。


Loc 函数

返回一个 Long，在已打开的文件中指定当前读/写位置。

语法

Loc(filenumber)

必要的 filenumber 参数是任何一个有效的 Integer 文件号。

说明

Loc 函数对各种文件访问方式的返回值如下：

方式 | 返回值
Random | 上一次对文件进行读出或写入的记录号。
Sequential | 文件中当前字节位置除以 128 的值。但是，对于顺序文件而言，不会使用 Loc 的返回值，也不需要使用 Loc 的返回值。
Binary | 上一次读出或写入的字节位置。


Loc 函数示例

本示例使用 Loc 函数来返回在打开的文件中当前读写的位置。 本示例假设 TESTFILE 文件内含数行文本数据。

Dim MyLocation, MyLine
Open "TESTFILE" For Binary As #1    ' 打开刚创建的文件。
Do While MyLocation < LOF(1)    ' 循环至文件尾。
    MyLine = MyLine & Input(1, #1)    ' 读入一个字符到变量中。
    MyLocation = Loc(1)    ' 取得当前位置。
' 在立即窗口中显示。
    Debug.Print MyLine : Tab : MyLocation
Loop
Close #1    ' 关闭文件。


LOF 函数

返回一个 Long，表示用 Open 语句打开的文件的大小，该大小以字节为单位。

语法

LOF(filenumber)

必要的 filenumber 参数是一个 Integer，包含一个有效的文件号。

注意 对于尚未打开的文件，使用 FileLen 函数将得到其长度。


LOF 函数示例

本示例使用 LOF 函数来得知已打开文件的大小。本示例假设 TESTFILE 文件内含文本数据。

Dim FileLength
Open "TESTFILE" For Input As #1    ' 打开文件。
FileLength = LOF(1)    ' 取得文件长度。
Close #1    ' 关闭文件。


Log 函数

返回一个 Double，指定参数的自然对数值。

语法

Log(number)

必要的 number 参数是 Double 或任何有效的大于 0 的数值表达式。

说明

自然对数是以 e 为底的对数。常数 e 的值大约是 2.718282。

如下所示，将 x 的自然对数值除以 n 的自然对数值，就可以对任意底 n 来计算数值 x 的对数值：

Logn(x) = Log(x) / Log(n)

下面的示例说明如何编写一个函数来求以 10 为底的对数值：

Static Function Log10(X)
    Log10 = Log(X) / Log(10#)
End Function


Log 函数示例

本示例使用 Log 函数得到某数的自然对数值。

Dim MyAngle, MyLog
' 定义角度（以“弧度”为单位）。
MyAngle = 1.3
' 计算反双曲正弦函数值（inverse sinh()）。
MyLog = Log(MyAngle + Sqr(MyAngle * MyAngle + 1))


LTrim、RTrim与 Trim 函数

返回 Variant (String)，其中包含指定字符串的拷贝，没有前导空白 (LTrim)、尾随空白 (RTrim) 或前导和尾随空白 (Trim)。

语法

LTrim(string)

RTrim(string)

Trim(string)

必要的 string 参数可以是任何有效的字符串表达式。如果 string 包含 Null，将返回 Null。


LTrim，RTrim，及 Trim 函数示例

本示例使用 LTrim 及 RTrim 函数将某字符串的开头及结尾的空格全部去除。事实上只使用 Trim 函数也可以做到将两头空格全部去除。

Dim MyString, TrimString
MyString = "  <-Trim->  "    ' 设置字符串初值。
TrimString = LTrim(MyString)    ' TrimString = "<-Trim->  "。
TrimString = RTrim(MyString)    ' TrimString = "  <-Trim->"。
TrimString = LTrim(RTrim(MyString))    ' TrimString = "<-Trim->"。
' 只使用 Trim 函数也同样将两头空格去除。
TrimString = Trim(MyString)    ' TrimString = "<-Trim->"。


MacID 函数

此函数用在 Macintosh 上，将长为4个字符的常量 转换成被 Dir, Kill, Shell, 和 AppActivate.使用的值。

语法

MacID(常量)

所需的常量参数包含4个字符，用来说明一个资源类型、文件类型、数字签名或 Apple Event,例如： “TEXT”、 “OBIN”,Excel 文件用 "XLS5" 说明(Excel 97用 "XLS8" 说明), Microsoft Word 用 "W6BN" 说明(Word 97用 "W8BN" 说明),如此等等.

注释

MacID 与 Dir 和 Kill 一起被用来说明一个 Macintosh 的文件类型。尽管 Macintosh 不支持 * 和 ? 作为通配符，您仍可以用4个字符常量替代说明一组文件。例如，下面的指令从当前的文件夹中返回 TEXT 类型的文件：

Dir("SomePath", MacID("TEXT"))

MacID 与 Shell 和 AppActivate 一起被用来说明一个应用使用此应用的唯一签名。


MacScript 函数

执行一个脚本并返回由此脚本返回的值，如果脚本有返回值的话。

语法

MacScript 脚本

参数脚本是一个字符串表达式。此字符串表达式既可以是一系列 AppleScript 的命令，也可以说明成 AppleScript 脚本或一个脚本文件的名字。

Remarks

多行脚本可由嵌入回车字符（Chr（13））生成。


MacScript 函数示例

此示例用 MacScript 函数打开 “Choose File” 对话框（ Macintosh 标准文件对话框）。返回用户所选文件的完整路径。如果合适的话，路径描述放在文件类型的前面。

ThePath$ = Macscript("ChooseFile")


Mid 函数

返回 Variant (String)，其中包含字符串中指定数量的字符。

语法

Mid(string, start[, length])

Mid 函数的语法具有下面的命名参数：

部分 | 说明
string | 必要参数。字符串表达式，从中返回字符。如果 string 包含 Null，将返回 Null。
start | 必要参数。为 Long。string 中被取出部分的字符位置。如果 start 超过 string 的字符数，Mid 返回零长度字符串 ("")。
length | 可选参数；为 Variant (Long)。要返回的字符数。如果省略或 length 超过文本的字符数（包括 start 处的字符），将返回字符串中从 start 到尾端的所有字符。

说明

欲知 string 的字符数，可用 Len 函数。

注意 MidB 函数作用于字符串中包含的字节数据，如同在双字节字符集(DBCS)语言中一样。因此其参数指定的是字节数，而不是字符数。对于使用 MidB的示例代码，请参阅示例主题中的第二个示例。


Mid 函数示例

本示例使用 Mid 语句来得到某个字符串中的几个字符。

Dim MyString, FirstWord, LastWord, MidWords
MyString = "Mid Function Demo"    建立一个字符串。
FirstWord = Mid(MyString, 1, 3)    ' 返回 "Mid"。
LastWord = Mid(MyString, 14, 4)    ' 返回 "Demo"。
MidWords = Mid(MyString, 5)    ' 返回 "Funcion Demo"。


Minute 函数

返回一个 Variant (Integer)，其值为 0 到 59 之间的整数，表示一小时中的某分钟。

语法

Minute(time)

必要的 time 参数，可以是任何能够表示时刻的 Variant、数值表达式、字符串表达式或它们的组合。如果 time 包含 Null，则返回 Null。


Minute 函数示例

本示例使用 Minute 函数转换指定的时间，得到小时后面的分钟数。在开发环境中，日期和时间原义会根据系统的地区设置，以短式日期和时间格式显示。

Dim MyTime, MyMinute
MyTime = #4:35:17 PM#    ' 指定一时间。
MyMinute = Minute(MyTime)    ' MyMinute 的值为 35。


MIRR 函数

返回一个 Double，指定一系列修改过的周期性现金流（支出或收入）的内部利率。

语法

MIRR(values(), finance_rate, reinvest_rate)

MIRR 函数有下列命名参数：

部分 | 描述
values() | 必要。Double 数组，指定现金流值。此数组至少要包含一个负值（支付）和一个正值（收入）。
finance_rate | 必要。Double 指定财务成本上的支付利率。
reinvest_rate | 必要。Double 指定由现金再投资所得利率。

说明

修改过的返回内部利率是指在用不同的利率计算支出和收入时的内部利率。MIRR 函数既考虑投资成本 (finance_rate)，也考虑现金再投资所得利率 (reinvest_rate)。

finance_rate 和 reinvest_rate 参数是用十进制数值表示的百分比。例如，0.12 表示百分之十二。

MIRR 函数用数组中的数值顺序来解释支付和收入的顺序。要确保支付和收入的输入顺序正确。


MIRR 函数示例

本示例使用 MIRR 函数计算由数组 Values() 内所含一系列期间现金流量之修正过的实质报酬率。LoanAPR 代表财务成本上的支付利息利率，而 InvAPR 则代表由现金再投资上所得到的利息利率。

Dim LoanAPR, InvAPR, Fmt, RetRate, Msg
Static Values(5) As Double    ' 声明数组。
LoanAPR = .1    ' 贷款利率。
InvAPR = .12    ' 再投资利率。
Fmt = "#0.00"    ' 定义金额格式。
Values(0) = -70000    ' 事业初始成本。
' 正数现金流代表连续四年的收入状况。
Values(1) = 22000 : Values(2) = 25000
Values(3) = 28000 : Values(4) = 31000
RetRate = MIRR(Values(), LoanAPR, InvAPR)    ' 计算实质报酬率。
Msg = "The modified internal rate of return for these five cash flows is"
Msg = Msg & Format(Abs(RetRate) * 100, Fmt) & "%."
MsgBox Msg    ' 显示实质报酬率。


Month 函数

返回一个 Variant (Integer)，其值为 1 到 12 之间的整数，表示一年中的某月。

语法

Month(date)

必要的 date 参数，可以是任何能够表示日期的 Variant、数值表达式、字符串表达式或它们的组合。如果 date 包含 Null，则返回 Null。


MonthName函数

描述

返回一个表示指定月份的字符串。

语法

MonthName(month[, abbreviate])

MonthName函数语法有如下几部分：

部分 | 描述
month | 必需的。月份的数值表示。例如一月是1，二月是2，等等。
abbreviate | 可选的。Boolean值，表示月份名是否缩写。如果忽略，缺省值为False，表明月份名不能被缩写。


MsgBox 函数

在对话框中显示消息，等待用户单击按钮，并返回一个 Integer 告诉用户单击哪一个按钮。

语法

MsgBox(prompt[, buttons] [, title] [, helpfile, context])

MsgBox 函数的语法具有以下几个命名参数：

部分 | 描述
Prompt | 必需的。字符串表达式，作为显示在对话框中的消息。prompt 的最大长度大约为 1024 个字符，由所用字符的宽度决定。如果 prompt 的内容超过一行，则可以在每一行之间用回车符 (Chr(13))、换行符 (Chr(10)) 或是回车与换行符的组合 (Chr(13) & Chr(10)) 将各行分隔开来。
Buttons | 可选的。数值表达式是值的总和，指定显示按钮的数目及形式，使用的图标样式，缺省按钮是什么以及消息框的强制回应等。如果省略，则 buttons 的缺省值为 0。
Title | 可选的。在对话框标题栏中显示的字符串表达式。如果省略 title，则将应用程序名放在标题栏中。
Helpfile | 可选的。字符串表达式，识别用来向对话框提供上下文相关帮助的帮助文件。如果提供了 helpfile，则也必须提供 context。
Context | 可选的。数值表达式，由帮助文件的作者指定给适当的帮助主题的帮助上下文编号。如果提供了 context，则也必须提供 helpfile。

设置值

buttons 参数有下列设置值：

常数 | 值 | 描述
vbOKOnly | 0 | 只显示 OK 按钮。
VbOKCancel | 1 | 显示 OK 及 Cancel 按钮。
VbAbortRetryIgnore | 2 | 显示 Abort、Retry 及 Ignore 按钮。
VbYesNoCancel | 3 | 显示 Yes、No 及 Cancel 按钮。
VbYesNo | 4 | 显示 Yes 及 No 按钮。
VbRetryCancel | 5 | 显示 Retry 及 Cancel 按钮。
VbCritical | 16 | 显示 Critical Message 图标。
VbQuestion | 32 | 显示 Warning Query 图标。
VbExclamation | 48 | 显示 Warning Message 图标。
VbInformation | 64 | 显示 Information Message 图标。
vbDefaultButton1 | 0 | 第一个按钮是缺省值。
vbDefaultButton2 | 256 | 第二个按钮是缺省值。
vbDefaultButton3 | 512 | 第三个按钮是缺省值。
vbDefaultButton4 | 768 | 第四个按钮是缺省值。

vbApplicationModal | 0 | 应用程序强制返回；应用程序一直被挂起，直到用户对消息框作出响应才继续工作。
vbSystemModal |  |  | 4096 | 系统强制返回；全部应用程序都被挂起，直到用户对消息框作出响应才继续工作。
vbMsgBoxHelpButton |  |  | 16384 | 将Help按钮添加到消息框
VbMsgBoxSetForeground |  |  | 65536 | 指定消息框窗口作为前景窗口
vbMsgBoxRight |  |  | 524288 | 文本为右对齐
vbMsgBoxRtlReading |  |  | 1048576 | 指定文本应为在希伯来和阿拉伯语系统中的从右到左显示

第一组值 (0–5) 描述了对话框中显示的按钮的类型与数目；第二组值 (16, 32, 48, 64) 描述了图标的样式；第三组值 (0, 256, 512) 说明哪一个按钮是缺省值；而第四组值 (0, 4096) 则决定消息框的强制返回性。将这些数字相加以生成 buttons 参数值的时候，只能由每组值取用一个数字。

注意 这些常数都是 Visual Basic for Applications (VBA) 指定的。结果，可以在程序代码中到处使用这些常数名称，而不必使用实际数值。

返回值

常数 |  | 值 |  | 描述
vbOK | 1 |  | OK
vbCancel |  | 2 |  | Cancel
vbAbort |  | 3 |  | Abort
vbRetry |  | 4 |  | Retry
vbIgnore |  | 5 |  | Ignore
vbYes |  | 6 |  | Yes
vbNo |  | 7 |  | No

说明

在提供了 helpfile 与 context 的时候，用户可以按 F1(Windows) or HELP (Macintosh) 来查看与 context 相应的帮助主题。像 Microsoft Excel 这样一些主应用程序也会在对话框中自动添加一个 Help 按钮。

如果对话框显示 Cancel 按钮，则按下 ESC 键与单击 Cancel 按钮的效果相同。如果对话框中有 Help 按钮，则对话框中提供有上下文相关的帮助。但是，直到其它按钮中有一个被单击之前，都不会返回任何值。

注意 如果还要指定第一个命名参数以外的参数，则必须在表达式中使用 MsgBox。为了省略某些位置参数，必须加入相应的逗号分界符。


MsgBox 函数示例

本示例使用 MsgBox 函数，在具有“是”及“否”按钮的对话框中显示一条严重错误信息。示例中的缺省按钮为“否”，MsgBox 函数的返回值视用户按哪一个钮而定。本示例假设 DEMO.HLP 为一帮助文件，其中有一个内容代码为 1000。

Dim Msg, Style, Title, Help, Ctxt, Response, MyString
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


Now 函数

返回一个 Variant (Date)，根据计算机系统设置的日期和时间来指定日期和时间。

语法

Now


Now 函数示例

本示例使用 Now 函数返回系统当前的日期与时间。

Dim Today
Today = Now    ' 将系统当前的日期与时间给变量。


NPer 函数

返回一个 Double，指定定期定额支付且利率固定的总期数。

语法

NPer(rate, pmt, pv[, fv[, type]])

NPer 函数有下列命名参数：

部分 | 描述
rate | 必要。Double 指定每一期的利率。例如，如果有一笔贷款年百分率 (APR) 为百分之十并按月付款的汽车贷款，则每一期的利率为 0.1/12 或 0.0083。
pmt | 必要。Double 指定每一期所付金额。付款金额通常包含本金和利息，且付款金额在年金的有效期间不变。
pv | 必要。Double 指定未来一系列付款或收款的现值。例如，当贷款买一辆汽车时，向贷方所借贷的金额为将来每月偿付给贷方款项的现值。
fv | 可选。Variant 指定在付清贷款后所希望的未来值或现金结存。例如，贷款的未来值在贷款付清后为 0 美元。但是，如果想要在 18 年间存下 50，000 美元作为子女教育基金，那么 50，000 美元为未来值。如果省略的话，缺省值为 0。
type | 可选。Variant 指定贷款到期时间。如果贷款是在贷款周期结束时到期，请使用 0，如果贷款是在周期开始时到期，请使用 1。如果省略的话，缺省值为 0。

说明

年金是在一段时间内一系列固定现金支付。年金可以是贷款（如房屋抵押贷款），也可以是一笔投资（如按月储蓄计划）。

对所有参数，用负数表示现金支出（如储蓄存款），而用正数表示现金收入（如红利支票）。


NPer 函数示例

本示例使用 NPer 函数计算分期偿还贷款之总期数，贷款金额为 PVal。计算时尚需给定每期利率（APR / 12），每期付款金额（Payment），贷款的未来值（FVal）及付款方式，以数值表示期初或期末付款（PayType）。

Dim FVal, PVal, APR, Payment, PayType, TotPmts
Const ENDPERIOD = 0, BEGINPERIOD = 1    ' 付款方式。
FVal = 0    ' 对贷款而言通常为零。
PVal = InputBox("How much do you want to borrow?")
APR = InputBox("What is the annual percentage rate of your loan?")
If APR > 1 Then APR = APR / 100    ' 确保格式正确。
Payment = InputBox("How much do you want to pay each month?")
PayType = MsgBox("Do you make payments at the end of month?", vbYesNo)
If PayType = vbNo Then PayType = BEGINPERIOD Else PayType = ENDPERIOD
TotPmts = NPer(APR / 12, -Payment, PVal, FVal, PayType)
If Int（TotPmts） <> TotPmts Then TotPmts = Int（TotPmts） + 1
MsgBox "It will take you " & TotPmts & " months to pay off your loan."


NPV 函数

返回一个 Double，指定根据一系列定期的现金流（支付和收入）和贴现率而定的投资净现值。

语法

NPV(rate, values())

NPV 函数有下列命名参数：

部分 | 描述
rate | 必要。Double 指定在一期间内的贴现率，用十进制表示。
values() | 必要。Double 数组 指定现金流值。此数组至少要包含一个负值（支付）和一个正值（收入）。

说明

投资的净现值是未来一系列支付或收入的当前价值。

NPV 函数使用数组中数值的顺序来解释支付和收入的顺序。要确保支付和收入值是用正确的顺序输入的。

NPV 投资在第一笔现金流值之前开始计算周期，而结束于数组中最后的现金流值。

净现值是根据未来的现金流进行计算的。如果第一笔现金流在第一期开始时发生，那么 NPV 返回的值必须加上第一笔值才是净现值。而且 values() 数组不可包含第一笔值。

NPV 函数与 PV 函数（现值）相似，只是 PV 函数在一个期间的开始或结束时才允许有现金流。与可变的 NPV 现金流值不同，PV 的现金流在整个投资期间必须固定。


NPV 函数示例

本示例使用 NPV 函数根据数组 Values() 内所含的一系列现金流量计算投资之净现值。RetRate 表示固定之实质报酬率。

Dim Fmt, Guess, RetRate, NetPVal, Msg
Static Values(5) As Double    ' 声明数组。
Fmt = "###,##0.00"    ' 定义金额格式。
Guess = .1    ' Guess 从 10% 开始。
RetRate = .0625    ' 设置固定实质报酬率。
Values(0) = -70000    ' 事业初始成本。
' 正数现金流代表连续四年的收入状况。
Values(1) = 22000 : Values(2) = 25000
Values(3) = 28000 : Values(4) = 31000
NetPVal = NPV(RetRate, Values())    ' 计算投资净现值。
Msg = "The net present value of these cash flows is "
Msg = Msg & Format(NetPVal, Fmt) & "."
MsgBox Msg    ' 显示投资净现值。


Oct 函数

返回 Variant (String)，代表一数值的八进制值。

语法

Oct(number)

必要的 number 参数为任何有效的数值表达式或字符串表达式。

说明

如果 number 尚非整数，那么在执行前会先四舍五入成最接近的整数。

如果 number 为 | Oct 返回
Null | Null
Empty | 零 (0)
任何其他的数字 | 最多可到 11 个八进制字符。

可以将适当范围的数前缀以 &O 来直接表示八进制数字。例如，八进制表示法的 &O10 代表十进制的 8。


Oct 函数示例

本示例使用 Oct 函数将某数值转换为 8 进制表达式。

Dim MyOct
MyOct = Oct(4)     ' 返回 4。
MyOct = Oct(8)    ' 返回 10。
MyOct = Oct(459)    ' 返回 713。


Partition 函数

返回一个 Variant (String)，指定一个范围，在一系列计算的范围中指定的数字出现在这个范围内。

语法

Partition(number, start, stop, interval)

Partition 函数的语法含有下面这些命名参数：

部分 | 描述
number | 必要参数。整数，在所有范围中判断这个整数是否出现。
start | 必要参数。整数，数值范围的开始值，这个数值不能小于 0。
stop | 必要参数。整数，数值范围的结束值，这个数值不能等于或小于 start。

说明

Partition 函数会标识 number 值出现的特定范围，并返回一个 Variant (String) 来描述这个范围。Partition 函数在查询中是最有用的。可以创建一个选择查询显示有多少定单落在几个变化的范围内，例如，定单数从 1 到 1000、1001 到 2000，以此类推。

下面的表格使用三组 start，stop 以及 interval 部分，来显示怎样决定这个范围。第一个范围和最后一个范围两列显示 Partition 的返回值，此范围的低端 (lowervalue) 和高端 (uppervalue) 是以冒号分开的。

start | stop | interval | 第一个范围之前 | 第一个范围 | 最后一个范围 | 最后一个范围之后
0 | 99 | 5 | " :-1" | " 0: 4" | " 95: 99" | " 100: "
20 | 199 | 10 | " : 19" | " 20: 29" | " 190: 199" | " 200: "
100 | 1010 | 20 | " : 99" | " 100: 119" | " 1000: 1010" | " 1011: "

从上面的表格中得知，在第三行中，由 start 和 stop 所定义的数值范围不能以 interval 来均分。所以，即使 interval 是 20，最后一个范围也只能扩展到stop（11 个数）。

如果需要的话，Partition 会在返回的范围中加上足够的空白，以便让返回值在冒号的左右两侧有相同的字符数，其值就是 stop 中的字符数再加一。如此可确保当要使用 Partition 与其它的数值作运算时，所得的字符串，可以在之后的排序操作中得到正确的结果。

如果 interval 是 1，则范围便是 number:number，而不管 start 和 stop 参数如何。比如说，如果 interval 是 1，number 是 100，而 stop 是 1000，则 Partition 会返回 " 100: 100"。

如果任何部分是 Null，则 Partition 会返回一个 Null。


Partition 函数示例

本示例假设您有一个“Orders”表，且里头含有一个“Freight”字段。程序建立一个“选择”来计算运费落在某些范围内的订单数量。Partition 函数是用来确定这些范围，然后调用 SQL Count 函数来计算在每个范围内的订单数量。本示例中，Partition 函数的参数值为 start = 0，stop = 500，interval = 50。第一个范围会是 0：49，每隔 50 一个范围，依次而下直到运费为 500 为止。

SELECT DISTINCTROW Partition([freight],0, 500, 50) AS Range,
Count(Orders.Freight) AS Count
FROM Orders
GROUP BY Partition([freight],0,500,50);


Pmt 函数

返回一个 Double，指定根据定期定额支付且利率固定的年金支付额。

语法

Pmt(rate, nper, pv[, fv[, type]])

Pmt 函数有下列命名参数：

部分 | 描述
rate | 必要。Double 指定每一期的利率。例如，如果有一笔贷款年百分比率 (APR) 为百分之十且按月付款的汽车贷款，则每一期的利率为 0.1/12 或 0.0083。
nper | 必要。Integer 指定一笔年金的付款总期数。例如，如果对一笔为期四年的汽车贷款选择按月付款，则贷款共有 4 * 12（或 48）个付款期。
pv | 必要。Double 指定未来一系列付款或收款的现值。例如，当贷款买一辆汽车时，向贷方所借贷的金额为将来每月偿付给贷方款项的现值。
fv | 可选。Variant 指定在付清贷款后所希望的未来值或现金结存。例如，贷款的未来值在贷款付清后为 0 美元。但是，如果想要在 18 年间存下 50，000 美元作为子女教育基金，那么 50，000 美元为未来值。如果省略的话，缺省值为 0。
type | 可选。Variant，指定贷款到期时间。如果贷款是在贷款周期结束时到期，请使用 0。如果贷款是在周期开始时到期，则请使用 1。如果省略的话，缺省值为 0。

说明

年金是在一段时间内一系列固定现金支付，年金可以是贷款（如房屋抵押贷款），也可以是一笔投资（如按月储蓄计划）。

在支付期间必须用相同的单位计算 rate 和 nper 参数。例如，如果 rate 用月份计算，则 nper 也必须用月份计算。

对所有参数，用负数表示现金支出（如储蓄存款），而用正数表示现金收入（如红利支票）。


Pmt 函数示例

本示例使用 Pmt 函数计算以定期方式偿还贷款之每期月付款金额。计算时需给定每期利率（APR / 12），付款总期数（TotPmts），贷款的现值或本金（PVal），贷款的未来值（FVal）及付款方式，以数值表示期初或期末付款（PayType）。

Dim Fmt, FVal, PVal, APR, TotPmts, PayType, Payment
Const ENDPERIOD = 0, BEGINPERIOD = 1    ' 付款方式。
Fmt = "###,###,##0.00"    ' 定义金额格式。
FVal = 0    ' 对贷款而言通常为零。
PVal = InputBox("How much do you want to borrow?")
APR = InputBox("What is the annual percentage rate of your loan?")
If APR > 1 Then APR = APR / 100    ' 确保格式正确。
TotPmts = InputBox("How many monthly payments will you make?")
PayType = MsgBox("Do you make payments at the end of month?", vbYesNo)
If PayType = vbNo Then PayType = BEGINPERIOD Else PayType = ENDPERIOD
Payment = Pmt(APR / 12, TotPmts, -PVal, FVal, PayType)
MsgBox "Your payment will be " & Format(Payment, Fmt) & " per month."


PPmt 函数

返回一个 Double，指定在定期定额支付且利率固定的年金的指定期间内的本金偿付额。

语法

PPmt(rate, per, nper, pv[, fv[, type]])

PPmt 函数有下列命名参数：

部分 | 描述
rate | 必要。Double 指定每一期的利率。例如，如果有一笔贷款年百分比率 (APR) 为百分之十且按月付款的汽车贷款，则每一期的利率为 0.1/12 或 0.0083。
per | 必要。Integer 指定在 nper 间范围 1 中的付款周期。
nper | 必要。Integer 指定一笔年金的付款总期数。例如，如果对一笔为期四年的汽车贷款选择按月付款，则贷款共有 4 * 12（或 48）个付款期。
pv | 必要。Double 指定未来一系列付款或收款的现值。例如，当贷款买一辆汽车时，向贷方所借贷的金额为将来每月偿付给贷方款项的现值。
fv | 可选。Variant 指定在付清贷款后所希望的未来值或现金结存值。例如，贷款的未来值在贷款付清后为 0 美元。但是，如果想要在 18 年间存下 50，000 美元作为子女教育基金，那么 50，000 美元为未来值。如果省略的话，缺省值为 0。
type | 可选。Variant 指定贷款到期时间。如果贷款是在贷款周期结束时到期，则请使用 0。如果贷款是在周期开始时到期，则请使用 1。如果省略的话，缺省值为 0。

说明

年金是在一段时间内一系列固定现金支付。年金可以是贷款（如房屋抵押贷款），也可以是一笔投资（如按月储蓄计划）。

在支付期间必须用相同的单位计算 rate 和 nper 参数。例如，如果 rate 用月份计算，则 nper 也必须用月份计算。

对所有参数，用负数表示现金支出（如储蓄存款），而用正数表示现金收入（如红利支票）。


PPmt 函数示例

本示例使用 PPmt 函数计算以定期定额且固定利率方式偿还贷款时，每期付款中偿还本金之金额。计算时给定每期利率（APR/12），本金分期偿还周期（Period），付款总期数（TotPmts），贷款的现值或本金（PVal），贷款的未来值（FVal）及付款方式，以数值表示期初或期末付款（PayType）。

Dim NL, TB, Fmt, FVal, PVal, APR, TotPmts, PayType, Payment, Msg, MakeChart, Period, P, I
Const ENDPERIOD = 0, BEGINPERIOD = 1    ' 付款方式。
NL = Chr(13) & Chr(10)    ' 定义换行字符。
TB = Chr(9)    ' 定义 tab。
Fmt = "###,###,##0.00"    ' 定义金额格式。
FVal = 0    ' 对贷款而言通常为零。
PVal = InputBox("How much do you want to borrow?")
APR = InputBox("What is the annual percentage rate of your loan?")
If APR > 1 Then APR = APR / 100    ' 确保格式正确。
TotPmts = InputBox("How many monthly payments do you have to make?")
PayType = MsgBox("Do you make payments at the end of month?", vbYesNo)
If PayType = vbNo Then PayType = BEGINPERIOD Else PayType = ENDPERIOD
Payment = Abs(-Pmt(APR / 12, TotPmts, PVal, FVal, PayType))
Msg = "Your monthly payment is " & Format(Payment, Fmt) & "."
Msg = Msg & "Would you like a breakdown of your principal and "
Msg = Msg & "interest per period?"
MakeChart = MsgBox(Msg, vbYesNo)    ' 询问是否要显示。
If MakeChart <> vbNo Then
    If TotPmts > 12 Then MsgBox "Only first year will be shown.”
    Msg = "Month  Payment  Principal  Interest" & NL
    For Period = 1 To TotPmts
        If Period > 12 Then Exit For    ' Show only first 12。
        P = PPmt(APR / 12, Period, TotPmts, -PVal, FVal, PayType)
        P = (Int((P + .005) * 100) / 100)    ' 四舍五入计算本金。
        I = Payment - P
        I = (Int((I + .005) * 100) / 100)    ' 四舍五入计算利息。
        Msg = Msg & Period & TB & Format(Payment, Fmt)
        Msg = Msg & TB & Format(P, Fmt) & TB & Format(I, Fmt) & NL
    Next Period
    MsgBox Msg    ' 显示分期偿还表。
End If


PV 函数

返回一个 Double 指定在未来定期、定额支付且利率固定的年金现值。

语法

PV(rate, nper, pmt[, fv[, type]])

PV 函数有下列命名参数：

部分 | 描述
rate | 必要。Double 指定每一期的利率。例如，如果有一笔贷款年百分比率 (APR) 为百分之十且按月付款的汽车贷款，则每一期的利率为 0.1/12 或 0.0083。
nper | 必要。Integer 指定一笔年金的付款总期数。例如，如果对一笔为期四年的汽车贷款选择按月付款，则贷款共有 4 * 12（或 48）个付款期。
pmt | 必要。Double 指定每一期的付款金额。付款金额通常包含本金和利息，且此付款金额在年金的有效期间不变。
fv | 可选。Variant，指定在付清贷款后所希望的未来值或现金结存。例如，贷款的未来值在贷款付清后为 0 美元。但是，如果想要在 18 年间存下 50，000 美元作为子女教育基金，那么 50，000 美元为未来值。如果省略的话，缺省值为 0。
type | 可选。Variant 指定贷款到期时间。如果贷款是在贷款周期结束时到期，则请使用 0。如果贷款是在周期开始时到期，则请使用 1。如果省略的话，缺省值为 0。

说明

年金是在一段时间内一系列固定现金支付。年金可以是贷款（如房屋抵押贷款），也可以是一笔投资（如按月储蓄计划）。

在支付期间必须用相同的单位计算 rate 和 nper 参数。例如，如果 rate 用月份计算，则 nper 也必须用月份计算。

对所有参数，现金支出（如储蓄存款）用负数表示，而现金收入（如红利支票）用正数表示。


PV 函数示例

在本示例中，PV 函数计算一笔养老金的现值，该养老金将以每年支付 $50,000 的方式，分二十年来支付 $1,000,000 之总金额。计算时给定值为年利率期望值（APR），付款总期数（TotPmts），每期付款金额（YrIncome），未来总值（FVal）以及付款方式，以数值表示期初或期末付款（PayType）。请注意，YrIncome 是一个负数，因为它代表每年从养老金支付出去的现金。

Dim Fmt, APR, TotPmts, YrIncome, FVal, PayType, PVal
Const ENDPERIOD = 0, BEGINPERIOD = 1    ' 付款方式。
Fmt = "###,##0.00"    ' 定义金额格式。
APR = .0825    ' 年利率。
TotPmts = 20    ' 付款总期数。
YrIncome = 50000    ' 每年收到金额。
FVal = 1000000    ' 未来总值。
PayType = BEGINPERIOD    ' 期初付款。
PVal = PV(APR, TotPmts, -YrIncome, FVal, PayType)
MsgBox "The present value is " & Format(PVal, Fmt) & "."


QBColor 函数

返回一个 Long，用来表示所对应颜色值的 RGB 颜色码。

语法

QBColor(color)

必要的 color 参数是一个界于 0 到 15 的整型。

设置值

color 参数有以下这些设置：

值 | 颜色 | 值 | 颜色
0 | 黑色 | 8 | 灰色
1 | 兰色 | 9 | 亮兰色
2 | 绿色 | 10 | 亮绿色
3 | 青色 | 11 | 亮青色
4 | 红色 | 12 | 亮红色
5 | 洋红色 | 13 | 亮洋红色
6 | 黄色 | 14 | 亮黄色
7 | 白色 | 15 | 亮白色

说明

color 参数代表使用于早期版本的 Basic（诸如 Microsoft Visual Basic for MS-DOS 以及 Basic Compiler）的颜色值。始于最低有效字节，返回值指定了红、绿、蓝三原色的值，用于设置成 VBA中RGB 系统的对应颜色。


QBColor 函数示例

本示例使用 QBColor 函数将 MyForm 窗体的 BackColor 属性，改成 ColorCode 参数指定的色彩。QBColor 可接受 0 到 15 的整型值。

Sub ChangeBackColor (ColorCode As Integer, MyForm As Form)
    MyForm.BackColor = QBColor(ColorCode)
End Sub


Rate 函数

返回一个 Double，指定每一期的年金利率。

语法

Rate(nper, pmt, pv[, fv[, type[, guess]]])

Rate 函数有下列命名参数：

部分 | 描述
nper | 必要。Double 指定一笔年金的付款总期数。例如，如果对一笔为期四年的汽车贷款选择按月付款，则贷款共有 4 * 12（或 48）个付款期。
pmt | 必要。Double，指定每一期的付款金额。付款金额通常包含本金和利息，且此付款金额在年金的有效期间不变。
pv | 必要。Double 指定未来一系列付款或收款的现值。例如，当贷款买一辆汽车时，向贷方所借贷的金额为将来每月偿付给贷方款项的现值。
fv | 可选。Variant 指定在付清贷款后所希望的未来值或现金结存。例如，贷款的未来值在贷款付清后为 0 美元。但是，如果想要在 18 年间存下 50，000 美元作为子女教育基金，那么 50，000 美元为未来值。如果省略的话，缺省值为 0。
type | 可选。Variant，指定贷款到期时间，如果贷款是在贷款周期结束时到期，则请使用 0。如果贷款是在周期开始时到期，则请使用 1。如果省略的话，缺省值为 0。
guess | 可选。Variant 指定 Rate 返回的估算值。如果省略，则 guess 为 0.1 (10%)。

说明

年金是在一段时间内的一系列固定现金支付，年金可以是贷款（如房屋抵押贷款)或是一笔投资（如按月储蓄计划）。

对所有参数，现金支出（如储蓄存款）用负数表示，而现金收入（如红利支票）用正数表示。

Rate 是叠代计算的。先从 guess 的值开始，Rate 反复循环计算，直到精确度达到 0.00001%。如果经过 20 次叠代测试还不能得到结果，则 Rate 计算失败。如果猜测是 10% 而 Rate 计算失败，则请试用不同的 guess.值。


Rate 函数示例

本示例使用 Rate 函数计算某贷款的利率，计算时需给定付款总期数（TotPmts），每期偿还贷款之金额（Payment），贷款的现值或本金（PVal），贷款的未来值（FVal）， 付款方式，以数值表示期初或期末付款（PayType），及利率的约略估计值（Guess）。

Dim Fmt, FVal, Guess, PVal, Payment, TotPmts, PayType, APR
Const ENDPERIOD = 0, BEGINPERIOD = 1    ' 付款方式。
Fmt = "##0.00"    ' 定义百分比的显示格式。
FVal = 0    ' 对贷款而言通常为零。
Guess = .1    ' 利率估计值为 10%。
PVal = InputBox("How much did you borrow?")
Payment = InputBox("What's your monthly payment?")
TotPmts = InputBox("How many monthly payments do you have to make?")
PayType = MsgBox("Do you make payments at the end of the month?", _
vbYesNo)
If PayType = vbNo Then PayType = BEGINPERIOD Else PayType = ENDPERIOD
APR = (Rate(TotPmts, -Payment, PVal, FVal, PayType, Guess) * 12) * 100
MsgBox "Your interest rate is " & Format(CInt(APR), Fmt) & " percent."


Replace函数

描述

返回一个字符串，该字符串中指定的子字符串已被替换成另一子字符串，并且替换发生的次数也是指定的。

语法几

Replace(expression, find, replace[, start[, count[, compare]]])

Replace函数语法有如下命名参数：

部分 | 描述
expression | 必需的。字符串表达式，包含要替换的子字符串。
find | 必需的。要搜索到的子字符串。
replace | 必需的。用来替换的子字符串。
start | 可选的。在表达式中子字符串搜索的开始位置。如果忽略，假定从1开始。
count | 可选的。子字符串进行替换的次数。如果忽略，缺省值是 –1，它表明进行所有可能的替换。
compare | 可选的。数字值，表示判别子字符串时所用的比较方式。关于其值，请参阅“设置值”部分。

设置值

compare参数的设置值如下：

常数 | 值 | 描述
vbUseCompareOption | –1 | 使用Option Compare语句的设置值来执行比较。
vbBinaryCompare | 0 | 执行二进制比较。
vbTextCompare | 1 | 执行文字比较。
vbDatabaseCompare | 2 | 仅用于Microsoft Access。基于您的数据库的信息执行比较。

返回值

Replace的返回值如下：

如果 | Replace返回值
expression长度为零 | 零长度字符串("")。
expression为Null | 一个错误。
find长度为零 | expression的复本。
replace长度为零 | expression的复本，其中删除了所有出现的find 的字符串。
start > Len(expression) | 长度为零的字符串。
count is 0 | expression的复本。

说明

Replace函数的返回值是一个字符串，但是，其中从start所指定的位置开始，到expression字符串的结尾处的一段子字符串已经发生过替换动作。并不是原字符串从头到尾的一个复制。


RGB 函数

返回一个 Long整数，用来表示一个 RGB 颜色值。

语法

RGB(red, green, blue)

RGB 函数的语法含有以下这些命名参数：

部分 |  | 描述
red | 必要参数；Variant (Integer)。数值范围从 0 到 255，表示颜色的红色成份。
green | 必要参数；Variant (Integer)。数值范围从 0 到 255，表示颜色的绿色成份。
blue | 必要参数；Variant (Integer)。数值范围从 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 操作系统时，不能使用。


RGB 函数示例

本示例示范如何使用 RGB 函数来返回代表 RGB 色彩值的完整数值。此函数通常用在和色彩有关的方法或属性。示例中的 MyObject 对象及其属性仅作示范帮助之用。如果 MyObject 并不存在，或者没有 Color 属性，则会发生错误。

Dim RED, I, RGBValue, 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 属性为红色。


Right 函数

返回 Variant (String)，其中包含从字符串右边取出的指定数量的字符。

语法

Right(string, length)

Right 函数的语法具有下面的命名参数：

部分 | 说明
string | 必要参数。字符串表达式，从中最右边的字符将被返回。如果 string 包含 Null，将返回 Null。
length | 必要参数；为 Variant (Long)。为数值表达式，指出想返回多少字符。如果为 0，返回零长度字符串 ("")。如果大于或等于 string 的字符数，则返回整个字符串。

说明

欲知 string 的字符数，用 Len 函数。

注意 RightB 函数作用于包含在字符串中的字节数据。所以 length 指定的是字节数，而不是指定返回的字符数。


Right 函数示例

本示例使用 Right 函数来返回某字符串右边算起的几个字符。

Dim AnyString, MyStr
AnyString = "Hello World"    ' 定义字符串。
MyStr = Right(AnyString, 1)    ' 返回 "d"。
MyStr = Right(AnyString, 6)    ' 返回 " World"。
MyStr = Right(AnyString, 20)    ' 返回 "Hello World"。


Rnd 函数

返回一个包含随机数值的 Single。

语法

Rnd[(number)]

可选的 number 参数是 Single 或任何有效的数值表达式。

返回值

如果 number 的值是 | Rnd 生成
小于 0 | 每次都使用 number 作为随机数种子得到的相同结果。
大于 0 | 序列中的下一个随机数。
等于 0 | 最近生成的数。
省略 | 序列中的下一个随机数。

说明

Rnd 函数返回小于 1 但大于或等于 0 的值。

number 的值决定了 Rnd 生成随机数的方式。

对最初给定的种子都会生成相同的数列，因为每一次调用 Rnd 函数都用数列中的前一个数作为下一个数的种子。

在调用 Rnd 之前，先使用无参数的 Randomize 语句初始化随机数生成器，该生成器具有根据系统计时器得到的种子。

为了生成某个范围内的随机整数，可使用以下公式：

Int((upperbound - lowerbound + 1) * Rnd + lowerbound)

这里，upperbound 是随机数范围的上限，而 lowerbound 则是随机数范围的下限。

注意 若想得到重复的随机数序列，在使用具有数值参数的 Randomize 之前直接调用具有负参数值的 Rnd。使用具有同样 number 值的 Randomize 是不会得到重复的随机数序列的。


Rnd 函数示例

本示例使用 Rnd 函数随机生成一个 1 到 6 的随机整数。

Dim MyValue
MyValue = Int((6 * Rnd) + 1)    ' 生成 1 到 6 之间的随机数值。


Round函数

描述

返回一个数值，该数值是按照指定的小数位数进行四舍五入运算的结果。

语法

Round(expression [,numdecimalplaces])

Round函数语法有如下几部分：

部分 | 描述
expression | 必需的。要进行四舍五入运算的数值表达式。
numdecimalplaces | 可选的。数字值，表示进行四舍五入运算时，小数点右边应保留的位数。如果忽略，则Round函数返回整数。


Second 函数

返回一个 Variant (Integer)，其值为 0 到 59 之间的整数，表示一分钟之中的某个秒。

语法

Second(time)

必要的 time 参数，可以是任何能够表示时刻的 Variant、数值表达式、字符串表达式或它们的组合。如果 time 包含 Null，则返回 Null。


Second 函数示例

本示例使用 Second 函数转换指定的时间，得到分钟后面的秒数。在开发环境中，日期和时间原义会根据系统的地区设置，以短式日期和时间格式显示。

Dim MyTime, MySecond
MyTime = #4:35:17 PM#    ' 指定一时间。
MySecond = Second(MyTime)    ' MySecond 的值为 17。


Seek 函数

返回一个 Long，在 Open 语句打开的文件中指定当前的读/写位置。

语法

Seek(filenumber)

必要的 filenumber 参数是一个包含有效文件号的 Integer。

说明

Seek 函数返回介于 1 和 2，147，483，647（相当于 2^31 – 1）之间的值。

对各种文件访问方式的返回值如下：

方式 | 返回值
Random | 下一个读出或写入的记录号。
Binary, Output, Append, Input | 下一个操作将要发生时所在的字节位置。文件中的第一个字节位于位置 1，第二个字节位于位置 2，依此类推。


Seek 函数示例

本示例使用 Seek 函数来返回当前文件位置。示例中假设 TESTFILE 文件内含有用户自定义数据类型 Record 的记录。

Type Record    ' 定义用户自定义数据类型。
    ID As Integer
    Name As String * 20
End Type

如果以随机方式打开文件，Seek 返回下一个记录的编号。

Dim MyRecord As Record    ' 声明变量。
Open "TESTFILE" For Random As #1 Len = Len(MyRecord)
Do While Not EOF(1)    ' 循环至文件尾。
    Get #1, , MyRecord    ' 读入下一个记录。
    Debug.Print Seek(1)    ' 在立即窗口中显示记录号。
Loop
Close #1    ' 关闭文件。

如果不以 Random 方式打开文件，则 Seek 返回下一个操作会发生的位置。假设 TESTFILE 文件内含有文本数据。

Dim MyChar
Open "TESTFILE" For Input As #1    ' 打开输入文件。
Do While Not EOF(1)    ' 循环至文件尾。
    MyChar = Input(1, #1)    ' 读入下一个字符。
    Debug.Print Seek(1)    ' 将下一字符的位置显示在立即窗口。
Loop
Close #1    ' 关闭文件。


Sgn 函数

返回一个 Variant (Integer)，指出参数的正负号。

语法

Sgn(number)

必要的 number 参数是任何有效的数值表达式。

返回值

如果 number 为 | Sgn 返回
大于 0 | 1
等于 0 | 0
小于 0 | -1

说明

number 参数的符号决定了 Sgn 函数的返回值。


Sgn 函数示例

本示例使用 Sgn 函数来判断某数的正负号。

Dim MyVar1, MyVar2, MyVar3, MySign
MyVar1 = 12: MyVar2 = -2.4: MyVar3 = 0
MySign = Sgn(MyVar1)    ' 返回 1。
MySign = Sgn(MyVar2)    ' 返回 -1。
MySign = Sgn(MyVar3)    ' 返回 0。


Shell 函数

执行一个可执行文件，返回一个 Variant (Double)，如果成功的话，代表这个程序的任务 ID，若不成功，则会返回 0。

语法

Shell(pathname[,windowstyle])

Shell 函数的语法含有下面这些命名参数：

部分 | 描述
pathname 必要参数。Variant (String)，要执行的程序名，以及任何必需的参数或命令行变量，可能还包括目录或文件夹，以及驱动器。在Macintosh中，可以使用MacID函数来指定一个应用程序的署名而不是名称。下面的例子使用了Microsoft Word的署名:
Shell MacID("MSWD")
Windowstyle | 可选参数。Variant (Integer)，表示在程序运行时窗口的样式。如果 windowstyle 省略，则程序是以具有焦点的最小化窗口来执行的。在Macintosh（系统7.0或更高）中，windowstyle仅决定当应用程序运行时是否获得焦点。

windowstyle 命名参数有以下这些值：

常量 | 值 | 描述
vbHide | 0 | 窗口被隐藏，且焦点会移到隐式窗口。常数vbHide在Macintosh平台不可用。
VbNormalFocus | 1 | 窗口具有焦点，且会还原到它原来的大小和位置。
VbMinimizedFocus | 2 | 窗口会以一个具有焦点的图标来显示。
VbMaximizedFocus | 3 | 窗口是一个具有焦点的最大化窗口。
VbNormalNoFocus | 4 | 窗口会被还原到最近使用的大小和位置，而当前活动的窗口仍然保持活动。
VbMinimizedNoFocus | 6 | 窗口会以一个图标来显示。而当前活动的的窗口仍然保持活动。

说明

如果 Shell 函数成功地执行了所要执行的文件，则它会返回程序的任务 ID。任务 ID 是一个唯一的数值，用来指明正在运行的程序。如果 Shell 函数不能打开命名的程序，则会产生错误。

在Macintosh中，vbNormalFocus、vbMinimizedFocus和vbMaximizedFocus都将应用程序置于前台；vbHide、vbNoFocus、vbMinimizeFocus都将应用程序置于后台。

注意 缺省情况下，Shell 函数是以异步方式来执行其它程序的。也就是说，用 Shell 启动的程序可能还没有完成执行过程，就已经执行到 Shell 函数之后的语句。


Shell 函数示例

本示例使用 Shell 函数来完成一个用户指定的应用程序。在 MacIntosh 上，默认的驱动名为 “HD” ，路径名称的每部分由冒号而非反斜线分隔。相似地，您可以指定 Macintosh 文件夹而非 \Windows.

' 将第二个参数值设成 1，可让该程序以正常大小的窗口完成，并且拥有焦点。
Dim RetVal
RetVal = Shell("C:\WINDOWS\CALC.EXE", 1)    ' 完成Calculator。


Sin 函数

返回一 Double，指定参数的 sine（正弦）值。

语法

Sin(number)

必要的 number 参数是 Double 或任何有效的数值表达式，表示一个以弧度为单位的角。

说明

Sin 函数取一角度为参数值，并返回角的对边长度除以斜边长度的比值。

结果的取值范围在 -1 到 1 之间。

为了将角度转换为弧度，请将角度乘以 pi /180。为了将弧度转换为角度，请将弧度乘以 180/pi。


Sin 函数示例

本示例使用 Sin 函数来求出一个角的正弦值（sin()）。

Dim MyAngle, MyCosecant
MyAngle = 1.3    ' 定义角度（以“弧度”为单位）。
MyCosecant = 1 / Sin(MyAngle)    ' 利用正弦来计算余割（csc()）。


SLN 函数

返回一个 Double，在一期里指定一项资产的直线折旧。

语法

SLN(cost, salvage, life)

SLN 函数有下列命名参数：

部分 | 描述
cost | 必要。Double 指定资产的初始成本。
salvage | 必要。Double 指定资产在可用年限结束后的价值。
life | 必要。Double 指定资产的可用年限。

说明

折旧期间必须用与 life 参数相同的单位表示。所有参数都必须是正数。


SLN 函数示例

本示例使用 SLN 函数以“直线折旧”（straight-line depreciation）法计算某项资产在一期之内的折旧，计算时须给定资产的初始成本（InitCost），资产在可用年限退出后的价值（SalvageVal）及资产的可用年限（LifeTime）。

Dim Fmt, InitCost, SalvageVal, MonthLife, LifeTime, PDepr
Const YEARMONTHS = 12    ' 一年之中的月份数。
Fmt = "###,##0.00"    ' 定义金额格式。
InitCost = InputBox("What's the initial cost of the asset?")
SalvageVal = InputBox("What's the asset's value at the end of its useful life?")
MonthLife = InputBox("What's the asset's useful life in months?")
Do While MonthLife < YEARMONTHS    ' 确保计算期间大于等于一年 。
    MsgBox "Asset life must be a year or more."
    MonthLife = InputBox("What's the asset's useful life in months?")
Loop
LifeTime = MonthLife / YEARMONTHS    ' 将月份数转成年份数。
If LifeTime <> Int(MonthLife / YEARMONTHS) Then
    LifeTime = Int(LifeTime + 1)    ' 四舍五入至最接近的年份。
End If
PDepr = SLN(InitCost, SalvageVal, LifeTime)
MsgBox "The depreciation is " & Format(PDepr, Fmt) & " per year."


Space 函数

返回特定数目空格的 Variant (String)。

语法

Space(number)

必要的 number 参数为字符串中想要的空格数。

说明

Space 函数在格式输出或清除固定长度字符串数据时很有用。


Space 函数示例

本示例使用 Space 函数来生成一个字符串，字符串的内容为空格，长度为指定的长度。

Dim MyString
' 返回 10 个空格的字符串。
MyString = Space(10)

' 将 10 个空格插入两个字符串中间。
MyString = "Hello" & Space(10) & "World"


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 – urrentprintposition) 的空白。

注意 要确保表格栏宽度足以容纳较宽的字符串。

当 Print 方法与间距字体一起使用时，使用 Spc 函数打印的空格字符的宽度总是等于选用字体内以磅数为单位的所有字符的平均宽度。但是，在已打印字符的个数与那些字符所占据的定宽列的数目之间不存在任何关系。例如，大写英文字母 W 占据超过一个定宽的列，而小写字母 i 则占据少于一个定宽的列。


Spc 函数示例

本示例使用 Spc 函数确定在文件或立即窗口中的输出位置。

' Spc 函数可以和 Print # 语句一起使用。
Open "TESTFILE" For Output As #1    ' 打开输出文件。
Print #1, "10 spaces between here"； Spc(10)； "and here."
Close #1    ' 关闭文件。

下列语句在显示到调试窗口（使用 Print 方法）的文本之前加 30 个空格。

Debug.Print Spc(30)； "Thirty spaces later. . ."


Split函数

描述

返回一个下标从零开始的一维数组，它包含指定数目的子字符串。

语法

Split(expression[, delimiter[, limit[, compare]]])

Split函数语法有如下命名参数：

部分 | 描述
expression | 必需的。包含子字符串和分隔符的字符串表达式 。如果expression是一个长度为零的字符串("")，Split则返回一个空数组，即没有元素和数据的数组。
delimiter | 可选的。用于标识子字符串边界的字符串字符。如果忽略，则使用空格字符(" ")作为分隔符。如果delimiter是一个长度为零的字符串，则返回的数组仅包含一个元素，即完整的 expression字符串。
limit | 可选的。要返回的子字符串数，–1表示返回所有的子字符串。
compare | 可选的。数字值，表示判别子字符串时使用的比较方式。关于其值，请参阅“设置值”部分。

设置值

compare参数的设置值如下：

常数 | 值 | 描述
vbUseCompareOption | –1 | 用Option Compare语句中的设置值执行比较。
vbBinaryCompare | 0 | 执行二进制比较。
vbTextCompare | 1 | 执行文字比较。
vbDatabaseCompare | 2 | 仅用于Microsoft Access。基于您的数据库的信息执行比较。


Sqr 函数

返回一个 Double，指定参数的平方根。

语法

Sqr(number)

必要的 number 参数 number 是 Double 或任何有效的大于或等于 0 的数值表达式。


Sqr 函数示例

本示例使用 Sqr 函数来计算某数的平方根。

Dim MySqr
MySqr = Sqr(4)    ' 返回 2。
MySqr = Sqr(23)    ' 返回 4.79583152331272。
MySqr = Sqr(0)    ' 返回 0。
MySqr = Sqr(-4)    ' 生成一个运行时错误（负数不能用此函数开平方根）。


Str 函数

返回代表一数值的 Variant (String)。

语法

Str(number)

必要的 number 参数为一 Long，其中可包含任何有效的数值表达式。

说明

当一数字转成字符串时，总会在前头保留一空位来表示正负。如果 number 为正，返回的字符串包含一前导空格暗示有一正号。

使用 Format 函数可将数值转成必要的格式，如日期、时间、货币或其他用户自定义格式。与 Str 不同的是，Format 函数不包含前导空格来放置 number 的正负号。

注意 Str 函数只视句点 (.) 为有效的小数点。如果使用不同的小数点（例如，国际性的应用程序），可使用 CStr 将数字转成字符串。


StrComp 函数

返回 Variant (Integer)，为字符串比较的结果。

语法

StrComp(string1, string2[, compare])

StrComp 函数的语法有下面的命名参数：

部分 | 说明
string1 | 必要参数。任何有效的字符串表达式。
string2 | 必要参数。任何有效的字符串表达式。
Compare | 可选参数。指定字符串比较的类型。如果 compare 参数是 Null，将发生错误。如果省略 compare，Option Compare 的设置将决定比较的类型。

设置

compare 参数设置为：

常数 | 值 | 描述
vbUseCompareOption | -1 | 使用Option Compare语句设置执行一个比较。
vbBinaryCompare | 0 | 执行一个二进制比较。
vbTextCompare | 1 | 执行一个按照原文的比较。
vbDatabaseCompare | 2 | 仅适用于Microsoft Access，执行一个基于数据库信息的比较。

返回值

StrComp 函数有下列返回值：

如果 | StrComp 返回
string1 小于 string2 | -1
string1 等于 string2 | 0
string1 大于 string2 | 1
string1 或 string 2为 Null | Null


StrComp 函数示例

本示例使用 StrComp 函数来比较两个字符串。如果第三个参数值为 1，字符串是以文本比较的方式进行比较；如果第三个参数值为 0 或是缺省，则以二进制比较的方式进行比较。

文本比较方式会将大小写字母视为一样，但二进制比较方式则视为不同。

Dim MyStr1, MyStr2, MyComp
MyStr1 = "ABCD": MyStr2 = "abcd"    ' 定义变量。
MyComp = StrComp(MyStr1, MyStr2, 1)    ' 返回 0。
MyComp = StrComp(MyStr1, MyStr2, 0)    ' 返回 -1。
MyComp = StrComp(MyStr2, MyStr1)    ' 返回 1。


StrConv 函数

返回按指定类型转换的 Variant (String)。

语法

StrConv(string, conversion, LCID)

StrConv 函数的语法有下面的命名参数：

部分 | 说明
string | 必要参数。要转换的字符串表达式。
conversion | 必要参数。Integer。其值的和决定转换的类型。
LCID | 可选的。如果与系统LocaleID不同，则为LocaleID（系统LocaleID为缺省值。）

设置值

conversion 参数的设置值为：

常数 | 值 |  | 说明
vbUpperCase | 1 |  | 将字符串文字转成大写。
vbLowerCase | 2 |  | 将字符串文字转成小写。
vbProperCase | 3 |  | 将字符串中每个字的开头字母转成大写。
vbWide* | 4* |  | 将字符串中单字节字符转成双字节字符。
vbNarrow* | 8* |  | 将字符串中双字节字符转成单字节字符。
vbKatakana** | 16** |  | 将字符串中平假名字符转成片假名字符。
vbHiragana** | 32** | 将字符串中片假名字符转成平假名字符。
vbUnicode | 64 |  | 根据系统的缺省码页将字符串转成 Unicode。 (在Macintosh中不可用。)
vbFromUnicode | 128 |  | 将字符串由 Unicode 转成系统的缺省码页。 (在Macintosh中不可用。)

*应用到远东区域。

**仅应用到日本。

注意 这些常数是由 VBA 指定的。可以在程序中使用它们来替换真正的值。其中大部分是可以组合的，例如 vbUpperCase + vbWide，互斥的常数不能组合，例如 vbUnicode + vbFromUnicode。当在不适用的区域使用常数 vbWide、vbNarrow、vbKatakana，和 vbHiragana 时，就会导致运行时错误。

下面是一些一般情况下的有效分界符：Null (Chr$(0))，水平制表符 (Chr$(9))，换行 (Chr$(10))，垂直制表符 (Chr$(11))，换页 (Chr$(12)) ，回车 (Chr$(13))，空白 (SBCS) (Chr$(32))。在 DBCS中，空白的实际值会随国家/地区而不同。

说明

在把 ANSI 格式的 Byte 数组转换为字符串时，您应该使用 StrConv 函数。当您转换 Unicode 格式的这种数组时，使用赋值语句。


StrConv 函数示例

本示例使用StrConv 函数来将Unicode 字符串转换成 ANSI 字符串。

Dim i As Long
Dim x() As Byte
x = StrConv("ABCDEFG", vbFromUnicode)    ' 转换字符串。
For i = 0 To UBound(x)
    Debug.Print x(i)
Next


StrReverse函数

描述

返回一个字符串，其中一个指定子字符串的字符顺序是反向的。

语法

StrReverse(expression)

参数expression 是一个字符串，它的字符顺序要被反向。如果expression 是一个长度为零的字符串("")，则返回一个长度为零的字符串。如果expression为Null，则产生一个错误。


String 函数

返回 Variant (String)，其中包含指定长度重复字符的字符串。

语法

String(number, character)

String 函数的语法有下面的命名参数：

部分 | 说明
number | 必要参数；Long。返回的字符串长度。如果 number 包含 Null，将返回 Null。
character | 必要参数；Variant。为指定字符的字符码或字符串表达式，其第一个字符将用于建立返回的字符串。如果 character 包含 Null，就会返回 Null。

说明

如果指定 character 的数值大于 255，String 会按下面的公式将其转为有效的字符码：

character Mod 256


String 函数示例

本示例使用 String 函数来生成一指定长度，且只含单一字符的字符串。

Dim MyString
MyString = String(5, "*")    ' 返回 "*****"。
MyString = String(5, 42)    ' 返回 "*****"。
MyString = String(10, "ABC")    ' 返回 "AAAAAAAAAA"。


Switch 函数

计算一组表达式列表的值，然后返回与表达式列表中最先为 True 的表达式所相关的 Variant 数值或表达式。

语法

Switch(expr-1, value-1[, expr-2, value-2 _ [, expr-n,value-n]])

Switch 函数的语法具有以下几个部分：

部分 | 描述
expr | 必要参数。要加以计算的 Variant 表达式。
value | 必要参数。如果相关的表达式为 True，则返回此部分的数值或表达式。

说明

Switch 函数的参数列表由多对表达式和数值组成。表达式是由左至右加以计算的，而数值则会在第一个相关的表达式为 True 时返回。如果其中有部分不成对，则会产生一个运行时错误。如果 expr-1 为 True 则 Switch 返回 value-1，如果 expr-1 为 False，但 expr-2 为 True，则 Switch 返回 value-2，以此类推。

Switch 会返回一个 Null值，如果：

  • 没有一个表达式为 True。

  • 第一个为 True 的表达式，其相对应的值为 Null。

虽然它只返回其中的一个值，但是 Switch 会计算所有的表达式。因此应该注意到所产生的副作用。例如，只要其中一个表达式导致被零除错误，就会发生错误。


Switch 函数示例

本示例使用 Switch 函数返回和城市名称匹配的语言名称。

Function MatchUp (CityName As String)
    Matchup = Switch(CityName = "London", "English", CityName _
                    = "Rome", "Italian", CityName = "Paris", "French")
End Function


SYD 函数

返回一个 Double，指定某项资产在一指定期间用年数总计法计算的折旧。

语法

SYD(cost, salvage, life, period)

SYD 函数有下列命名参数：

部分 | 描述
cost | 必要。Double 指定资产的初始成本。
salvage | 必要。Double 指定资产在可用年限结束后的价值。
life | 必要。Double 指定资产的可用年限。
period | 必要。Double 指定计算资产折旧所用的那一期间。

说明

必须用相同的单位表示 life 和 period 参数。例如，如果 life 用月份表示，则 period 也必须用月份表示。所有参数都必须是正数。


SYD 函数示例

本示例使用 SYD 函数计算某项资产在指定期间内的折旧，计算时需给定资产初始成本（InitCost），资产在可用年限退出后的价值（SalvageVal）及资产的可用年限（LifeTime）。计算折旧的以年为单位的期间为 PDepr。

Dim Fmt, InitCost, SalvageVal, MonthLife, LifeTime, DepYear, PDepr
Const YEARMONTHS = 12    ' 一年之中的月份数。
Fmt = "###,##0.00"    ' 定义金额格式。
InitCost = InputBox("What's the initial cost of the asset?")
SalvageVal = InputBox("What's the asset's value at the end of its life?")
MonthLife = InputBox("What's the asset's useful life in months?")
Do While MonthLife < YEARMONTHS    ' 确保计算期间大于等于一年 。
    MsgBox "Asset life must be a year or more."
    MonthLife = InputBox("What's the asset's useful life in months?")
Loop
LifeTime = MonthLife / YEARMONTHS    ' 将月份数转成年份数。
If LifeTime <> Int(MonthLife / YEARMONTHS) Then
    LifeTime = Int(LifeTime + 1)    ' 四舍五入至最接近的年份。
End If
DepYear = CInt(InputBox("For which year do you want depreciation?"))
Do While DepYear < 1 Or DepYear > LifeTime
    MsgBox "You must enter at least 1 but not more than " & LifeTime
    DepYear = CInt(InputBox("For what year do you want depreciation?"))
Loop
PDepr = SYD(InitCost, SalvageVal, LifeTime, DepYear)
MsgBox "The depreciation for year " & DepYear & " is " & Format(PDepr, Fmt) & "."


Tab 函数

与 Print # 语句或 Print 方法一起使用，对输出进行定位。

语法

Tab[(n)]

可选的 n 参数是在显示或打印列表中的下一个表达式之前移动的列数。若省略此参数，则 Tab 将插入点移动到下一个打印区的起点。这就使 Tab 可用来替换区域中的逗号，此处，逗号是作为十进制分隔符使用的。

说明

如果当前行上的打印位置大于 n，则 Tab 将打印位置移动到下一个输出行的第 n 列上。如果 n 小于 1，则 Tab 将打印位置移动到列 1。如果 n 大于输出行的宽度，则 Tab 函数使用以下公式计算下一个打印位置：

n Mod width

例如，如果 width 是 80，并指定 Tab(90)，则下一个打印将从列 10 开始（90/80 的余数）。如果 n 小于当前打印位置，则从下一行中计算出来的打印位置开始打印。如果计算后的打印位置大于当前打印位置，则从同一行中计算出来的打印位置开始打印。

输出行最左端的打印位置总是 1。在使用 Print # 语句将数据写入文件时，最右端的打印位置是输出文件的当前宽度，这一宽度可用 Width # 语句设置。

注意 要确保表格列的宽度足以容纳较宽的字符串。

当 Print 方法与 Tab 函数一起使用时，打印的外观将会被分割为均匀、定宽的列。各列的宽度等于选用字体内以磅数为单位的所有字符的平均宽度。但是，在已打印字符的个数与那些字符所占据的定宽列的数目之间不存在任何关系。例如，大写字母 W 占据超过一个定宽的列，而小写字母 i 则占据少于一个定宽的列。


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."


Tan 函数

返回一个 Double 的值，指定一个角的正切值。

语法

Tan(number)

必要的 number 参数是 Double 或任何有效的数值表达式，表示一个以弧度为单位的角度。

说明

Tan 取一角度为参数值，并返回直角的两条邻边的比值。该比值是角的对边长度除以角的邻边长度的商。

为了将角度转换为弧度，请将角度乘以 pi/180/180。为了将弧度转换为角度，请将弧度乘以 180/pi。


Tan 函数示例

本示例使用 Tan 函数来求出一个角的正切（tan()）。

Dim MyAngle, MyCotangent
MyAngle = 1.3    ' 定义角度（以“弧度”为单位）。
MyCotangent = 1 / Tan(MyAngle)    ' 利用正切来计算余切（cot()）。


Time 函数

返回一个指明当前系统时间的 Variant (Date)。

语法

Time

说明

为了设置系统时间，请使用 Time 语句。


Timer 函数

返回一个 Single，代表从午夜开始到现在经过的秒数。

语法

Timer

说明

Microsoft Windows中，Timer函数返回一秒的小数部分。在Macintosh上，计时器的精度是1秒。


Timer 函数示例

本示例使用 Timer 函数来暂停应用程序。同时用 DoEvents 在暂停期间将控制让给其他进程。

Dim PauseTime, Start, Finish, TotalTime
If (MsgBox("Press Yes to pause for 5 seconds", 4)) = vbYes Then
    PauseTime = 5    ' 设置暂停时间。
    Start = Timer    ' 设置开始暂停的时刻。
    Do While Timer < Start + PauseTime
        DoEvents    ' 将控制让给其他程序。
    Loop
    Finish = Timer    ' 设置结束时刻。
    TotalTime = Finish - Start    ' 计算总时间。
    MsgBox "Paused for " & TotalTime & " seconds"
Else
    End
End If


TimeSerial 函数

返回一个 Variant (Date)，包含具有具体时、分、秒的时间。

语法

TimeSerial(hour, minute, second)

TimeSerial 函数语法有下列的命名参数：

部分 | 描述
hour | 必要；Variant (Integer)。其值从 0 (12:00 A.M.) 到 23 (11:00 P.M.)，或一数值表达式。
minute | 必要；Variant (Integer)。任何数值表达式。
second | 必要；Variant (Integer)。任何数值表达式。

说明

为了指定一个时刻，如 11:59:59，TimeSerial 的参数取值应在正常范围内；也就是说，钟点应介于 0-23 之间，而分钟与秒应介于 0-59 之间。但是，当一个数值表达式表示某时刻之前或其后的时、分钟或秒数时，也可以为每个使用这个数值表达式的参数指定相对时间。以下示例中使用了表达式代替绝对时间数。TimeSerial 函数返回中午之前六小时 (12 - 6) 又十五分钟 (-15) 的时间，即 5:45:00 A.M.

TimeSerial(12 - 6, -15, 0)

当任何一个参数的取值超出正常范围时，它会适时进位到下一个较大的时间单位。例如，如果指定了 75（75 分钟），则这个时间被解释成一小时又十五分。如果一个参数值超出 -32，768 到 32，767 的范围，就会导致错误发生。如果三个参数指定的时间会使日期超出可接受的日期范围，则亦会导致错误发生。


TimeSerial 函数示例

本示例使用 TimeSerial 函数来将已知的时分秒转换为时间。

Dim MyTime
MyTime = TimeSerial(16, 35, 17)    ' MyTime 的值为 4:35:17 PM 之时间表达式。


TimeValue 函数

返回一个包含时间的 Variant (Date)。

语法

TimeValue(time)

必要的 time 参数，通常是一个字符串表达式，表示 0:00:00 (12:00:00 A.M.) 到 23:59:59 (11:59:59 P.M.) 之间的时刻。但是，time 也可以是表示在同一时间范围取值的任何其它表达式。如果 time 包含 Null，则返回 Null。

说明

可以使用 12 小时制或 24 小时制的时间格式。例如，”2:24PM” 和 "14:24" 均是有效的 time 表达式。

如果 time 参数包含日期信息，TimeValue 将不会返回它。但是，若 time 包含无效的日期信息，则会导致错误发生。


TimeValue 函数示例

本示例使用 TimeValue 函数将字符串转换为时间。也可以使用日期原义直接 给 Variant 或 Date 类型的变量赋值时间，例如 MyTime = #4:35:17 PM# 。

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


TypeName 函数

返回一个 String，提供有关变量的信息。

语法

TypeName(varname)

必要的 varname 参数是一个 Variant，它包含用户定义类型变量之外的任何变量。

说明

TypeName 所返回的字符串可以是下面列举的任何一个字符串：
返回字符串 | 变量
对象类型 | 类型为 objecttype 的对象
Byte | 位值
Integer | 整数
Long | 长整数
Single | 单精度浮点数
Double | 双精度浮点数
Currency | 货币
Decimal | 十进制值
Date | 日期
String | 字符串
Boolean | Boolean 值
Error | 错误值
Empty | 未初始化
Null | 无效数据
Object | 对象
Unknown | 类型未知的对象
Nothing | 不再引用对象的对象变量

如果 varname 是一个数组，则返回的字符串可以是任何一个后面添加了空括号的可能的返回字符串（或 Variant）。例如，如果 varname 是一个整数数组，则 TypeName 返回 "Integer()"。


TypeName 函数示例

本示例使用 TypeName 函数返回有关变量的信息。

' 声明变量。
Dim NullVar, MyType, 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()"。


UBound 函数

返回一个 Long 型数据，其值为指定的数组维可用的最大下标。

语法

UBound(arrayname[, dimension])

UBound 函数的语法包含下面部分：

部分 | 描述
arrayname | 必需的。数组变量的名称，遵循标准变量命名约定。
dimension | 可选的；Variant (Long)。指定返回哪一维的上界。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


UBound 函数示例

该示例使用 UBound 函数，确定数组的指定维的最大可用下标。

Dim Upper
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。


UCase 函数

返回 Variant (String)，其中包含转成大写的字符串。

语法

UCase(string)

必要的 string 参数为任何有效的字符串表达式。如果 string 包含 Null，将返回 Null。

说明

只有小写的字母会转成大写；原本大写或非字母之字符保持不变。


UCase 函数示例

本示例使用 UCase 函数来将某字符串转成全部大写。

Dim LowerCase, UpperCase
LowerCase = "Hello World 1234"    ' 要输送的字符串。
UpperCase = UCase(LowerCase)    ' 返回 "HELLO WORLD 1234"。


Val 函数

返回包含于字符串内的数字，字符串中是一个适当类型的数值。

语法

Val(string)

必要的 string 参数可以是任何有效的字符串表达式.

说明

Val 函数，在它不能识别为数字的第一个字符上，停止读入字符串。那些被认为是数值的一部分的符号和字符，例如美圆号与逗号，都不能被识别。但是函数可以识别进位制符号 &O（八进制）和 &H（十六进制）。空白、制表符和换行符都从参数中被去掉。

下面的返回值为 1615198：

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

在下面的代码中，Val 为所示的十六进制数值返回十进制数值 -1。

Val("&HFFFF")

注意 Val 函数只会将句点（.）当成一个可用的小数点分隔符。当使用不同的小数点分隔符时，如在国际版应用程序中，代之以 CDbl 来把字符串转换为数字。


Val 函数示例

本示例使用 Val 函数返回字符串中所含的数值。

Dim MyValue
MyValue = Val("2457")    ' 返回 2457。
MyValue = Val(" 2 45 7")    ' 返回 2457。
MyValue = Val("24 and 57")    ' 返回 24。


VarType 函数

返回一个 Integer，指出变量的子类型。

语法

VarType(varname)

必要的 varname 参数是一个 Variant，包含用户定义类型变量之外的任何变量。

返回值

常数 |  | 值 |  | 描述
vbEmpty | 0 |  | Empty（未初始化）
vbNull | 1 |  | Null（无有效数据）
vbInteger | 2 |  | 整数
vbLong | 3 |  | 长整数
vbSingle | 4 |  | 单精度浮点数
vbDouble | 5 |  | 双精度浮点数
vbCurrency | 6 |  | 货币值
vbDate | 7 |  | 日期
vbString | 8 |  | 字符串
vbObject | 9 |  | 对象
vbError | 10 |  | 错误值
vbBoolean | 11 |  | Boolean 值
vbVariant | 12 |  | Variant（只与变体中的数组一起使用）
vbDataObject | 13 |  | 数据访问对象
vbDecimal | 14 |  | 十进制值
vbByte | 17 |  | 位值
vbUserDefinedType | 36 |  | 包含用户定义类型的变量
vbArray | 8192 |  | 数组

注意 这些常数是由 Visual Basic 为应用程序指定的。这些名称可以在程序代码中到处使用，以代替实际值。

说明

VarType 函数自身从不对 vbArray 返回值。VarType 总是要加上一些其他值来指出一个具体类型的数组。常数 vbVariant 只与 vbArray 一起返回，以表明 VarType 函数的参数是一个 Variant 类型的数组。例如，对一个整数数组的返回值是 vbInteger + vbArray，或 8194。如果一个对象有缺省属性，则 VarType (object) 返回对象缺省属性的类型。


VarType 函数示例

本示例使用 VarType 函数决定变量的次类型（subtype）。

Dim IntVar, StrVar, DateVar, MyCheck
' 初始化变量。
IntVar = 459: StrVar = "Hello World": DateVar = #2/12/69#
MyCheck = VarType(IntVar)    ' 返回 2。
MyCheck = VarType(DateVar)    ' 返回 7。
MyCheck = VarType(StrVar)    ' 返回 8。


Weekday 函数

返回一个 Variant (Integer)，包含一个整数，代表某个日期是星期几。

语法

Weekday(date, [firstdayofweek])

Weekday 函数语法有下列的命名参数：

部分 | 描述
date | 必要。能够表示日期的 Variant、数值表达式、字符串表达式或它们的组合。如果 date 包含 Null，则返回 Null。
Firstdayofweek | 可选。指定一星期第一天的常数。如果未予指定，则以 vbSunday 为缺省值。

设置

firstdayofweek 参数有以下设定值：

常数 | 值 | 描述
vbUseSystem | 0 | 使用 NLS API 设置。
VbSunday | 1 | 星期日（缺省值）
vbMonday | 2 | 星期一
vbTuesday | 3 | 星期二
vbWednesday | 4 | 星期三
vbThursday | 5 | 星期四
vbFriday | 6 | 星期五
vbSaturday | 7 | 星期六

返回值

Weekday 函数可以返回以下诸值：

常数 | 值 | 描述
vbSunday | 1 | 星期日
vbMonday | 2 | 星期一
vbTuesday | 3 | 星期二
vbWednesday | 4 | 星期三
vbThursday | 5 | 星期四
vbFriday | 6 | 星期五
vbSaturday | 7 | 星期六


WeekdayName函数

描述

返回一个字符串，表示一星期中的某天。

语法

WeekdayName(weekday, abbreviate, firstdayofweek)

WeekdayName函数语法有如下几部分：

部分 | 描述
weekday | 必需的。数字值，表示一星期中的某天。该数字值要依赖于firstdayofweek设置中的设置值来决定。
abbreviate | 可选的。Boolean值，表示星期的名称是否被缩写。如果忽略该值，缺省值为False，表明星期的名称不能被缩写。
firstdayofweek | 可选的。数字值，表示一星期中第一天。关于其值，请参阅“设置值”部分。

设置值

firstdayofweek参数值如下：

常数 | 值 | 描述
vbUseSystem | 0 | 使用本国语言支持 (NLS) API设置值。
vbSunday | 1 | 星期日（缺省）。
vbMonday | 2 | 星期一
vbTuesday | 3 | 星期二
vbWednesday | 4 | 星期三
vbThursday | 5 | 星期四
vbFriday | 6 | 星期五
vbSaturday | 7 | 星期六


Year 函数

返回 Variant (Integer)，包含表示年份的整数。

语法

Year(date)

必要的 date 参数，可以是任何能够表示日期的 Variant、数值表达式、字符串表达式或它们的组合。如果 date 包含 Null，则返回 Null。


Year 函数示例

本示例使用 Year 函数返回某个日期的年份。在开发环境中，日期原义会根据系统的地区设置，以短式日期格式显示。

Dim MyDate, MyYear
MyDate = #February 12, 1969#    ' 指定一日期。
MyYear = Year(MyDate)    ' MyYear 的值为 1969。


算术运算符

^ 运算符

* 运算符

/ 运算符

\ 运算符

Mod 运算符

+ 运算符

- 运算符


连接运算符

& 运算符

+ 运算符


转换函数

Asc 函数

CBool 函数

CByte 函数

CCur 函数

CDate 函数

CDec 函数

CDbl 函数

Chr 函数

CInt 函数

CLng 函数

CSng 函数

CStr 函数

CVar 函数

CVErr 函数

Format 函数

Hex 函数

Oct 函数

Str 函数

Val 函数


数据类型概述

以下表格显示所支持的数据类型，以及存储空间大小与范围。

数据类型 存储空间大小 范围

Byte | 1 个字节 | 0 到 255
Boolean | 2 个字节 |  | True 或 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.79769313486231E308 到 -4.94065645841247E-324；正数时从4.94065645841247E-324 到 1.79769313486232E308
Currency (变比整型) | 8 个字节 |  | 从 -922,337,203,685,477.5808 到 922,337,203,685,477.5807
Decimal | 14 个字节 |  | 没有小数点时为 +/-79,228,162,514,264,337,593,543,950,335，而小数点右边有 28 位数时为 +/-7.9228162514264337593543950335；最小的非零值为 +/-0.0000000000000000000000000001
Date | 8 个字节 |  | 100 年 1 月 1 日 到 9999 年 12 月 31 日
Object | 4 个字节 |  | 任何 Object 引用
String (变长) | 10 字节加字符串长度 |  | 0 到大约 20 亿
String (定长) | 字符串长度 |  | 1 到大约 65,400
Variant (数字) | 16 个字节 |  | 任何数字值，最大可达 Double 的范围
Variant (字符) | 22 个字节加字符串长度 |  | 与变长 String 有相同的范围
用户自定义 （利用 Type） | 所有元素所需数目 |  | 每个元素的范围与它本身的数据类型的范围相同。

注意 任何数据类型的数组都需要 20 个字节的内存空间，加上每一数组维数占 4 个字节，再加上数据本身所占用的空间。数据所占用的内存空间可以用数据元数目乘上每个元素的大小加以计算。例如，以 4 个 2 字节之 Integer 数据元所组成的一维数组中的数据，占 8 个字节。这 8 个字节加上额外的 24 个字节，使得这个数组所需总内存空间为 32 个字节。

包含一数组的 Variant 比单独的一个数组需要多 12 个字节。

注意 使用 StrConv 函数把字符串数据从一种类型转换为另一种类型。


导出的数学函数

以下为非基本数学函数的列表，皆可由基本数学函数导出：

函数 | 由基本函数导出之公式
Secant（正割） | Sec(X) = 1 / Cos(X)
Cosecant（余割） | Cosec(X) = 1 / Sin(X)
Cotangent（余切） | Cotan(X) = 1 / Tan(X)
Inverse Sine （反正弦） | Arcsin(X) = Atn(X / Sqr(-X * X + 1))
Inverse Cosine （反余弦） | Arccos(X) = Atn(-X / Sqr(-X * X + 1)) + 2 * Atn(1)
Inverse Secant （反正割） | Arcsec(X) = Atn(X / Sqr(X * X - 1)) + Sgn((X) - 1) * (2 * Atn(1))
Inverse Cosecant （反余割） | Arccosec(X) = Atn(X / Sqr(X * X - 1)) + (Sgn(X) - 1) * (2 * Atn(1))
Inverse Cotangent （反余切） | Arccotan(X) = Atn(X) + 2 * Atn(1)
Hyperbolic Sine （双曲正弦） | HSin(X) = (Exp(X) - Exp(-X)) / 2
Hyperbolic Cosine （双曲余弦） | HCos(X) = (Exp(X) + Exp(-X)) / 2
Hyperbolic Tangent （双曲正切） | HTan(X) = (Exp(X) - Exp(-X)) / (Exp(X) + Exp(-X))
Hyperbolic Secant （双曲正割） | HSec(X) = 2 / (Exp(X) + Exp(-X))
Hyperbolic Cosecant（双曲余割） | HCosec(X) = 2 / (Exp(X) - Exp(-X))
Hyperbolic Cotangent（双曲余切） | HCotan(X) = (Exp(X) + Exp(-X)) / (Exp(X) - Exp(-X))
Inverse Hyperbolic Sine（反双曲正弦） | HArcsin(X) = Log(X + Sqr(X * X + 1))
Inverse Hyperbolic Cosine（反双曲余弦） | HArccos(X) = Log(X + Sqr(X * X - 1))
Inverse Hyperbolic Tangent（反双曲正切） | HArctan(X) = Log((1 + X) / (1 - X)) / 2
Inverse Hyperbolic Secant（反双曲正割） | HArcsec(X) = Log((Sqr(-X * X + 1) + 1) / X)
Inverse Hyperbolic Cosecant | HArccosec(X) = Log((Sgn(X) * Sqr(X * X + 1) + 1) / X)
Inverse Hyperbolic Cotangent （反双曲余切） | HArccotan(X) = Log((X + 1) / (X - 1)) / 2
以 N 为底的对数 | LogN(X) = Log(X) / Log(N)


逻辑运算符

And 运算符

Eqv 运算符

Imp 运算符

Not 运算符

Or 运算符

Xor 运算符


数学函数

Abs 函数

Atn 函数

Cos 函数

Exp 函数

Fix 函数

Int 函数

Log 函数

Rnd 函数

Sgn 函数

Sin 函数

Sqr 函数

Tan 函数

导出的数学函数


运算符优先顺序

在一个表达式中进行若干操作时，每一部分都会按预先确定的顺序进行计算求解，称这个顺序为运算符的优先顺序。

在表达式中，当运算符不止一种时，要先处理算术运算符，接着处理比较运算符，然后再处理逻辑运算符。所有比较运算符的优先顺序都相同；也就是说，要按它们出现的顺序从左到右进行处理。而算术运算符和逻辑运算符则必须按下列优先顺序进行处理：

算术 | 比较 | 逻辑
指数运算 (^) | 相等 (=) | Not
负数 (–) | 不等 (<>) | And
乘法和除法 (*、 /) | 小于 (<) | Or
整数除法 (\) | 大于 (>) | Xor
求模运算 (Mod) | 小于或相等 (<=) | Eqv
加法和减法 (+、 –) | 大于或相等 (>=) | Imp
字符串连接 (&) | Like Is |

当乘法和除法同时出现在表达式中时，每个运算都按照它们从左到右出现的顺序进行计算。当乘法和除法同时出现在表达式中时，每个运算也都按照它们从左到右出现的顺序进行计算。可以用括号改变优先顺序，强令表达式的某些部分优先运行。括号内的运算总是优先于括号外的运算。但是，在括号之内，运算符的优先顺序不变。

字符串连接运算符 (&) 不是算术运算符，但是，就其优先顺序而言，它在所有算术运算符之后，而在所有比较运算符之前。

Like 的优先顺序与所有比较运算符都相同，实际上是模式匹配运算符。

Is 运算符是对象引用的比较运算符。它并不将对象或对象的值进行比较，而只确定两个对象引用是否参照了相同的对象。


运算符摘要

运算符 | 描述
算术运算符 | 用来进行数学计算的运算符。
比较运算符 | 用来进行比较的运算符。
连接运算符 | 用来合并字符串的运算符。
逻辑运算符 | 用来执行逻辑运算的运算符。


数组关键字总结

作用 | 关键字
确认一个数组。 | IsArray
建立一个数组。 | Array
改变缺省最小值。 | Option Base
声明及初始化数组。 | Dim, Private, Public, ReDim, Static
判断数组下标极限值。 | LBound, UBound
重新初始化一个数组。 | Erase, ReDim


Collection 对象关键字总结

作用 | 关键字
建立一个 Collection 对象。 | Collection
添加对象到集合对象中。 | Add
从集合对象中删除对象。 | Remove
引用集合对象中的项。 | Item


编译命令关键字总结

作用 | 关键字
定义编译常数。 | #Const
编译程序码中的选择区块。 | #If...Then...#Else


控制流关键字总结

作用 | 关键字
分支。 | GoSub...Return, GoTo, On Error, On...GoSub, On...GoTo
退出或暂停程序。 | DoEvents, End, Exit, Stop
循环。 | Do...Loop For...Next, For Each...Next, While...Wend, With
判断。 | Choose, If...Then...Else, Select Case, Switch
使用过程。 | Call, Function, Property Get, Property Let, Property Set, Sub


变换关键字总结

作用 | 关键字
ANSI 值变换为字符串。 | Chr
大小写变换。 | Format, LCase, UCase
日期变换为数字串。 | DateSerial, DateValue
数字进制变换。 | Hex, Oct
数值变换为字符串。 | Format, Str
数据类型变换。 | CBool, CByte, CCur, CDate, CDbl, CDec, CInt, CLng, CSng, CStr, CVar, CVErr, Fix, Int
日期变换。 | Day, Month, Weekday, Year
时间变换。 | Hour, Minute, Second
字符串变换为 ASCII 值。 | Asc
字符串变换为数值。 | Val
时间变换为数字串。 | TimeSerial, TimeValue


数据类型关键字总结

作用 | 关键字
数据类型变换。 | CBool, CByte, CCur, CDate, CDbl, CDec, CInt, CLng, CSng, CStr, CVar, CVErr, Fix, Int
设置数据类型。 | Boolean, Byte, Currency, Date, Double, Integer, Long, Object, Single, String, Variant (default)
检查数据类型。 | IsArray, IsDate, IsEmpty, IsError, IsMissing, IsNull, IsNumeric, IsObject


日期与时间关键字总结

作用 | 关键字
设置当前日期或时间。 | Date ,Now, Time
计算日期。 | DateAdd, DateDiff, DatePart
返回日期。 | DateSerial, DateValue
返回时间。 | TimeSerial, TimeValue
设置日期或时间。 | Date, Time
计时。 | Timer


目录和文件关键字总结

作用 | 关键字
改变目录或文件夹。 | ChDir
改变磁盘。 | ChDrive
复制文件。 | FileCopy
新建目录或文件夹。 | MkDir
删除目录或文件夹。 | RmDir
重新命名文件、目录或文件夹。 | Name
返回当前路径。 | CurDir
返回文件的日期、时间。 | FileDateTime
返回文件、目录及标签属性。 | GetAttr
返回文件长度。 | FileLen
返回文件名或磁盘标签。 | Dir
设置有关文件属性的信息。 | SetAttr


错误关键字总结

作用 | 关键字
产生运行时错误。 | Clear, Error, Raise
取得错误信息。 | Error
提供错误信息。 | Err
返回 Error 变体。 | CVErr
运行时的错误处理。 | On Error, Resume
类型确认。 | IsError


金融关键字总结

作用 | 关键字
计算折旧率。 | DDB, SLN, SYD
计算未来值。 | FV
计算利率。 | Rate
计算本质利率。 | IRR, MIRR
计算期数。 | NPer
计算支付。 | IPmt, Pmt, PPmt
计算当前净值。 | NPV, PV


输入与输出关键字总结

作用 | 关键字
访问或创建文件。 | 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 #


关键字分类

分类 | 描述
数组 | 建立、定义与使用数组。
编译命令 | 控制编译方式。
控制流 | 循环及过程流程控制。
变换 | 变换数值及数据类型。
数据类型 | 数据类型与 variant 子型态。
日期与时间 | 变换、使用日期与时间表达式。
目录和文件 | 控制文件系统与处理文件。
错误 | 侦测与返回错误值。
金融 | 进行各种金融运算。
输入与输出 | 接受输入与显示、打印输出。
数学 | 完成各种数学运算。
其他 | 激活其他应用程序与处理事件。
操作符 | 比较表达式与完成其它操作。
字符串处理 | 处理字符串及字符串数据类型。
变量与常数 | 声明、定义变量与常数。


数学关键字总结

作用 | 关键字
三角函数。 | Atn, Cos, Sin, Tan
一般计算。 | Exp, Log, Sqr
产生随机数。 | Randomize, Rnd
取得绝对值。 | Abs
取得表达式的正负号。 | Sgn
数值变换。 | Fix, Int


其他关键字总结

作用 | 关键字
处理搁置事件。 | DoEvents
运行其他程序。 | AppActivate, Shell
发送按键信息给其他应用程序。 | SendKeys
发出警告声。 | Beep
系统。 | Environ
提供命令行字符串。 | Command
Macintosh。 | MacID, MacScript
自动。 | CreateObject, GetObject
色彩。 | QBColor, RGB


运算符关键字总结

作用 | 关键字
算术。 | ^, -, *, /, \, Mod, +, &
比较。 | =, <>, <, >, <=, >=, Like, Is
逻辑运算。 | Not, And, Or, Xor, Eqv, Imp


注册关键字总结

作用 | 关键字
删除程序设置。 | DeleteSetting
读入程序设置。 | GetSetting, GetAllSettings
保存程序设置。 | SaveSetting


字符串处理关键字总结

作用 | 关键字
比较两个字符串。 | StrComp
变换字符串。 | StrConv
大小写变换。 | 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, New, Static
声明模块为私有。 | Option Private Module
判断 Variant。 | IsArray, IsDate, IsEmpty, IsError, IsMissing, IsNull, IsNumeric, IsObject, TypeName, VarType
引用当前对象。 | Me
变量须明确声明。 | Option Explicit
设置缺省数据类型。 | Deftype


As

As 关键字用于下列语句：

Const 语句

Declare 语句

Dim 语句

Function 语句

Name 语句

Open 语句

Private 语句

Property Get 语句

Property Let 语句

Property Set 语句

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

Empty 关键字是用作 Variant 子类型。它表示未初始化的变量值。


Error

Error 关键字用于下列上下文：

Error 函数

Error 语句

On Error 语句


False

False 关键字的值等于 0。


For

For 关键字用于下列上下文：

For...Next 语句

For Each...Next 语句

Open 语句


Friend

修改窗体模块或者类模块中的一个过程的定义，使得该过程可以被类外的模块调用，但必须是在定义该类的工程的部分内。Friend 过程在标准的模块中是不能使用的。

语法

[Private | Friend | Public] [Static] [Sub | Function | Property] procedurename

必需的 procedurename 是所要设定为在整个工程中都是可见的过程的名称，但是该过程对于类的控制器却是不可见的。

说明

类中的 Public 过程在任何地方都可以调用，即使是被该类实例的控制器所调用也可以。声明一个过程为 Private 就阻止了该对象的控制器对于该过程的调用，但是同时也阻止了定义该类的工程内部对该过程的调用。Friend 使得该过程在整个工程中都是可见的，但是对于一个对象实例的控制器却是不可见的。Friend 只能出现在窗体模块和类模块中，并且只能修改过程的名称，不能修改变量或者类型。一个类中的过程可以访问某个工程所有其它类的 Friend 过程。Friend 过程不会出现在类的类型库中。一个 Friend 过程不能被后期绑定。


Friend 示例

当下面的代码被放置在一个类模块中时，该段代码会使得成员变量 dblBalance 对该工程中的类的所有用户来说都是可访问的。类的任何用户都可以获得该变量的值；但是只有工程内的代码可以对该变量赋值。

Private dblBalance As Double

Public Property Get Balance() As Double
    Balance = dblBalance
End Property

Friend Property Let Balance(dblNewBalance As Double)
    dblBalance = dblNewBalance
End Property


Get

Get 关键字用于下列上下文：

Get 语句

Property Get 语句


Input

Input 关键字用于下列上下文：

Input 函数

Input # 语句

Line Input # 语句

Open 语句


Is

Is 关键字用于下列上下文：

If...Then...Else 语句

Is 运算子

Select Case 语句


Len

Len 关键字用于下列上下文：

Len 函数

Open 语句


Let

Let 关键字用于下列上下文：

Let 语句

Property Let 语句


Lock

Lock 关键字用于下列上下文：

Lock、Unlock 语句

Open 语句


Me

Me 关键字像是隐含声明的变量。这个关键字适用于类模块中的每个过程。当类有多个实例时，Me 在代码正在执行的地方提供引用具体实例的方法。要把当前执行类实例的有关信息传递到另一个模块的过程，Me 非常有用。例如，假定模块中有以下过程：

Sub ChangeFormColor(FormName As Form)
    FormName.BackColor = RGB(Rnd * 256, Rnd * 256, Rnd * 256)
End Sub

可以调用这个过程并使用下列语句将窗体类的当前实例作为参数传递。

ChangeFormColor Me


Mid

Mid 关键字用于下列上下文：

Mid 函数

Mid 语句


New

New 关键字用于下列上下文：

Dim 语句

Private 语句

Public 语句

Set 语句

Static 语句


Next

Next 关键字用于下列上下文：

For...Next 语句

For Each...Next 语句

On Error 语句

Resume 语句


Nothing

使用 Nothing 关键字被将对象变量从实际对象中分离开来。要使用 Set 语句将 Nothing 赋值给对象变量。例如：

Set MyObject = Nothing

几个对象变量可以引用同一个实际对象。当 Nothing 被赋值给一个对象变量时，该变量不再引用任何实际对象。当几个对象变量引用同一个对象时，只有将全部对象变量都设置成 Nothing 之后，与被引用的对象有关联的内存资源及系统资源才会被释放掉，在这里，或者明确使用 Set，或者在最后一个设置成 Nothing 的对象变量超出范围后隐含地使用 Set。


Null

Null 关键字被用来作为 Variant 子类型。它说明变量不包含有效数据。


On

On 关键字用于下列上下文：

On Error 语句

On...GoSub 语句

On...GoTo 语句


Option

Option 关键字用于下列上下文：

Option Base 语句

Option Compare 语句

Option Explicit 语句

Option Private 语句


Optional

Optional 关键字用于下列上下文：

Declare 语句

Function 语句

Property Get 语句

Property Let 语句

Property Set 语句

Sub 语句


ParamArray

ParamArray 关键字用于下列上下文：

Declare 语句

Function 语句

Sub 语句


Print

Print 关键字用于下列上下文：

Print 方法

Print # 语句


Private

Private 关键字用于下列上下文：

Const 语句

Declare 语句

Enum 语句

Function 语句

Option Private 语句

Private 语句

Property Get 语句

Property Let 语句

Property Set 语句

Sub 语句

Type 语句


Property

Property 关键字用于下列上下文：

Property Get 语句

Property Let 语句

Property Set 语句


Public

Public 关键字用于下列上下文：

Const 语句

Declare 语句

Enum 语句

Event 语句

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 语句

Property Get 语句

Property Let 语句

Property Set 语句

Static 语句

Sub 语句


Step

Step 关键字用于下列上下文：

For...Next 语句

For Each...Next 语句


String

String 关键字用于下列上下文：

String 数据类型

String 函数


Then

Then 关键字用于下列上下文：

#If...Then...#Else 命令

If...Then...Else 语句


Time

Time 关键字用于下列上下文：

Time 函数

Time 语句


To

To 关键字用于下列上下文：

Dim 语句

For...Next 语句

Lock、Unlock 语句s

Private 语句

Public 语句

ReDim 语句

Select Case 语句

Static 语句

Type 语句


True

True 关键字的值等于 -1。


WithEvents

WithEvents 关键字用于下列上下文：

Dim 语句

Private 语句

Public 语句


Add 方法

添加一个成员到 Collection 对象。

语法

object.Add item, key, before, after

Add 方法的语法具有下列对象限定符和命名参数：

部分 | 描述
object | 必需的。对象表达式，其值为“应用于”列表中的对象。
item | 必需的。任意类型的表达式，指定要添加到集合中的成员。
key | 可选的。唯一字符串表达式，指定可以使用的键字符串，代替位置索引来访问集合中的成员。
before | 可选的。表达式，指定集合中的相对位置。在集合中将添加的成员放置在 before 参数识别的成员之前。如果为一数值表达式，则 before 必须是介于 1 和集合 Count 属性值之间的值。如果为一字符串表达式，则当添加一个被引用的成员到集合时，before 必须对应于指定的 key 值。可以指定 before 位置或 after 位置，但不能同时指定这两个位置。
after | 可选。表达式，指定集合中的相对位置。在集合中将添加的成员放置在 After 参数识别的成员之后。如果为一数值表达式，则 after 必须是介于 1 和集合 Count 属性值之间的值；如果为一字符串表达式，则当添加一个被引用的成员到集合时，after 必须对应于指定的 key 值。可以指定 before 位置或 after 位置，但不能同时指定这两个位置。

说明

before 或 after 参数是字符串表达式或数值表达式，均须引用集合中现有成员，否则将导致错误发生。

如果指定的 key 和集合中现有成员的 key 发生重复，则也会导致错误发生。


Add方法(Dictionary)

描述

添加一对相对应的关键字和条目到 Dictionary 对象。

语法

object.Add key, item

Add方法的语法有如下几部分：

部分 | 描述
Object | 必需的。一个 Dictionary 对象的名字。
Key | 必需的。与所添加的条目相关联的关键字。
Item | 必需的。与所添加的关键字相关联的条目。

说明

如果该关键字已经存在，则产生一个错误。


Add 方法(Folder)

Add 方法(Folders)

描述

添加一个新的 Folder 到 Folders 集合。

语法

object.Add folderName

Add方法的语法有如下几部分：

部分 | 描述
Object | 必需的。一个Folders集合的名称。
FolderName | 必需的。新添加的Folder的名称。

说明

如果 folderName 已经存在，则产生一个错误。


Assert 方法

有条件地在该方法出现的行上挂起执行。

语法

object.Assert booleanexpression

Assert 方法的语法有如下的对象限定符和参数：

部分 | 描述
object | 必需的。总是 Debug 对象。
booleanexpression | 必需的。一个值为 True 或者 False 的表达式。

说明

Assert 调用只在开发环境中工作。当模块被编译成为一个可执行的文件时，调用 Debug 对象的方法就会被忽略。

全部 booleanexpression 常常被计算。例如，即使一个 And 表达式的第一部分被计算为 False，整个表达式还要被计算。


Assert 方法示例

下面的示例说明如何使用 Assert 方法。示例需要一个带有两个按纽控件的窗体。缺省的按纽名称是 Command1 和 Command2 。

当示例运行时，单击 Command1 按纽使得按纽上的文本在 0 和 1 之间进行切换。单击 Command2 按纽可能不做任何事，也可能引起一个确认，应该执行哪一个操作取决于 Command1 按纽上所显示的值。该确认将在最后一个语句执行之后使整个执行停止，并且 Debug.Assert 行被突出显式。

Option Explicit
Private blnAssert As Boolean
Private intNumber As Integer

Private Sub Command1_Click()
    blnAssert = Not blnAssert
    intNumber = IIf(intNumber <> 0, 0, 1)
    Command1.Caption = intNumber
End Sub

Private Sub Command2_Click()
    Debug.Assert blnAssert
End Sub

Private Sub Form_Load()
    Command1.Caption = intNumber
    Command2.Caption = "Assert Tester"
End Sub


BuildPath 方法

描述

追加一个名字到一个已经存在的路径。

语法

object.BuildPath(path, name)

BuildPath 方法语法有如下几部分：

部分 | 描述
object | 必需的。始终是 FileSystemObject 的名字。
path | 必需的。要对其追加名字的已存在路径。路径可以是绝对的也可以是相对的，不必指定一个已存在的文件夹。
name | 必需的。要追加到已存在路径上的名字。

说明

只有在需要时，BuildPath 方法才在已存在路径和名字之间插入一个附加的路径分隔符。


Clear 方法

清除 Err 对象的所有属性设置。

语法

object.Clear

objec 总是 Err 对象。

说明

在处理错误之后使用 Clear 来清除 Err 对象，例如，在对 On Error Resume Next 使用拖延错误处理时就可使用 Clear。每当执行下列语句时就会自动调用 Clear 方法：

  • 任意类型的 Resume 语句。

  • Exit Sub, Exit Function, Exit Property

  • 任何 On Error 语句。

    注意 当处理因访问其他对象产生的错误时，与其使用 On Error GoTo，不如使用 On Error Resume Next。每一次与对象打交道之后都检查 Err，则可消除代码访问对象时的含混之处。可以确认是哪个对象将错误引入 Err.Number 中，也可以确认最初是哪个对象产生了这个错误（Err.Source 中指定的对象）。


Clear 方法示例

本示例使用 Err 对象的 Clear 方法将 Err 对象之数值属性重新设置为零，并将其字符串属性设置为零长度字符串。如果在代码中省略 Clear 方法，则每完成一次循环便会显示一次错误信息（发生错误之后），不论程序中的计算结果是否真的有错误。

Dim Result(10) As Integer    ' 声明数组变量
            '其元素容易溢出
Dim indx
On Error Resume Next    ' 将错误处理的方式改为“继续下一行”。
Do Until indx = 10
    ' 下面计算若有错误发生，便显示错误信息。
    Result(indx) = Rnd * indx * 20000
    If Err.Number <> 0 Then
        MsgBox Err, , "Error Generated: ", Err.HelpFile, Err.HelpContext
        Err.Clear    ' 清除 Err 对象的属性。
    Else
        indx = indx + 1
    End If
Loop


Close 方法

描述

关闭一个打开的 TextStream 文件。

语法

object.Close

object始终是一个 TextStream 对象的名字。


Copy 方法

描述

把一个指定的文件或文件夹从一个地方复制到另一个地方。

语法

object.Copy destination[, overwrite]

Copy 方法语法有如下几部分：

部分 | 描述
object | 必需的。始终是一个 File 或 Folder 对象的名字。
destination | 必需的。文件或文件夹要复制到的接受端。不允许有通配符。
overwrite | 可选的。Boolean 值，如果该值为 True （缺省），则已存在的文件或文件夹将被覆盖。如果为 False，则它们不被覆盖。

说明

对一个 File 或 Folder，Copy 方法的结果和执行 FileSystemObject.CopyFile 或FileSystemObject.CopyFolder 操作的结果是一样的，在后者中， object所引用的文件或文件夹是作为参数传递的。应当注意，后面的方法能够复制多个文件或文件夹。


CopyFile 方法

描述

把一个或多个文件从一个地方复制到另一个地方。

语法

object.CopyFile source, destination[, overwrite]

CopyFile 方法语法有如下几部分：

部分 | 描述
object | 必需的。object始终是一个 FileSystemObject 的名字。
source | 必需的。指明一个或多个要被复制文件的字符串文件说明，它可以包括通配符。
destination | 必需的。指明 source 中的一个或多个文件要被复制到的接受端的字符串，不允许有通配符。
overwrite | 选项的。Boolean 值，它表示存在的文件是否被覆盖。如果是 True，文件将被覆盖；如果是 False，它们不被覆盖。缺省值是 True。注意如果 destination 具有只读属性设置，不论 overwrite 值如何，CopyFile 都将失败。

说明

通配符只能用在 source 参数的最后一个路径部件。例如，你可以在下面请况使用通配符：

FileSystemObject.CopyFile "c:\mydocuments\letters\*.doc", "c:\tempfolder\"

但下面情况不能使用：

FileSystemObject.CopyFile "c:\mydocuments\*\R1???97.xls", "c:\tempfolder"

如果 source 包含通配符或 destination 以路径分隔符（\）为结尾，则认为 destination 是一个已存在文件夹，在其中复制相匹配的文件。否则认为 destination 是一个要创建文件的名字。不论是那种情况，当复制一个文件时，可能发生三种事件。

  • 如果 destination 不存在，source 得到复制。这是通常的情况。

  • 如果 destination 是一个已存在的文件，则当 overwrite 值为 False 时发生一个错误，否则，source的复制文件将试图覆盖已存在文件。

  • 如果 destination 是一个目录，发生一个错误。

如果使用通配符的 source 不能和任何文件匹配，同样产生一个错误。CopyFile 方法停止在它遇到的第一个错误上。不要试图回卷或撤消错误发生前所做的任何改变。


CopyFolder 方法

描述

从一个地方递归地复制一个文件夹到另一个地方。

语法

object.CopyFolder source, destination[, overwrite]

CopyFolder 方法语法有如下几部分：

部分 | 描述
Object | 必需的。始终为一个 FileSystemObject 的名字。
source | 必需的。指明一个或多个被复制文件夹的字符串文件夹说明，可以包括通配符。
destination | 必需的。指明 source 中被复制文件夹和子文件夹的接受端的字符串，不允许有通配符。
overwrite | 选项的。Boolean 值，它表示已存在的文件夹是否被覆盖。如果为 True，文件被覆盖。如果为 False，文件不被覆盖。缺省值为 True。

说明

通配符仅可用于 source 参数的最后一个路径部件。例如你可以在下面情况使用它：

FileSystemObject.CopyFolder "c:\mydocuments\letters\*", "c:\tempfolder\"

但不能在下面情况使用它：

FileSystemObject.CopyFolder "c:\mydocuments\*\*", "c:\tempfolder\"

如果 source 包含通配符或 destination 以路径分隔符（\）为结尾，则认为 destination 是一个已存在的文件夹，在其中复制相匹配的文件夹和子文件夹。否则认为 destination 是一个要创建的文件夹的名字。不论何种情况，当复制一个文件夹时，可能发生四种事件。

  • 如果 destination 不存在，source 文件夹和它所有的内容得到复制。这是通常的情况。

  • 如果 destination 是一个已存在的文件，则发生一个错误。

  • 如果 destination 是一个目录，它将尝试复制文件夹和它所有的内容。如果一个包含在 source 的文件已在 destination 中存在，当 overwrite 为 False 时发生一个错误，否则它将尝试覆盖这个文件。

  • 如果 destination 是一个只读目录，当尝试去复制一个已存在的只读文件到此目录并且 overwrite为 False 时，则发生一个错误。

如果 source 使用的通配符不能和任何文件夹匹配，也发生一个错误。

CopyFolder 方法停止在它遇到的第一个错误上。不要尝试回卷错误发生前所做的任何改变。


CreateFolder 方法

描述

创建一个文件夹。

语法

object.CreateFolder(foldername)

CreateFolder 方法有如下几部分：

部分 | 描述
object | 必需的。始终是一个 FileSystemObject 的名字。
foldername | 必需的。字符串表达式，它标识创建的文件夹。

说明

如果指定的文件夹已经存在，则发生一个错误。


CreateTextFile 方法

描述

创建一个指定的文件名并且返回一个用于该文件读写的 TextStream 对象。

语法

object.CreateTextFile(filename[, overwrite[, unicode]])

CreateTextFile 方法有如下几部分：

部分 | 描述
object | 必需的。始终是一个 FileSystemObject 或 Folder 对象的名字。
filename | 必需的。字符串表达式，它标识创建的文件。
overwrite | 可选的。Boolean 值，表示一个已存在文件是否可被覆盖。如果可被覆盖其值为 True，其值为 False 时不能覆盖。如果它被省略，则已存在文件不能覆盖。
unicode | 可选的。Boolean 值，表示文件是作为一个 Unicode 文件创建的还是作为一个ASCII 文件创建的。如果作为一个 Unicode 文件创建，其值为 True，作为一个 ASCII 文件创建，其值为 False。如果省略的话，则认为是一个 ASCII 文件。

说明

下面的代码举例说明如何使用 CreateTextFile 方法创建和打开文本文件。

Sub CreateAfile
    Set fs = CreateObject("Scripting.FileSystemObject")
    Set a = fs.CreateTextFile("c:\testfile.txt", True)
    a.WriteLine("This is a test.")
    a.Close
End Sub

对于一个已经存在的 filename，如果 overwrite 参数是 False 或者没有提供，则发生一个错误。


Delete 方法

描述

删除一个指定的文件或文件夹。

语法

object.Delete force

Delete 方法语法有如下几部分：

部分 | 描述
object | 必需的。始终是一个 File 或 Folder 对象的名字。
force | 可选的。Boolean 值，如果要删除具有只读属性设置的文件或文件夹，其值为True。当其值为 False 时（缺省），不能删除具有只读属性设置的文件或文件夹。

说明

如果指定的文件或文件夹不存在，则发生一个错误。

对于一个 File 或 Folder，Delete 方法的结果和 执行 FileSystemObject.DeleteFile 或FileSystemObject.DeleteFolder 操作的结果是一样的。

Delete 方法对于文件夹内是否有内容不做区别。不管指定的文件夹是否有内容，它都被删除。


DeleteFile 方法

描述

删除一个指定的文件。

语法

object.DeleteFile filespec[, force]

DeleteFile 方法语法有如下几部分：

部分 | 描述
object | 必需的。始终是一个 FileSystemObject 的名字。
filespec | 必需的。要删除文件的名字。Filespec 可以在最后的路径部件中包含通配符。
force | 可选的。Boolean 值，如果要删除具有只读属性设置的文件，其值为 True。如果其值为 False （缺省），则不能删除具有只读属性设置的文件。

说明

如果没有发现相匹配的文件，则产生一个错误。DeleteFile 方法停在它遇到的第一个错误上。不要尝试回卷或撤消错误发生前所做的任何改变。


DeleteFolder 方法

描述

删除一个指定的文件夹和它的内容。

语法

object.DeleteFolder folderspec[, force]

DeleteFolder 方法语法有如下几部分：

部分 | 描述
object | 必需的。始终是一个 FileSystemObject 的名字。
folderspec | 必需的。要删除的文件夹的名字。 Folderspec 可以在最后的路径部件中包含通配符。
force | 可选的。Boolean 值，如果要删除具有只读属性设置的文件夹，其值为 True，如果值为 False （缺省），则不能删除具有只读属性设置的文件夹。

说明

DeleteFolder方法对文件夹中有无内容不做区别。不管指定的文件夹中是否有内容，它都被删除。

如果没有发现相匹配的文件夹，则发生一个错误。DeleteFolder 方法停止在它遇到的第一个错误上，不要尝试回卷或撤消错误发生前所做的任何改变。


DriveExists 方法

描述

如果指定的驱动器存在，返回 True，如果不存在返回 False。

语法

object.DriveExists(drivespec)

DriveExists 方法语法有如下几部分：

部分 | 描述
Object | 必需的。始终是一个 FileSystemObject 的名字。
Drivespec | 必需的。一个驱动器字符或一个完整的路径说明。

说明

对于可删除介质的驱动器，即使没有介质存在， DriveExists 方法也返回 True。使用 Drive 对象的 IsReady 属性确定驱动器是否准备好。


Exists 方法

描述

如果在 Dictionary 对象中指定的关键字存在，返回 True，若不存在，返回 False。

语法

object.Exists(key)

Exists 方法语法有如下几部分：

部分 | 描述
Object | 必需的。始终是一个 Dictionary 对象的名字。
Key | 必需的。在 Dictionary 对象中搜索的 Key 值。


FileExists 方法

描述

如果指定的文件存在，返回 True，若不存在，则返回 False。

语法

object.FileExists(filespec)

FileExists 方法语法有如下几部分：

部分 | 描述
object | 必需的。始终是一个 FileSystemObject 的名字。
filespec | 必需的。要确定是否存在的文件的名字。如果认为文件不在当前文件夹中，必须提供一个完整的路径说明（绝对的或相对的）。


FolderExists 方法

描述

如果指定的文件夹存在返回 True，不存在返回 False。

语法

object.FolderExists(folderspec)

FolderExists 方法语法有如下几部分：

部分 | 描述
object | 必需的。始终是一个 FileSystemObject 对象的名字。
folderspec | 必需的。要确定是否存在的文件夹名字。如果认为文件夹不在当前文件夹中，必须提供一个完整的路径说明（绝对的或相对的）。


GetAbsolutePathName 方法

描述

从提供的路径说明中返回一个完整、明确的路径。

语法

object.GetAbsolutePathName(pathspec)

GetAbsolutePathName 方法语法有如下几部分：

部分 | 描述
object | 必需的。始终是一个 FileSystemObject 的名字。
pathspec | 必需的。要改变到一个完整、明确路径的路径说明。

说明

一个路径如果提供了从指定驱动器根目录的一个完整引用，则该路径是完整、明确的。一个完整的路径如果指定一个被映射驱动器的根文件夹，它只能以路径分隔符（\）为结尾。

假设当前目录是 c:\mydocuments\reports，下面的表说明了 GetAbsolutePathName 方法的行为。

Pathspec | 返回的路径
"c:" | "c:\mydocuments\reports"
"c:.." | "c:\mydocuments"
"c:\\\" | "c:\"
"c:*.*\may97" | "c:\mydocuments\reports\*.*\may97"
"region1" | "c:\mydocuments\reports\region1"
"c:\..\..\mydocuments" | "c:\mydocuments"


GetBaseName 方法

描述

返回一个包含路径中最后部件的基本名字（去掉任何文件扩展名）的字符串。

语法

object.GetBaseName(path)

GetBaseName 方法语法有如下几部分：

部分 | 描述
object | 必需的。始终是一个 FileSystemObject 的名字。
path | 必需的。 要返回其基本名字的部件的路径说明。

说明

如果没有部件和 path 参数匹配，GetBaseName 方法返回一个长度为零的字符串（""）。

注意 GetBaseName 方法只对提供的 path 字符串起作用。它既不试图去辨认路径，也不检查指定路径是否存在。


GetDrive 方法

描述

返回一个与指定路径中的驱动器相对应的 Drive 对象。

语法

object.GetDrive drivespec

GetDrive 方法语法有如下几部分：

部分 | 描述
Object | 必需的。始终是一个 FileSystemObject 的名字。
Drivespec | 必需的。drivespec参数可以是一个驱动器字符（c）、一个驱动器字符加一个冒号（c:）、一个驱动器字符加冒号和路径分隔符（c:\）或任何网络共享的说明（\\computer2\share1）。

说明

对于网络共享，要进行检查以确保共享存在。

如果 drivespec 不符合任何一种可以接受的形式或者不存在，则发生一个错误。

对一个普通路径字符串调用 GetDrive 方法，使用下面步骤得到一个适合作为 drivespec 使用的字符串：

DriveSpec = GetDriveName(GetAbsolutePathName(Path))


GetDriveName 方法

描述

返回一个包含指定路径的驱动器名字的字符串。

语法

object.GetDriveName(path)

GetDriveName 方法语法有如下几部分：

部分 | 描述
object | 必需的。始终是一个 FileSystemObject 的名字。
path | 必需的。要返回其驱动器名字的部件的路径说明。

说明

如果驱动器不能确定，GetDriveName 方法返回一个长度为零的字符串（""）。

注意 GetDriveName 方法只对提供的路径字符串起作用。它没有尝试去辨认路径，也不对指定路径是否存在进行检查。


GetExtensionName 方法

描述

返回一个包含路径中最后部件扩展名的字符串。

语法

object.GetExtensionName(path)

GetExtensionName 方法语法有如下几部分：

部分 | 描述
object | 必需的。始终是一个 FileSystemObject 的名字。
path | 必需的。.要返回其扩展名的部件的路径说明。

说明

对于网络驱动器，根目录（\）被认为是一个部件。

如果没有部件和 path 参数相匹配，GetExtensionName 方法返回一个长度为零的字符串 ("")。


GetFile 方法

描述

返回一个和指定路径中文件相对应的 File 对象。.

语法

object.GetFile(filespec)

GetFile 方法语法有如下几部分：

部分 | 描述
object | 必需的。始终是一个 FileSystemObject. 的名字。
filespec | 必需的。Filespec 是到一个指定文件的路径（绝对的或相对的）。

说明

如果指定的文件不存在，则发生一个错误。


GetFileName 方法

描述

返回指定路径中的最后部件，该路径不是驱动器说明的一部分。

语法

object.GetFileName(pathspec)

GetFileName 方法语法有如下几部分：

部分 | 描述
object | 必需的。始终是一个 FileSystemObject 的名字。
pathspec | 必需的。到一个指定文件的路径（绝对的或相对的）。

说明

如果 pathspec 不是以已命名部件结尾，GetFileName 方法返回一个零长度字符串（""）。

注意 GetFileName 方法仅在提供的路径字符串上起作用。它没有尝试去辨认路径，也不对指定路径是否存在进行检查。


GetFolder 方法

描述

返回一个和指定路径中文件夹相对应的 Folder 对象。

语法

object.GetFolder(folderspec)

GetFolder方法语法有如下几部分：

部分 | 描述
object | 必需的。始终是一个 FileSystemObject. 的名字。
folderspec | 必需的。Folderspec 是指定文件夹的路径（绝对的和相对的）。

说明

如果指定的文件夹不存在，则发生一个错误。


GetParentFolderName 方法

描述

返回一个包含指定路径最后部件父文件夹名字的字符串。

语法

object.GetParentFolderName(path)

GetParentFolderName 方法语法有如下几部分：

部分 | 描述
object | 必需的。始终是 一个 FileSystemObject 的名字。
path | 必需的。要返回其父文件夹名字的部件的路径说明。

说明

如果 path 参数指定的部件没有父文件夹，则 GetParentFolderName 方法返回一个零长度字符串（""）。

注意 GetParentFolderName 方法仅对提供的 path 字符串起作用。它没有尝试去辨认路径，也不对指定路径是否存在进行检查。


GetSpecialFolder 方法

描述

返回指定的特殊文件夹。

语法

object.GetSpecialFolder(folderspec)

GetSpecialFolder 方法语法有如下几部分：

部分 | 描述
object | 必需的。始终是一个 FileSystemObject 的名字。
folderspec | 必需的。要返回的特殊文件夹的名字。可以是在设置值部分中列出的任何常数。

设置值

folderspec 参数可为任何的下列值：

常数 | 值 | 描述
WindowsFolder | 0 | Windows 文件夹，包含由 Windows 操作系统安装的文件。
SystemFolder | 1 | 系统文件夹，包含库、字体、设备驱动程序。
TemporaryFolder | 2 | Temp 文件夹，用于存储临时文件。它的路径在 TMP 环境变量中。


GetTempName 方法

描述

返回一个随机产生的临时文件或文件夹的名字，该名字在执行需要临时文件或文件夹的操作时有用。

语法

object.GetTempName

可选的 object 始终是一个 FileSystemObject. 的名字。

说明

GetTempName 方法不产生一个文件，它仅提供一个临时文件名字，该名字可被 CreateTextFile 用于创建一个文件。


Hide 方法

隐藏一个对象但不卸载它。

语法

object.Hide

object 代表对象表达式，其值为“应用于”列表中的对象。如果省略掉 object，则把焦点所在的 UserForm 当做 object。

说明

在隐藏一个对象后，它会从屏幕上删除，且将其 Visible 属性设为 False。用户不能访问隐藏对象中的控件，但是对于正在运行的应用程序、其他可以通过Automation 与此应用程序沟通的过程以及Windows中的Timer 控件事件来说，是可以用程序来访问的。

隐藏一个 UserForm 之后，用户就不能与应用程序交互作用了，直到造成 UserForm 隐含事件过程代码完成执行为止。

如果在使用 Hide 方法时尚未装载 UserForm，则 Hide 方法就会装载此 UserForm 但不会显示出来。


Hide 方法示例

下列示例假设程序中有两个UserForms。在 UserForm1 的 Initialize 事件中，程序会加载 UserForm2 并将它显示出来。当用户单击 UserForm2 时，UserForm2 便会隐藏起来，而 UserForm1 将会出现。当用户单击 UserForm1 时，UserForm2 会再次出现。

' UserForm1 的 Initialize 事件过程
Private Sub UserForm_Initialize()
    Load UserForm2
    UserForm2.Show
End Sub
' UserForm2 的 Click 事件
Private Sub UserForm_Click()
    UserForm2.Hide
End Sub

' UserForm1 的 Click 事件
Private Sub UserForm_Click()
    UserForm2.Show
End Sub


Item 方法

利用位置或键返回 Collection 对象的指定成员。

语法

object.Item(index)

Item 方法的语法具有下列对象限定符和部分：

部分 | 描述
object | 必要。对象表达式，其值为“应用于”列表中对象。
index | 必要。为一表达式，指定集合中成员的位置。如果是数值表达式，则 index 必须是从 1 到集合 Count 属性值之间的数值。如果是字符串表达式，则当加入一被引用的成员到集合时，index 必须和 key 参数对应。

说明

如果 index 值无法与集合的任何现有成员匹配，就会导致错误发生。

Item 方法是集合的缺省方法。因此，以下两行程序代码等价：

Print MyCollection(1)
Print MyCollection.Item(1)


Items 方法

描述

返回一个包含 Dictionary 对象中所有条目的数组。

语法

object.Items

object始终是一个 Dictionary 对象的名字。

说明

下面的代码举例说明了 Items 方法的使用。:

Dim a, d, i             '创建一些变量
Set d = CreateObject("Scripting.Dictionary")
d.Add "a", "Athens"     '添加一些关键字和条目。
d.Add "b", "Belgrade"
d.Add "c", "Cairo"
a = d.Items             '取得条目
For i = 0 To d.Count -1 '重复数组
    Print a(i)          '打印条目
Next
...


Keys方法

描述

返回一个数组，该数组包含一个 Dictionary 对象中的全部已有的关键字。

语法

object.Keys

object始终是一个 Dictionary 对象的名字。

说明

下面的代码举例说明了 Keys 方法的使用。

Dim a, d, i             '创建一些变量
Set d = CreateObject("Scripting.Dictionary")
d.Add "a", "Athens"     '添加一些关键字和条目。
d.Add "b", "Belgrade"
d.Add "c", "Cairo"
a = d.keys              '取得关键字
For i = 0 To d.Count -1 '重复数组
    Print a(i)          '打印关键字
Next
...


Move 方法

描述

将一个指定的文件或文件夹从一个地方移动到另一个地方。

语法

object.Move destination

Move 方法语法有如下几部分：

部分 | 描述
object | 必需的。始终是一个 File 或 Folder 对象的名字。
destination | 必需的。文件或文件夹要移动到的目标。不允许有通配符。

说明

Move 方法对一个 File 或 Folder 的结果和执行 FileSystemObject.MoveFile 或 FileSystemObject.MoveFolder 操作的结果是一样的。但应当注意，后面的方法能够移动多个文件或文件夹。


MoveFile 方法

描述

将一个或多个文件从一个地方移动到另一个地方。

语法

object.MoveFile source, destination

MoveFile 方法语法有如下几部分：

部分 | 描述
Object | 必需的。始终是一个 FileSystemObject 的名字。
Source | 必需的。一个或多个要移动文件的路径。Source 参数字符串只能在路径的最后部件中包含通配符。
destination | 必需的。一个或多个文件要移动到的目标路径。 Destination 参数不能包含通配符。

说明

如果 source 包含通配符或 destination 以路径分隔符 （\） 为结尾，则认为 destination 指定了一个存在的文件夹，在此文件夹中移动相匹配的文件。否则，认为 destination 是一个要创建的目标文件名。在上面任一情况下，当移动一个文件时可能出现三种事件。

  • 如果 destination 不存在，文件得到移动。这是通常的情况。

  • 如果 destination 是一个已存在文件，则发生一个错误。

  • 如果 destination 是一个目录，则发生一个错误。

如果一个在 source 中使用的通配符不能和任何一个文件匹配，也发生一个错误。 MoveFile 方法停止在它遇到的第一个错误上。不要尝试回卷错误发生前所做的任何改变。

重点 只有操作系统支持的情况下，这个方法才允许在卷之间移动文件。


MoveFolder 方法

描述

将一个或多个文件夹从一个地方移动到另一个地方。

语法

object.MoveFolder source, destination

MoveFolder 方法语法有如下几部分：

部分 | 描述
object | 必需的。始终是一个 FileSystemObject 的名字。
source | 必需的。一个或多个要移动的文件夹路径。Source 参数字符串只能在路径的最后部件中包含通配符。
destination | 必需的。一个或多个文件夹要移动到的目标路径。Destination 参数不能包含通配符。

说明

如果 source 包含通配符或 destination 以路径分隔符 （\） 为结尾，则认为 destination 指定了一个已存在的文件夹，在此文件夹中移动相匹配的文件。否则，认为 destination 是一个要创建的目标文件夹名字。在上面的任一种情况下，当一个文件夹被移动时可能出现三种情况。

  • 如果 destination 不存在，文件夹得到移动。这是通常的情况。

  • 如果 destination 是一个已存在文件，则发生一个错误。

  • 如果 destination 是一个目录，则发生一个错误。

如果 source 中使用的一个通配符不能和任何文件夹相匹配，也发生一个错误。MoveFolder 方法停止在它遇到的第一个错误上。不要尝试回卷在错误发生前所做的任何改变。

重点 只有在操作系统支持的情况下，这个方法才允许文件夹在卷之间移动。


OpenAsTextStream 方法

描述

打开一个指定的文件并返回一个 TextStream 对象，该对象可用来对文件进行读、写、追加操作。

语法

object.OpenAsTextStream([iomode, [format]])

OpenAsTextStream 方法语法有如下几部分：

部分 | 描述
Object | 必需的。始终是一个 File 对象的名字。
Iomode | 可选的。表明输入/输出方式。可为三个常数之一：ForReading、ForWriting 或 ForAppending。
format | 可选的。三个 Tristate 值之一，用于指示打开文件的格式。如果省略，则文件以 ASCII 格式打开。

设置值

iomode 参数可为下面设置值中的任何值：

常数 | 值 | 描述
ForReading | 1 | 打开一个只读文件，不能对此文件进行写操作。
ForWriting | 2 | 打开一个用于写操作的文件。如果和此文件同名的文件已存在，则覆盖以前内容。
ForAppending | 8 | 打开一个文件并写到文件的尾部。

Format 参数可为下面设置值中的任何值：

常数 | 值 | 描述
TristateUseDefault | –2 | 使用系统缺省打开文件。
TristateTrue | –1 | 以 Unicode 格式打开文件。
TristateFalse | 0 | 以 ASCII 格式打开文件。.

说明

OpenAsTextStream 方法提供了和 FileSystemObject. 的 OpenTextFile 方法相同的功能。此外，OpenAsTextStream 方法还可以用于对一个文件进行写操作。

下面的代码举例说明了 OpenAsTextStream 方法的使用：

Sub TextStreamTest
    Const ForReading = 1, ForWriting = 2, ForAppending = 3
    Const TristateUseDefault = -2, TristateTrue = -1,
TristateFalse = 0
    Dim fs, f, ts, s
    Set fs = CreateObject("Scripting.FileSystemObject")
    fs.CreateTextFile "test1.txt"            '创建一个文件
    Set f = fs.GetFile("test1.txt")
    Set ts = f.OpenAsTextStream(ForWriting, TristateUseDefault)
    ts.Write "Hello World"
    ts.Close
    Set ts = f.OpenAsTextStream(ForReading, TristateUseDefault)
    s = ts.ReadLine
    MsgBox s
    ts.Close
End Sub


OpenTextFile 方法

描述

打开一个指定的文件并返回一个 TextStream 对象，该对象可用于对文件进行读操作或追加操作。

语法

object.OpenTextFile(filename[, iomode[, create[, format]]])

OpenTextFile 方法有如下几部分：

部分 | 描述
Object | 必需的。始终是一个 FileSystemObject 的名字。
filename | 必需的。字符串表达式，它标识了打开的文件。
iomode | 可选的。表示输入/输出方式。可为两个常数之一：ForReading或 ForAppending。
create | 可选的。Boolean 值，它表示如果指定的 filename 不存在是否可以创建一个新文件。如果创建新文件，其值为 True。若不创建文件其值为 False。缺省值为 False。
format | 可选的。三种 Tristate 值之一，用于指示打开文件的格式。如果省略，则文件以 ASCII 格式打开。

设置值

iomode 参数可为下面设置值的任何一个：

常数 | 值 | 描述
ForReading | 1 | 打开一个只读文件。不能对此文件进行写操作。
ForAppending | 8 | 打开一个文件并写到文件的尾部。

Format 参数可为下面设置值的任何值：

常数 | 值 | 描述
TristateUseDefault | –2 | 使用系统缺省打开文件。
TristateTrue | –1 | 以 Unicode 格式打开文件。
TristateFalse | 0 | 以 ASCII 格式打开文件。

说明

下面的代码举例说明了使用 OpenTextFile 方法打开一个用于追加文本的文件：

Sub OpenTextFileTest
    Const ForReading = 1, ForWriting = 2, ForAppending = 3
    Dim fs, f
    Set fs = CreateObject("Scripting.FileSystemObject")
    Set f = fs.OpenTextFile("c:\testfile.txt", ForAppending,TristateFalse)
    f.Write "Hello world!"
    f.Close
End Sub


Print 方法

在 Immediate 窗口中显示文本。

语法

object.Print [outputlist]

Print 方法的语法具有下列对象限定符和部分：

部分 | 描述
object | 必需的。对象表达式，其值为“应用于”列表中的对象。
outputlist | 可选的。要打印的表达式或表达式的列表。如果省略，则打印一空白行。

outputlist 参数具有以下语法和部分：

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

部分 | 描述
Spc(n) | 可选的。用来在输出中插入空白字符，这里，n 为要插入的空白字符数。
Tab(n) | 可选的。用来将插入点定位在绝对列号上，这里，n 为列号。使用无参数的 Tab(n) 将插入点定位在下一个打印区的起始位置。
expression | 可选。要打印的数值表达式或字符串表达式。
charpos | 可选。指定下个字符的插入点。使用分号 (;) 直接将插入点定位在上一个被显示的字符之后。使用 Tab(n) 将插入点定位在绝对列号上。使用无参数的 Tab 将插入点定位在下一个打印区的起始位置。如果省略 charpos，则在下一行打印下一字符。

说明

可以用空白或分号来分隔多个表达式。

对系统指定的区域设置，用小数点分隔符将所有打印到 Immediate 视窗的数据正确格式化。关键字要用适用于主应用程序的语言输出。

对于 Boolean 数据，或者打印 True 或者打印 False。根据主机应用程序的地区设置来翻译 True 和 False 关键字。

使用系统能识别的标准短日期格式书写 Date 数据。当日期或时间部件丢失或为零时，只书写已提供的部件。

如果 outputlist 数据是 Empty，则无内容可写。但是，如果 outputlist 数据是 Null，则输出 Null。在输出 Null 关键字时，要把关键字正确翻译出来。

要把错误数据作为 Error errorcode 输出。在输出 Error 关键字时，要把关键字正确翻译出来。

如果在具有缺省显示空间的模块外使用此方法，则需要 object。例如，如果没有指定对象就在标准模块上调用此方法，则将导致错误发生，但是，如果在窗体模块上进行调用，则会在窗体上显示“outputlist”。

注意 因为 Print 方法是按照字符比例进行打印，所以字符数与字符所占据的宽度固定的列的数目无关。例如，像 “W” 这样的宽字母占据的宽度超过一固定列宽，而像 "i" 这样的窄字母占据的宽度则较小。考虑到要使用比平均字符更宽的空间，表列一定要留有足够余地。另外，也可以使用固定间距的字体（像 Courier 字体）来确保每一字符均只占一列。


PrintForm 方法

将 UserForm 对象的图象逐位发送到打印机。

语法

object.PrintForm

object 代表对象表达式，其值为“应用于”列表中的对象。如果省略掉 object，则把焦点所在的 UserForm 当做 object。

说明

PrintForm 可以打印所有可见对象以及 UserForm 对象的位图。PrintForm 也可打印 UserForm 对象上的图形。

PrintForm 用什么打印机要取决于操作系统的“控制面板”中的设置。


PrintForm 方法示例

在下列示例中，当用户单击窗体时，程序将窗体的客户区域打印出来。

' UserForm1 的 Click 事件
Private Sub UserForm_Click()
    UserForm1.PrintForm
End Sub


Raise 方法

产生运行时错误。

语法

object.Raise number, source, description, helpfile, helpcontext

Raise 方法具有下列对象限定符和命名参数：

参数 | 描述
object | 必需的。总是 Err 对象。
Number | 必需的。Long整数，识别错误性质。Visual Basic 错误（既有 Visual Basic 定义的错误也有用户定义的错误）的范围在 0–65535 之间。从 0–512 的范围保留为系统错误；从 513–65535 的范围可以用做用户定义的错误。当在类模块中将 Number 属性设置成自己的错误代码时，可将错误代码号添加到 vbObjectError 常数上。例如，为了产生错误号 513，可将 vbObjectError + 513 赋值到 Number 属性。
source | 可选的。字符串表达式，为产生错误的对象或应用程序命名。当设置对象的这一属性时，要使用窗体 project.class。如果没有指定 source，则使用当前 Visual Basic 工程的程序设计 ID。
description | 可选的。描述错误的字符串表达式。如果没有指定，则检查 Number 的值。如果可以将错误映射成 Visual Basic 运行时错误代码，则将 Error 函数返回的字符串作为 Description 使用。如果没有与 Number 对应的 Visual Basic 错误，则要用到消息“应用程序定义的错误或对象定义的错误”。
helpfile | 可选的。帮助文件的完整限定的路径，在帮助文件中可以找到有关错误的帮助信息。如果没有指定，则 Visual Basic 会使用 Visual Basic 帮助文件的完整限定的驱动器、路径和文件名。
helpcontext | 可选的。识别 helpfile 内的标题的上下文 ID，而 helpfile 提供有助于了解错误的描述。如果省略，则使用处理有关错误的 Visual Basic 帮助文件的上下文 ID，该 ID 与 Number 属性对应。

说明

除了 number 之外，所有参数都是可选的。如果使用 Raise 而不指定一些参数，并且 Err 对象的属性设置含有未清除的值，则视这些值为错误的值。

Raise 被用来生成运行时错误，并可用来代替 Error 语句。当书写类模块时要生成错误，Raise 是有用的，因为 Err 对象比 Error 语句可能提供更丰富的信息。例如，用 Raise 方法，可以在 Source 属性中说明生成错误的来源，可以引用该错误的联机帮助。


Raise 方法示例

本示例使用 Err 对象的 Raise 方法在用 Visual Basic 写成的 Automation 对象中生成错误，该对象的程序代码为 MyProj.MyObject。 在 MacIntosh中，缺省驱动器名为"HD"，且路径名部分由冒号而不是反斜杠分隔。

Const MyContextID = 1010407    ' 定义上下文ID的常数。
Function TestName(CurrentName, NewName)
    If Instr(NewName, "bob") Then    ' 检测 NewName 的有效性。
        ' 产生例外
        Err.Raise vbObjectError + 513, "MyProj.MyObject", _
        "No ""bob"" allowed in your name", "c:\MyProj\MyHelp.Hlp", _
        MyContextID
    End If
End Function


Read 方法

描述

从一个 TextStream 文件中读取指定数量的字符并返回得到的字符串。

语法

object.Read(characters)

Read 方法语法有如下几部分：

部分 | 描述
object | 必需的。始终是一个 TextStream 对象的名字。
characters | 必需的。从文件中要读取的字符数。


ReadAll 方法

描述

读取整个的 TextStream 文件并返回得到的字符串。

语法

object.ReadAll

object 始终是一个 TextStream 对象的名字。

说明

对于大的文件，使用 ReadAll 方法浪费内存资源。应使用其它的技术去输入一个文件，比如一行一行地读取文件。


ReadLine 方法

描述

从一个 TextStream 文件读取一整行（到换行符但不包括换行符）并返回得到的字符串。

语法

object.ReadLine

object参数始终是一个 TextStream 对象的名字。


Remove 方法

把成员从 Collection 对象中删除。

语法

object.Remove index

Remove 方法的语法具有下列对象限定符和部分：

部分 | 描述
object | 必需的。对象表达式，其值为“应用于”列表中的对象。
Index | 必需的。表达式，指定集合成员的位置。如果是数值表达式，则 index 必须是介于 1 和集合 Count 属性值之间的数。如果是字符串表达式，则在将被引用的成员添加到集合时，index 必须和 key 参数一致。

说明

如果 index 的值与集合的现有成员不匹配，则会导致错误发生。


Remove 方法

描述

从一个 Dictionary 对象中删除一个关键字和条目对。

语法

object.Remove(key)

Remove 方法语法有如下几部分：

部分 | 描述
Object | 必需的。始终是一个 Dictionary 对象的名字。
Key | 必需的。Key 与要从 Dictionary 对象中删除的关键字和条目对相关联。

说明

如果指定的关键字和条目对不存在，则发生一个错误。

下面的代码举例说明了 Remove 方法的使用：

Dim a, d, i             '创建一些变量
Set d = CreateObject("Scripting.Dictionary")
d.Add "a", "Athens"     '添加一些关键字和条目
d.Add "b", "Belgrade"
d.Add "c", "Cairo"
...
a = d.Remove()          '删除第二对


RemoveAll 方法

描述

RemoveAll 方法从 Dictionary 对象中删除所有关键字和条目对。

语法

object.RemoveAll

object始终是一个 Dictionary 对象的名字。

说明

下面的代码举例说明了 RemoveAll 方法的用法：

Dim a, d, i             '创建一些变量
Set d = CreateObject("Scripting.Dictionary")
d.Add "a", "Athens"     '添加一些关键字和条目
d.Add "b", "Belgrade"
d.Add "c", "Cairo"
...
a = d.RemoveAll         '清除字典


Show 方法

显示 UserForm 对象。

语法

[object.]Show modal

Show 方法的语法有如下几部分：

部分 | 描述
object | 可选的。object 代表对象表达式，其值为“应用于”列表中的对象。如果省略掉 object，则把与活动的 UserForm 模块相关联的 UserForm当作 object。
modal | 可选的。 Boolean 值决定UserForm is 是模态的还是无模式的。

设置值

modal 的设置值如下：

常数 | 值 | 描述
vbModal | 1 | UserForm 是模态的。缺省的。
vbModeless | 0 | UserForm是无模式的。

说明

如果在运用 Show 方法时并未装载指定的对象，则 Visual Basic 会自动装载它。

注意 在 Microsoft Office 97中，如果UserForm 被设置为无模式的，它会引发运行时错误； Office 97 UserForms 总是模态的。

当 UserForm 是无模式的，后续代码一出现即被执行。无模式的窗体不在任务栏中出现，且不按窗口标签顺序。

注意 如果对该UserForm 工程进行修改，比如删除一个代码模块，会引起工程的重新编译，并且可能丢失与无模式的UserForm 有关的数据。

当UserForm是模态的，用户在使用应用程序的其它部分之前，必须先对其作出响应。在隐藏或卸载 UserForm 之前，后续代码不会被执行。

虽然在显示 UserForm 时不能使用应用程序中的其他窗体，但其他应用程序仍然可以使用。


Show 方法示例

下列示例假设程序中有两个UserForms。在 UserForm1 的 Initialize 事件中，程序会加载 UserForm2 并将它显示出来。当用户单击 UserForm2 时，UserForm2 便会隐藏起来而 UserForm1 将会显示出来。当用户单击 UserForm1 时，UserForm2 会再次出现。

' UserForm1 的 Initialize 事件过程
Private Sub UserForm_Initialize()
    Load UserForm2
    UserForm2.Show
End Sub
' UserForm2 的 Click 事件
Private Sub UserForm_Click()
    UserForm2.Hide
End Sub

' UserForm1 的 Click 事件
Private Sub UserForm_Click()
    UserForm2.Show
End Sub


Skip 方法

描述

当读一个 TextStream 文件时跳过指定数量的字符。

语法

object.Skip(characters)

Skip 方法语法有下面几部分：

部分 | 描述
object | 必需的。始终是一个 TextStream 对象的名字。
characters | 必需的。当读文件时要跳过的字符的数量。

说明

跳过的字符被放弃。


SkipLine 方法

描述

当读一个 TextStream 文件时跳过下一行。

语法

object.SkipLine

object始终是一个 TextStream 对象的名字。

说明

跳过一行是指读取并放弃一行中的所有字符，一直到并包括该行的换行符。

如果读的文件没有打开，则产生一个错误。


WhatsThisMode 方法

使鼠标指针改变成“这是什么”指针，并提供应用程序对选定对象显示帮助。该方法只存在于 Macintosh中，但没有指针功能。

语法

object.WhatsThisMode

object 代表对象表达式，其值为“应用于”列表中的对象。如果省略掉 object，则把焦点所在的 UserForm 当做 object。

说明

执行 WhatsThisMode 方法对应用程序来说，与单击标题栏的“这是什么”按钮的结果一样。鼠标指针会变成“这是什么”指针。当用户单击对象时，该对象的 WhatsThisHelpID 属性可用来调用上下文相关的帮助。


WhatsThisMode 方法示例

在下列示例中，当用户单击UserForms时，就会将鼠标指针改成“这是什么”（一个问号）指针。如果在属性窗口中，既没有将 WhatsThisHelp 设置成 True，也没有将 WhatsThisButton 属性设置成 True ，则下列程序就没有任何作用。

Private Sub UserForm_Click()
' 将鼠标光标改成“这是什么”问号。
    WhatsThisMode
End Sub


Write 方法

描述

写一个指定的字符串到一个 TextStream 文件。

语法

object.Write(string)

Write 方法语法有如下几部分：

部分 | 描述
object | 必需的。始终是一个 TextStream 对象的名字。
string | 必需的。要写到文件中去的正文。

说明

指定的字符串被写入到文件中，在每个字符串之间没有插入空格或字符。使用 WriteLine 方法写入一个换行符或一个以换行符为结尾的字符串。


WriteBlankLines 方法

描述

写入指定数量的换行符到一个 TextStream 文件中。

语法

object.WriteBlankLines(lines)

WriteBlankLines 方法语法有如下几部分：

部分 | 描述
object | 必需的。始终是一个 TextStream 对象的名字。
lines | 必需的。要写入的换行符数量。


WriteLine 方法

描述

写入一个指定的字符串和换行符到一个 TextStream 文件中。.

语法

object.WriteLine([string])

WriteLine 方法语法有如下几部分：

部分 | 描述
object | 必需的。始终是一个 TextStream 对象的名字。
string | 可选的。要写入文件的正文。如果省略，一个换行符被写入文件中。


字符集 (0-127)

字符集 (0–127)

0 | · | 32 | [space] | 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 | 

· Microsoft Windows 不支持这些字符。

* *值 8、9、10 和 13 分别转换为退格、制表、换行和回车字符。它们并没有特定的图形显示，但会依不同的应用程序，而对文本显示有不同的影响。


字符集 (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 并不支持这些字符。

本表中的值是 Windows 的默认值。 ANSI 字符集中 127 以上的值是由与操作系统有关的代码页决定的。


文档约定

Visual Basic 文档均遵循以下编排约定：

特定 | 说明
Sub, If, ChDir, Print, True, Debug | 首字母大写的粗体字表示语言专用的关键字。
Setup | 操作命令以粗体字表示。
object, varname, arglist | 斜体的小写字母表示您须提供的信息。
pathname, filenumber | 粗斜体的小写字母表示参数，在那儿，可利用其位置指定或命名参数语法。
[expressionlist] | 用在语法中，括号中的项目代表可选的。
{While | Until} | 用在语法中，表示可从括号中的项目中选择一个。而且必须选择一个，除非所有项目外层还有一个中括号，例如：
 | [{This | OrThat}]
ESC,ENTER | 小的大写字母代表按键名称和按键顺序。
ALT+F1, CTRL+R | 以加号 (+) 连接按键名称代表组合键，例如，ALT+F1 表示按下 ALT 键，再按下 F1。

代码约定

使用下列代码约定：

代码示例 | 说明
MyString = "Hello, world!" | 这种字体都用于代码、变量与错误信息。
' This is a comment. | 符号 (') 引导注释文本。
MyVar = "This is an " _
& "example" _
& " of how to continue code." 		空白加下划线 ( _) 可接续两行以上的代码。


Collection 对象

Collection 对象是项目所组成的有序集合，可以把这个集合作为单元来引用。

说明

Collection 对象提供了简便方法，直截了当将一组相关的项目视为单一对象来引用。集合中的项目或成员被这样一个事实联系起来：它们都属于这个集合。集合的成员不一定都是同一种数据类型的。

建立集合的方法与建立其它对象的方法一样。例如：

Dim X As New Collection

一旦建立集合之后，就可以用 Add 方法添加成员，用 Remove 方法删除成员。在用 For Each...Next 语句重复整个集合时，可以用 Item 方法从集合返回特定成员。


Collection 对象示例

本示例建立一个命名为 MyClasses 的 Collection 对象，再建立一个对话框，让用户可从对话框中将对象建立到该集合对象中。若要观察程序如何工作，请先在“插入”菜单上选择“类模块”命令，然后在 Class1 的模块级中声明一个公用变量，命名为 InstanceName（类型为 Public InstanceName），此变量用来保存每个类实例的名称。不要更改类的缺省名称 Class1。将下列代码复制到另一个模块的“通用”节中，然后在另一个过程中用 ClassNamer 语句使它启动激活。（本示例仅使用支持类的主机应用程序。）

Sub ClassNamer()
    Dim MyClasses As New Collection    ' 建立一个集合对象（Collection）。
    Dim Num    ' 计数用变量，用来对对象的个数计数。
    Dim Msg As String    ' 提示信息用变量。
    Dim TheName, MyObject, NameList    ' 对象信息用变体。
    Do
        Dim Inst As New Class1    ' 建立 Class1 的新实例。
        Num = Num + 1    ' 把计数变量 Num 加一，然后要求输入新对象个体的名称。
        Msg = "Please enter a name for this object." & Chr(13) _
         & "Press Cancel to see names in collection."
        TheName = InputBox(Msg, "Name the Collection Items")
        Inst.InstanceName = TheName    ' 将名称送入对象实例。
        ' 若用户输入了名称，将它加入集合。
        If Inst.InstanceName <> "" Then
            ' 将命名的对象加入集合。
            MyClasses.Add item := Inst, key := CStr(Num)
        End If
        ' 清除当前的引用，为对下一个对象做准备。
        Set Inst = Nothing
    Loop Until TheName = ""
    For Each MyObject In MyClasses    ' 建立名称列表。
        NameList = NameList & MyObject.InstanceName & Chr(13)
    Next MyObject
    ' 将名称列表在消息框中显示出来。
    MsgBox NameList, , "Instance Names In MyClasses Collection"

    For Num = 1 To MyClasses.Count    ' 从集合中删除名字。
        MyClasses.Remove 1    ' 因为每删除一个对象后，集合
                ' 会自动重排顺序，故每次迭代时只需删除第一个
    Next        ' 对象即可。
End Sub


Debug 对象

Debug 对象在运行时将输出发送到 Immediate 窗口。


Dictionary 对象

描述

对象，用于存储数据关键字和条目对。

语法

Scripting.Dictionary

说明

Dictionary 对象与 PERL 关联数组等价。可以是任何形式的数据的条目被存储在数组中。每个条目都与一个唯一的关键字相关联。该关键字用来检索单个条目，通常是整数或字符串，可以是除数组外的任何类型。

下面的代码举例说明了如何创建一个 Dictionary 对象：

Dim d                   '创建一个变量
Set d = CreateObject(Scripting.Dictionary)
d.Add "a", "Athens"     '添加一些关键字和条目
d.Add "b", "Belgrade"
d.Add "c", "Cairo"
...


Drive 对象

描述

对特定磁盘驱动器或网络共享的属性提供访问。

说明

下面的代码举例说明了用 Drive 对象来访问驱动器属性：

Sub ShowFreeSpace(drvPath)
    Dim fs, d, s
    Set fs = CreateObject("Scripting.FileSystemObject")
    Set d = fs.GetDrive(fs.GetDriveName(drvPath))
    s = "Drive " & UCase(drvPath) & " - "
    s = s & d.VolumeName  & vbCrLf
    s = s & "Free Space: " & FormatNumber(d.FreeSpace/1024, 0)
    s = s & " Kbytes"
    MsgBox s
End Sub


Drives 集合

描述

所有可用驱动器的只读集合。

说明

对于可删除的驱动器，不需要将媒体插入其中，它就可以在Drives集合中显示出来。

下面的代码举例说明了如何获得 Drives 集合，以及如何用 For Each...Next 语句来访问该集合中的每个Drive：

Sub ShowDriveList
    Dim fs, d, dc, s, n
    Set fs = CreateObject("Scripting.FileSystemObject")
    Set dc = fs.Drives
    For Each d in dc
        s = s & d.DriveLetter & " - "
        If d.DriveType = Remote Then
            n = d.ShareName
        Else
            n = d.VolumeName
        End If
        s = s & n & vbCrLf
    Next
    MsgBox s
End Sub


Err 对象

含有关于运行时错误的信息。

说明

Err 对象的属性由错误的生成者来设置，这个生成者或者是 Visual Basic，或者是对象，或者是程序设计员。

Err 对象的缺省属性是 Number。因为该缺省属性可以用对象名称 Err 表示，所以不必修改以前用 Err 函数或 Err 语句书写的代码。

当运行时错误发生时，Err 对象的属性被填入明确识别错误的信息以及处理这个错误所使用的信息。为了在代码中生成运行时错误，请用 Raise 方法。

在任意形式的 Resume 或 On Error 语句之后以及在错误处理子程序内的 Exit Sub、Exit Function、或 Exit Property 语句之后，将 Err 对象的属性重新设置为零或长度为零的字符串 ("")。可使用 Clear 方法重新明确设置 Err 。

为了对系统错误和类模块生成运行时错误，要使用 Raise 方法而不使用 Error 语句。在其它代码中是否使用 Raise 方法，这要看想要返回的信息量有多大。

Err 对象是具有全局范围的固有对象。在代码中没有必要建立这些对象的实例。


Err 对象示例

本示例使用 Err 对象的各个属性，来建立一个显示错误信息的对话框。请注意，如过使用 Raise 方法产生 Visual Basic 的错误时，首先使用 Clear 方法，则 Visual Basic 的缺省值会变成 Err 对象的属性值。

Dim Msg
' 如果有错误发生，就构成一个错误信息
On Error Resume Next    ' 改变错误处理的方式。
Err.Clear
Err.Raise 6    ' 生成一个溢出（Overflow）的错误。
' 检查错误代号，显示相关错误信息。
If Err.Number <> 0 Then
    Msg = "Error # " & Str(Err.Number) & " was generated by " _
            & Err.Source & Chr(13) & Err.Description
    MsgBox Msg, , "Error", Err.Helpfile, Err.HelpContext
End If


File 对象

描述

提供对文件所有属性的访问。

说明

下面的代码举例说明了如何获得一个 File 对象，以及如何查看它的一个属性。

Sub ShowFileInfo(filespec)
    Dim fs, f, s
    Set fs = CreateObject("Scripting.FileSystemObject")
    Set f = fs.GetFile(filespec)
    s = f.DateCreated
    MsgBox s
End Sub


Files 集合

描述

在一个文件夹内的所有 File 对象的集合。

说明

下面的代码举例说明了如何获得一个 Files 集合，以及如何用 For Each...Next 语句来访问这个集合中的每个File：

Sub ShowFolderList(folderspec)
    Dim fs, f, f1, fc, s
    Set fs = CreateObject("Scripting.FileSystemObject")
    Set f = fs.GetFolder(folderspec)
    Set fc = f.Files
    For Each f1 in fc
        s = s & f1.name
        s = s & vbCrLf
    Next
    MsgBox s
End Sub


FileSystemObject 对象

描述

提供对计算机文件系统的访问。

语法

Scripting.FileSystemObject

说明

下面的代码举例说明了如何使用 FileSystemObject 返回一个 TextStream 对象，该对象是可读并可写的：

Set fs = CreateObject("Scripting.FileSystemObject")
Set a = fs.CreateTextFile("c:\testfile.txt", True)
a.WriteLine("This is a test.")
a.Close

在上面列出的代码中，CreateObject 函数返回 FileSystemObject (fs)。CreateTextFile 方法接着创建文件作为一个 TextStream 对象(a)，而 WriteLine 方法则向创建的文本文件中写入一行文本。Close 方法刷新缓冲区并关闭文件。


Folder 对象

描述

提供对一个文件夹所有属性的访问。

说明

下面的代码举例说明了如何获得一个 Folder 对象，以及如何返回它的一个属性：

Sub ShowFolderInfo(folderspec)
    Dim fs, f, s,
    Set fs = CreateObject("Scripting.FileSystemObject")
    Set f = fs.GetFolder(folderspec)
    s = f.DateCreated
    MsgBox s
End Sub


Folders 集合

描述

包含在一个 Folder 对象内的所有 Folder 对象的集合。

说明

下面的代码举例说明了如何获得一个 Folders 集合，以及如何用 For Each...Next 语句来访问该集合中的每个Folder：

Sub ShowFolderList(folderspec)
    Dim fs, f, f1, fc, s
    Set fs = CreateObject("Scripting.FileSystemObject")
    Set f = fs.GetFolder(folderspec)
    Set fc = f.SubFolders
    For Each f1 in fc
        s = s & f1.name
        s = s &  vbCrLf
    Next
    MsgBox s
End Sub


TextStream 对象

描述

加快对文件的顺序访问。

语法

TextStream.{property | method}

property 和 method 参数可以是和 TextStream 对象相关联的任何属性和方法。请注意，在实际应用中，TextStream 被一个变量占位符所替代，该变量占位符表示从 FileSystemObject 返回的 TextStream 对象。

说明

在下面的代码中，a 是由 FileSystemObject 的 CreateTextFile 方法返回的 TextStream 对象：

Set fs = CreateObject("Scripting.FileSystemObject")
Set a = fs.CreateTextFile("c:\testfile.txt", True)
a.WriteLine("This is a test.")
a.Close

WriteLine 和 Close 是 TextStream 对象的两个方法。


UserForm 对象

UserForm 对象，UserForms 集合对象

UserForm 对象是一个窗口或对话框，用以构成应用的用户界面部分。

UserForms 集合对象是一个集合，其部件代表应用程序中每个装入的 UserForm。UserForms 集合对象有一个 Count 属性，一个 Item 属性，及一个 Add 方法。Count 用来指定集合对象中的部件个数；Item（缺省成员）用来指定某个集合对象成员；而 Add 则用来在集合对象中放置一个新的 UserForm 部件。

语法

UserForm

UserForms[.Item](index)

index 代表从 0 到 UserForms.Count – 1 之间的一个整型数；Item 则是 UserForms 集合对象的缺省成员，并且是不须指定的。

说明

可以经由 UserForms 集合对象，对程序中所有已装入的用户窗体进行访问，其识别的方法须经由 UserForms 这个全局变量。可以将 UserForms(index) 传送到一个参数为 UserForm 类的函数中。

可利用用户窗体的属性决定其外观，例如位置、大小、颜色，以及动作。

用户窗体也会回应由用户所引起或系统引发的事件。例如，可以在 UserForm 的 Initialize 事件过程中编写代码，以便在 UserForm 显示前初始化模块级别的变量。

除了属性与事件之外，还可以在代码中使用方法来操纵用户窗体。例如，可以用 Move 方法来改变 UserForm 的位置与大小。

在设计用户窗体时，设置 BorderStyle 属性可定义边框，以及设置 Caption 属性以便在标题栏填入文本。利用代码，以 Hide 及 Show 方法使 UserForm 在运行时为可见的或不可见的。

UserForm 是一种 Object 数据类型。设计时设置变量为 UserForm 类型的实例前，可将其声明为 UserForm。同样的，也可用UserForm 类型传送参数给过程。可以在代码中用 Dim 中的关键字 New、Set 及 Static 等语句，来建立用户窗体的多个实例。

可以用 Controls 集合对象，来访问 UserForm 上的控件的集合对象。例如，要隐藏 UserForm 上的所有控件，可以用类似以下的代码：

For Each Control in UserForm1.Controls
    Control.Visible = False
Next Control


& 运算符

用来强制两个表达式作字符串连接。

语法

result = expression1 & expression2

& 运算符的语法具有以下几个部分：

部分 | 描述
result | 必需的；任何 String或 Variant 变量。
expression1 | 必需的；任何表达式。
expression2 | 必需的；任何表达式。

说明

如果 expression 不是字符串，则将其转换成 String 变体。如果两个表达式都是字符串表达式，则 result 的数据类型是 String；否则 result 是 String 变体。如果两个表达式都是 Null，则 result 也是 Null。但是，只要有一个 expression 是 Null，那么在与其它表达式连接时，都将其作为长度为零的字符串 ("") 处理。任何 Empty 类型表达式也作为长度为零的字符串处理。


& 运算符示例

本示例使用 & 运算符将字符串串接起来。

Dim MyStr
MyStr = "Hello" & " World"    ' 返回 "Hello World"。
MyStr = "Check " & 123 & " Check"    ' 返回 "Check 123 Check"。


* 运算符

用来将两数相乘。

语法

result = number1*number2

* 运算符的语法具有以下几个部分：

部分 | 描述
result | 必需的；任何数值变量。
number1 | 必需的；任何数值表达式。
number2 | 必需的；任何数值表达式。

说明

result 的数据类型通常与最精确的表达式的数据类型相同。精确度由最低到最高的顺序是

Byte、 Integer、Long、Single、Currency、Double 和 Decimal。下列情况是例外：

如果 | 则 result 为
乘法运算有一个 Single 和一个Long， | 转换成 Double。
result 的数据类型是 Long、Single 或 Date 变体，且超出正确范围， | 转换成有 Double 的 Variant。
result 的数据类型是 Byte 变体，且超出正确范围， | 转换成 Integer 变体。
result 的数据类型是 Integer 变体，且超出正确范围， | 转换成 Long 变体。

如果有一个或两个表达式是 Null 表达式，则 result 为 Null。如果一个表达式是 Empty，则作为 0 处理。

注意 乘法用到的精确度等级与加法和减法用到的精确度等级不一样。


* 运算符示例

本示例使用 * 运算符来计算两数的乘积。

Dim MyValue
MyValue = 2 * 2    ' 返回 4。
MyValue = 459.35 * 334.90     ' 返回 153836.315。


+ 运算符

用来求两数之和。

语法

result = expression1+expression2

+ 运算符的语法具有以下几个部分：

部分 | 描述
result | 必需的；任何数值变量。
expression1 | 必需的；任何表达式。
expression2 | 必需的；任何表达式。

说明

在使用 + 运算符时有可能无法确定是做加法还是做字符串连接。为避免混淆，请使用 & 运算符进行连接，并且改进程序代码的可读性。

如果至少有一个表达式不是 Variant，则可运用以下法则：

如果 | 则
两个表达式都是数值数据类型 (Byte、Boolean、 Integer、Long、Single、 Double、 Date、Currency 或是 Decimal) | 相加。
两个表达式都是 String | 连接。
一个表达式是数值数据类型而另一个是 Null 之外的任意 Variant。 | 相加。
一个表达式是 String 而其它是 Null 之外的任意 Variant。 | 连接。
一个表达式是 Empty Variant | 返回另一个不变的表达式作为 result。
一个表达式是数值数据类型，而另一个是 String | 产生一个类型不匹配错误。
每个表达式都是 Null | result 是 Null。

如果两个表达式都是 Variant 表达式，则可运用下列规则：

如果 | 则
两个 Variant 表达式都是数值 | 相加。
两个 Variant 表达式都是字符串 | 连接。
一个 Variant 表达式是数值而另一个是字符串 | 相加。

对于只有数值数据类型表达式的单纯加法，result 的数据类型通常与其中最精确的表达式的数据类型相同。精确度由最低到最高的顺序是 Byte、Integer、Long、Single、Double、Currency 和 Decimal。但下列情况例外：

如果 | 则 result 为
一个 Single 和一个 Long 相加， | 一个 Double。
result 的数据类型是 Long、Single 或 Date 变体，且越出正确范围， | 转换成 Double 变体。
result 的数据类型是 Byte 变体，且超过本身的正确范围时， | 转换成 Integer 变体。
result 的数据类型是 Integer 变体，且超过本身的正确范围时， | 转换成 Long 变体。
将一个 Date 加到任何数据类型上， | 一个 Date。

如果有一个或两个表达式是 Null 表达式，则 result 为 Null。如果两个表达式都是 Empty，则 result 是 Integer。但是，如果只有一个表达式是 Empty，则另一个表达式原封不动地作为 result 返回。

注意 加法和减法用到的精确度等级与乘法用到的精确度等级不一样。


- 运算符

– 运算符

用来求两数之差或表示数值表达式的负值。

语法 1

result = number1 - number2

语法 2

- n umber

– 运算符的语法具有以下几个部分：

部分 | 描述
result | 必需的；任何数值变量。
number | 必需的；任何数值表达式。
number1 | 必需的；任何数值表达式。
number2 | 必需的；任何数值表达式。

说明

在语法 1 中，– 运算符是求两数之差的算术减法运算符。在语法 2 中，– 运算符为一元负运算符，说明表达式的值为负值。

result 的数据类型通常与最精确的表达式的数据类型相同。精确度由最低到最高的顺序是Byte、Integer、Long、Single、Double、Currency 和 Decimal。

下列情况例外：

如果 | 则 result 为
当减法运算中有一个 Single 和一个 Long， | 转换成一个 Double。
result 的数据类型是一个 Long、Single 或 Date 变体，且超出正确范围， | 转换成包含 Double 的Variant。
result 的数据类型是一个 Byte 变体，且超出正确范围， | 转换成一个 Integer 变体。
result 的数据类型是一个 Integer 变体，且超出正确范围， | 转换成一个 Long 变体。
减法运算中有 Date 和其它任何数据类型， | 一个 Date。
减法运算中有两个 Date 表达式， | 一个 Double。

如果有一个或两个表达式是 Null 表达式，则 result 为 Null。如果一个表达式是 Empty，则作为 0 处理。

注意 加法和减法用到的精确度等级与乘法用到的精确度等级不一样。


- 运算符示例

本示例使用 - 运算符来计算两数值的差。

Dim MyResult
MyResult = 4 - 2    ' 返回 2。
MyResult = 459.35 - 334.90    ' 返回 124.45。


/ 运算符

用来进行两个数的除法运算并返回一个浮点数。

语法

result = number1/number2

/ 运算符的语法具有以下几个部分：

部分 | 描述
result | 必需的；任何数值变量。
number1 | 必需的；任何数值表达式。
number2 | 必需的；任何数值表达式。

说明

result 的数据类型通常是 Double 或 Double 变体。下列情况是例外：

如果 | 则 result 为
两个表达式都是 Byte、Integer 或Single表达式时， | 一个 Single，除非超出正确范围；如果发生这种情况，则产生错误。
两个表达式都是 Byte、Integer 或Single 变体， | 一个 Single 变体，除非已超出正确范围；一旦发生这种情况，result 是一个包含 Double 的 Variant。
除法运算中有一个 Decimal及其它任何数据类型， | 一个 Decimal 数据类型。

如果有一个或是两个表达式是 Null 表达式，则 result 为 Null。如果一个表达式是 Empty 则作为 0 处理。


/ 运算符示例

本示例使用 / 运算符来计算浮点数除法。

Dim MyValue
MyValue = 10 / 4    ' 返回 2.5。
MyValue = 10 / 3    ' 返回 3.333333。


\ 运算符

用来对两个数作除法并返回一个整数。

语法

result = number1\number2

\ 运算符的语法具有以下几个部分：

部分 | 描述
result | 必需的；任何数值变量。
number1 | 必需的；任何数值表达式。
number2 | 必需的；任何数值表达式。

说明

在进行除法运算之前，数值表达式通过舍去小数部分转换成 Byte、Integer 或 Long表达式。

通常，无论 result 是不是整数，result 的数据类型都是 Byte、Byte 变体、Integer、Integer 变体、Long 或 Long 变体。任何小数部分都被删除。但是，如果任何一个表达式是 Null，则 result 为 Null。如果一个表达式是 Empty，则作为0 处理。


\ 运算符示例

本示例使用 \ 运算符来计算整型除法。

Dim MyValue
MyValue = 11 \ 4    ' 返回 2。
MyValue = 9 \ 3    ' 返回 3。
MyValue = 100 \ 3    ' 返回 33。


^运算符

用来求一个数字的某次方，次方数为 exponent 值。

语法

result = number^exponent

^ 运算符的语法具有以下几个部分：

部分 | 描述
result | 必需的；任何数值变量。
number | 必需的；任何数值表达式。
exponent | 必需的；任何数值表达式。

说明

只有当 exponent 为整数值时，number 才可以为负数。在表达式中执行多个指数运算时，^ 运算符的计算顺序从左到右。

result 的数据类型通常是 Double 或包含 Double 的 Variant。但是，如果 number 或 exponent 中有一个是 Null 表达式，则 result 也是 Null。


^ 运算符示例

本示例使用 ^ 运算符来表示某数的乘方的指数值。

Dim MyValue
MyValue = 2 ^ 2    ' 返回 4。
MyValue = 3 ^ 3 ^ 3    ' 返回 19683。
MyValue = (-5) ^ 3    ' 返回 -125。


= 运算符

描述

用于对一个变量或属性赋值。

语法

variable = value

= 运算符语法有如下几部分：

部分 | 描述
variable | 任何变量或任何可写的属性。
value | 任何数值型或字符串文字、常数或表达式。

说明

等号左边的名字可以是一个简单的标量变量或一个数组的元素。等号左边的属性只能是运行时可写的属性。


AddressOf 运算符

一个一元运算符，它将其后面的过程的地址传递给一个 API 过程，该 API 过程在参数表对应位置中需要一个函数指针。

语法

AddressOf procedurename

必需的 procedurename 指定要传递的地址是哪一个过程的地址。这个过程必须是发出调用命令的工程中的一个标准模块模块里的一个过程。

说明

当一个过程的名称出现在一个参数列表中时，通常该过程已经被计算，并且该过程返回值的地址也会被传递。AddressOf 允许该过程的地址被传递给动态链接库 (DLL) 中的一个 Windows API 函数，而不是传递该过程的返回值。API 函数然后就可以使用这个地址来调用相应的 Basic 过程，这个过程就是我们所知道的回调。AddressOf 运算符只出现在对 API 过程的调用中。

尽管可以使用 AddressOf 运算符在 Basic 过程之间传递过程指针，却不能通过这样的一个指针从 Basic 内部调用一个函数。这就是说，例如，一个使用 Basic 编写的类 不能使用这样的一个指针来回调自己的控制器。当使用 AddressOf 运算符在 Basic 内的过程之间传递一个过程的指针时，被调用过程的参数类型必须定义为 As Long。

警告 如果不能完全理解函数回调的概念，则使用 AddressOf 运算符可能会导致意想不到的结果。必须理解回调的 Basic 部份是如何工作的，以及接受所传递的函数地址的 DLL 的代码是如何工作的。调试这样的交互操作是非常困难的，因为该程序和开发环境运行在相同的进程中。在某些情况下，系统的调试也许是不可能的。

注意 可以使用 Microsoft Visual C++ （或者类似的工具）编译的 DLLs 来创建自己的回调函数原型。要使用 AddressOf 运算符来工作，您的原型必需使用 __stdcall 调用约定。缺省的调用约定 (__cdecl) 不能与 AddressOf 运算符一起工作。

因为一个回调的调用程序不在用户自己的程序中，所以很重要的一点是要保证回调过程中的错误不被回传到调用者。可以通过把 On Error Resume Next 语句放置于回调过程的起始处来达到这个要求。


AddressOf 运算符示例

下面的示例创建一个带有一个列表框的窗体，该列表框包含您的系统中的字体的按字母顺序排序的列表。

要运行该示例，请创建一个带有一个列表框的窗体。窗体部分的代码如下：

Option Explicit

Private Sub Form_Load()
    Module1.FillListWithFonts List1
End Sub

把下面的代码放置到一个模块中。EnumFontFamilies 函数定义中的第三个参数是一个长整形，它代表一个过程。该参数必须包含这个过程的地址，而不是这个过程的返回值。在对 EnumFontFamilies 的调用中，第三个参数需要 AddressOf 运算符来返回 EnumFontFamProc 过程的地址，该过程是当调用 Windows API 函数，即 EnumFontFamilies 时提供的回调过程的名称。当把 AddressOf EnumFontFamProc 传递给 EnumFontFamilies 时， Windows 就会为系统中的每一个字体库调用一次 EnumFontFamProc。传递给 EnumFontFamilies 的最后一个参数指定用来显示信息的列表框。

'字体枚举类型
Public Const LF_FACESIZE = 32
Public Const LF_FULLFACESIZE = 64

Type LOGFONT
        lfHeight As Long
        lfWidth As Long
        lfEscapement As Long
        lfOrientation As Long
        lfWeight As Long
        lfItalic As Byte
        lfUnderline As Byte
        lfStrikeOut As Byte
        lfCharSet As Byte
        lfOutPrecision As Byte
        lfClipPrecision As Byte
        lfQuality As Byte
        lfPitchAndFamily As Byte
        lfFaceName(LF_FACESIZE) As Byte
End Type

Type NEWTEXTMETRIC
        tmHeight As Long
        tmAscent As Long
        tmDescent As Long
        tmInternalLeading As Long
        tmExternalLeading As Long
        tmAveCharWidth As Long
        tmMaxCharWidth As Long
        tmWeight As Long
        tmOverhang As Long
        tmDigitizedAspectX As Long
        tmDigitizedAspectY As Long
        tmFirstChar As Byte
        tmLastChar As Byte
        tmDefaultChar As Byte
        tmBreakChar As Byte
        tmItalic As Byte
        tmUnderlined As Byte
        tmStruckOut As Byte
        tmPitchAndFamily As Byte
        tmCharSet As Byte
        ntmFlags As Long
        ntmSizeEM As Long
        ntmCellHeight As Long
        ntmAveWidth As Long
End Type

' ntmFlags 段标志
Public Const NTM_REGULAR = &H40&
Public Const NTM_BOLD = &H20&
Public Const NTM_ITALIC = &H1&

'  tmPitchAndFamily 标志
Public Const TMPF_FIXED_PITCH = &H1
Public Const TMPF_VECTOR = &H2
Public Const TMPF_DEVICE = &H8
Public Const TMPF_TRUETYPE = &H4

Public Const ELF_VERSION = 0
Public Const ELF_CULTURE_LATIN = 0

'  EnumFonts 掩码
Public Const RASTER_FONTTYPE = &H1
Public Const DEVICE_FONTTYPE = &H2
Public Const TRUETYPE_FONTTYPE = &H4

Declare Function EnumFontFamilies Lib "gdi32" Alias _
     "EnumFontFamiliesA" _
     (ByVal hDC As Long, ByVal lpszFamily As String, _
     ByVal lpEnumFontFamProc As Long, LParam As Any) As Long
Declare Function GetDC Lib "user32" (ByVal hWnd As Long) As Long
Declare Function ReleaseDC Lib "user32" (ByVal hWnd As Long, _
     ByVal hDC As Long) As Long

Function EnumFontFamProc(lpNLF As LOGFONT, lpNTM As NEWTEXTMETRIC, _
     ByVal FontType As Long, LParam As ListBox) As Long
Dim FaceName As String
Dim FullName As String
    FaceName = StrConv(lpNLF.lfFaceName, vbUnicode)
    LParam.AddItem Left$(FaceName, InStr(FaceName, vbNullChar) - 1)
    EnumFontFamProc = 1
End Function

Sub FillListWithFonts(LB As ListBox)
Dim hDC As Long
    LB.Clear
    hDC = GetDC(LB.hWnd)
    EnumFontFamilies hDC, vbNullString, AddressOf EnumFontFamProc, LB
    ReleaseDC LB.hWnd, hDC
End Sub


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


And 运算符示例

本示例使用 And 运算符来做两个表达式结果的逻辑合取（a logical conjunction）。

Dim A, B, C, D, MyCheck
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（位比较的结果）。


比较运算符

用来比较表达式。

语法

result = expression1 comparisonoperator expression2

result = object1 Is object2

result = string Like pattern

比较运算符具有以下几个部分：

部分 | 描述
result | 必需的；任何数值变量。
expression | 必需的；任何表达式。
comparisonoperator | 必需的；任何比较运算符。
object | 必需的；任何对象名称。
string | 必需的；任何字符串表达式。
pattern | 必需的；任何字符串表达式或字符的范围。

说明

下列表格中有一系列比较运算符以及判定 result 是 True、False 还是 Null 的条件：

运算符 | True if | False if | Null if
<（小于） | expression1 < expression2 | expression1 >= expression2 | expression1 or expression2 = Null
<=（小于或等于） | expression1 <= expression2 | expression1 > expression2 | expression1 or expression2 = Null
>（大于） | expression1 > expression2 | expression1 <= expression2 | expression1 or expression2 = Null
>=（大于或等于） | expression1 >= expression2 | expression1 < expression2 | expression1 or expression2 = Null
=（等于） | expression1 = expression2 | expression1 <> expression2 | expression1 or expression2 = Null
<>（不等于） | expression1 <> expression2 | expression1 = expression2 | expression1 or expression2 = Null

注意 Is 和 Like 运算符有特定的比较功能，它们不同於表格中的运算符。

在比较两个表达式的时候可能难以确定将要比较的表达式是数字还是字符串。下列表格将说明如何比较表达式，或说明当其中一个表达式不是 Variant 时，如何获得比较的结果。

如果 | 则
两个表达式都是数值数据类型 (Byte、Boolean、Integer、Long、Single、Double、Date、Currency 或Decimal) | 进行数值比较。
两个表达式都是 String | 进行字符串比较
一个表达式是数值数据类型而另一个是数字 Variant、或可以为一数字 | 进行数值比较。
一个表达式是数值数据类型而另一个是不能转换成数字的字符串 Variant | 产生类型不匹配的错误。
一个表达式是 String，而另一个是除了 Null 以外的任何 Variant | 进行字符串比较。
一个表达式是 Empty 而另一个是数值数据类型 | 进行数值比较，使用 0 作为 Empty 表达式。
一个表达式是 Empty 而另一个是 String | 进行字符串比较，使用长度为零的字符串 ("") 作为 Empty 表达式。

如果 expression1 和 expression2 都是 Variant 表达式， 则它们的基本类型决定了比较方式。下列表格说明如何比较表达式，或指出通过比较得到的结果，此结果取决于 Variant 的基本类型：

如果 | 则
两个 Variant 表达式都是数值 | 进行数值比较。
两个 Variant 表达式都是字符串 | 进行字符串比较。
一个 Variant 表达式是数值而另一个是字符串 | 数值表达式小于字符串表达式。
一个 Variant 表达式是 Empty 而另一个是数值 | 进行数值比较，使用 0 作为 Empty 表达式。
一个 Variant 表达式是 Empty 而另一个是字符串 | 进行字符串比较，使用长度为零的字符串 ("") 作为 Empty 表达式。
两个 Variant 表达式都是 Empty | 表达式相等。

当一个 Single 与一个 Double 作比较时，Double 会进行舍入处理而与此 Single 有相同的精确度。

如果一个 Currency 与一个 Single 或 Double 进行比较，则 Single 或 Double 转换成一个 Currency。与此相似，当一个 Decimal 要与一个 Single 或 Double 进行比较时，Single 或 Double 会转换成一个 Decimal。对于 Currency，任何小于 .0001 的小数将被舍弃，对于 Decimal，任何小于 1E-28 的小数将被舍弃，或者可能产生溢出错误。舍弃这样的小数部分会使原来不相等的两个数值经过比较后相等。


比较运算符示例

本示例示范各种“比较运算符”的用法。这类运算符通常拿来做表达式结果的比较。

Dim MyResult, Var1, Var2
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。


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


Eqv 运算符示例

本示例使用 Eqv 运算符来做两个表达式结果的逻辑等价（logical equivalence）。

Dim A, B, C, D, MyCheck
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 运算符

用来对两个表达式进行逻辑蕴涵运算。

语法

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


Imp 运算符示例

本示例使用 Imp 运算符来做两个表达式结果的逻辑隐含式（logical implication）。

Dim A, B, C, D, MyCheck
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（位比较的结果）。


Is 运算符

用来比较两个对象的引用变量。

语法

result = object1 Is object2

Is 运算符的语法具有以下几个部分：

部分 | 描述
result | 必需的；任何数值变量。
object1 | 必需的；任何对象名称。
object2 | 必需的；任何对象名称。

说明

如果 object1 和 object2 两者引用相同的对象，则 result 为 True；否则，result 为 False。有很多方法使两个变量引用相同的对象。

在以下示例中，A 和 B 已被设置成与 C 引用相同的对象：

Set A = B

在下例中，A 和 B 引用的对象与 C 相同：

Set A = C
Set B = C


Is 运算符示例

本示例使用 Is 运算符来比较两个对象引用。示例中的对象变量名只是作说明用途的一般性名称而已。

Dim MyObject, YourObject, ThisObject, OtherObject, ThatObject, MyCheck
Set YourObject = MyObject    ' 指定对象引用。
Set ThisObject = MyObject
Set ThatObject = OtherObject
MyCheck = YourObject Is ThisObject    ' 返回 True。
MyCheck = ThatObject Is ThisObject    ' 返回 False。
' 假设 MyObject <> OtherObject
MyCheck = MyObject Is ThatObject    ' 返回 False。


Like 运算符

用来比较两个字符串。

语法

result = string Like pattern

Like 运算符的语法具有以下几个部分：

部分 | 描述
result | 必需的；任何数值变量。
string | 必需的；任何字符串表达式。
pattern | 必需的；任何字符串表达式，遵循“说明”中的模式匹配约定。

说明

如果 string 与 pattern 匹配，则 result 为 True；如果不匹配，则 result 为 False。但是如果 string 或 pattern 中有一个为 Null，则 result 为 Null。

Like 运算符的特性随着 Option Compare 语句而不同。每个模块的缺省字符串比较方法是 Option Compare Binary。

在字符串比较中，Option Compare Binary 的结果是根据字符的内部二进制表示法导出的排序顺序得到的。在 Microsoft Windows 中，排序顺序由代码页决定。下例说明通常二进制的排序顺序：

A < B < E < Z < a < b < e < z < _ < _ < _ < _ < _ < ?/P>

在字符串比较中，Option Compare Text 的结果是字符串比较，它建立在不区分大小写的文本排序顺序基础上，而这一排序顺序是由系统的区域确定的。在对相同的字符使用 Option Compare Text 时会产生以下文本排序顺序：

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

内建的模式匹配功能提供了多种工具来进行字符串比较。有了模式匹配功能就可以使用通配符、字符串列表或字符区间的任何组合来匹配字符串。下列表格指出 pattern 中允许的字符以及它们与什么进行匹配：

pattern 中的字符 | 符合 string 中的
? | 任何单一字符。
* | 零个或多个字符。
# | 任何一个数字 (0–9)。
[charlist] | charlist.中的任何单一字符。
[!charlist] | 不在 charlist 中的任何单一字符。

在中括号 ([ ]) 中，可以用由一个或多个字符 (charlist) 组成的组与 string 中的任一字符进行匹配，这个组几乎包括任何一个字符代码以及数字。

注意 为了与左括号 ([)、问号 (?)、数字符号 (#) 和星号 (*) 等特殊字符进行匹配，可以将它们用方括号括起来。不能在一个组内使用右括号 (]) 与自身匹配，但在组外可以作为个别字符使用。

通过在范围的上、下限之间用连字符 (–)，charlist 可以指定字符的范围。例如，如果 string 中相应字符的位置包括 A–Z 之间的任意大写字母，则 [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 的开头（如果使用惊叹号，则在惊叹号之后），也可以出现在 charlist 的结尾与自身匹配。在任何其它地方，连字符用来识别字符的范围。

  • 当指定了字符范围时，这些字符必须按照升序（从最小到最大）顺序来显示。[A-Z] 是有效模式，但 [Z-A] 不是。

  • 字符序列 [] 被看作是长度为零的字符串 ("")。

某些语言的字母表中有一些特殊字符，它们表示两个分开的字符。例如，在一些语言中，当字符 "a" 与 "e" 同时出现时，用 "_" 来表示字符 "a" 与 "e"。Like 运算符可以辨认出单一的特殊字符和两个个别字符是否相等。

当一个语言使用了一个特殊字符，而且这个字符在系统地区设置中已被指定的时候，在 pattern 或 string 中出现的单一特殊字符将与其他字符串中等价的两个字符相匹配。与此相似，由方括号括起来的 pattern 中的单一特殊字符（字符本身在列表或范围内）将与 string 中等价的两个字符序列匹配。


Like 运算符示例

本示例使用 Like 运算符做字符串的方式比较。

Dim MyCheck
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。


Mod 运算符

用来对两个数作除法并且只返回余数。

语法

result = number1 Mod number2

Mod 的语法具有以下几个部分：

部分 | 描述
result | 必需的；任何数值变量。
number1 | 必需的；任何数值表达式。
number2 | 必需的；任何数值表达式。

说明

在进行 Mod 运算或求余数运算时，该运算符将 number1 用 number2 除（将浮点数字四舍五入成整数），并把余数作为 result 的值返回。例如，在下列表达式中，A (result) 等于 5。

A = 19 Mod 6.7

一般说来，不管 result 是否为一个整数，result 的数据类型为 Byte，Byte 变体、Integer、Integer 变体、Long 或一个包含 Long 的 Variant。任何小数部分都被删除。但是，如果任何一个 Null，类型的表达式出现时，result 都将是 Null。任何 Empty 类型表达式都作为 0 处理。


Mod 运算符示例

本示例使用 Mod 运算符来对两数作除法运算，但返回其余数而非商数。如果两数中有一数为浮点数，该数会先被四舍五入成整型后再进行运算。

Dim MyResult
MyResult = 10 Mod 5    ' 返回 0。
MyResult = 10 Mod 3    ' 返回 1。
MyResult = 12 Mod 4.3    ' 返回 0。
MyResult = 12.6 Mod 5    ' 返回 3。


Not 运算符

用来对表达式进行逻辑否定运算。

语法

result = Not expression

Not 运算符的语法具有以下几个部分：

部分 | 描述
result | 必需的；任何数值变量。
expression | 必需的；任何表达式。

说明

下表说明如何确定 result：

如果 expression 为 | 则 result 为
True | False
False | True
Null | Null

此外，Not 运算符改变任何变量的位值，并根据下表设置 result 中相应的位：

如果在 expression 的位为 | 则在 result 中的位为
0 | 1
1 | 0


Not 运算符示例

本示例使用 Not 运算符来做两个表达式结果的逻辑非（logical negation）。

Dim A, B, C, D, MyCheck
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 运算符

用来对两个表达式进行逻辑析取运算。

语法

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


Or 运算符示例

本示例使用 Or 运算符来做两个表达式结果的逻辑析取（logical disjunction）。

Dim A, B, C, D, MyCheck
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 运算符

用来对两个表达式进行逻辑互斥或运算。

语法

[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 运算符既可作为逻辑运算符，也可作为位运算符。使用互斥或的逻辑进行的两个表达式的逐位比较，其结果通过下表说明：

如果 expression1 为 | 且 expression2 为 | 则 result 为
0 | 0 | 0
0 | 1 | 1
1 | 0 | 1
1 | 1 | 0


Xor 运算符示例

本示例使用 Xor 运算符来做两个表达式结果的逻辑异或（logical exclusion）。

Dim A, B, C, D, MyCheck
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（位比较的结果）。


AtEndOfLine 属性

描述

只读属性，在 TextStream 文件中，如果文件指针正好在行尾标记的前面，那么该属性值返回 True；否则返回 False。

语法

object.AtEndOfLine

object 总是一个 TextStream 对象的名称。

说明

AtEndOfLine 属性仅应用于已打开供读取的 TextStream 文件；否则就会出错。

下面的代码举例说明了 AtEndOfLine 属性的用法：

Dim fs, a, retstring
Set fs = CreateObject("Scripting.FileSystemObject")
Set a = fs.OpenTextFile("c:\testfile.txt", ForReading, False)
Do While a.AtEndOfLine <> True
    retstring = a.Read(1)
    ...
Loop
a.Close


AtEndOfStream 属性

描述

只读属性，如果文件指针在 TextStream 文件末尾，则该属性值返回 True；否则返回 False。

语法

object.AtEndOfStream

object 总是一个 TextStream 对象的名称。

说明

AtEndOfStream 属性仅应用于已打开供读取的 TextStream 文件；否则就会出错。

下面的代码举例说明了 AtEndOfStream 属性的用法：

Dim fs, a, retstring
Set fs = CreateObject("Scripting.FileSystemObject")
Set a = fs.OpenTextFile("c:\testfile.txt", ForReading, False)
Do While a.AtEndOfStream <> True
    retstring = a.ReadLine
    ...
Loop
a.Close


Attributes 属性

描述

设置或者返回文件或文件夹的属性。读/写或只读，取决于属性。

语法

object.Attributes [= newattributes]

Attributes 属性有下列几个部分：

部分 | 描述
object | 必需的。总是某个 File 或者 Folder 对象的名字。
newattributes | 可选的。如果提供的话，newattributes 就是所指定 object 的新属性值。

设置

newattributes 参数可以是具有下列值中的任意一个或任意的逻辑组合：

常数 | 值 | 描述
Normal | 0 | 一般文件。未设置属性。
ReadOnly | 1 | 只读文件。属性为读/写。
Hidden | 2 | 隐藏文件。属性为读/写。
System | 4 | 系统文件。属性为读/写。
Volume | 8 | 磁盘驱动器卷标。属性为只读。
Directory | 16 | 文件夹或目录。属性为只读。
Archive | 32 | 自上次备份后已经改变的文件。属性为读/写。
Alias | 64 | 链接或快捷方式。属性为只读。
Compressed | 128 | 压缩文件。属性为只读。

说明

下面的代码用一个文件举例说明了 Attributes 属性的用法：

Sub SetClearArchiveBit(filespec)
    Dim fs, f, r
    Set fs = CreateObject("Scripting.FileSystemObject")
    Set f = fs.GetFile(fs.GetFileName(filespec))
    If f.attributes and 32 Then
        r = MsgBox("The Archive bit is set, do you want to clear it?", vbYesNo, "Set/Clear Archive Bit")
        If r = vbYes Then
            f.attributes = f.attributes - 32
            MsgBox "Archive bit is cleared."
        Else
            MsgBox "Archive bit remains set."
        End If
    Else
        r = MsgBox("The Archive bit is not set. Do you want to set it?", vbYesNo, "Set/Clear Archive Bit")
        If r = vbYes Then
            f.attributes = f.attributes + 32
            MsgBox "Archive bit is set."
        Else
            MsgBox "Archive bit remains clear."
        End If
    End If
End Sub


AvailableSpace 属性

描述

返回在指定的驱动器或网络共享上的用户可用空间容量。

语法

object.AvailableSpace

object 总是一个 Drive 对象。

说明

一般来说，AvailableSpace 属性的返回值与 FreeSpace 属性的返回值是相同的。对于支持限额的计算机系统来说，两个值之间可能会有所不同。

下面的代码举例说明了 AvailableSpace 属性的用法：

Sub ShowAvailableSpace(drvPath)
    Dim fs, d, s
    Set fs = CreateObject("Scripting.FileSystemObject")
    Set d = fs.GetDrive(fs.GetDriveName(drvPath))
    s = "Drive " & UCase(drvPath) & " - "
    s = s & d.VolumeName  & vbCrLf
    s = s & "Available Space: " & FormatNumber(d.AvailableSpace/1024, 0)
    s = s & " Kbytes"
    MsgBox s
End Sub


Calendar 属性

返回或设置一个值，指出工程中所使用日历的类型。

可以为 Calendar使用下列设置之一:

设置 | 值 | 描述
vbCalGreg | 0 | 使用Gregorian 日历(缺省)。
vbCalHijri | 1 | 使用Hijri 日历。

说明

可以程序化地只设置Calendar 属性。例如，要使用Hijri 日历，使用：

Calendar = vbCalHijri


Column 属性

描述

只读属性，返回 TextStream 文件中当前字符位置的列号。

语法

object.Column

object 总是一个 TextStream 对象的名称。

说明

在写了一个新行字符后，但在写任何其他字符之前，Column 的值是 1。


CompareMode 属性

描述

设置或返回某个 Dictionary 对象中的比较字符串关键字的比较模式。

语法

object.CompareMode[ = compare]

CompareMode 属性具有下列部分：

部分 | 描述
object | 必需的。总是一个 Dictionary 对象的名称。
compare | 可选的。如果提供的话，compare 是一个代表比较模式的值，该比较模式用于象 StrComp 这样的函数。

设置

compare 参数可以具有下列值：

常数 | 值 | 描述
VbUseCompareOption | –1 | 使用 Option Compare 语句的设置值进行比较。
vbBinaryCompare | 0 | 进行二进制比较。
vbTextCompare | 1 | 进行文字比较。
vbDatabaseCompare | 2 | 仅用于 Microsoft Access。进行基于您自己数据库中信息的比较。

说明

如果试图对已经包含数据的 Dictionary 对象的比较模式进行更改的话，就会出错。

CompareMode 属性所用的参数值与 StrComp 函数所用的 compare 参数相同。可以用大于 2 的值表示使用特定 Locale IDs (LCID) 的比较。


Count 属性

返回 Long（长整数），包含集合中的对象数目。只读。


Count 属性示例

本示例使用 Collection 对象的 Count 属性，用来指示要将 MyClasses 集合对象中所有成员全部删除所需完成的次数（一次删除一个）。当集合对象以数字做索引值时，缺省方式是数值 1 代表第一个成员。因为集合对象的成员若被删除，便会自动重新编排索引值，所以下列代码中只在集合中连续删除第一个成员，最后即可删除所有成员。

Dim Num, MyClasses
For Num = 1 To MyClasses.Count    ' 删除集合对象里的成员。
    MyClasses.Remove 1    ' 集合对象索引值缺省方式为由 1 开始。
Next


Count 属性

描述

返回集合或 Dictionary 对象中的条目数。只读。

语法

object.Count

object 总是“应用于”列表中某一项的名称。

说明

下面的代码举例说明了 Count 属性的使用方法：

Dim a, d, i             '创建一些变量
Set d = CreateObject("Scripting.Dictionary")
d.Add "a", "Athens"     '添加一些关键字和条目。
d.Add "b", "Belgrade"
d.Add "c", "Cairo"
a = d.Keys              '获得关键字
For i = 0 To d.Count -1 '遍及数组
    Print a(i)          '打印关键字
Next
...


DateCreated 属性

描述

返回指定文件或文件夹的创建日期和时间。只读。

语法

object.DateCreated

object 总是一个 file 或Folder对象。

说明

下面的代码用一个文件举例说明了 DateCreated 属性的用法：

Sub ShowFileInfo(filespec)
    Dim fs, f, s
    Set fs = CreateObject("Scripting.FileSystemObject")
    Set f = fs.GetFile(filespec)
    s = "Created: " & f.DateCreated
    MsgBox s
End Sub


DateLastAccessed 属性

描述

返回最后一次访问指定文件或文件夹的日期和时间。只读。

语法

object.DateLastAccessed

object 总是一个 file 或 Folder 对象。

说明

下面的代码用一个文件举例说明了 DateLastAccessed 属性的用法：

Sub ShowFileAccessInfo(filespec)
    Dim fs, f, s
    Set fs = CreateObject("Scripting.FileSystemObject")
    Set f = fs.GetFile(filespec)
    s = UCase(filespec) & vbCrLf
    s = s & "Created: " & f.DateCreated & vbCrLf
    s = s & "Last Accessed: " & f.DateLastAccessed & vbCrLf
    s = s & "Last Modified: " & f.DateLastModified
    MsgBox s, 0, "File Access Info"
End Sub

重点 这种方法由其下一级操作系统决定其行为。如果操作系统不支持提供时间信息，则没有返回信息。


DateLastModified 属性

描述

返回最后一次修改指定文件或文件夹的日期和时间。只读。

语法

object.DateLastModified

object 总是一个 file 或 Folder 对象。

说明

下面的代码用一个文件举例说明了 DateLastModified 属性的用法：

Sub ShowFileAccessInfo(filespec)
    Dim fs, f, s
    Set fs = CreateObject("Scripting.FileSystemObject")
    Set f = fs.GetFile(filespec)
    s = UCase(filespec) & vbCrLf
    s = s & "Created: " & f.DateCreated & vbCrLf
    s = s & "Last Accessed: " & f.DateLastAccessed & vbCrLf
    s = s & "Last Modified: " & f.DateLastModified
    MsgBox s, 0, "File Access Info"
End Sub


Description 属性

返回或设置一个字符串表达式，包含与对象相关联的描述性字符串。可读/可写。

对于 Err 对象，返回或设置与错误相关联的描述性字符串。

说明

Description 属性设置对错误进行简短描述。当无法处理或不想处理错误的时候，可以使用这个属性提醒用户。在生成用户自定义的错误时，将有关此错误的一个简短陈述指定给 Description 属性。如果 Description 未填入数据，而且 Number 的值与 Visual Basic 运行时错误一致，那么在生成错误时，将 Error 函数返回的字符串放置在 Description 中。


Description 属性示例

本示例将一个用户自定义的信息，指定给 Err 对象的 Description 属性。

Err.Description = "It was not possible to access an object necessary " _
& "for this operation。"


Drive 属性

描述

返回指定文件或文件夹所在的驱动器符号。只读。

语法

object.Drive

object 总是一个 File 或 Folder 对象。

说明

下面的代码举例说明了 Drive 属性的用法：

Sub ShowFileAccessInfo(filespec)
    Dim fs, f, s
    Set fs = CreateObject("Scripting.FileSystemObject")
    Set f = fs.GetFile(filespec)
    s = f.Name & " on Drive " & UCase(f.Drive) & vbCrLf
    s = s & "Created: " & f.DateCreated & vbCrLf
    s = s & "Last Accessed: " & f.DateLastAccessed & vbCrLf
    s = s & "Last Modified: " & f.DateLastModified
    MsgBox s, 0, "File Access Info"
End Sub


DriveLetter 属性

描述

返回某个物理本地驱动器或网络共享的驱动器字母。只读。

语法

object.DriveLetter

object 总是一个 Drive 对象。

说明

如果指定的驱动器没有同某个驱动器字母关联起来，例如，未被映射到一个驱动器字母的网络共享，则 DriveLetter 属性返回一个 0 字节长度的字符串 ("")。

下面的代码举例说明了 DriveLetter 属性的用法：

Sub ShowDriveLetter(drvPath)
    Dim fs, d, s
    Set fs = CreateObject("Scripting.FileSystemObject")
    Set d = fs.GetDrive(fs.GetDriveName(drvPath))
    s = "Drive " & d.DriveLetter & ": - "
    s = s & d.VolumeName  & vbCrLf
    s = s & "Free Space: " & FormatNumber(d.FreeSpace/1024, 0)
    s = s & " Kbytes"
    MsgBox s
End Sub


Drives 属性

描述

返回包含本地机器上所有可用 Drive 对象的 Drives 集合。

语法

object.Drives

object 总是一个 FileSystemObject。

说明

对于可删除媒体驱动器来说，不需要插入媒体，就可使其出现在 Drives 集合中。

可以用 For Each...Next 结构遍及 Drives 集合中的成员，如下面的代码所示：

Sub ShowDriveList
    Dim fs, d, dc, s, n
    Set fs = CreateObject("Scripting.FileSystemObject")
    Set dc = fs.Drives
    For Each d in dc
        s = s & d.DriveLetter & " - "
        If d.DriveType = 3 Then
            n = d.ShareName
        Else
            n = d.VolumeName
        End If
        s = s & n & vbCrLf
    Next
    MsgBox s
End Sub


DriveType 属性

描述

返回一个值，表示指定驱动器的类型。

语法

object.DriveType

object 总是一个 Drive 对象。

说明

下面的代码举例说明了 DriveType 属性的用法：

Sub ShowDriveType(drvpath)
    Dim fs, d, s, t
    Set fs = CreateObject("Scripting.FileSystemObject")
    Set d = fs.GetDrive(drvpath)
    Select Case d.DriveType
        Case 0: t = "Unknown"
        Case 1: t = "Removable"
        Case 2: t = "Fixed"
        Case 3: t = "Network"
        Case 4: t = "CD-ROM"
        Case 5: t = "RAM Disk"
    End Select
    s = "Drive " & d.DriveLetter & ": - " & t
    MsgBox s
End Sub


Files 属性

描述

返回由所有 File 对象组成的 Files 集合，这些 File 对象包含在指定的文件夹中──包括设置了隐藏和系统文件属性的那些文件。

语法

object.Files

object 总是一个 Folder 对象。

说明

下面的代码举例说明了 Files 属性的用法：

Sub ShowFileList(folderspec)
    Dim fs, f, f1, fc, s
    Set fs = CreateObject("Scripting.FileSystemObject")
    Set f = fs.GetFolder(folderspec)
    Set fc = f.Files
    For Each f1 in fc
        s = s & f1.name
        s = s &  vbCrLf
    Next
    MsgBox s
End Sub


FileSystem 属性

描述

返回指定驱动器所使用的文件系统类型。

语法

object.FileSystem

object 总是一个 Drive 对象。

说明

可以得到的返回类型包括 FAT、NTFS、以及 CDFS。

下面的代码举例说明了 FileSystem 属性的用法：

Sub ShowFileSystemType
    Dim fs,d, s
    Set fs = CreateObject("Scripting.FileSystemObject")
    Set d = fs.GetDrive("e:")
    s = d.FileSystem
    MsgBox s
End Sub


FreeSpace 属性

描述

返回指定驱动器上或网络共享的用户可用磁盘剩余空间容量。只读。

语法

object.FreeSpace

object 总是一个 Drive 对象。

说明

一般来说，FreeSpace 属性的返回值和 AvailableSpace 属性的返回值是相同的。对于支持限额的计算机系统来说，二者之间可能有所不同。

下面的代码举例说明了 FreeSpace 属性的用法：

Sub ShowFreeSpace(drvPath)
    Dim fs, d, s
    Set fs = CreateObject("Scripting.FileSystemObject")
    Set d = fs.GetDrive(fs.GetDriveName(drvPath))
    s = "Drive " & UCase(drvPath) & " - "
    s = s & d.VolumeName  & vbCrLf
    s = s & "Free Space: " & FormatNumber(d.FreeSpace/1024, 0)
    s = s & " Kbytes"
    MsgBox s
End Sub


HelpContext 属性

返回或设置一个字符串表达式，包含 Microsoft Windows 帮助文件中的主题的上下文 ID。可读 / 可写。

说明

HelpContext 属性被用来自动显示 HelpFile 属性中指定的帮助主题。如果 HelpFile 和 HelpContext 都是空的，则检查 Number 的值。如果 Number 的值与 Visual Basic 运行时错误一致，则对此错误使用 Visual Basic 帮助上下文 ID。如果 Number 的值与 Visual Basic 错误不一致，则在屏幕上显示 Visual Basic 帮助文件的内容。

注意 应该在应用程序中写入一些例程来处理常见错误。当使用对象编程时，可以用该对象的帮助文件来提高处理错误的质量，而如果错误无法补救，则要为用户显示一段有意义的消息。


HelpContext 属性示例

本示例使用 Err 对象的 HelpContext 属性，来显示 Visual Basic 对于“溢出”（Overflow）错误的帮助主题。

Dim Msg
Err.Clear
On Error Resume Next
Err.Raise 6 ' 引发“溢出”错误。
If Err.Number <> 0 Then
    Msg = "Press F1 or HELP to see " & Err.HelpFile & " topic for" & _
    " the following HelpContext: " & Err.HelpContext
    MsgBox Msg, , "Error: " & Err.Description, Err.HelpFile, _
Err.HelpContext
End If


HelpFile 属性

返回或设置一个字符串表达式，表示帮助文件的完整限定路径。可读/可写。

说明

如果 HelpFile 中指定了帮助文件，则当用户在错误消息对话框中按下 Help 按钮（或Windows 中的 F1 键或Macintosh中的 HELP 键)）时，帮助文件被自动调用。如果 HelpContext 属性包含被指定文件的有效的上下文 ID，则自动显示那一主题。如果未指定 HelpFile，则显示 Visual Basic 帮助文件。

注意 应该在应用程序中写入一些例程来处理常见错误。当使用对象编程时，可以用该对象的帮助文件来提高处理错误的质量，而如果错误无法补救，则要为用户显示一段有意义的消息。


HelpFile 属性示例

本示例使用 Err 对象的 HelpFile 属性，来激活 在线帮助系统。HelpFile 属性缺省值为 Visual Basic 帮助文件之文件名。

Dim Msg
Err.Clear
On Error Resume Next    ' 由于示范目的，改变错误处理的方式。
Err.Raise 6    ' 引发“溢出”错误。
Msg = "Press F1 or HELP to see " & Err.HelpFile & _
" topic for this error"
MsgBox Msg, , "Error: " & Err.Description,Err.HelpFile, Err.HelpContext


IsReady 属性

描述

如果指定的驱动器已准备好，返回 True；否则返回 False。

语法

object.IsReady

object 总是一个 Drive 对象。

说明

对于可删除媒体驱动器和 CD-ROM 驱动器来说，仅当插入了适当的媒体，并已准备好供访问时，IsReady 才返回 True。

下面的代码举例说明了 IsReady 属性的用法：

Sub ShowDriveInfo(drvpath)
    Dim fs, d, s, t
    Set fs = CreateObject("Scripting.FileSystemObject")
    Set d = fs.GetDrive(drvpath)
    Select Case d.DriveType
        Case 0: t = "Unknown"
        Case 1: t = "Removable"
        Case 2: t = "Fixed"
        Case 3: t = "Network"
        Case 4: t = "CD-ROM"
        Case 5: t = "RAM Disk"
    End Select
    s = "Drive " & d.DriveLetter & ": - " & t
    If d.IsReady Then
        s = s & vbCrLf & "Drive is Ready."
    Else
        s = s & vbCrLf & "Drive is not Ready."
    End If
    MsgBox s
End Sub


IsRootFolder 属性

描述

如果指定的文件夹是根文件夹，则返回 True；否则返回 False。

语法

object.IsRootFolder

object 总是一个 Folder 对象。

说明

下面的代码举例说明了 IsRootFolder 属性的用法：

Dim fs
Set fs = CreateObject("Scripting.FileSystemObject")
Sub DisplayLevelDepth(pathspec)
    Dim f, n
    Set f = fs.GetFolder(pathspec)
    If f.IsRootFolder Then
        MsgBox "The specified folder is the root folder."
    Else
        Do Until f.IsRootFolder
            Set f = f.ParentFolder
            n = n + 1
        Loop
        MsgBox "The specified folder is nested " & n & " levels deep."
    End If
End Sub


Item 属性

描述

对 Dictionary 对象中指定的 Key，设置或返回一个 Item 。对于集合来说，基于指定的 Key ，返回一个 Item 。读/写属性。

语法

object.Item(key) [= newitem]

Item 属性具有下列部分：

部分 | 描述
object | 必需的。总是一个集合或 Dictionary 对象的名称。
key | 必需的。与被检索或添加的条目相关联的 Key 。
newitem | 可选的。仅用于 Dictionary 对象；没有用于集合的应用程序。如果提供的话，newitem 是与指定的 Key 相关联的新值。

说明

如果在改变某个 item 时，没有找到 key，则用指定的newitem创建一个新的 key 。如果在试图返回某个已存在条目时，没有找到 key，则创建一个新 key，且其相应的条目为空。


Key 属性

描述

在一个 Dictionary 对象中设置一个 key。

语法

object.Key(key) = newkey

Key 属性具有下列部分：

部分 | 描述
object | 必需的。总是一个 Dictionary 对象的名字。
key | 必需的。被更改的 Key值。
newkey | 必需的。替换指定 key 的新值。

说明

如果在更改某个 key 时，没有找到 key，则会出现运行时错误。


LastDLLError 属性

返回因调用动态链接库 (DLL) 而产生的系统错误号。只读。 在Macintosh中，LastDLLError 总是返回零。

说明

LastDLLError 属性只适用于由 Visual Basic 代码进行的 DLL 调用。在调用时，被调用的函数通常返回一个表明成功还是失败的代码，同时对 LastDLLError 属性填充数据。请检查 DLL 函数的文档，确定返回值，表明是成功还是失败。只要返回失败代码，Visual Basic 的应用程序就应立即检查 LastDLLError 属性。在设置 LastDLLError 属性时不会有任何例外。


LastDLLError 属性示例

下列代码（您可将之粘帖到一个 UserForm 模块中）会试图调用某个 DLL（动态链接程序库）里的函数。因为程序中故意传入一个会生成错误的参数值（传入一 NULL 指针），该调用会失败，而且 SQL 如果没有在运行的话，便不能取消它的作业。程序接下来会检查该函数的返回值，并将 Err 对象的 LastDLLError 属性值显示出来。在没有DLL的操作系统中， LastDLLError 总是返回零。

 Private Declare Function SQLCancel Lib "ODBC32.dll" _
 (ByVal hstmt As Long) As Integer

Private Sub UserForm_Click()
    Dim RetVal
    ' 调用函数，但传入了无效的参数值。
    RetVal = SQLCancel(myhandle&)
    ' 检查 SQL 的返回值。
    If RetVal = -2 Then
        '显示错误代号。
        MsgBox "Error code is :" & Err.LastDllError
    End If
End Sub


Line 属性

描述

只读属性，返回一个 TextStream 文件中的当前行号。

语法

object.Line

object 总是一个 TextStream 对象的名字。

说明

文件初次打开后，在写任何东西之前，Line 的值为 1。


Name 属性

描述

设置或返回指定文件或文件夹名。读/写属性。

语法

object.Name [= newname]

Name 属性有下列几部分：

部分 | 描述
object | 必需的。总是某个 File 或 Folder 对象的名字。
newname | 可选的。如果提供的话，newname 是指定的 object 的新名。

说明

下面的代码举例说明了 Name 属性的用法：

Sub ShowFileAccessInfo(filespec)
    Dim fs, f, s
    Set fs = CreateObject("Scripting.FileSystemObject")
    Set f = fs.GetFile(filespec)
    s = f.Name & " on Drive " & UCase(f.Drive) & vbCrLf
    s = s & "Created: " & f.DateCreated & vbCrLf
    s = s & "Last Accessed: " & f.DateLastAccessed & vbCrLf
    s = s & "Last Modified: " & f.DateLastModified
    MsgBox s, 0, "File Access Info"
End Sub


Number 属性

返回或设置表示错误的数值。Number 是 Err 对象的缺省属性。可读/可写。

说明

从对象返回用户自定义的错误时，把被选作错误代码的数与 vbObjectError 常数相加，并由此设置 Err.Number。例如，用下列代码返回作为错误代码的数字 1051：

Err.Raise Number := vbObjectError + 1051, Source:= SomeClass


Number 属性示例

第一个示例说明 Number 属性在错误处理过程中的典型用法。第二个示例则检查 Err 对象的 Number 属性，以确定由某个 Automation 对象所返回的错误代号为该对象定义的，或是 Visual Basic 所定义的。请注意，常数 vbObjectError 为一个绝对值很大之负数，通常由 OLE Automation 对象所定义的错误代号会加上这个值，而由 Visual Basic 所定义的就不会。所以，将 Err.Number 减去 vbObjectError 后便可判断是否为 OLE Automation 对象定义的错误代号（引用代码中的注释）。示例中如果错误代号为 OLE Automation 对象定义的，则该错误代号便是 MyError 的值，并会和错误来源一起显示出来。如果 Err.Number 为 Visual Basic 定义的错误代号，则只将 Visual Basic 错误代号显示出来。

' Number 属性的典型用法
Sub test()
    On Error GoTo out

    Dim x, y
    x = 1 / y    ' 引发一个“除以零”的错误
    Exit Sub
    out:
    MsgBox Err.Number
    MsgBox Err.Description
    ' 检查是否发生“除以零”的错误
    If Err.Number = 11 Then
        y = y + 1
    End If
    Resume
End Sub

' 使用 Number 属性来判断Automation 对象返回的错误代号
Dim MyError, Msg
' 首先，减去 OLE Automation 对象所加上的常数。
MyError = Err.Number - vbObjectError
' 如果减去常数 vbObjectError 后的值仍然在
' 0 到 65,535 之间，便是 OLE Automation 对象定义的错误代号。
If MyError > 0 And MyError < 65535 Then
    Msg = "The object you accessed assigned this number to the error: " _
             & MyError & ". The originator of the error was: " _
            & Err.Source & ". Press F1 to see originator's Help topic。"
' 否则便是 Visual Basic 定义的错误代号。
Else
    Msg = "This error (# " & Err.Number & ") is a Visual Basic error" & _
            " number. Press Help buttonor F1 for the Visual Basic Help" _
            & " topic for this error."
End If
    MsgBox Msg, , "Object Error", Err.HelpFile, Err.HelpContext


ParentFolder 属性

描述

返回指定文件或文件夹的父文件夹对象。只读。

语法

object.ParentFolder

object 总是一个 File 或 Folder 对象。

说明

下面的代码用一个文件举例说明了 ParentFolder 属性的用法：

Sub ShowFileAccessInfo(filespec)
    Dim fs, f, s
    Set fs = CreateObject("Scripting.FileSystemObject")
    Set f = fs.GetFile(filespec)
    s = UCase(f.Name) & " in " & UCase(f.ParentFolder) & vbCrLf
    s = s & "Created: " & f.DateCreated & vbCrLf
    s = s & "Last Accessed: " & f.DateLastAccessed & vbCrLf
    s = s & "Last Modified: " & f.DateLastModified
    MsgBox s, 0, "File Access Info"
End Sub


Path 属性

描述

返回指定文件、文件夹、或驱动器的路径。

语法

object.Path

object 总是一个 File、Folder、或 Drive 对象。

说明

对于驱动器字母来说，不包括根驱动器。例如，C 驱动器的路径是 C:，而不是 C:\。

下面的代码用一个 File 对象举例说明了 Path 属性的用法：

Sub ShowFileAccessInfo(filespec)
    Dim fs, d, f, s
    Set fs = CreateObject("Scripting.FileSystemObject")
    Set f = fs.GetFile(filespec)
    s = UCase(f.Path) & vbCrLf
    s = s & "Created: " & f.DateCreated & vbCrLf
    s = s & "Last Accessed: " & f.DateLastAccessed & vbCrLf
    s = s & "Last Modified: " & f.DateLastModified
    MsgBox s, 0, "File Access Info"
End Sub


RightToLeft 属性

返回一个Boolean 值，该值指定文本显示方向和控制文本在双向系统中的视觉效果。

说明

RightToLeft属性的设置值有:

设置 | 描述
True | 该控件在双向平台上运行，比如Arabic Windows95 和Hebrew Windows95，并且文本从右向左运行。该控件能修改它的行为，比如能把垂直滚动条放到文本或列表框的左侧，把标签放到文本框的右侧，等等。
False | 该控件在非双向平台上运行，比如英文的 Windows95, 并且文本从左向右运行。如果该容器没有执行这个外围属性， False 为缺省值。

RightToLeft 从Userform 获得外围信息，表明包含在Userform 中的控件的行为。 该属性是一个 Boolean 值，指示文本显示方向和控制在双向系统中的视觉效果。缺省值是False 。


RootFolder 属性

描述

返回一个 Folder 对象，该对象表示一个指定驱动器的根文件夹。只读属性。

语法

object.RootFolder

object 总是一个 Drive 对象。

说明

驱动器上所包含的所有文件和文件夹都可以使用返回的 Folder 对象进行访问。


SerialNumber 属性

描述

返回用于唯一标识磁盘卷标的十进制序列号。

语法

object.SerialNumber

object 总是一个 Drive 对象。

说明

可以使用 SerialNumber 属性确保正确的磁盘已插入到某个带有可删除媒体的驱动器中。

下面的代码举例说明了 SerialNumber 属性的用法：

Sub ShowDriveInfo(drvpath)
    Dim fs, d, s, t
    Set fs = CreateObject("Scripting.FileSystemObject")
    Set d = fs.GetDrive(fs.GetDriveName(fs.GetAbsolutePathName(drvpath)))
    Select Case d.DriveType
        Case 0: t = "Unknown"
        Case 1: t = "Removable"
        Case 2: t = "Fixed"
        Case 3: t = "Network"
        Case 4: t = "CD-ROM"
        Case 5: t = "RAM Disk"
    End Select
    s = "Drive " & d.DriveLetter & ": - " & t
    s = s & vbCrLf & "SN: " & d.SerialNumber
    MsgBox s
End Sub


ShareName 属性

描述

返回指定驱动器的网络共享名。

语法

object.ShareName

object 总是一个 Drive 对象。

说明

如果 object 不是一个网络驱动器，则 ShareName 属性返回一个 0 字节长度的字符串 ("")。

下面的代码举例说明了 ShareName 属性的用法：

Sub ShowDriveInfo(drvpath)
    Dim fs, d, s
    Set fs = CreateObject("Scripting.FileSystemObject")
    Set d = fs.GetDrive(fs.GetDriveName(fs.GetAbsolutePathName(drvpath)))
    s = "Drive " & d.DriveLetter & ": - " & d.ShareName
    MsgBox s
End Sub


ShortName 属性

描述

返回需要较早的 8.3 命名约定的程序所使用的短名字。

语法

object.ShortName

object 总是一个 File 或 Folder 对象。

说明

下面的代码用一个 File 对象举例说明了 ShortName 属性的用法：

Sub ShowShortName(filespec)
    Dim fs, f, s
    Set fs = CreateObject("Scripting.FileSystemObject")
    Set f = fs.GetFile(filespec)
    s = "The short name for " & "" & UCase(f.Name)
    s = s & "" & vbCrLf
    s = s & "is: " & "" & f.ShortName & ""
    MsgBox s, 0, "Short Name Info"
End Sub


ShortPath 属性

描述

返回需要较早的 8.3 文件命名约定的程序所使用的短路径。

语法

object.ShortPath

object 总是一个 File 或 Folder 对象。

说明

下面的代码用一个 File 对象举例说明了 ShortName 属性的用法：

Sub ShowShortPath(filespec)
    Dim fs, f, s
    Set fs = CreateObject("Scripting.FileSystemObject")
    Set f = fs.GetFile(filespec)
    s = "The short path for " & "" & UCase(f.Name)
    s = s & "" & vbCrLf
    s = s & "is: " & "" & f.ShortPath & ""
    MsgBox s, 0, "Short Path Info"
End Sub


ShowModal 属性

设置 UserForm 在显示时是模态的或者无模式的。此属性在运行时是只读的。

说明

ShowModal 属性的设置值有：

设置 | 描述
True | (缺省) UserForm 是模态的。
False | UserForm 是无模式的。

说明

当UserForm 是模态的，在使用该应用程序的任何其他部分以前必须提供信息或者关闭UserForm 。不执行后续代码，直到UserForm 被隐藏或卸载。尽管在显示一个UserForm 时，该应用程序的其他窗体无效，但其他应用程序有效。

当 UserForm 是无模式的，不关闭UserForm用户也能查看其他窗体或窗口。

无模式的窗体不在任务栏中出现，并且不按照窗口选项卡顺序。

注意 如果您试图在Microsoft Office 97 中打开一个具有ShowModal 属性的UserForm , 您会遇到运行时错误，因为Office 97 只能显示模态的UserForms 。Office 97 忽略 ShowModal 属性，模态地显示 UserForm 。


Size 属性

描述

对于文件来说，返回以字节为单位的指定文件大小。对于文件夹来说，返回以字节为单位的包含在文件夹中所有文件和子文件夹的大小。

语法

object.Size

object 总是一个 File 或 Folder 对象。

说明

下面的代码用一个 Folder 对象举例说明了 Size 属性的用法：

Sub ShowFolderSize(filespec)
    Dim fs, f, s
    Set fs = CreateObject("Scripting.FileSystemObject")
    Set f = fs.GetFolder(filespec)
    s = UCase(f.Name) & " uses " & f.size & " bytes."
    MsgBox s, 0, "Folder Size Info"
End Sub


Source 属性

返回或设置一个字符串表达式，指明最初生成错误的对象或应用程序的名称。可读 / 可写。

说明

Source 属性是字符串表达式，指定生成错误的对象；此表达式通常是这个对象的类名或程序设计的 ID。在程序代码无法处理被访问对象产生的错误时，请使用 Source 提供消息。例如，如果访问 Microsoft Excel 时生成了一个“除以零”的错误，则 Microsoft Excel 将 Err.Number 设置成代表此错误的错误代码，并将 Source 设置成 Excel.Application。

在错误生成时，Source 就是应用程序的程序设计 ID。对于类模块，Source 应该包含一个具有 project.class 窗体的名称。当代码中出现不可预料的错误时，Source 属性会自动填上数据。对于标准模块中的错误，Source 含有工程名称。对于类模块中的错误，Source 包含具有 project.class 窗体的名称。


Source 属性示例

本示例将某个由 Visual Basic 生成的Automation 对象之程序设计标识符（Programmatic ID）存到变量 MyObjectID 中，并在程序使用 Raise 方法来生成一错误状态时，将之存入 Err 对象的 Source 属性中。在错误处理过程中，请不要在程序中使用 Source 属性（或除 Number 外的 Err 对象属性）。只有用户不能处理该错误时，才要使用 Number 以外的属性将详细的错误信息显示给用户。该示例假设App 和 MyClass是有效的引用。

Dim MyClass, MyObjectID, MyHelpFile, MyHelpContext
' 某个 MyClass 类型的对象生成一个错误，并设置 Err 对象
' 的所有属性值，包括 Source（记录 MyObjectID － 为 App 对象
' 的 Title 属性及 MyClass 对象的 Name 属性之组合）。
MyObjectID = App.Title & "." & MyClass.Name
Err.Raise    Number := vbObjectError + 894, Source := MyObjectID, _
                Description := "Was not able to complete your task", _
                HelpFile := MyHelpFile, HelpContext := MyHelpContext


StartupPosition 属性

返回或设置一个值，用来指定 UserForm 第一次出现时的位置。

可以用以下的值来设置 StartupPosition：

设置 | 值 | 描述
Manual | 0 | 没有初始设置指定。
CenterOwner | 1 | 在 UserForm 所属项目的中央。
CenterScreen | 2 | 在整个屏幕的中央。
Windows Default | 3 | 在屏幕的左上角。

说明

可以在程序中设置 StartUpPosition 属性，也可以从Properties窗口中设置。


StartUpPosition 属性示例

下列示例使用 Load 语句及 Show 方法，在 UserForm1 的 Click 事件中装入 UserForm2，并将 StartUpPosition 属性值设成 3 (Windows 缺省位置)。Show 方法则是用来将 UserForm2 显示出来。

Private Sub UserForm_Click()
    Load UserForm2
    UserForm2.StartUpPosition = 3
    UserForm2.Show
End Sub


SubFolders 属性

描述

返回包含所有文件夹的一个 Folders 集合，这些文件夹包含在某个特定的文件夹中，包括设置了隐藏和系统文件属性的那些文件夹。

语法

object.SubFolders

object 总是一个 Folder 对象。

说明

下面的代码举例说明了 SubFolders 属性的用法：

Sub ShowFolderList(folderspec)
    Dim fs, f, f1, s, sf
    Set fs = CreateObject("Scripting.FileSystemObject")
    Set f = fs.GetFolder(folderspec)
    Set sf = f.SubFolders
    For Each f1 in sf
        s = s & f1.name
        s = s &  vbCrLf
    Next
    MsgBox s
End Sub


TotalSize 属性

描述

以字节为单位，返回驱动器或网络共享的总空间大小。

语法

object.TotalSize

object 总是一个 Drive 对象。

说明

下面的代码举例说明了 TotalSize 属性的用法：

Sub ShowSpaceInfo(drvpath)
    Dim fs, d, s
    Set fs = CreateObject("Scripting.FileSystemObject")
    Set d = fs.GetDrive(fs.GetDriveName(fs.GetAbsolutePathName(drvpath)))
    s = "Drive " & d.DriveLetter & ":"
    s = s & vbCrLf
    s = s & "Total Size: " & FormatNumber(d.TotalSize/1024, 0) & " Kbytes"
    s = s & vbCrLf
    s = s & "Available: " & FormatNumber(d.AvailableSpace/1024, 0) & " Kbytes"
    MsgBox s
End Sub


Type 属性

描述

返回关于某个文件或文件夹类型的信息。例如，对于以.TXT 结尾的文件来说，返回 "Text Document"。

语法

object.Type

object 总是一个 File 或 Folder 对象。

说明

下面的代码举例说明了返回某个文件夹类型的 Type 属性的用法。在这个示例中，试图将 Recycle Bin 的路径或其他唯一的文件夹提供给过程。

Sub ShowFileSize(filespec)
    Dim fs, f, s
    Set fs = CreateObject("Scripting.FileSystemObject")
    Set f = fs.GetFolder(filespec)
    s = UCase(f.Name) & " is a " & f.Type
    MsgBox s, 0, "File Size Info"
End Sub


VolumeName 属性

描述

设置或返回指定驱动器的卷标名。读/写属性。

语法

object.VolumeName [= newname]

VolumeName 属性有下列几部分：

部分 | 描述
object | 必需的。总是一个 Drive 对象的名字。
newname | 可选的。如果提供的话，newname 是指定 object 的新名字。

说明

下面的代码举例说明了 VolumeName 属性的用法：

Sub ShowVolumeInfo(drvpath)
    Dim fs, d, s
    Set fs = CreateObject("Scripting.FileSystemObject")
    Set d = fs.GetDrive(fs.GetDriveName(fs.GetAbsolutePathName(drvpath)))
    s = "Drive " & d.DriveLetter & ": - " & d.VolumeName
    MsgBox s
End Sub


WhatsThisButton 属性

返回一个 Boolean 值，以决定“这是什么”按钮是否要出现在 UserForm 对象的标题栏。此属性在运行时是只读的。 该属性不适用于Macintosh。

说明

WhatsThisButton 属性的设置值有：

设置 | 描述
True | 显示“这是什么”按钮。
False | (缺省值) 不显示“这是什么”按钮。

说明

WhatsThisButton 属性为 True 时，WhatsThisHelp 属性也必须为 True。


WhatsThisHelp 属性

返回一个 Boolean 值，以决定上下文有关帮助是采用 Windows 95 帮助所提供的弹出式窗口，还是利用主帮助窗口。此属性在运行时是只读的。该属性不适用于Macintosh。

说明

WhatsThisHelp 属性的设置值有：

设置 | 描述
True | 应用程序可以使用“这是什么”访问技术，来启动帮助窗口，并装入由WhatsThisHelpID 属性所标识的主题。
False | (缺省值)应用程序可利用 F1 键来启动帮助窗口，并装入由 HelpContextID 属性所标识的主题。

说明

在应用程序中，有两种访问技术可提供“这是什么”。要使用这些技术，WhatsThisHelp 的属性就必须要设置为 True。

  • 利用 WhatsThisButton 属性，在 UserForm 的标题栏中提供一“这是什么”按钮。鼠标指针会变成“这是什么”状态 ( 带问号的箭头 )。显示的主题由用户所单击控件的 WhatsThisHelpID 属性来决定。

  • 采用 UserForm 的 WhatsThisMode 方法。这样便不需按钮也可生成如同按下“这是什么”按钮的动作。例如，可以在应用程序的菜单命令中引用此方法。


AppActivate 语句

激活一应用程序窗口。

语法

AppActivate title[, wait]

AppActivate 语句的语法具有以下几个命名参数：

部分 | 描述
title | 必需的。字符串表达式，所要激活的应用程序窗口的标题。可以使用 Shell 函数返回的任务识别码来替换 title，以激活应用程序。
wait | 可选的。Boolean 值，说明在激活另一个应用程序之前调用的应用程序是否有焦点。如果为 False（缺省），那么，即使调用的应用程序没有焦点，也直接激活指定的应用程序。如果为 True，则调用的应用程序会等到有焦点后，才激活指定的应用程序。

说明

AppActivate 语句将焦点移动到命名的应用程序或窗口，但并不影响焦点是否最大化或最小化。当用户采取行动改变焦点或将窗口关闭时，就会将焦点从活动的应用程序窗口移动出去。可用 Shell 函数启动一个应用程序并设置窗口样式。

在决定激活哪个应用程序时，请将 title 与每一个运行中的应用程序的标题字符串进行比较。如果没有完全匹配，就激活任何这样的应用程序，其标题字符串以 title 开头。如果以 title 命名的应用程序有很多实例，则激活任何一个实例。


AppActivate 语句示例

本示例说明使用 AppActivate 语句来激活应用程序的各种用法。示例中用到的 Shell 语句均假定该应用程序已经存在指定的路径中。在Macintosh 上，缺省驱动器名为"HD"，且路径名部分由冒号而不是反斜杠分隔。

Dim MyAppID, ReturnValue
AppActivate "Microsoft Word"    ' 激活 Microsoft
    ' Word。

' AppActivate 也可利用 Shell 函数的返回值。
MyAppID = Shell("C:\WORD\WINWORD.EXE", 1)    ' 运行 Microsoft Word。
AppActivate MyAppID    ' 激活 Microsoft
    ' Word。

' 您也可使用 Shell 函数的返回值。
ReturnValue = Shell("c:\EXCEL\EXCEL.EXE",1)    ' 运行 Microsoft Excel。
AppActivate ReturnValue    ' 激活 Microsoft
    ' Excel。


Beep 语句

通过计算机喇叭发出一个声调。

语法

Beep

说明

呼叫的频率与时间长短取决于硬件和系统软件，并随电脑不同而不同。.


Beep 语句示例

本示例使用 Beep 语句让计算机连续响三声。

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


Call 语句

将控制权转移到一个 Sub 过程，Function 过程，或动态链接库 (DLL) 过程。

语法

[Call] name [argumentlist]

Call 语句的语法具有以下几个部分：

部分 | 描述
Call | 可选参数；关键字。如果指定了这个关键字，则 argumentlist 必须加上括号，例如：
 | Call MyProc(0)
name | 必要参数，要调用的过程名称。
argumentlist |

说明

调用一个过程时，并不一定要使用 Call 关键字。如果使用 Call 关键字来调用一个需要参数的过程，argumentlist 就必须要加上括号。如果省略了 Call 关键字，那么也必须要省略 argumentlis 外面的括号。如果使用 Call 语法来调用内建函数或用户定义函数，则函数的返回值将被丢弃。

若要将整个数组传给一个过程，使用数组名，然后在数组名后加上空括号。


Call 语句示例

下列示例示范如何使用 Call 语句来将控制转移到子过程、内在函数、和动态链接库（DLL）过程，或是 Macintosh 代码资源内的过程。

' 调用一个子过程。
Call PrintToDebugWindow("Hello World")
' 上面的语句将控制转移到下面的子过程。
Sub PrintToDebugWindow(AnyString)
    Debug.Print AnyString    ' 在“立即”窗口中显示。
End Sub

' 调用一个内在函数，函数的返回值被忽略不处理。
Call Shell(AppName, 1)    ' AppName 包含可执行文件的路径。

' 调用 Microsoft Windows DLL 过程。该声明语句必需是类模块中的私有的，而不是标准模块中的。
Private Declare Sub MessageBeep Lib "User" (ByVal N As Integer)
Sub CallMyDll()
    Call MessageBeep(0)    ' 调用 Windows DLL 过程。
    MessageBeep 0    ' 再次调用，但不用“调用”这个关键字。
End Sub


ChDir 语句

改变当前的目录或文件夹。

语法

ChDir path

必要的 path 参数是一个字符串表达式，它指明哪个目录或文件夹将成为新的缺省目录或文件夹。path 可能会包含驱动器。如果没有指定驱动器，则 ChDir 在当前的驱动器上改变缺省目录或文件夹。

说明

ChDir 语句改变缺省目录位置，但不会改变缺省驱动器位置。例如，如果缺省的驱动器是 C，则下面的语句将会改变驱动器 D 上的缺省目录，但是 C 仍然是缺省的驱动器：

ChDir "D:\TMP"

在 Power Macintosh 中，默认驱动器总是改为在 path 语句中指定的驱动器。完整路径指定由卷标名开始，相对路径由冒号 (:) 开始. ChDir 可以辨认路径中指定的别名:

ChDir "MacDrive:Tmp"    ' 在 Macintosh 中。

注意 当改变相对路径时，在 Microsoft Windows 和 Macintosh 中使用不同符号:

ChDir ".."    ' 在 Microsoft Windows 中，上移一层目录.
ChDir "::"    ' 在 Macintosh 中，上移一层目录。


ChDir 语句示例

本示例使用 ChDir 语句来改变当前目录或文件夹 在 Macintosh 中，默认驱动器名称是 “HD” 并且路径部分由冒号分隔代替反斜线。同样，可以指定 Macintosh 的文件夹来替代 \Windows。最后，在Macintosh中，通配符不再包含特殊意义，只作为普通字符。。

' 将当前目录或文件夹改为“MYDIR”。
ChDir "MYDIR"

' 假设当前的驱动器是“C:”，下列语句将把
' 缺省目录改至“D:”，而“C:”仍旧是当前驱动器。
ChDir "D:\WINDOWS\SYSTEM"


ChDrive 语句

改变当前的驱动器。

语法

ChDrive drive

必要的 drive 参数是一个字符串表达式，它指定一个存在的驱动器。如果使用零长度的字符串 ("")，则当前的驱动器将不会改变。如果 drive 参数中有多个字符，则 ChDrive 只会使用首字母。 在 Macintosh 中， ChDrive 将当前文件夹改变到指定驱动器的根文件夹。


ChDrive 语句示例

本示例使用 ChDrive 语句来改变当前的驱动器。 在 Macintosh 中，“HD:” 是默认驱动器名称，而ChDrive 将改变当前文件夹到指定驱动器的根文件夹。 以下示例假设机器存在 D 驱动器。

ChDrive "D"    ' 使“D”成为当前驱动器。


Close 语句

关闭 Open 语句所打开的输入/输出 (I/O) 文件。

语法

Close [filenumberlist]

可选的 filenumberlist 参数为一个或多个文件号，其中 filenumber 为任何有效的文件号，语法如下：

[[#]filenumber] [, [#]filenumber] . . .

说明

若省略 filenumberlist，则将关闭 Open 语句打开的所有活动文件。

当关闭 Output 或 Append 打开的文件时，将属于此文件的最终输出缓冲区写入操作系统缓冲区。所有与该文件相关联的缓冲区空间都被释放。

在执行 Close 语句时，文件与其文件号之间的关联将终结。


Close 语句示例

本示例使用 Close 语句来关闭所有为 Output 而打开的三个文件。

Dim I, FileName
For I = 1 To 3    ' 循环三次。
    FileName = "TEST" & I    ' 创建文件名。
    Open FileName For Output As #I    ' 打开文件。
    Print #I, "This is a test."    ' 将字符串写入文件。
Next I
Close    ' 将三个已打开的文件全部关闭。


Const 语句

声明用于代替文字量的常数。

语法

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

Const 语句的语法包含下面部分：

部分 | 描述
Public | 可选的。该关键字用于在模块级别中声明在所有模块中对所有过程都可以使用的常数。在过程中不能使用。
Private | 可选的。该关键字用于在模块级声明只能在包含该声明的模块中使用的常数。不能在过程中使用。
constname | 必需的。常数的名称；遵循标准的变量命名约定。
type | 可选的。常数的数据类型；可以是 Byte、 Boolean 、Integer、Long、Currency、Single、Double、Decimal（目前尚不支持）、Date、String 或 Variant。所声明的每个变量都要使用一个单独的 As 类型子句。
expression | 必需的。文字，其它常数，或由除 Is 之外的任意的算术操作符和逻辑操作符所构成的任意组合。

说明

在缺省情况下常数是私有的。过程中的常数总是私有的；它们的可见性无法改变。在标准模块中，可以用 Public 关键字来改变模块级常数可见性的缺省值。不过，在类模块中，常数只能是私有的，而且用 Public 关键字也不能改变其可见性。

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

在给常量赋值的表达式中，不能使用变量，用户自定义的函数，或 Visual Basic 的内部函数（如 Chr）。

注意 常数可以使程序更具可读性，以及易于修改。在程序运行时，常数不会象变量那样无意中被改变。

如果在声明常数时没有显式地使用 As type 子句，则该常数的数据类型是最适合其表达式的数据类型。

在 Sub、Function 或 Property 过程中声明的常数都是该过程的局部常数。在过程外声明的常数，在包含该声明的模块中被定义。在可以使用表达式的地方，都可以使用常数。


Const 语句示例

该示例使用 Const 语句来声明用于代替文字值的常数。Public 常数在标准模块的通用部分声明，而不是在类模块中声明。Private 常数可以在任何模块类型的通用部分声明。

'缺省情况下常数是私有的。
Const MyVar = 459

'声明公用常数。
Public Const MyString = "HELP"

'声明私有的整数常数。
Private Const MyInt As Integer = 5

'在一行中声明多个常数。
Const MyStr = "Hello", MyDouble As Double = 3.4567


Date 语句

设置当前系统日期。

语法

Date = date

对于运行 Microsoft Windows 95 的系统，要设置的 date 必须介于 1980 年 1月 1 日与 2099 年 12 月 31 日之间。对于运行 Microsoft Windows NT 的系统，date 必须介于公元 1980 年 1 月 1 日到 2079 年 12 月 31 日之间。

对于Macintosh，date值必须是介于1904年1月1日到2040年2月5日之间的日期。


Date 语句示例

本示例使用 Date 语句来设置系统日期。在开发环境中，日期原义会根据系统的地区设置，以短式日期格式显示。

Dim MyDate
MyDate = #February 12, 1985#    ' 指定某个日期。
Date = MyDate    ' 改变系统日期。


Declare 语句

用于在模块级别中声明对动态链接库 (DLL) 中外部过程的引用。

语法 1

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

语法 2

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

Declare 语句的语法包含下面部分：

部分 | 描述
Public | 可选的。用于声明对所有模块中的所有其它过程都可以使用的过程。
Private | 可选的。用于声明只能在包含该声明的模块中使用的过程。
Sub | 可选的（但 Sub 或 Function 二者需选其一）。表示该过程没有返回值。
Function | 可选的（但 Sub 或 Function 二者需选其一）。表示该过程会返回一个可用于表达式的值。
name | 必需的。任何合法的过程名。注意动态链接库的入口处（entry points）区分大小写。
Lib | 必需的。指明包含所声明过程的动态链接库或代码资源。所有声明都需要 Lib 子句。
libname | 必需的。包含所声明的过程动态链接库名或代码资源名。
Alias | 可选的。表示将被调用的过程在动态链接库 (DLL) 中还有另外的名称。当外部过程名与某个关键字重名时，就可以使用这个参数。当动态链接库的过程与同一范围内的公用变量、常数或任何其它过程的名称相同时，也可以使用 Alias。如果该动态链接库过程中的某个字符不符合动态链接库的命名约定时，也可以使用 Alias。
aliasname | 可选的。动态链接库或代码资源中的过程名。如果首字符不是数字符号 (#)，则 aliasname 是动态链接库中该过程的入口处的名称。如果首字符是 (#)，则随后的字符必须指定该过程的入口处的顺序号。
arglist | 可选的。代表调用该过程时需要传递的参数的变量表。
type | 可选的。Function 过程返回值的数据类型；可以是 Byte、 Boolean 、Integer、Long、Currency、Single、Double、Decimal（目前尚不支持）、Date、String（只支持变长）或 Variant，用户定义类型，或对象类型。

arglist 参数的语法以及语法各个部分如下：

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

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

说明

对Function 过程而言，过程的数据类型决定其返回值的数据类型。可以在 arglist 之后使用 As 子句来指定函数返回值的数据类型。在 arglist 中，可以使用 As 子句来指定任何传给该过程的参数的数据类型。不单可以指定为任何标准数据类型，还可以在 arglist 中指定 As Any 来禁止类型检查，从而允许将任意数据类型传递给该过程。

空圆括号表示该 Sub 或 Function 过程没有参数，且 Visual Basic 应确保不会传递任何参数。在下面的示例中，First 不带任何参数。如果对 First 的调用中使用了参数，就会产生错误：

Declare Sub First Lib "MyLib" ()

如果带参数表，则每次调用该过程时都要检查参数的个数和类型。在下面的示例中，First 有一个 Long 参数：

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

注意 在 Declare 语句的参数表中不能有定长的字符串；只有变长的字符串才能传给过程。定长的字符串可以作为过程参数使用，但在传递前都要被转换为变长的字符串。

注意 当所调用的外部过程需要一个值为 0 的字符串时，就要使用 vbNullString 常数。该常数与零长度字符串 ("") 是不相同的。


Declare 语句示例

该示例演示如何在标准模块的模块级使用 Declare 语句来声明对动态链接库 (DLL) 中的一个外部过程的引用。如果是 Private 的 Declare 语句，则可以用于类模块。

'在 Microsoft Windows（16 位）中：
Declare Sub MessageBeep Lib "User" (ByVal N As Integer)
'假设 SomeBeep 是该过程名的别名。
Declare Sub MessageBeep Lib "User" Alias "SomeBeep"(ByVal N As Integer)
'在 Alias 子句使用顺序号来调用 GetWinFlags。
Declare Function GetWinFlags Lib "Kernel" Alias "#132"() As Long

'在 32 位 Microsoft Windows 系统中，指定的库应是 USER32.DLL，
'而不是 USER.DLL。可以使用条件编译来编写
'既可在 Win32 又可在 Win16 环境运行的代码。
#If Win32 Then
    Declare Sub MessageBeep Lib "User32" (ByVal N As Long)
#Else
    Declare Sub MessageBeep Lib "User" (ByVal N As Integer)
#End If


Deftype 语句

在模块级别上，为变量和传给过程的参数，设置缺省数据类型，以及为其名称以指定的字符开头的 Function 和 Property Get 过程，设置返回值类型。

语法

DefBool letterrange[, letterrange] . . .

DefByte letterrange[, letterrange] . . .

DefInt letterrange[, letterrange] . . .

DefLng letterrange[, letterrange] . . .

DefCur letterrange[, letterrange] . . .

DefSng letterrange[, letterrange] . . .

DefDbl letterrange[, letterrange] . . .

DefDec letterrange[, letterrange] . . .

DefDate letterrange[, letterrange] . . .

DefStr letterrange[, letterrange] . . .

DefObj letterrange[, letterrange] . . .

DefVar letterrange[, letterrange] . . .

所需的 letterrange 参数遵循下述语法：

letter1[-letter2]

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

说明

语句的名字就确定相应的数据类型：

语句 | 数据类型
DefBool | Boolean
DefByte | Byte
DefInt | Integer
DefLng | Long
DefCur | Currency
DefSng | Single
DefDbl | Double
DefDec | Decimal（目前尚不支持）
DefDate | Date
DefStr | String
DefObj | Object
DefVar | Variant

例如，在下面的程序段中，Message 就是一个字符串变量：

DefStr A-Q
. . .
Message = "Out of stack space."

Def type 语句只在使用该语句的模块中有效。例如，一个模块中的 DefInt 语句只对在该模块中声明的变量和传给过程的参数的缺省数据类型，以及 Function 和 Property Get 过程的返回值的类型有效；而其它模块中的变量、参数、以及返回值的缺省数据类型就不受影响。如果不用 Def type 语句显式地声明，则所有变量、参数、Function 过程、以及 Property Get 过程的缺省数据类型都是 Variant。

当指定字符范围时，通常为以字符集的前 128 个字符中的字符开始的变量定义数据类型。不过，如果指定的字符范围是A–Z，则将所有的变量，包括以字符集的扩展部分(128–255) 中的国际字符开始的变量的缺省类型都设为指定的类型。

在指定了A–Z 范围之后，就不能再使用 Def type 语句来重新定义任何子范围的变量了。在指定一个范围后，如果另一个 Def type 语句定义的范围中含有前面已定义的字符，就会产生错误。不过，不管变量是否已定义，都可以使用带 As type 子句的 Dim 语句来显式指定其数据类型。例如，可以在模块级使用如下代码将一个缺省数据类型为 Integer 的变量定义为 Double：

DefInt A-Z
Dim TaxRate As Double

Def type 语句对用户定义类型中的元素无影响，因为这些元素必须显式声明。


Deftype 语句示例

该示例演示了 Def type 语句的多种用法，来设置那些名称是以指定字符开头的变量和函数过程的缺省数据类型。只有使用 Dim 语句的显式赋值，才可以覆盖这种缺省数据类型。Def type 语句只能在模块级使用（即不能在过程内使用）。

'将名称以 A 至 K 开头变量的缺省数据类型设为 Integer 类型。
DefInt A-K
'将名称以 L 至 Z 开头变量的缺省数据类型设为 String 类型。
DefStr L-Z
CalcVar = 4    '初始化为 Integer。
StringVar = "Hello there"    '初始化为 String。
AnyVar = "Hello"     '导致 "Type mismatch" 错误。
Dim Calc As Double    '赋给一个 Double 类型。
Calc = 2.3455    '允许指定为一个 Double 数。

'Deftype 语句也可以应用于函数过程。
CalcNum = ATestFunction(4)    '调用用户自定义的函数。
'ATestFunction 函数过程的定义。
Function ATestFunction(INumber)
    ATestFunction = INumber * 2    '返回值是一个 Integer。
End Function


DeleteSetting 语句

在 Windows 注册表中 或 (Macintosh中)应用程序初始化文件中的信息，从应用程序项目里删除区域或注册表项设置。

语法

DeleteSetting appname, section[, key]

DeleteSetting 语句的语法具有下列命名参数：

部分 |  | 描述
appname | 必需的。字符串表达式，包含应用程序或工程的名称，区域或注册表项用于这些应用程序或工程。 在Macintosh中，这是System文件夹中Preferences文件夹中初始化文件的文件名。
section | 必要。字符串表达式，包含要删除注册表项设置的区域名称。如果只有 appname 和 section，则将指定的区域连同所有有关的注册表项设置都删除。
key | 可选。字符串表达式，包含要删除的注册表项设置。

说明

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


DeleteSetting 语句示例

下列示例先使用 SaveSetting 语句，来建立Windows注册区（或 16位 Windows 平台的 ini 文件）里 MyApp应用程序的项目，然后使用 DeleteSetting 语句将之删除。因为没有指定 key参数，整个区段都会被删除掉，包括区段名称及其所有的机码（key）。

' 在注册区中添加一些设置值。
SaveSetting appname := "MyApp", section := "Startup", _
            key := "Top", setting := 75
SaveSetting "MyApp","Startup", "Left", 50
' 删除区段及所有的设置值。
DeleteSetting "MyApp", "Startup"


Dim 语句

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

语法

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

Dim 语句的语法包含下面部分：

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

说明

在模块级别中用 Dim 声明的变量，对该模块中的所有过程都是可用的。在过程级别中声明的变量，只在过程内是可用的。

可以使用 Dim 语句在模块级或过程级中声明变量的数据类型。例如，下面的语句声明了 Integer 类型的变量。

Dim NumberOfEmployees As Integer

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

Dim X As New Worksheet

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

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

如果不指定数据类型或对象类型，且在模块中没有 Def type 语句，则该变量按缺省设置是 Variant 类型。

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

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


Dim 语句示例

该示例演示使用 Dim 语句来声明变量，也演示了用 Dim 语句来声明数组。数组的缺省下界为 0，可以在模块级使用 Option Base 语句来取代数组的缺省下界。

'AnyValue 和 MyValue 按缺省情况被声明为 Variant，
'同时值被设为 Empty。
Dim AnyValue, MyValue

'显式声明一个 Integer 类型的变量。
Dim Number As Integer

'在一行中声明多个变量。AnotherVar 为 Variant 类型，
'因为它的类型被省略了。
Dim AnotherVar, Choice As Boolean, BirthDate As Date

'DayArray 是一个有 51 个索引（从 0 到 50）元素的 Variant 数组，
'假设在当前模块中 Option Base 被设为 0（缺省设置）。
Dim DayArray(50)

'Matrix 是一个二维 Integer 数组。
Dim Matrix(3, 4) As Integer

'MyMatrix 是一个显式指定了上下界
'的三维 double 数组。
Dim MyMatrix(1 To 5,  4 To 9,  3 To 5) As Double

'BirthDay 是一个索引从 1 到 10 的 date 数组。
Dim BirthDay(1 To 10) As Date

'MyArray 是一个 variant 动态数组。
Dim MyArray()


Do...Loop 语句

当条件为 True 时，或直到条件变为 True 时，重复执行一个语句块中的命令。

语法

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

Loop

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

Do
[statements]
[Exit Do]
[statements]

Loop [{While | Until} condition]

Do Loop 语句的语法具有以下几个部分：

部分 | 描述
condition | 可选参数。数值表达式或字符串表达式，其值为 True 或 False。如果 condition 是 Null，则 condition 会被当作 False。
statements | 一条或多条命令，它们将被重复当或直到 condition 为 True。

说明

在 Do...Loop 中可以在任何位置放置任意个数的 Exit Do 语句，随时跳出 Do...Loop 循环。Exit Do 通常用于条件判断之后，例如 If...Then，在这种情况下，Exit Do 语句将控制权转移到紧接在 Loop 命令之后的语句。

如果 Exit Do 使用在嵌套的 Do...Loop 语句中，则 Exit Do 会将控制权转移到 Exit Do 所在位置的外层循环。


Do...Loop 语句示例

本示例示范如何使用 Do...Loop 语句。内层的 Do...Loop 语句循环到第 10 次时将标志值设置为 False，并用 Exit Do 语句强制退出内层循环。外层循环则在检查到标志值为 False 时，马上退出。

Dim Check, Counter
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

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 语句。

说明

在执行时，End 语句会重置所有模块级别变量和所有模块的静态局部变量。若要保留这些变量的值，改为使用 Stop 语句，则可以在保留这些变量值的基础上恢复执行。

注意 End 语句不调用 Unload、QueryUnload、或 Terminate 事件或任何其它 Visual Basic 代码，只是生硬地终止代码执行。窗体和类模块中的 Unload、QueryUnload、和 Terminate 事件代码未被执行。类模块创建的对象被破坏，由 Open 语句打开的文件被关闭，并且释放程序所占用的内存。其它程序的对象引用无效。

End 语句提供了一种强迫中止程序的方法。Visual Basic 程序正常结束应该卸载所有的窗体。只要没有其它程序引用该程序公共类模块创建的对象并无代码执行，程序将立即关闭。


End 语句示例

本示例使用 End 语句，在用户输入错误密码时结束代码执行。

Sub Form_Load
    Dim Password, Pword
    PassWord = "Swordfish"
    Pword = InputBox("Type in your password")
    If Pword <> PassWord Then
        MsgBox "Sorry, incorrect password"
        End
    End If
End Sub


Enum 语句

定义枚举类型。

语法

[Public | Private] Enum name

membername [= constantexpression]

membername [= constantexpression]

. . .

End Enum

Enum 语句包含下面部分：

部分 | 描述
Public | 可选的。表示该 Enum 类型在整个工程中都是可见的。Enum 类型的缺省情况是 Public。
Private | 可选的。表示该 Enum 类型只在所声明的模块中是可见的。
name | 必需的。该 Enum 类型的名称。name 必须是一个合法的 Visual Basic 标识符，在定义该 Enum 类型的变量或参数时用该名称来指定类型。
membername | 必需的。用于指定该 Enum 类型的组成元素名称的合法 Visual Basic 标识符。
constantexpression | 可选的。元素的值（为 Long 类型）。可以是别的 Enum 类型。如果没有指定 constantexpression，则所赋给的值或者是 0（如果该元素是第一个 membername），或者比其直接前驱的值大 1。

说明

所谓枚举变量，就是指用 Enum 类型定义的变量。变量和参数都可以定义为 Enum 类型。Enum 类型中的元素被初始化为 Enum 语句中指定的常数值。所赋给的值可以包括正数和负数，且在运行时不能改变。例如：

Enum SecurityLevel
    IllegalEntry = -1
    SecurityLevel1 = 0
    SecurityLevel2 = 1
End Enum

Enum 语句只能在模块级别中出现。定义 Enum 类型后，就可以用它来定义变量，参数或返回该类型的过程。不能用模块名来限定 Enum 类型。类模块中的 Public Enum 类型并不是该类的成员；只不过它们也被写入到类型库中。在标准模块中定义的 Enum 类型则不写到类型库中。具有相同名字的 Public Enum 类型不能既在标准模块中定义，又在类模块中定义，因为它们共享相同的命名空间。若不同的类型库中有两个 Enum 类型的名字相同，但成员不同，则对这种类型的变量的引用，将取决于哪一个类型库具有更高的引用优先级。

不能在 With 块中使用 Enum 类型作为目标。


Enum 语句示例

下面的示例演示用 Enum 语句定义一个命名常数的集合。在本例中是一些可以选择的颜色常数用于设计数据库的数据输入窗体。

Public Enum InterfaceColors
    icMistyRose = &HE1E4FF&
    icSlateGray = &H908070&
    icDodgerBlue = &HFF901E&
    icDeepSkyBlue = &HFFBF00&
    icSpringGreen = &H7FFF00&
    icForestGreen = &H228B22&
    icGoldenrod = &H20A5DA&
    icFirebrick = &H2222B2&
End Enum


Erase 语句

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

语法

Erase arraylist

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

说明

Erase 根据是固定大小（常规的）数组还是动态数组，来采取完全不同的行为。Erase 无需为固定大小的数组恢复内存。Erase 按下表来设置固定数组的元素：

数组类型 | Erase 对固定数组元素的影响
固定数值数组 | 将每个元素设为 0。
固定字符串数组（长度可变） | 将每个元素设为零长度字符串 ("")。
固定字符串数组（长度固定） | 将每个元素设为 0。
固定 Variant 数组 | 将每个元素设为 Empty。
用户定义类型的数组 | 将每个元素作为单独的变量来设置。
对象数组 | 将每个元素设为特定值 Nothing。

Erase 释放动态数组所使用的内存。在下次引用该动态数组之前，程序必须使用 ReDim 语句来重新定义该数组变量的维数。


Erase 语句示例

该示例使用 Erase 语句重新初始化固定大小的数组中的元素，以及释放动态数组存储空间。

'声明数组变量。
Dim NumArray(10) As Integer    ' Integer 数组。
Dim StrVarArray(10) As String    '变长的 String 数组。
Dim StrFixArray(10) As String * 10    '定长的 String 数组。
Dim VarArray(10) As Variant    'Variant 数组。
Dim DynamicArray() As Integer    '动态数组。
ReDim DynamicArray(10)    '分配存储空间。
Erase NumArray    '将每个元素设为 0。
Erase StrVarArray    '将每个元素设为
    '零长度字符串 ("")。
Erase StrFixArray    '将每个元素设为 0。
Erase VarArray    '将每个元素设为 Empty。
Erase DynamicArray    '释放数组所用内存。


Error 语句

模拟错误的发生。

语法

Error errornumber

必要的 errornumber 可以是任何有效的错误号。

说明

Error 语句获得的支持是向后兼容的。在新的代码中，特别是在建立对象时，要使用 Err 对象的 Raise 方法产生运行时错误。

如果已经定义 errornumber，那么，在 Err 对象的属性被赋予下列值之后，Error 语句会调用错误处理程序：

属性 | 值
Number | 作为参数指定给 Error 语句的值。可以是任何有效的错误号。
Source | 当前 Visual Basic 工程的名称。
Description | 字符串表达式，如果这个字符串存在，则表达式将与 Error 函数的返回值一致，该返回值是 Error 函数对指定的 Number 的返回值。如果这个字符串不存在，则 Description 包含一个长度为零的字符串 ("")。
HelpFile | Visual Basic 帮助文件的完整限定的驱动器、路径和文件名。
HelpContext | 对于与 Number 属性一致的错误所指定的 Visual Basic 帮助文件上下文 ID。
LastDLLError | 零。

如果不存在错误处理程序，或未做任何启动动作，那么就会由 Err 对象属性发布一个错误信息并将错误信息显示出来。

注意 并非全部 Visual Basic 主应用程序都可以建立对象。请参考主机应用程序的文档来判断它能否建立类和对象。


Error 语句示例

本示例使用 Error 语句来模拟发生错误代号 11 的状况。

On Error Resume Next    ' 错误处理。
Error 11    ' 模拟“除以零”的错误。


Event 语句

定义用户自定义的事件。

语法

[Public] Event procedurename [(arglist)]

Event 语句包含下面部分：

部分 | 描述
Public | 可选的。指定该 Event 在整个工程中都是可见的。缺省情况下 Events 类型是 Public。应注意，事件只能在所声明的模块中产生。
procedurename | 必需的。事件的名称；遵循标准的变量命名约定。

arglist 参数的语法及语法的各个部分如下：

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

部分 | 描述
ByVal | 可选的。表示该参数是按值传递的。
ByRef | 可选的。表示该参数是按地址传递的。ByRef 是 Visual Basic 的缺省设置。
varname | 必需的。代表要传递给过程的参数变量的名称；遵循标准的变量命名约定。
type | 可选的。指传递给过程的参数的数据类型；可以是 Byte、 Boolean 、Integer、Long、Currency、Single、Double、Decimal（目前尚不支持）、Date、String（只支持变长）、Object、Variant、用户定义类型或对象类型。

说明

事件被声明之后，就可以使用 RaiseEvent 语句来产生该事件。如果在标准模块中出现 Event 声明，就会产生语法错误。不能声明带返回值的事件。在下面的代码段中，给出了声明事件和产生事件的典型事件：

'在类模块的模块级中声明一个事件

Event LogonCompleted (UserName as String)

Sub
    RaiseEvent LogonCompleted("AntoineJan")
End Sub

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


Event 语句示例

下面的示例是在百米赛跑演示中使用事件来计时。代码说明了所有与事件相关的方法、属性和语句，包括 Event 语句。

产生事件的类是事件源，实现该事件的类则是事件吸收。一个事件源可以有多个针对其所产生的事件的漏。事件可以被每个选定出为对象的实例吸收事件的类所触发。

该示例使用了一个窗体 (Form1)，该窗体有一个按钮 (Command1)，一个标签 (Label1)，以及两个文本框 (Text1 和 Text2)。单击按钮后，第一个文本框显示 "From Now"，第二个文本框中时钟开始计时。当经过 9.84 秒（百米记录）之后，第一个文本框显示 "Until Now"，第二个则显示 "9.84"。

Form1 代码用于指定该窗体的初始状态和终止状态，也包含了事件产生后所要执行的代码。

Option Explicit

Private WithEvents mText As TimerState

Private Sub Command1_Click()
Text1.Text = "From Now"
    Text1.Refresh
    Text2.Text = "0"
    Text2.Refresh
Call mText.TimerTask(9.84)
End Sub

Private Sub Form_Load()
    Command1.Caption = "Click to Start Timer"
    Text1.Text = ""
    Text2.Text = ""
    Label1.Caption = "The fastest 100 meter run took this long:"
    Set mText = New TimerState
    End Sub

Private Sub mText_ChangeText()
    Text1.Text = "Until Now"
    Text2.Text = "9.84"
End Sub

Private Sub mText_UpdateTime(ByVal dblJump As Double)
    Text2.Text = Str(Format(dblJump, "0"))
    DoEvents
End Sub

下面是 TimerState 类模块的代码。事件产生后 Event 语句声明被初始化的过程。

Option Explicit
Public Event UpdateTime(ByVal dblJump As Double)
Public Event ChangeText()

Public Sub TimerTask(ByVal Duration As Double)
    Dim dblStart As Double
    Dim dblSecond As Double
    Dim dblSoFar As Double
    dblStart = Timer
    dblSoFar = dblStart

    Do While Timer < dblStart + Duration
        If Timer - dblSoFar >= 1 Then
            dblSoFar = dblSoFar + 1
            RaiseEvent UpdateTime(Timer - dblStart)
        End If
    Loop

    RaiseEvent ChangeText

End Sub


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 语句之后的语句。当 Exit Do 用在嵌套的 Do...Loop 循环中时，Exit Do 会将控制权转移到 Exit Do 所在位置的外层循环。
Exit For | 提供一种退出 For 循环的方法，并且只能在 For...Next 或 For Each...Next 循环中使用。Exit For 会将控制权转移到 Next 之后的语句。当 Exit For 用在嵌套的 For 循环中时，Exit For 将控制权转移到 Exit For 所在位置的外层循环。
Exit Function | 立即从包含该语句的 Function 过程中退出。程序会从调用 Function 的语句之后的语句继续执行。
Exit Property | 立即从包含该语句的 Property 过程中退出。程序会从调用 Property 过程的语句之后的语句继续执行。
Exit Sub | 立即从包含该语句的 Sub 过程中退出。程序会从调用 Sub 过程的语句之后的语句继续执行。

说明

不要将 Exit 语句与 End 语句搞混了。Exit 并不说明一个结构的终止。


Exit 语句示例

本示例使用 Exit 语句退出 For...Next 循环、Do...Loop 循环及子过程。

Sub ExitStatementDemo()
Dim I, MyNum
    Do                ' 建立无穷循环。
        For I = 1 To 1000    ' 循环 1000 次。
            MyNum = Int(Rnd * 1000)    ' 生成一随机数码。
            Select Case MyNum    ' 检查随机数码。
                Case 7: Exit For    ' 如果是 7，退出 For...Next 循环。
                Case 29: Exit Do    ' 如果是 29，退出 Do...Loop 循环。
                Case 54: Exit Sub    ' 如果是 54，退出子过程。
            End Select
        Next I
    Loop
End Sub


FileCopy 语句

复制一个文件。

语法

FileCopy source, destination

FileCopy 语句的语法含有以下这些命名参数：

部分 | 描述
source | 必要参数。字符串表达式，用来表示要被复制的文件名。source 可以包含目录或文件夹、以及驱动器。
destination | 必要参数。字符串表达式，用来指定要复制的目地文件名。destination 可以包含目录或文件夹、以及驱动器。

说明

如果想要对一个已打开的文件使用 FileCopy 语句，则会产生错误。


FileCopy 语句示例

本示例使用 FileCopy 语句来复制文件。示例中假设 SRCFILE 为含有数据的文件。

Dim SourceFile, DestinationFile
SourceFile = "SRCFILE"    ' 指定源文件名。
DestinationFile = "DESTFILE"    ' 指定目的文件名。
FileCopy SourceFile, DestinationFile    ' 将源文件的内容复制到目的文件中。


For Each...Next 语句

针对一个数组或集合中的每个元素，重复执行一组语句。

语法

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

Next [element]

For...Each...Next 语句的语法具有以下几个部分：

部分 | 描述
element | 必要参数。用来遍历集合或数组中所有元素的变量。对于集合来说，element 可能是一个 Variant 变量、一个通用对象变量或任何特殊对象变量。对于数组而言，element只能是一个 Variant 变量。
group | 必要参数。对象集合或数组的名称（用户定义类型的数组除外）。
statements | 可选参数，针对 group 中的每一项执行的一条或多条语句。

说明

如果集合中至少有一个元素，就会进入 For...Each 块执行。一旦进入循环，便先针对 group 中第一个元素执行循环中的所有语句。如果 group 中还有其它的元素，则会针对它们执行循环中的语句，当 group 中的所有元素都执行完了，便会退出循环，然后从 Next 语句之后的语句继续执行。

在循环中可以在任何位置放置任意个 Exit For 语句，随时退出循环。Exit For经常在条件判断之后使用，例如 If...Then，并将控制权转移到紧接在 Next 之后的语句。

可以将一个 For...Each...Next 循环放在另一个之中来组成嵌套式 For...Each...Next 循环。但是每个循环的 element 必须是唯一的。

注意 如果省略 Next 语句中的 element，就像 element 存在时一样执行。如果 Next 语句在它相对应的 For 语句之前出现，则会产生错误。

不能在 For...Each...Next 语句中使用用户自定义类型数组，因为 Variant 不能包含用户自定义类型。


For Each...Next 语句示例

本示例使用 For Each...Next 语句搜寻集合中的所有成员的 Text 属性，查找“Hello”字符串。示例中，MyObject 是面向文本的对象，并且是 MyCollection 集合的成员，这两个名字只是为示范目的而使用的通用名称而已。

Dim Found, 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 counter = start To end [Step step]
[statements]
[Exit For]
[statements]

Next [counter]

For匩ext 语句的语法具有以下几个部分：

部分 | 描述
counter | 必要参数。用做循环计数器的数值变量。这个变量不能是 Boolean 或数组元素。
start | 必要参数。counter 的初值。
End | 必要参数，counter 的终值。
Step | 可选参数。counter 的步长。如果没有指定，则 step 的缺省值为 1。
Statements | 可选参数。放在 For 和 Next 之间的一条或多条语句，它们将被执行指定的次数。

说明

step 参数可以是正数或负数。step 参数值决定循环的执行情况，如下所示：

值 | 循环执行，如果
正数或 0 | counter <= end
负数 | counter >= end

当所有循环中的语句都执行后，step 的值会加到 counter 中。此时，循环中的语句可能会再次执行（基于循环开始执行时同样的测试），也可能是退出循环并从 Next 语句之后的语句继续执行。

提示 在循环中改变 counter 的值，将会使程序代码的阅读和调试变得更加困难。

循环中可以在任何位置放置任意个 Exit For 语句，随时退出循环。 Exit For经常在条件判断之后使用，例如 If...Then，并将控制权转移到紧接在 Next 之后的语句。

可以将一个 For...Next 循环放置在另一个 For...Next 循环中，组成嵌套循环。不过在每个循环中的 counter 要使用不同的变量名。下面的体系结构是正确的：

For I = 1 To 10
    For J = 1 To 10
        For K = 1 To 10
            ...
        Next K
    Next J
Next I

注意 如果省略 Next 语句中的 counter，就像 counter 存在时一样执行。但如果 Next 语句在它相对应的 For 语句之前出现，则会产生错误。


Function 语句

声明 Function 过程的名称，参数以及构成其主体的代码。

语法

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

End Function

Function 语句的语法包含下面部分：

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

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

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

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

说明

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

小心 Function 过程可以是递归的；也就是说，该过程可以调用自己来完成某个特定的任务。不过，递归可能会导致堆栈上溢。通常 Static 关键字和递归的 Function 过程不在一起使用。

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

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

Function 过程与 Sub 过程的相似之处是： Function 过程是一个可以获取参数，执行一系列语句，以及改变其参数值的独立过程，而与子过程不同的是：当要使用该函数的返回值时，可以在表达式的右边使用 Function 过程，这与内部函数，诸如 Sqr、Cos 或 Chr 的使用方式一样。

在表达式中，可以通过使用函数名，并在其后用圆括号给出相应的参数列表来调用一个 Function 过程。请参阅 Call 语句关于如何调用 Function 过程的详细说明。

要从函数返回一个值，只需将该值赋给函数名。在过程的任意位置都可以出现这种赋值。如果没有对 name 赋值，则过程将返回一个缺省值：数值函数返回 0，字符串函数返回一个零长度字符串 ("")，Variant 函数则返回 Empty。如果在返回对象引用的 Function 过程中没有将对象引用赋给 name （通过 Set），则函数返回 Nothing。

下面的示例说明如何给一个名为 BinarySearch 的函数赋返回值。在这个示例中，将 False 赋给了该函数名，表示没有找到某个值。

Function BinarySearch(. . .) As Boolean
. . .
    '值未找到，返回一个 False 值。
    If lower > upper Then
        BinarySearch = False
        Exit Function
    End If
. . .
End Function

在 Function 过程中使用的变量分为两类：一类是在过程内显式声明的，另一类则不是。在过程内显式声明的变量（使用 Dim 或等效方法）都是局部变量。对于那些没有在过程中显式声明的变量，除非它们在该过程外更高级别的位置有显示地声明，否则也是局部的。

小心 过程可以使用没有在过程内显式声明的变量，但只要有任何在模块级别中定义的名称与之相同，就会产生名称冲突。如果过程中使用的未声明的变量与另一个过程，常数，或变量的名称相同，则会认为过程使用的是模块级的名称。显式声明变量就可以避免这类冲突。可以使用 Option Explicit 语句来强制显式声明变量。

小心 Visual Basic 可能会重新安排数学表达式以提高内部效率。若 Function 过程会改变某个数学表达式中变量的值，则应避免在此表达式中使用该函数。


Function 语句示例

该示例使用 Function 语句来声明 Function 过程的名称、参数、以及构成 Function 过程主体的代码。最后一个例子中使用了确定类型的、初始化的 Optional 参数。

'下面的用户自定义函数返回
'它的参数的平方根。
Function CalculateSquareRoot(NumberArg As Double) As Double
    If NumberArg < 0 Then    '评估参数。
        Exit Function    '退出调用过程。
    Else
        CalculateSquareRoot = Sqr(NumberArg)    '返回平方根。
    End If
End Function

使用 ParamArray 关键字可以使函数接收数目可变的参数。在下面的定义中，FirstArg 是按值传递的。

Function CalcSum(ByVal FirstArg As Integer, ParamArray OtherArgs())
Dim ReturnValue
'如果用如下代码调用该函数：
ReturnValue = CalcSum(4, 3 ,2 ,1)
'则局部变量被赋予以下值：FirstArg = 4，
'OtherArgs(1) = 3，OtherArgs(2) = 2，等等。
'假设缺省数组下界 = 1。

Optional 参数可以带缺省值，可以是除 Variant 之外的任何类型。

'如果函数的参数定义如下：
Function MyFunc(MyStr As String, Optional MyArg1 As _ Integer = 5, Optional MyArg2 = "Dolly")
Dim RetVal
'则可用如下代码调用该函数：
RetVal = MyFunc("Hello", 2, "World")    '提供了所有 3 个参数。
RetVal = MyFunc("Test", , 5)    '省略了参数 2。
'参数 1 和参数 3 使用了命名的参数。
RetVal = MyFunc(MyStr:="Hello ", MyArg1:=7)


Get 语句

将一个已打开的磁盘文件读入一个变量之中。

语法

Get [#]filenumber, [recnumber], varname

Get 语句的语法具有以下几个部分：

部分 | 描述
filenumber | 必要。任何有效的文件号。
recnumber | 可选。Variant (Long)。记录号（Random 方式的文件）或字节数（Binary 方式的文件），以表示在此处开始读出数据。
varname | 必要。一个有效的变量名，将读出的数据放入其中。

说明

通常用 Put 将 Get 读出的数据写入一个文件。

文件中第一个记录或字节位于位置 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 子句所指定的记录长度必须至少比储存变量所需的实际长度多两个字节。

    注意 可以使用 Get 语句从磁盘中读出一个 Variant 数组，但不能使用它读出包含数组的标量 Variant。也不能使用 Get 从磁盘中读出对象。

  • 如果读出的变量是 VarType 8 (String) 的 Variant，则 Get 先读出两个字节，识别 VarType，接下来的两个字节指出字符串的长度，然后读出字符串数据。Open 语句中的 Len 子句所指定的记录长度必须比实际字符串的长度至少多四个字节。

  • 如果读出的变量是一个动态数组，则 Get 会读出一个描述符，其长度等于 2 加上 8 乘以维数，即 2 + 8 * NumberOfDimensions。读出数组数据和数组描述符就需要占据字节，而 Open 语句中的 Len 子句所指定的记录长度必须大于或等於这些字节数的总和。 例如，在将数组写入磁盘时，下列数组声明需要 118 个字节：
    Dim MyArray(1 To 5,1 To 10) As Integer

    这 118 个字节的分配情况如下：18 个字节用于描述符 (2 + 8 * 2)，100 个字节用于数据 (5 * 10 * 2)。

  • 如果读出的变量是一个大小固定的数组，则 Get 只读出数据。它不读出描述符。

  • 如果读出的变量是任何其他类型的变量（不是可变长度的字符串或 Variant），则 Get 只读出变量数据。Open 语句中的 Len 子句所指定的记录长度必须大于或等於要读出的数据的长度。

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

对于以 Binary 方式打开的文件，Random 的所有规则都适用，但以下情况除外：

  • 当 Open 语句中的 Len 子句不起作用时，Get 连续从磁盘中读出所有变量；也就是说，两个记录之间没有任何填充。

  • 对于任何不属于用户定义的类型的数组，Get 只读出数据。它不会读出描述符。

  • Get 读出可变长度字符串，不管这些字符串是否具有长度为 2 字节的描述符，它们都不是用户定义的类型的元素。所读出的字节数等於字符串已包含的字符数。例如，下列语句从文件号为 1 的文件中读出十个字节：
    VarString = String(10, )
Get #1,,VarString


Get 语句示例

本示例使用 Get 语句来将数据从文件读到变量中。示例中假设 TESTFILE 文件中含有五个用户自定义类型的记录。

Type Record    ' 定义用户自定义的数据类型。
    ID As Integer
    Name As String * 20
End Type

Dim MyRecord As Record, Position    ' 声明变量。
' 为随机访问打开样本文件。
Open "TESTFILE" For Random As #1 Len = Len(MyRecord)
' 使用 Get 语句来读样本文件。
Position = 3    ' 定义记录号。
Get #1, Position, MyRecord    ' 读第三个记录。
Close #1    ' 关闭文件。


GoSub...Return 语句

在一个过程中跳到另一个子程序中执行，执行后再返回。

语法

GoSub line
...
line
...

Return

必要的 line 参数可以是任何行标签或行号。

说明

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

注意 不能使用 GoSub...Return 来进入或退出 Sub 过程。

提示 创建分开的过程，并使用 GoSub...Return 来调用，可以使程序更具结构化。


GoSub...Return 语句示例

本示例使用 GoSub 来调用子过程里的一段子程序。Return 语句则将执行返回到 GoSub 的下一个语句。Exit Sub 语句则是用来避免控制意外进入该子程序的情形发生。

Sub GosubDemo()
Dim Num
' 请求用户输入一个数字。
    Num = InputBox("Enter a positive number to be divided by 2.")
' 如果用户输入一个正整型，则使用子程序。
    If Num > 0 Then GoSub MyRoutine
    Debug.Print Num
    Exit Sub    ' 使用 Exit 命令来避免错误发生。
MyRoutine:
    Num = Num/2    ' 将数除以 2。
    Return    ' 将控制返回 GoSub 之后的语句。
End Sub


GoTo 语句

无条件地转移到过程中指定的行。

语法

GoTo line

必要的 line 参数可以是任意的行标签或行号。

说明

GoTo 只能跳到它所在过程中的行。

注意 太多的 GoTo 语句，会使程序代码不容易阅读及调试。尽可能使用结构化控制语句(Do...Loop、For...Next、If...Then...Else、Select Case)。


GoTo 语句示例

本示例使用 GoTo 语句在一个过程内的不同程序段间作流程控制，不同程序段用不同的“程序标签”来区隔。

Sub GotoStatementDemo()
Dim Number, MyString
    Number = 1     ' 设置变量初始值。
    ' 判断 Number 的值以决定要完成那一个程序区段（以“程序标签”来表式）。
    If Number = 1 Then GoTo Line1 Else GoTo Line2

Line1:
    MyString = "Number equals 1"
    GoTo LastLine    ' 完成最后一行。
Line2:
    ' 下列的语句根本不会被完成。
    MyString = "Number equals 2"
LastLine:
    Debug.Print MyString    ' 将“"Number equals 1"”显示在“立即”窗口。
End Sub


If...Then...Else 语句

根据表达式的值有条件地执行一组语句。

语法

If condition Then [statements][Else elsestatements]

或者，可以使用块形式的语法：

If condition Then
[statements]

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

[Else
[elsestatements]]

End If

If...Then...Else 语句的语法具有以下几个部分：

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

说明

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

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

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

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

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

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

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

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

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


If...Then...Else 语句示例

本示例示范 If...Then...Else 语句的两种格式：“区块格式”及“单行格式”，也示范了 If TypeOf...Then...Else 的用法。

Dim Number, Digits, MyString
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"

利用 If TypeOf 可以判断传入过程的控件是否为一文本框。

Sub ControlProcessor(MyControl As Control)
    If TypeOf MyControl Is CommandButton Then
        Debug.Print "You passed in a " & TypeName(MyControl)
    ElseIf TypeOf MyControl Is CheckBox Then
        Debug.Print "You passed in a " & TypeName(MyControl)
    ElseIf TypeOf MyControl Is TextBox Then
        Debug.Print "You passed in a " & TypeName(MyControl)
    End If
End Sub


Implements 语句

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

语法

Implements [InterfaceName | Class]

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

说明

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

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

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

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

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


Implements 语句示例

下面的示例说明如何使用 Implements 语句来编写多个类都可以使用的一系列声明。通过 Implements 语句共享这些声明，所有的类都不必再自己进行声明。

假设有两个窗体。其中 Selector 窗体有两个按钮，Customer Data 和 Supplier Data。若要输入客户或供应商的名称及地址信息，用户就单击 Selector 窗体的 Customer Date 按钮或 Supplier Date 按钮，然后使用 Data Entry 窗体来输入名称和地址。Data Entry 窗体有两个文本字段，Name 和 Address。

下面的共享声明的代码位于称为 PersonalData 的类中：

Public Name As String
Public Address As String

有关处理客户数据的代码位于 Customer 类模块：

Implements PersonalData
Private Property Get PersonalData_Address() As String
PersonalData_Address = "CustomerAddress"
End Property

Private Property Let PersonalData_Address(ByVal RHS As String)
'
End Property

Private Property Let PersonalData_Name(ByVal RHS As String)
'
End Property

Private Property Get PersonalData_Name() As String
PersonalData_Name = "CustomerName"
End Property

有关处理供应商数据的代码位于 Supplier 类模块：

Implements PersonalData

Private Property Get PersonalData_Address() As String
PersonalData_Address = "SupplierAddress"
End Property

Private Property Let PersonalData_Address(ByVal RHS As String)
'
End Property

Private Property Let PersonalData_Name(ByVal RHS As String)
'
End Property

Private Property Get PersonalData_Name() As String
PersonalData_Name = "SupplierName"
End Property

下面的代码负责处理 Selector 窗体：

Private cust As New Customer
Private sup As New Supplier

Private Sub Command1_Click()
Dim frm2 As New Form2
    Set frm2.PD = cust
    frm2.Show 1
End Sub

Private Sub Command2_Click()
Dim frm2 As New Form2
    Set frm2.PD = sup
    frm2.Show 1
End Sub

下面的代码负责处理 Data Entry 窗体：

Private m_pd As PersonalData
Private Sub Form_Load()
    With m_pd
        Text1 = .Name
        Text2 = .Address
    End With
End Sub
Public Property Set PD(Data As PersonalData)
    Set m_pd = Data
End Property


Input # 语句

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

语法

Input #filenumber, varlist

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

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

说明

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

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

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

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

注意 不能写入包含了内嵌引号的字符串，例如，用Input # 语句写入 "1,2""X" ：Input # 会把这个字符串当作两个完全分开的字符串。

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

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

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


Input # 语句示例

本示例使用 Input # 语句将文件内的数据读入两个变量中。本示例假设 TESTFILE文件内含数行以 Write # 语句写入的数据；也就是说，每一行数据中的字符串部分都是用双引号括起来，而与数字用逗号隔开，例如，（"Hello", 234）。

Dim MyString, MyNumber
Open "TESTFILE" For Input As #1    ' 打开输入文件。
Do While Not EOF(1)    ' 循环至文件尾。
    Input #1, MyString, MyNumber    ' 将数据读入两个变量。
    Debug.Print MyString, MyNumber    ' 在立即窗口中显示数据。
Loop
Close #1    ' 关闭文件。


Kill 语句

从磁盘中删除文件。

语法

Kill pathname

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

说明

在 Microsoft Windows 中，Kill 支持多字符 (*) 和单字符 (?) 的统配符来指定多重文件。. 然而在 Macintosh 中，这些字符作为合法文件名字符使用，不能作为通配符指定多个文件。

由于 Macintosh 不支持通配符，使用文件类型识别需要删除的组文件。可以使用 MacID 函数指定文件类型而不用对每个单独文件使用重复命令。例如，下列语句删除当前文件夹内的所有TEXT文件。

Kill MacID("TEXT")

如果在 Microsoft Windows 中使用包含 MacID 函数的Kill 语句，会产生错误。

如果使用 Kill 来删除一个已打开的文件，则会产生错误。

注意 若要删除目录，使用 RmDir 语句。


Kill 语句示例

本示例使用 Kill 语句将磁盘中的文件删除。

' 假设 TESTFILE是一数据文件。
Kill "TestFile"    ' 删除。

' 将当前目录下所有 *.TXT 文件全部删除。
Kill "*.TXT"


Let 语句

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

语法

[Let] varname = expression

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

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

说明

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

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

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

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


Let 语句示例

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

Dim MyStr, MyInt
'下面的变量赋值使用了 Let 语句。
Let MyStr = "Hello World"
Let MyInt = 5

下面是没有使用 Let 语句的相同赋值。

Dim MyStr, MyInt
MyStr = "Hello World"
MyInt = 5


Line Input # 语句

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

语法

Line Input #filenumber, varname

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

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

说明

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

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


Line Input # 语句示例

本示例使用 Line Input # 语句从顺序文件中读入一行数据，并将该行数据赋予一个变量。本示例假设 TESTFILE 文件内含数行文本数据。

Dim TextLine
Open "TESTFILE" For Input As #1    ' 打开文件。
Do While Not EOF(1)    ' 循环至文件尾。
    Line Input #1, TextLine    ' 读入一行数据并将其赋予某变量。
    Debug.Print TextLine    ' 在立即窗口中显示数据。
Loop
Close #1    ' 关闭文件。


Load 语句

装载一对象但却不显示。

语法

Load object

object 代表对象表达式，其值为“应用于”列表中的对象。

说明

在装载对象时会先把它放入内存中，但却是不可见的。必须用 Show 方法使对象可见。在对象成为可见的之前，用户不能与之交互作用。您可以在 Initialize 事件过程中用程序操控对象。


Load 语句示例

下列示例在 UserForm1 的 Initialize 事件期间加载 UserForm2 。单击 UserForm2 就可将 UserForm1 显示出来。

' UserForm1 的 Initialize 事件过程
Private Sub UserForm_Initialize()
    Load UserForm2
    UserForm2.Show
End Sub
' UserForm2 的 Click 事件
Private Sub UserForm_Click()
    UserForm2.Hide
End Sub

' UserForm1 的 Click 事件
Private Sub UserForm_Click()
    UserForm2.Show
End Sub


Lock，Unlock 语句

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

语法

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

Unlock [#]filenumber[, recordrange]

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

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

设置

recordrange 参数的设置如下：

recnumber | [start] To end

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

说明

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

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

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

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

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


Lock 及 Unlock 语句示例

本示例示范如何使用 Lock 及 Unlock 语句。当用户正在修改数据中某个记录时，其他过程不可以来访问这条记录。 本示例假设 TESTFILE 文件内含五个用户自定义类型 Record 的记录。

Type Record    ' 定义用户自定义数据类型。
    ID As Integer
    Name As String * 20
End Type

Dim MyRecord As Record, RecordNumber    ' 声明变量。
' 以随机访问的方式来打开文件。
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    ' 关闭文件。


LSet 语句

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

语法

LSet stringvar = string

LSet varname1 = varname2

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

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

说明

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

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

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

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


LSet 语句示例

本示例使用 LSet 语句，将某字符串插入到另一字符串的最左边。虽然 LSet 也能用来复制一个用户自定义类型变量的内容到另一个不一定完全一样，但却兼容的用户自定义类型变量中，但并不建议使用这种方法。因为不同操作系统间对数据结构的做法不同，使用 LSet 的程序并不能保证有很好的移植性。

Dim MyString
MyString = "0123456789"    ' 设置字符串初值。
Lset MyString = "<-Left"    ' MyString 的内容为 "<-Left    "。


Mid 语句

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

语法

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

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

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

说明

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

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


Mid 语句示例

本示例使用 Mid 语句将某字符串中的几个字符替换为其他的字符。

Dim MyString
MyString = "The dog jumps"    ' 设置字符串初值。
Mid(MyString, 5, 3) = "fox"    ' MyString = "The fox jumps"。
Mid(MyString, 5) = "cow"    ' MyString = "The cow jumps"。
Mid(MyString, 5) = "cow jumped over"    ' MyString = "The cow jumpe"。
Mid(MyString, 5, 3) = "duck"    ' MyString = "The duc jumpe"。


MkDir 语句

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

语法

MkDir path

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


MkDir 语句示例

本示例使用 MkDir 语句来创建目录或文件夹。如果没有指定驱动器，新目录或文件夹将会建在当前驱动器中。

MkDir "MYDIR"    ' 建立新的目录或文件夹。


Name 语句

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

语法

Name oldpathname As newpathname

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

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

说明

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

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


Name 语句示例

本示例使用 Name 语句来更改文件的名称。示例中假设所有使用到的目录或文件夹都已存在。 在 Macintosh 中，默认驱动器名称是 “HD” 并且路径部分由冒号取代反斜线隔开。

Dim OldName, NewName
OldName = "OLDFILE": NewName = "NEWFILE"    ' 定义文件名。
Name OldName As NewName    ' 更改文件名。

OldName = "C:\MYDIR\OLDFILE": NewName = "C:\YOURDIR\NEWFILE"
Name OldName As NewName    ' 更改文件名，并移动文件。


On Error 语句

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

语法

On Error GoTo line

On Error Resume Next

On Error GoTo 0

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

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

说明

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

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

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

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

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

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

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

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

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

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

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

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

Err.Number = vbObjectError + 1052

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


On Error 语句示例

本示例先使用 On Error GoTo 语句在一个过程中指定错误处理的代码所在。本示例中，试图删除一已经打开的文件从而生成的错误码为 55。这个错误将由示例中的错误处理程序码来处理，处理完後，控制会回到发生错误的语句处。On Error GoTo 0 语句关闭错误陷阱。然后 On Error Resume Next 语句用来改变错误陷阱，以便发觉下一个语句产生的错误的范围。请注意示例中使用 Err.Clear 在错误处理完後，清除 Err 对象的属性。

Sub OnErrorStatementDemo()
    On Error GoTo ErrorHandler    ' 打开错误处理程序。
    Open "TESTFILE" For Output As #1    ' 打开输出文件。
    Kill "TESTFILE"    ' 试图删除已打开的文件。
    On Error Goto 0    ' 关闭错误陷阱。
    On Error Resume Next    ' 改变错误陷阱。
    ObjectRef = GetObject("MyWord.Basic")    ' 试图启动不存在
                ' 的对象
'检查可能发生的 Automation 错误。
    If Err.Number = 440 Or Err.Number = 432 Then
        ' 告诉用户出了什么事。然后清除 Err 对象。
        Msg = "There was an error attempting to open the Automation object!"
        MsgBox Msg, , "Deferred Error Test"
        Err.Clear    ' 清除 Err 对象字段。
    End If
Exit Sub        ' 退出程序，以避免进入错误处理程序。
ErrorHandler:    ' 错误处理程序。
    Select Case Err.Number    ' 检查错误代号。
        Case 55    ' 发生“文件已打开”的错误。
            Close #1    ' 关闭已打开的文件。
        Case Else
            ' 处理其他错误状态 . . .
    End Select
    Resume    ' 将控制返回到产生错误的语句。
End Sub


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

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

语法

On expression GoSub destinationlist

On expression GoTo destinationlist

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

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

说明

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

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

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

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


On...GoSub 及 On...GoTo 语句示例

本示例使用 On...GoSub 及 On...GoTo 语句来完成不同的子程序或程序区段。

Sub OnGosubGotoDemo()
Dim Number, MyString
    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


Open 语句

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

语法

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

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

部分 | 描述
pathname | 必要。字符串表达式，指定文件名，该文件名可能还包括目录、文件夹及驱动器。
mode | 必要。关键字，指定文件方式，有 Append、Binary、Input、Output、或 Random 方式。如果未指定方式，则以 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 操作失败，而且会有错误发生。

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

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


Open 语句示例

本示例示范 Open 语句的不同用法来做到文件的输出与输入。

下列代码以顺序输入模式打开 TESTFILE 文件。

Open "TESTFILE" For Input As #1
' 若要以其他方式打开文件，必需先关闭此文件。
Close #1

下列代码以只允许写操作的二进制方式打开文件。

Open "TESTFILE" For Binary Access Write As #1
' 若要以其他方式打开文件，必需先关闭此文件。
Close #1

下列代码以随机方式打开文件，文件中含有用户自定义数据类型 Record 的记录。

Type Record    ' 定义用户自定义数据类型。
    ID As Integer
    Name As String * 20
End Type

Dim MyRecord As Record    ' 声明变量。
Open "TESTFILE" For Random As #1 Len = Len(MyRecord)
' 若要以其他方式打开文件，必需先关闭此文件。
Close #1

下列代码以顺序输出方式打开文件；任何过程都可以读写该文件。

Open "TESTFILE" For Output Shared As #1
' 若要以其他方式打开文件，必需先关闭此文件。
Close #1

下列代码以只允许读的二进制方式打开文件；其他过程不可以读该文件。

Open "TESTFILE" For Binary Access Read Lock Read As #1


Option Base 语句

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

语法

Option Base {0 | 1}

说明

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

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

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


Option Base 语句示例

该示例使用 Option Base 语句来取代数组下标的缺省值 0。LBound 函数返回数组的指定维数的最小可用下标。Option Base 语句只能在模块级使用。

Option base 1    '将缺省的数组下标设为 1。

Dim Lower
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 {Binary | Text | Database}

说明

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

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

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

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

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

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

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


Option 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、Private、Public、ReDim 或 Static 语句来显式声明所有的变量。如果使用了未声明的变量名在编译时间会出现错误。

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

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


Option Explicit 语句示例

该示例使用 Option Explicit 语句来强制显式声明所有变量。如果试图使用一个未声明的变量，则会在编译时导致错误。Option Explicit 语句只能在模块级使用。

Option explicit    '强制显式地声明变量。
Dim MyVar    '声明变量。
MyInt = 10    '未声明的变量将产生错误。
MyVar = 10    '已声明的变量则不会产生错误。


Option Private 语句

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

语法

Option Private Module

说明

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

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

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


Option Private 语句示例

该示例演示 Option Private 语句的用法，该语句用于模块级，表示整个模块都是私有的。若使用 Option Private Module，则该项目中的其它模块可以使用没有声明为 Private 的模块级部分，但其它工程或应用程序不能使用。

Option private Module    '表示该模块是私有的。


Print # 语句

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

语法

Print #filenumber, [outputlist]

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

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

设置

outputlist 参数的设置如下：

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

设置 | 描述
Spc(n) | 用来在输出数据中插入空白字符，而 n 指的是要插入的空白字符数。
Tab(n) | 用来将插入点定位在某一绝对列号上，这里，n 是列号。使用无参数的 Tab 将插入点定位在下一个打印区的起始位置。
expression | 要打印的数值表达式或字符串表达式。
charpos | 指定下一个字符的插入点。使用分号将插入点定位在上一个显示字符之后。用 Tab(n) 将插入点定位在某一绝对的列号上，用无参数的 Tab 将插入点定位在下一个打印区的起始处。如果省略 charpos，则在下一行打印下一个字符。

说明

通常用 Line Input # 或 Input 读出 Print # 在文件中写入的数据。

如果省略参数 outputlist，而且，filenumber 之后只含有一个列表分隔符，则将一空白行打印到文件中。多个表达式之间可用一个空白或一个分号隔开。空白与分号等效。

对于 Boolean 类型的数据，打印的是 True 或 False。无论在什么区域，都不将 True 和 False 这两个关键字翻译出来。

使用操作系统所能够辨认的标准短日期格式可将 Date 类型的数据写入文件中。在未指定日期或时间部件或这些部件的设置为零时，只将指定的部分写入文件中。

如果 outputlist 的数据是 Empty，则不将任何数据写入文件。但是，如果 outputlist 的数据是 Null，则将 Null 写入文件。

对于 Error 类型的数据而言，输出的数据看起来与 Error errorcode 一样。而且无论在什么地区，都不将 Error 关键字翻译出来。

用 Print # 写入文件的所有数据都是国际通用的；也就是说，可以正确利用十进制分隔符将这些数据格式化。

因为 Print # 将数据的图像写入文件，所以必须将各项数据分隔开来，以便正确打印。如果使用无参数的 Tab 将打印位置移动到下一个打印区，则 Print # 也会将打印字段之间的空白写入文件中。

注意 如果今后想用 Input # 语句读出文件的数据，就要用 Write # 语句而不用 Print # 语句将数据写入文件。因为在使用 Write # 时，将数据域分界就可确保每个数据域的完整性，因此可用 Input # 再将数据读出来。使用 Write # 还能确保任何地区的数据都被正确读出。


Print # 语句示例

本示例使用 Print # 语句将数据写入一个文件。

Open "TESTFILE" For Output As #1    ' 打开输出文件。
Print #1, "This is a test"    ' 将文本数据写入文件。
Print #1,    ' 将空白行写入文件。
Print #1, "Zone 1"； Tab ； "Zone 2"    ' 数据写入两个区（print zones）。
Print #1, "Hello" ； " " ； "World"    ' 以空格隔开两个字符串。
Print #1, Spc(5) ； "5 leading spaces "    ' 在字符串之前写入五个空格。
Print #1, Tab(10) ； "Hello"    ' 将数据写在第十列。

' 赋值 Boolean、Date、Null 及 Error 等。
Dim MyBool, MyDate, MyNull, MyError
MyBool = False : MyDate = #February 12, 1969# : MyNull = Null
MyError = CVErr(32767)
' True、False、Null 及 Error 会根据系统的地区设置自动转换格式。
' 日期将以标准的短式日期的格式显示。
Print #1, MyBool ； " is a Boolean value"
Print #1, MyDate ； " is a date"
Print #1, MyNull ； " is a null value"
Print #1, MyError ； " is an error value"
Close #1    ' 关闭文件。


Private 语句

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

语法

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

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

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

说明

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

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

Private NumberOfEmployees As Integer

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

Private X As New Worksheet

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

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

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

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

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


Private 语句示例

该示例演示在模块级使用 Private 语句来声明私有变量；即这些变量只能在包含其声明的模块中使用。

Private Number As Integer    '私有的整数变量。
Private NameArray(1 To 5) As String    '私有的数组变量。
'多个声明，两个变体型，以及一个整型，都是私有的。
Private MyVar, YourVar, ThisVar As Integer


Property Get 语句

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

语法

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

End Property

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

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

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

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

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

说明

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

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

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

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


Property Get 语句示例

该示例使用 Property Get 语句，定义获取属性值的 Property 过程。该属性用一个字符串来标识画笔的当前颜色。

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 过程的名称，参数以及构成其主体的代码，该过程给一个属性赋值。

语法

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

End Property

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

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

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

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

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

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

说明

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

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

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

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


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 过程的名称，参数以及构成其主体的代码，该过程设置一个对象引用。

语法

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

End Property

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

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

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

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

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

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

说明

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

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

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

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


Property Set 语句示例

该示例使用 Property Set 语句，定义设置对象引用的 Property 过程。

'该 Pen 属性可以设置为不同的 Pen 实现。
Property Set Pen(P As Object)
    Set CurrentPen = P    '将 Pen 赋给对象。
End Property


Public 语句

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

语法

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

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

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

说明

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

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

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

Public NumberOfEmployees As Integer

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

Public X As New Worksheet

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

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

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

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


Public 语句示例

该示例在标准模块的模块级（通用部分）使用 Public 语句，来显式声明公用的变量，指如果没有使用 Option Private Module，则在所有应用程序的所有模块的所有过程中都可以使用的变量。

Public Number As Integer    '公用的整数变量。
Public NameArray(1 To 5) As String    '公用的字符串数组变量。
'多个声明，两个变体型变量，以及一个整数型变量，都是公用的。
Public MyVar, YourVar, ThisVar As Integer


Put 语句

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

语法

Put [#]filenumber, [recnumber], varname

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

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

说明

通常用 Get 将 Put 写入的文件数据读出来。

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

Put #4,,FileBuffer

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

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

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

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

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

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

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

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

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

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

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

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

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

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


Put 语句示例

本示例使用 Put 语句将数据写入文件中。示例中写入五个用户自定义数据类型 Record 的记录。

Type Record    ' 定义用户自定义数据类型。
    ID As Integer
    Name As String * 20
End Type

Dim MyRecord As Record, RecordNumber    ' 声明变量。
' 以随机访问方式打开文件。
Open "TESTFILE" For Random As #1 Len = Len(MyRecord)
For RecordNumber = 1 To 5    ' 循环五次。
    MyRecord.ID = RecordNumber    ' 定义 ID。
    MyRecord.Name = "My Name" & RecordNumber    ' 建立字符串。
    Put #1, RecordNumber, MyRecord    ' 将记录写入文件中。
Next RecordNumber
Close #1    ' 关闭文件。


RaiseEvent 语句

引发在一个类、窗体、或者文档中的模块级中声明的一个事件。

语法

RaiseEvent eventname [(argumentlist)]

必需的 eventname 是在模块 中声明的，并且符合 Basic 变量命名约定的一个事件的名称。

RaiseEvent 语句的语法有如下部分：

部分 | 描述
Eventname | 必需的。所引发的事件的名称。
Argumentlist | 可选的。用逗号分隔的变量、数组，或者表达式的列表。argumentlist 必须用圆括号括起来。如果没有参数，则圆括号必须被忽略。

说明

如果在事件被引发的模块内该事件没有被声明，就会发生一个错误。下面这个程序片段说明了一个事件的声明以及一个引发该事件的过程。

' 在类模块的模块级声明一个事件
Event LogonCompleted (UserName as String)

Sub
    ' 引发该事件。
    RaiseEvent LogonCompleted ("AntoineJan")
End Sub

如果在 RaiseEvent 中该事件没有参数，包括空的圆括号，则对该事件的调用就会导致一个错误。不能使用 RaiseEvent 来引发在模块中没有明确定义的事件。例如，如果一个窗体有一个 Click 事件，则不能使用 RaiseEvent 来引发该窗体的 Click 事件。如果在窗体模块 中声明了一个 Click 事件，则它将覆盖窗体自己的 Click 事件。仍然可以使用调用该事件的正常语法来调用该窗体的 Click 事件，但是不能使用 RaiseEvent 语句。

事件的引发是根据连接建立的顺序来进行的。因为事件可以有 ByRef 参数，所以后来连接的进程可能接收已经被一个更早的事件处理程序更改的参数。


RaiseEvent 语句示例

下面的示例使用事件来计数 100 米短跑比赛的演示的最短时间秒数。代码演示了所有与事件有关的方法、属性、以及语句，包括 RaiseEvent 语句。

引发一个事件的类是事件源，而实现这个事件的类是吸收类。一个事件源可以有多个吸收类用于吸收这个事件源所产生的事件。当类引发事件时，该事件将在每一个被选择来为该对象实例吸收事件的类上被引发。

该示例使用了一个带有一个按纽（ Command1 ）、一个标签（ Label1 ）、和两个文本框（ Text1 和 Text2 ）的窗体（ Form1 ）。当单击该按纽时，第一个文本框显示“From Now”并且第二个文本框开始时间计数。当整个时间（9.84秒）结束时，第一个文本框将显示“Until Now”，并且第二个文本框显示“9.84”。

Form1 的代码指定了窗体的最初状态和结束状态。它同时还包括当事件被引发时所要执行的代码。

Option Explicit

Private WithEvents mText As TimerState

Private Sub Command1_Click()
    Text1.Text = "From Now"
    Text1.Refresh
    Text2.Text = "0"
    Text2.Refresh
    Call mText.TimerTask(9.84)
End Sub

Private Sub Form_Load()
    Command1.Caption = "Click to Start Timer"
    Text1.Text = ""
    Text2.Text = ""
    Label1.Caption = "The fastest 100 meters ever run took this long:"
    Set mText = New TimerState
    End Sub

Private Sub mText_ChangeText()
    Text1.Text = "Until Now"
    Text2.Text = "9.84"
End Sub

Private Sub mText_UpdateTime(ByVal dblJump As Double)
    Text2.Text = Str(Format(dblJump, "0"))
    DoEvents
End Sub

剩下的代码在一个名为 TimerState 的类模块中。包括在该模块的命令中的是 Raise Event语句。

Option Explicit
Public Event UpdateTime(ByVal dblJump As Double)
Public Event ChangeText()

Public Sub TimerTask(ByVal Duration As Double)
    Dim dblStart As Double
    Dim dblSecond As Double
    Dim dblSoFar As Double
    dblStart = Timer
    dblSoFar = dblStart

    Do While Timer < dblStart + Duration
        If Timer - dblSoFar >= 1 Then
            dblSoFar = dblSoFar + 1
            RaiseEvent UpdateTime(Timer - dblStart)
        End If
    Loop

    RaiseEvent ChangeText

End Sub


Randomize 语句

初始化随机数生成器。

语法

Randomize [number]

可选的 number 参数是 Variant 或任何有效的数值表达式。

说明

Randomize 用 number 将 Rnd 函数的随机数生成器初始化，该随机数生成器给 number 一个新的种子值。如果省略 number，则用系统计时器返回的值作为新的种子值。

如果没有使用 Randomize，则（无参数的）Rnd 函数使用第一次调用 Rnd 函数的种子值。

注意 若想得到重复的随机数序列，在使用具有数值参数的 Randomize 之前直接调用具有负参数值的 Rnd。使用具有同样 number 值的 Randomize 是不会得到重复的随机数序列的。


Randomize 语句示例

本示例用 Randomize 语句初始化随机数生成器。由于忽略了数值参数， 所以 Randomize 用 Timer 函数的返回值作为新的随机数种子值。

Dim MyValue
Randomize    ' 对随机数生成器做初始化的动作。

MyValue = Int((6 * Rnd) + 1)    ' 生成 1 到 6 之间的随机数值。


ReDim 语句

在过程级别中使用，用于为动态数组变量重新分配存储空间。

语法

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

ReDim 语句的语法包括以下几个部分：

部分 | 描述
Preserve | 可选的。关键字，当改变原有数组最末维的大小时，使用此关键字可以保持数组中原来的数据。
varname | 必需的。变量的名称；遵循标准的变量命名约定。
subscripts | 必需的。数组变量的维数；最多可以定义 60 维的多维数组。subscripts 参数使用下面的语法：
 | [lower To] upper [,[lower To] upper] . . .
 | 如果不显式指定 lower，则数组的下界由 Option Base 语句控制。如果没有 Option Base 语句则下界为 0。
type | 可选的。变量的数据类型；可以是 Byte、Boolean、Integer、Long、Currency、Single、Double、Decimal（目前尚不支持）、Date、String（对变长的字符串）、String * length（对定长的字符串）、Object、Variant、用户定义类型或对象类型。所声明的每个变量都要有一个单独的 As type 子句。对于包含数组的 Variant 而言，type 描述的是该数组的每个元素的类型，不能将此 Variant 改为其它类型。

说明

ReDim 语句用来定义或重定义原来已经用带空圆括号（没有维数下标）的 Private、Public 或 Dim 语句声明过的动态数组的大小。

可以使用 ReDim 语句反复地改变数组的元素以及维数的数目，但是不能在将一个数组定义为某种数据类型之后，再使用 ReDim 将该数组改为其它数据类型，除非是 Variant 所包含的数组。如果该数组确实是包含在某个 Variant 中，且没有使用 Preserve 关键字，则可以使用 As type 子句来改变其元素的类型，但在使用了此关键字的情况下，是不允许改变任何数据类型的。

如果使用了 Preserve 关键字，就只能重定义数组最末维的大小，且根本不能改变维数的数目。例如，如果数组就是一维的，则可以重定义该维的大小，因为它是最末维，也是仅有的一维。不过，如果数组是二维或更多维时，则只有改变其最末维才能同时仍保留数组中的内容。下面的示例介绍了如何在为已有的动态数组增加其最末维大小的同时而不清除其中所含的任何数据。

ReDim X(10, 10, 10)
. . .
ReDim Preserve X(10, 10, 15)

同样地，在使用 Preserve 时，只能通过改变上界来改变数组的大小；改变下界则会导致错误。

如果将数组改小，则被删除的元素中的数据就会丢失。如果按地址将数组传递给某个过程，那么不要在该过程内重定义该数组的各维的大小。

在初始化变量时，数值变量被初始化为 0，变长的字符串被初始化为一个零长度的字符串 ("")，而定长的字符串则用 0 填充。Variant 变量被初始化为 Empty。用户自定义类型的变量的每个元素作为各自独立的变量进行初始化。在使用引用对象的变量之前，必须使用 Set 语句将一个已有的对象赋给该变量。在被赋值之前，所声明的对象变量有一个特定值 Nothing，这个值表示该变量没有指向任何对象的实例。

小心 如果 ReDim 语句所使用的变量在模块级别或过程级别不存在，则该语句就相当于一个声明语句。如果此后在一个更广的范围内又创建了同名的变量，即使使用了 Option Explicit，ReDim 也将使用后声明的这个变量，且不会导致编译错误。为了避免这种冲突，就不应把 ReDim 作为声明语句使用，而只应作为重定义数组大小的语句。

注意 要改变 Variant 所包含的数组的大小，必须在试图改变其数组大小之前显式声明该 Variant 变量。


ReDim 语句示例

该示例使用 ReDim 语句为动态数组变量分配和重分配存储空间。假设 Option Base 是 1。

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 comment

也可以使用如下语法：

' comment

comment 参数是可选的，指要包括的任何注释文本。在 Rem 关键字与 comment 之间要加一个空格。

说明

如果使用行号或行标签，则可以从 GoTo 或 GoSub 语句转到一个 Rem 语句行。程序会从该 Rem 语句下面的第一条可执行语句继续执行。如果在其它语句行后使用 Rem 关键字，则必须使用冒号 (:) 与语句隔开。

可以用一个撇号 (') 来代替 Rem 关键字。若使用撇号，则在其它语句行使用时不必加冒号。


Rem 语句示例

该示例说明用来在程序中包含注释的 Rem 语句的各种格式。

Dim MyStr1, MyStr2
MyStr1 = "Hello":Rem 注释在语句之后要用冒号隔开。
MyStr2 = "Goodbye"     '这也是一条注释；无需使用冒号。


Reset 语句

关闭所有用 Open 语句打开的磁盘文件。

语法

Reset

说明

Reset 语句关闭 Open 语句打开的所有活动文件，并将文件缓冲区的所有内容写入磁盘。


Reset 语句示例

本示例使用 Reset 语句关闭所有已打开的文件，并且将所有文件缓冲区内的数据写到磁盘中。请注意，示例中 Variant 变量 FileNumber 用来当作字符串及数值来使用。

Dim FileNumber
For FileNumber = 1 To 5    ' 循环五次。
    ' 打开输出文件。文件名为 TEST 加上文件代码 FileNumber，
    ' 跟在 # 之后它只是一个数值。
    Open "TEST" & FileNumber For Output As #FileNumber
    Write #FileNumber, "Hello World"    ' 将数据写入文件。
Next FileNumber
Reset    ' 关闭文件并将缓冲区内的数据写到磁盘中。


Resume 语句

在错误处理程序结束后，恢复原有的运行。

语法

Resume [0]

Resume Next

Resume line

Resume 语句的语法可以具有以下任何一种形式：

语句 | 描述
Resume | 如果错误和错误处理程序出现在同一个过程中，则从产生错误的语句恢复运行。如果错误出现在被调用的过程中，则从最近一次调用包含错误处理程序的过程的语句处恢复运行。
Resume Next | 如果错误和错误处理程序出现在同一个程序中，则从紧随产生错误的语句的下个语句恢复运行。如果错误发生在被调用的过程中，则对最后一次调用包含错误处理程序的过程的语句（或 On Error Resume Next 语句），从紧随该语句之后的语句处恢复运行。
Resume line | 在必要的 line 参数指定的 line 处恢复运行。line 参数是行标签或行号，必须和错误处理程序在同一个过程中。

说明

在错误处理程序之外的任何地方使用 Resume 语句都会导致错误发生。


Resume 语句示例

本示例使用 Resume 语句来结束错误处理程序，然后将执行返回到产生错误的语句。以生成错误代号 55 的状况来示范如何使用 Resume 语句。

Sub ResumeStatementDemo()
    On Error GoTo ErrorHandler    ' 打开错误处理程序。
    Open "TESTFILE" For Output As #1    ' 打开输出文件。
    Kill "TESTFILE"    ' 试图删除已打开的文件。
    Exit Sub    ' 退出程序，以避免进入错误处理程序。
ErrorHandler:    ' 错误处理程序。
    Select Case Err.Number    ' 检查错误代号。
        Case 55    ' 发生“文件已打开”的错误。
            Close #1    ' 关闭已打开的文件。
        Case Else
            ' 处理其他错误状态 . . .
    End Select
    Resume    ' 将执行返回到发生错误的语句。
End Sub


RmDir 语句

删除一个存在的目录或文件夹。

语法

RmDir path

必要的 path 参数是一个字符串表达式，用来指定要删除的目录或文件夹。path 可以包含驱动器。如果没有指定驱动器，则 RmDir 会在当前驱动器上删除目录或文件夹。

说明

如果想要使用 RmDir 来删除一个含有文件的目录或文件夹，则会发生错误。在试图删除目录或文件夹之前，先使用 Kill 语句来删除所有文件。


RmDir 语句示例

本示例使用 RmDir 语句删除已存在的目录或文件夹。

' 假设 MYDIR 为一空的目录或文件夹。
RmDir "MYDIR"    ' 将 MYDIR 删除。


RSet 语句

在一字符串变量中将一字符串往右对齐。

语法

RSet stringvar = string

RSet 语句的语法有下面这些部分：

部分 | 说明
stringvar | 必要参数。为字符串变量名。
String | 必要参数。在 stringvar 内想往右对齐的字符串表达式。

说明

如果 stringvar 比 string 长，Rset 会将 stringvar 中空余的字符以空白代替，直至字符串开头。

注意 RSet 不能用于用户定义类型。


RSet 语句示例

本示例使用 RSet 语句将某字符串插入到另一字符串的最右边。

Dim MyString
MyString = "0123456789"    ' 设置字符串初值。
Rset MyString = "Right->"    ' MyString 的内容为 "   Right->"。


SaveSetting 语句

在 Windows 注册表中 或 (Macintosh中)应用程序初始化文件中的信息保存或建立应用程序项目。

语法

SaveSetting appname, section, key, setting

SaveSetting 语句的语法具有下列命名参数：

部分 | 描述
appname | 必要。字符串表达式，包含应用程序或工程的名称，对这些应用程序或工程使用设置 在Macintosh中，这是System文件夹中Preferences文件夹中初始化文件的文件名。
section | 必要。字符串表达式，包含区域名称，在该区域保存注册表项设置。
key | 必要。字符串表达式，包含将要保存的注册表项设置的名称。
setting | 必要。表达式，包含 key 的设置值。

说明

如果无论如何也不能保存注册表项设置，则将导致错误发生。


SaveSetting 语句示例

下列示例首先使用 SaveSetting 语句来建立 Windows 注册区（或 16 位 Windows 平台的.ini 档）里 MyApp 应用程序的项目，然后使用 DeleteSetting 语句来将之删除。

' 在注册区中添加一些设置值。
SaveSetting appname := "MyApp", section := "Startup", _
            key := "Top", setting := 75
SaveSetting "MyApp","Startup", "Left", 50
' 删除区段及所有的设置值。
DeleteSetting "MyApp", "Startup"


Seek 语句

在 Open 语句打开的文件中，设置下一个读/写操作的位置。

语法

Seek [#]filenumber, position

Seek 语句的语法具有以下几个部分：

部分 | 描述
filenumber | 必要。任何有效的文件号。
position | 必要。介于 1 – 2，147，483，647 之间的数字，指出下一个读写操作将要发生的位置。

说明

在 Get 及 Put 语句中指定的记录号将覆盖由 Seek 语句指定的文件位置。

若在文件结尾之后进行 Seek 操作，则进行文件写入的操作会把文件扩大。如果试图对一个位置为负数或零的文件进行 Seek 操作，则会导致错误发生。


Seek 语句示例

本示例使用 Seek 语句在文件内设置下一次读写的位置。示例中假设 TESTFILE 文件内含有用户自定义数据类型 Record 的记录。

Type Record    ' 定义用户自定义数据类型。
    ID As Integer
    Name As String * 20
End Type

如果以随机方式打开文件，Seek 将读写位置设置到下一个记录。

Dim MyRecord As Record, MaxSize, RecordNumber    ' 声明变量。
' 以随机文件方式打开文件。
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    ' 关闭文件。

如果不以 Random 打开文件，则 Seek 设置下一个操作发生的位置。假设 TESTFILE 文件内含有文本数据。

Dim MaxSize, NextChar, MyChar
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    ' 关闭文件。


Select Case 语句

根据表达式的值，来决定执行几组语句中的其中之一。

语法

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

End Select

Select Case 语句的语法具有以下几个部分：

部分 | 描述
testexpression | 必要参数。任何数值表达式或字符串表达式。
expressionlist-n | 如果有 Case 出现，则为必要参数。其形式为 expression，expression To expression，Is comparisonoperator expression的一个或多个组成的分界列表。To 关键字可用来指定一个数值范围。如果使用 To 关键字，则较小的数值要出现在 To 之前。使用 Is 关键字时，则可以配合比较运算符（除 Is 和 Like 之外）来指定一个数值范围。如果没有提供，则 Is 关键字会被自动插入。
statements-n | 可选参数。一条或多条语句，当 testexpression 匹配expressionlist-n中的任何部分时执行。
elsestatements | 可选参数。一条或多条语句，当 testexpression 不匹配 Case 子句的任何部分时执行。

说明

如果 testexpression 匹配某个 Case expressionlist 表达式， 则在 Case 子句之后，直到下一个 Case 子句的 statements 会被执行；如果是最后一个子句，则会执行到 End Select。然后控制权会转移到 End Select 之后的语句。如果 testexpression 匹配一个以上的 Case 子句中的 expressionlist 表达式，则只有第一个匹配后面的语句会被执行。

Case Else 子句用于指明 elsestatements，当 testexpression 和所有的 Case 子句中的 expressionlist 都不匹配时，则会执行这些语句。虽然不是必要的，但是在 Select Case 区块中，最好还是加上 Case Else 语句来处理不可预见的 testexpression 值。如果没有 Case expressionlist 匹配 testexpression，而且也没有 Case Else 语句，则程序会从 End Select 之后的语句继续执行。

可以在每个 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 语句。


Select Case 语句示例

本示例使用 Select Case 语句来判断变量的值。示例中第二个 Case 子句包含了变量值，故只有此区块内的语句会被完成到。

Dim Number
Number = 8    ' 设置变量初值。
Select Case Number    ' 判断 Number 的值。
Case 1 To 5    ' Number 的值在 1 到 5 之间，包含1 和 5 。
    Debug.Print "Between 1 and 5"
' 下一个 Case 子句是本示例中唯一判断值为 True 的子句。
Case 6, 7, 8    ' Number 的值在 6 到 8 之间。
    Debug.Print "Between 6 and 8"
Case 9 到 10    ' Number 的值为 9 或 10。
Debug.Print "Greater than 8"
Case Else    ' 其他数值。
    Debug.Print "Not between 1 and 10"
End Select


SendKeys 语句

将一个或多个按键消息发送到活动窗口，就如同在键盘上进行输入一样。

语法

SendKeys string[, wait]

SendKeys 语句的语法具有以下几个命名参数：

部分 | 描述
string | 必需的。字符串表达式，指定要发送的按键消息。
Wait | 可选的。指定等待方式的 BooleandefBooleanDataType@veendf98.chm 值。如果为 False（缺省值），则控件在按键发送出去之后立刻返回到过程。如果为 True，则按键消息必须在控件返回到过程之前加以处理。

说明

每个按键由一个或多个字符表示。为了指定单一键盘字符，必须按字符本身的键。例如，为了表示字母 A，可以用 "A" 作为 string。为了表示多个字符，就必须在字符后面直接加上另一个字符。例如，要表示 A、B 及 C，可用 "ABC" 作为 string。

对 SendKeys 来说，加号 (+)、插入符 (^)、百分比符号 (%)、上划线 (~) 及圆括号 ( ) 都具有特殊意义。为了指定上述任何一个字符，要将它放在大括号 ({}) 当中。例如，要指定正号，可用 {+} 表示。方括号 ([ ]) 对 SendKeys 来说并不具有特殊意义，但必须将它们放在大括号中。在其它应用程序中，方括号有特殊意义，在出现动态数据交换 (DDE) 的时候，它可能具有重要意义。为了指定大括号字符，请使用 {{} 及 {}}。

为了在按下按键时指定那些不显示的字符，例如 ENTER 或 TAB 以及那些表示动作而非字符的按键，请使用下列代码：

按键 | 代码
BACKSPACE | {BACKSPACE}, {BS}, 或 {BKSP}
BREAK | {BREAK}
CAPS LOCK | {CAPSLOCK}
DEL or DELETE | {DELETE} 或 {DEL}
DOWN ARROW | {DOWN}
END | {END}
ENTER | {ENTER}或 ~
ESC | {ESC}
HELP | {HELP}
HOME | {HOME}
INS or INSERT | {INSERT} 或 {INS}
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 | ^
ALT | %

为了说明在按下其它按键时应同时按下 SHIFT、CTRL、及 ALT 的任意组合键，请把那些按键的码放在括号当中。例如，为了说明按下 E 与 C 的时候同时按下 SHIFT 键，请使用 "+(EC)"。为了说明在按下 E 的时候同时按下 SHIFT 键，但接着按 C 而不按 SHIFT，则使用 "+EC"。

为了指定重复键，使用 {key number} 的形式。必须在 key 与 number 之间放置一个空格。例如，{LEFT 42} 意指 42 次按下 LEFT ARROW 键；{h 10} 则是指 10 次按下 H 键。

注意 不能用 SendKeys 将按键消息发送到这样一个应用程序，这个应用程序并没有被设计成在 Microsoft Windows or Macintosh中运行。Sendkeys 也无法将 PRINT SCREEN 按键 {PRTSC} 发送到任何应用程序。


SendKeys 语句示例

本示例使用 Shell 函数来运行 Microsoft Windows 所附的计算器程序；然后使用 SendKeys 语句来按下计算器的某些数字键，最后退出计算器。（若要观察示例运行过程，可将示例粘贴到过程中，再运行过程即可。因为 AppActivate 会将焦点转移到计算器应用程序，故本示例不能以单步方式来运行。）。在 Macintosh上，使用Macintosh 应用程序接受键盘输入而不是用Windows 计算器。

Dim ReturnValue, I
ReturnValue = Shell("CALC.EXE", 1)    ' 运行计算器。
AppActivate ReturnValue     ' 激活计算器。
For I = 1 To 100    ' 设置计数循环。
    SendKeys I & "{+}", True    ' 按下按键给计算器
Next I    ' 将所有 I 值相加。
SendKeys "=", True    ' 取得总合。
SendKeys "%{F4}", True    ' 按 ALT+F4 关闭计算器。


Set 语句

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

语法

Set objectvar = {[New] objectexpression | Nothing}

Set 语句的语法包含下面部分：

部分 | 描述
objectvar | 必需的。变量或属性的名称，遵循标准变量命名约定。
New | 可选的。通常在声明时使用 New，以便可以隐式创建对象。如果 New 与 Set 一起使用，则将创建该类的一个新实例。如果 objectvar 包含了一个对象引用，则在赋新值时释放该引用。不能使用 New 关键字来创建任何内部数据类型的新实例，也不能创建从属对象。
objectexpression | 必需的。由对象名，所声明的相同对象类型的其它变量，或者返回相同对象类型的函数或方法所组成的表达式。
Nothing | 可选的。断绝 objectvar 与任何指定对象的关联。若没有其它变量指向 objectvar 原来所引用的对象，将其赋为 Nothing 会释放该对象所关联的所有系统及内存资源。

说明

为确保合法，objectvar 必须是与所赋对象相一致的对象类型。

Dim、Private、Public、ReDim以及 Static 语句都只声明了引用对象的变量。在用 Set 语句将变量赋为特定对象之前，该变量并没有引用任何实际的对象。

下面的示例说明了如何使用 Dim 来声明 Form1 类型的数组。Form1 实际上还没有实例。然后使用 Set 将新创建的 Form1 的实例的引用赋给 myChildForms 变量。在 MDI 应用程序中可以使用这些代码来创建子窗体。

Dim myChildForms(1 to 4) As Form1
Set myChildForms(1) = New Form1
Set myChildForms(2) = New Form1
Set myChildForms(3) = New Form1
Set myChildForms(4) = New Form1

通常，当使用 Set 将一个对象引用赋给变量时，并不是为该变量创建该对象的一份副本，而是创建该对象的一个引用。可以有多个对象变量引用同一个对象。因为这些变量只是该对象的引用，而不是对象的副本，因此对该对象的任何改动都会反应到所有引用该对象的变量。不过，如果在 Set 语句中使用 New 关键字，那么实际上就会新建一个该对象的实例。


SetAttr 语句

为一个文件设置属性信息。

语法

SetAttr pathname, attributes

SetAttr 语句的语法含有以下这些命名参数：

部分 |  | 描述
pathname | 必要参数。用来指定一个文件名的字符串表达式，可能包含目录或文件夹、以及驱动器。
Attributes | 必要参数。常数或数值表达式，其总和用来表示文件的属性。

设置值

attributes 参数设置可为：

常数 |  | 值 |  | 描述
vbNormal | 0 |  | 常规（缺省值）
VbReadOnly | 1 |  | 只读。
vbHidden | 2 |  | 隐藏。
vbSystem | 4 |  | 系统文件 在Macintosh中不可用。
vbArchive | 32 |  | 上次备份以后，文件已经改变
vbAlias | 64 |  | 指定的文件名是一个别名。只在Macintosh中可用。

注意 这些常数是由 VBA 所指定的，在程序代码中的任何位置，可以使用这些常数来替换真正的数值。

说明

如果想要给一个已打开的文件设置属性，则会产生运行时错误。


SetAttr 语句示例

本示例使用 SetAttr 语句来设置文件属性。 在 Macintosh 中， 只有常量 vbNormal、 vbReadOnly、 vbHidden 和vbAlias 是可用的。

SetAttr"TESTFILE", vbHidden    ' 设置隐含属性。
SetAttr"TESTFILE", vbHidden + vbReadOnly    ' 设置隐含并只读。


Static 语句

在过程级别中使用，用于声明变量并分配存储空间。在整个代码运行期间都能保留使用 Static 语句声明的变量的值。

语法

Static varname[([subscripts])] [As [New] type] [, varname[([subscripts])] [As [New] type]] . . .

Static 语句的语法包含下面部分：

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

说明

模块的代码开始运行后，使用 Static 语句声明的变量会一直保持其值，直至该模块复位或重新启动。可以在非静态的过程中使用 Static 语句显式声明只在该过程内可见，但具有与包含该过程定义的模块相同生命期的变量。

可以在过程中使用 Static 语句来声明在过程调用之间仍能保持其值的变量的数据类型。例如，下面的语句声明了一个定长的整型数组：

Static EmployeeNumber(200) As Integer

下面的语句为 worksheet 的新实例声明了一个变量：

Static X As New Worksheet

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

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

注意 Static 语句与 Static 关键字很相似，但是针对不同的效果来使用的。如果使用 Static 关键字（如 Static Sub CountSales ()）来声明一个过程，则该过程中的所有局部变量的存储空间都只分配一次，且这些变量的值在整个程序运行期间都存在。对非静态过程而言，该过程每次被调用时都要为其变量分配存储空间，当该过程结束时都要释放其变量的存储空间。Static 语句则用来在非静态的过程中声明特定的变量，以使其在程序运行期间能保持其值。

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

注意 如果在过程中使用 Static 语句，应和其它的声明语句（如 Dim）一样将其放在过程的开始。


Static 语句示例

该示例使用 Static 语句，可以在模块代码运行期间一直保持变量的值。

'函数定义。
Function KeepTotal(Number)
    '只有 Accumulate 变量能在调用过程之间保持其值。
    Static Accumulate
    Accumulate = Accumulate + Number
    KeepTotal = Accumulate
End Function

'Static 函数定义。
Static Function MyFunction(Arg1, Arg2, Arg3)
    '所有局部变量在函数调用之间都能保持其值。
    Accumulate = Arg1 + Arg2 + Arg3
    Half = Accumulate / 2
    MyFunction = Half
End Function


Stop 语句

暂停执行。

语法

Stop

说明

可以在过程中的任何地方放置 Stop 语句，使用 Stop 语句，就相当于在程序代码中设置断点。

Stop 语句会暂停程序的执行，但是它不像 End，因为 Stop 不会关闭任何文件，或清除变量，除非它是以编译后的可执行文件 (.EXE) 方式来执行。


Stop 语句示例

本示例使用 Stop 语句来暂停 For...Next 循环里的每一次完成。

Dim I
For I = 1 To 10    ' 开始 For...Next 循环。
    Debug.Print I    ' 将 I 的值显示到“立即”窗口。
    Stop    ' 每一次的完成都会在此暂停。
Next I


Sub 语句

声明子过程的名称，参数，以及构成其主体的代码。

语法

[Private | Public | Friend] [Static] Sub name [(arglist)]
[statements]
[Exit Sub]
[statements]

End Sub

Sub 语句的语法包含下面部分：

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

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

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

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

说明

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

小心 Sub 过程可以是递归的；也就是说，该过程可以调用自己来完成某个特定的任务。不过，递归可能会导致堆栈上溢。通常 Static 关键字和递归的 Sub 过程不在一起使用。

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

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

Sub 过程与 Function 过程的相似之处是：它们都一个可以获取参数，执行一系列语句，以及改变其参数的值的独立过程。而与 Function 过程不同的是：带返回值的 Sub 过程不能用于表达式。

可以使用过程名并后跟相应的参数列表来调用一个 Sub 过程。请参阅 Call 语句关于如何调用 Sub 过程的详细的说明信息。

在 Sub 过程中使用的变量分为两类：一类是在过程内显式定义的，另一类则不是。在过程内显式定义的变量（使用 Dim 或等效方法）都是局部变量。对于使用了但又没有在过程中显式定义的变量，除非其在该过程外更高级别的位置有显示地定义，否则也是局部的。

小心 过程可以使用没有在过程内显式定义的变量，但只要有任何在模块级别定义的名称与之同名，就会产生名称冲突。如果过程中使用的未定义的变量与别的过程，常数，或变量的名称相同，则认为过程使用的是模块级的名称。显式定义变量就可以避免这类冲突。可以使用 Option Explicit 语句来强制显式定义变量。

注意 不能使用 GoSub、GoTo 或 Return 来进入或退出 Sub 过程。


Sub 语句示例

该示例使用 Sub 语句来定义子过程的名称、参数、以及构成子过程主体的代码。

'子过程的定义。
'子过程带有两个参数。
Sub SubComputeArea(Length, TheWidth)
    Dim Area As Double    '声明局部变量。
    If Length = 0 Or TheWidth = 0 Then
    '如果有一个参数 = 0，
         Exit Sub    '就立即退出子过程。
    End If
    Area = Length * TheWidth    '计算矩形的面积。
    Debug.Print Area    '将面积显示在调试窗口。
End Sub


Time 语句

设置系统时间。

语法

Time = time

必要的 time 参数，可以是任何能够表示时刻的数值表达式、字符串表达式或它们的组合。

说明

如果 time 是一字符串，则 Time 会试着根据系统指定的时间，利用时间分隔符将其转换成一个时间。如果无法转换成一个有效的时间，则会导致错误发生。


Time 语句示例

本示例使用 Time 语句来设置系统时间。

Dim MyTime
MyTime = #4:35:17 PM#    ' 指定一时间。
Time = MyTime    ' 将系统时间设置为 MyTime 的内容。


Type 语句

在模块级别中使用，用于定义包含一个或多个元素的用户自定义的数据类型。

语法

[Private | Public] Type varname
elementname [([subscripts])] As type
[elementname [([subscripts])] As type]
. . .

End Type

Type 语句的语法包含下面部分：

部分 | 描述
Public | 可选的。用于声明可在所有工程的所有模块的任何过程中使用的用户定义类型。
Private | 可选的。用于声明只能在包含该声明的模块中使用的用户自定义的类型。
varname | 必需的。用户自定义类型的名称；遵循标准的变量命名约定
elementname | 必需的。用户自定义类型的元素名称。除了可以使用的关键字，元素名称也应遵循标准变量命名约定。
subscripts | 可选的。数组元素的维数。当定义大小可变的数组时，只须圆括号。subscripts 参数使用如下语法：
 | [lower To] upper [,[lower To] upper] . . .
 | 如果不显式指定 lower，则数组的下界由 Option Base 语句控制。如果没有 Option Base 语句则下界为 0。
type | 必需的。元素的数据类型；可以是Byte、Boolean、Integer、Long、Currency、Single、Double、Decimal（目前尚不支持）、Date、String（对变长的字符串）、String * length（对定长的字符串）、Object、Variant、其它的用户自定义的类型或对象类型。

说明

Type 语句只能在模块级使用。使用 Type 语句声明了一个用户自定义类型后，就可以在该声明范围内的任何位置声明该类型的变量。可以使用 Dim、Private、Public、ReDim 或 Static 来声明用户自定义类型的变量。

在标准模块中，用户自定义类型按缺省设置是公用的。可以使用 Private 关键字来改变其可见性。而在类模块中，用户自定义类型只能是私有的，且使用 Public 关键字也不能改变其可见性。

在 Type...End Type 块中不允许使用行号和行标签。

用户自定义类型经常用来表示数据记录，记录一般由多个不同数据类型的元素组成。

下面的示例演示了一个用户自定义类型的大小固定的数组的用法：

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 相同。

当在用户自定义类型中声明大小固定的数组时，必须用数字文字或常数而不能用变量来声明数组的维数。


Type 语句示例

该示例使用 Type 语句，定义用户自定义的数据类型。Type 语句只能在模块级使用。如果要在类模块中使用，则必须在 Type 语句前冠以关键字 Private。

Type EmployeeRecord    '创建用户自定义的类型。
    ID As Integer    '定义元素的数据类型。
    Name As String * 20
    Address As String * 30
    Phone As Long
    HireDate As Date
End Type
Sub CreateRecord()
    Dim MyRecord As EmployeeRecord    '声明变量。

    '对 EmployeeRecord 变量的赋值必须在过程内进行。
    MyRecord.ID = 12003    '给一个元素赋值。
End Sub


Unload 语句

从内存中删除一个对象。

语法

Unload object

必要的 object 参数，代表对象表达式，其值为“应用于”列表中的对象。

说明

当卸载一对象时，就将这个对象从内存中删除，使释放出来的内存空间可再使用。直到用 Load 语句再次将对象放入内存之前，用户都不能与此对象交互作用，且不能用程序操作对象。


Unload 语句示例

下列示例假设程序中有两个UserForms。在 UserForm1 的 Initialize 事件中，程序会加载 UserForm2 并将它显示出来。当用户单击 UserForm2 时， UserForm2 就会被卸载，而 UserForm1将会显示出来。而当用户单击 UserForm1 时就会卸载 UserForm1 。

' UserForm1 的 Initialize 事件过程
Private Sub UserForm_Initialize()
    Load UserForm2
    UserForm2.Show
End Sub
' UserForm2 的 Click 事件
Private Sub UserForm_Click()
    Unload UserForm2
End Sub

' UserForm1 的 Click 事件
Private Sub UserForm_Click()
    Unload UserForm1
End Sub


While...Wend 语句

只要指定的条件为 True，则会重复执行一系列的语句。

语法

While condition
[statements]

Wend

While...Wend 语句的语法具有以下几个部分：

部分 | 描述
condition | 必要参数。数值表达式或字符串表达式，其计算结果为 True 或 False。如果 condition 为 Null，则 condition 会视为 False。
statements | 可选参数。一条或多条语句，当条件为 True 时执行。

说明

如果 condition 为 True，则所有的 statements 都会执行，一直执行到 Wend 语句。然后再回到 While 语句，并再一次检查 condition，如果 condition 还是为 True，则重复执行。如果不为 True，则程序会从 Wend 语句之后的语句继续执行。

While...Wend 循环也可以是多层的嵌套结构。每个 Wend 匹配最近的 While 语句。

提示 Do...Loop 语句提供了一种结构化与适应性更强的方法来执行循环。


While...Wend 语句示例

本示例使用 While...Wend 语句来增加计数变量的值。如果条件判断值为 True，则循环内的语句将一直执行下去。

Dim Counter
Counter = 0    ' 设置变量初值。
While Counter < 20    ' 测试计数器的值。
    Counter = Counter + 1    ' 将计数器的值加一。
Wend    ' 当 Counter > 19 时则循环终止。
Debug.Print Counter    ' 在“立即”窗口中显示数字 20。


Width # 语句

将一个输出行的宽度指定给用 Open 语句打开的文件。

语法

Width #filenumber, width

Width # 语句的语法具有以下几个部分：

部分 | 描述
filenumber | 必要。任何有效的文件号。
width | 必要。范围在 0–255 之间的数值表达式，在新的一行开始之前，指出在该行上可出现多少字符。如果 width 等于 0，则行的长度不受限制。width 的缺省值为 0。


Width # 语句示例

本示例使用 Width # 语句来设置文件的输出行宽。

Dim I
Open "TESTFILE" For Output As #1    ' 打开输出文件。
VBA.Width 1, 5    ' 设置输出行宽为 5。
For I = 0 To 9    ' 循环 10 次。
    Print #1, Chr(48 + I)；    ' 每行输出五个字符。
Next I
Close #1    ' 关闭文件。


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 就不能改变。因此不能用一个 With 语句来设置多个不同的对象。

可以将一个 With 块放在另一个之中，而产生嵌套的 With 语句。但是，由于外层 With 块成员会在内层的 With 块中被屏蔽住，所以必须在内层的 With 块中，使用完整的对象引用来指出在外层的 With 块中的对象成员。

重点 一般来说，建议您不要跳入或跳出 With 块。如果在 With 块中的语句被执行，但是 With 或 End With 语句并没有执行，则一个包含对该对象引用的临时变量将保留在内存中，直到您退出该过程。。


With 语句示例

本示例使用 With 语句对某单一对象执行一系列的语句。MyObject 对象及其属性均为示范目的而采用了通用名称。

With MyObject
    .Height = 100        ' 和 MyObject.Height 一样等于 100 。
    .Caption = "Hello World"    ' 和 MyObject.Caption 一样等于 "Hello World" 。
    With .Font
        .Color = Red        ' 和 MyObject.Font.Color 一样等于 Red。
        .Bold = True        ' 和 MyObject.Font.Bold 一样等于 True 。
    End With
End With


Write # 语句

将数据写入顺序文件。

语法

Write #filenumber, [outputlist]

Write # 语句的语法具有以下几个部分：

部分 | 描述
filenumber | 必要。任何有效的文件号。
outputlist | 可选。要写入文件的数值表达式或字符串表达式，用一个或多个逗号将这些表达式分界。

说明

通常用 Input # 从文件读出 Write # 写入的数据。

如果省略 outputlist，并在 filenumber 之后加上一个逗号，则会将一个空白行打印到文件中。多个表达式之间可用空白、分号或逗号隔开。空白和分号等效。

用 Write # 将数据写入文件时将遵循几个通用的约定，使得无论什么区域都可用 Input # 读出并正确解释数据：

  • 在写入数值数据时总使用句号作为十进制分隔符。

  • 对于 Boolean 类型的数据，或者打印 #TRUE# 或者打印 #FALSE#。无论在什么地区，都不将 True 和 False 这两个关键字翻译出来。

  • 使用通用的日期格式将 Date 类型的数据写入文件中。当日期或时间的部件丢失或为零时，只将现有部分写入文件中。

  • 如果 outputlist 的数据为 Empty，则不将任何数据写入文件。但对 Null 数据，则要写入 #NULL#。

  • 如果 outputlist 数据为 Null 数据，则将 #NULL# 写入文件中。

  • 对于 Error 类型的数据，输出看起来与 #ERROR errorcode# 一样。无论在什么地区，都不将关键字 Error 翻译出来。

    与 Print # 语句不同，当要将数据写入文件时，Write # 语句会在项目和用来标记字符串的引号之间插入逗号。没有必要在列表中键入明确的分界符。Write # 语句在将 outputlist 中的最后一个字符写入文件后会插入一个新行字符，即回车换行符，(Chr(13) + Chr(10))。

    注意 不能写入包含了内嵌引号的字符串，例如，用Input # 语句写入 "1,2""X" ：Input # 会把这个字符串当作两个完全分开的字符串。


Write # 语句示例

本示例使用 Write # 语句将行数据写入顺序文件。

Open "TESTFILE" For Output As #1    ' 打开输出文件。
Write #1, "Hello World", 234    ' 写入以逗号隔开的数据。
Write #1,    ' 写入空白行。

Dim MyBool, MyDate, MyNull, MyError
' 赋值 Boolean、Date、Null 及 Error 等。
MyBool = False : MyDate = #February 12, 1969# : MyNull = Null
MyError = CVErr(32767)
' Boolean 数据以 #TRUE# 或 #FALSE# 的格式写入。
' 日期以通用日期格式写入，例如：#1994-07-13# 代表
' 1994 年 1 月 13 日。Null 数据以 #NULL# 格式写入。
' Error 数据以 #ERROR 错误代号# 的格式写入。
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    ' 关闭文件。


未找到主题

没有找到匹配的主题。以下列出了可能导致出现此主题的原因及解决办法：

原因 | 解决办法
目标主题未在选中的活动子集中。 | 将活动子集设置为合适的子集或为（“整个集合”）。
链接已过期。 | 使用索引或搜索功能代替。
书写的链接不正确。 | 使用索引或搜索功能代替。
MSDN 安装的问题。 | 卸载 MSDN Library，然后重新运行安装程序。

有关子集、搜索、索引和安装的详细内容，请参阅 MSDN Library 帮助。


CStr 返回值
如果 expression 是 |  | CStr 返回
Boolean |  | 含有 True或 False 的字符串
Date | 含有系统中短日期格式日期的字符串
Null |  | 一个运行时错误
Empty |  | 一个零长度字符串 ("")
Error |  | 包含单词 Error 以及错误号的字符串
其他数值 |  | 含有数值的字符串


CBool 函数示例

本示例使用 CBool 函数来将一表达式转成 Boolean 值。如果表达式的结果为非零的值，CBool 返回 True；否则返回 False。

Dim A, B, Check
A = 5: B = 5    ' 设置变量初值。
Check = CBool(A = B)    ' Check 的值为 True。

A = 0    ' 定义变量。
Check = CBool(A)    ' Check 的值为 False。


CByte 函数示例

本示例使用 CByte 函数将一表达式转成 Byte。

Dim MyDouble, MyByte
MyDouble = 125.5678    ' MyDouble 为Double（双精度）。
MyByte = CByte(MyDouble)    ' MyByte 值为 126。


CCur 函数示例

本示例使用 CCur 函数将表达式转成 Currency。

Dim MyDouble, MyCurr
MyDouble = 543.214588    ' MyDouble 为 Double 类型。
MyCurr = CCur(MyDouble * 2)    ' 将 MyDouble * 2 的结果
    ' （1086.429176）转换为 Currency （1086.4292）。


CDate 函数示例

本示例使用 CDate 函数将字符串转换成 Date。一般说来，字符串格式的日期与时间硬编码（如示例中所示）并不好。较好的做法是使用日期原义表达式和时间的原义表达式（如 #2/12/1969#，#4:45:23 PM#）。

Dim MyDate, MyShortDate, MyTime, MyShortTime
MyDate = "February 12, 1969"    ' 定义日期。
MyShortDate = CDate(MyDate)    ' 转换为 Date 数据类型。

MyTime = "4:35:47 PM"    ' 定义时间。
MyShortTime = CDate(MyTime)    ' 转换为 Date 数据类型。


CDbl 函数示例

本示例使用 CDbl 函数将表达式转换为 Double 类型。

Dim MyCurr, MyDouble
MyCurr = CCur(234.456784)    ' MyCurr 为 Currency 类型。
MyDouble = CDbl(MyCurr * 8.2 * 0.01)    ' 将结果转换为 Double 类型。


CDec 函数示例

该示例使用 CDec 函数将数字值转换为 Decimal。

Dim MyDecimal, MyCurr
MyCurr = 10000000.0587    ' MyCurr 是货币。
MyDecimal = CDec(MyCurr)     ' MyDecimal 是二进制数。


CInt 函数示例

本示例使用 CInt 函数将一数值转换为 Integer。

Dim MyDouble, MyInt
MyDouble = 2345.5678    ' MyDouble 为 Double 类型。
MyInt = CInt(MyDouble)    ' MyInt 的值为 2346。


CLng 函数示例

本示例使用 CLng 函数将一数值转换为 Long。

Dim MyVal1, MyVal2, MyLong1, MyLong2
MyVal1 = 25427.45: MyVal2 = 25427.55    ' MyVal1、MyVal2 均为 Double 类型。
MyLong1 = CLng(MyVal1)    ' MyLong1 的值为 25427。
MyLong2 = CLng(MyVal2)    ' MyLong2 的值为 25428。


CSng 函数示例

本示例使用 CSng 函数将一数值转换为 Single。

Dim MyDouble1, MyDouble2, MySingle1, MySingle2
' MyDouble1、MyDouble2 均为 Double 类型。
MyDouble1 = 75.3421115: MyDouble2 = 75.3421555
MySingle1 = CSng(MyDouble1)    ' MySingle1 的值为 75.34211。
MySingle2 = CSng(MyDouble2)    ' MySingle2 的值为 75.34216。


CStr 函数示例

本示例使用 CStr 函数将一数值转换为 String。

Dim MyDouble, MyString
MyDouble = 437.324    ' MyDouble 为 Double 类型。
MyString = CStr(MyDouble)    ' MyString 的内容为“437.324”。


CVar 函数示例

本示例使用 CVar 函数将表达式转换为 Variant。

Dim MyInt, MyVar
MyInt = 4534    ' MyInt 为 Integer 类型。
MyVar = CVar(MyInt & "000")    ' MyVar 的内容为字符串“4534000”。


Date 函数示例

本示例使用 Date 函数返回系统当前的日期。

Dim MyDate
MyDate = Date    ' MyDate 的值为系统当前的日期。


Format 函数示例

本示例显示用 Format 函数做格式化输出的不同用法。对于日期分隔号（/），时间分隔号（:），以及 AM/ PM 等文本而言，其真正的显示格式会因计算机上的国际标准不同而有所差异。在开发阶段，日期与时间是以短日期的格式，配合代码的国际标准来显示的。而在运行时，短日期则是根据系统的国际标准而定，而系统的国际标准和代码的国际标准可能并不相同。本示例中是假设国际标准为 English/United States。

MyTime 及 MyDate 在开发环境下，使用系统的短日期设置显示出来的。

Dim MyTime, MyDate, MyStr
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"。


Input 函数示例

本示例使用 Input 函数来一次读文件中一个字符，并将它显示到立即窗口。本示例假设 TESTFILE 文件内含数行文本数据。

Dim MyChar
Open "TESTFILE" For Input As #1    ' 打开文件。
Do While Not EOF(1)    ' 循环至文件尾。
    MyChar = Input(1, #1)    ' 读入一个字符。
    Debug.Print MyChar    ' 显示到立即窗口。
Loop
Close #1    ' 关闭文件。


InStr 函数示例

本示例使用 InStr 函数来查找某字符串在另一个字符串中首次出现的位置。

Dim SearchString, SearchChar, MyPos
SearchString ="XXpXXpXXPXXP"    ' 被搜索的字符串。
SearchChar = "P"    ' 要查找字符串 "P"。

' 从第四个字符开始，以文本比较的方式找起。返回值为 6（小写 p）。
' 小写 p 和大写 P 在文本比较下是一样的。
MyPos = Instr(4, SearchString, SearchChar, 1)

' 从第一个字符开使，以二进制比较的方式找起。返回值为 9（大写 P）。
' 小写 p 和大写 P 在二进制比较下是不一样的。
MyPos = Instr(1, SearchString, SearchChar, 0)

' 缺省的比对方式为二进制比较（最后一个参数可省略）。
MyPos = Instr(SearchString, SearchChar)    ' 返回 9。

MyPos = Instr(1, SearchString, "W")    ' 返回 0。


Month 函数示例

本示例使用 Month 函数来得知某个日期的月份。在开发环境中，日期原义会根据系统的地区设置，以短式日期格式显示。

Dim MyDate, MyMonth
MyDate = #February 12, 1969#    ' 指定一日期。
MyMonth = Month(MyDate)    ' MyMonth 的值为 2。


Str 函数示例

本示例使用 Str 函数来将一个数字转成字符串。当数字转成字符串时，字符串的第一个位一定是空格或是正负号。

Dim MyString
MyString = Str(459)    ' 返回 " 459"。
MyString = Str(-459.65)    ' 返回 "-459.65"。
MyString = Str(459.001)    ' 返回 " 459.001"。


Time 函数示例

本示例使用 Time 函数返回系统当前的时间。

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


Weekday 函数示例

本示例使用 Weekday 函数将日期转换为星期几。

Dim MyDate, MyWeekDay
MyDate = #February 12, 1969#    ' 指定一日期。
MyWeekDay = Weekday(MyDate)    ' MyWeekDay 的值为 4，因为 MyDate 是星期四。


不同数值对应不同格式 (Format 函数)

用户自定义数值格式表达式可以有一至四个区段，各区段间以分号隔开。但如果 format 函数的参数含有命名数值格式，则只能有一个区段。

如果使用 | 其结果为
只有一个区段 | 格式表达式应用到所有值。
两个区段 | 第一个区段应用到正值或零，第二个区段应用到负值。
三个区段 | 第一个区段应用到正值，第二个区段应用到负值，第三个区段应用到零。
四个区段 | 第一个区段应用到正值，第二个区段应用到负值，第三个区段应用到零，第四个区段应用到 Null 值。

下面的例子有两个区段：第一个区段定义正值和零的格式；第二个区段定义负值。

"$#,##0;($#,##0)"

如果分号之间没有格式，那么遗漏的区段将以正值的格式来表示。例如，下面的格式以第一个区段显示正值及负值，而如果值为零时，则显示 "Zero"。

"$#,##0;;\Z\e\r\o"


不同字符串值对应不同格式(Format 函数)

字符串的格式表达式可以有一或两个区段，各区段间以分号 (;) 隔开。

如果使用 | 其结果为
只有一个区段 | 格式表达式会应用到所有字符串值。
两个区段 | 第一个区段应用到字符串数据，第二个区段应用到 Null 值和零长度字符串 ("")。


命名日期/时间格式 (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 | 以时和分以及 AM/PM 指示符，来显示 12 小时时间格式的时间。
Short Time | 以 24 小时的时间格式来显示时间，例如，17:45。


命名数值格式 (Format 函数)

下面表格标识了一些预定义数值格式名称：

格式名称 | 说明
General Number | 显示没有千分位符号的数字。
Currency | 显示包含千分位符号的数值，小数点后会显示两位数。输出取决于系统区域的设置。
Fixed | 显示至少小数点左边一位数，右边两位数。
Standard | 显示包含千分位符号的数值，至少小数点左边一位数，右边两位数。
Percent | 显示乘以 100 的数字，其后附加一个百分比符号 (%)，小数点右边总是显示两位数。
Scientific | 使用标准科学计数法。
Yes/No | 如果数字为 0，显示 No；否则显示 Yes。
True/False | 如果数字为 0，显示 False；否则显示 True。
On/Off | 如果数字为 0，显示 Off；否则显示 On。


用户自定义字符串格式 (Format 函数)

可以用下面任意字符来创建格式表达式用于字符串：

字符 | 说明
@ | 字符占位符。显示字符或是空白。如果字符串在格式字符串中 @的位置有字符存在，那么就显示出来；否则，就在那个位置上显示空白。除非有惊叹号字符 (!) 在格式字符串中，否则字符占位符将由右而左被填充。
& | 字符占位符。显示字符或什么都不显示。如果字符串在格式字符串中和号 (&) 的位置有字符存在，那么就显示出来；否则，就什么都不显示。除非有惊叹号字符 (!) 在格式字符串中，否则字符占位符将由右而左被填充。
< | 强制小写。将所有字符以小写格式显示。
> | 强制大写。将所有字符以大写格式显示。
! | 强制由左而右填充字符占位符。缺省值是由右而左填充字符占位符。


用户自定义日期/时间格式 (Format 函数)

下面表格标识一些可用来创建用户自定义日期/时间格式的字符：

字符 | 说明
(:) | 时间分隔符。在一些区域，可能用其他符号来当时间分隔符。格式化时间值时，时间分隔符可以分隔时、分、秒。时间分隔符的真正字符在格式输出时取决于系统的设置。
(/) | 日期分隔符。在一些区域，可能用其他符号来当日期分隔符。格式化日期数值时，日期分隔符可以分隔年、月、日。日期分隔符的真正字符在格式输出时取决于系统设置。
c | 以 ddddd 来显示日期并且以 ttttt 来显示时间。如果想显示的数值无小数部分，则只显示日期部分，如果想显示的数值无整数部分，则只显示时间部分。
d | 以没有前导零的数字来显示日 (1 – 31)。
dd | 以有前导零的数字来显示日 (01 – 31)。
ddd | 以简写来表示日 (Sun –Sat)。
dddd | 以全称来表示日 (Sunday –Saturday)。
ddddd | 以完整日期表示法显示（包括年、月、日），日期的显示要依系统的短日期格式设置而定。缺省的短日期格式为 m/d/yy。
dddddd | 以完整日期表示法显示日期系列数（包括年、月、日），日期的显示要依系统识别的长日期格式而定。缺省的长日期格式为 mmmm dd, yyyy。
aaaa | 与dddd 一样，它只是该字符串的本地化版本。
w | 将一周中的日期以数值表示（1 表星期日~ 7表星期六）。
ww | 将一年中的星期以数值表示 (1 – 54)。
m | 以没有前导零的数字来显示月 (1 – 12)。如果 m 是直接跟在 h 或 hh 之后，那么显示的将是分而不是月。
mm | 以有前导零的数字来显示月 (01 – 12)。如果m是直接跟在h或hh之后，那么显示的将是分而不是月。
mmm | 以简写来表示月 (Jan –Dec)。
mmmm | 以全称来表示月 (January –December)。
oooo | 与mmmm一样，它只是该字符串的本地化版本。
q | 将一年中的季以数值表示 (1 – 4)。
y | 将一年中的日以数值表示 (1 – 366)。
yy | 以两位数来表示年 (00 – 99)。
yyyy | 以四位数来表示年 (00 – 99)。
h | 以没有前导零的数字来显示小时 (0 – 23)。
Hh | 以有前导零的数字来显示小时 (00– 23)。
N | 以没有前导零的数字来显示分 (0 – 59)。
Nn | 以有前导零的数字来显示分 (00 – 59)。
S | 以没有前导零的数字来显示秒 (0 – 59)。
Ss | 以有前导零的数字来显示秒 (00 – 59)。
t t t t t | 以完整时间表示法显示（包括时、分、秒），用系统识别的时间格式定义的时间分隔符进行格式化。如果选择有前导零并且时间是在 10:00 A.M. 或 P.M.之前，那么将显示有前导零的时间。缺省的时间格式为 h:mm:ss。
AM/PM | 在中午前以 12 小时配合大写 AM 符号来使用；在中午和 11:59 P.M.间以 12 小时配合大写 PM 来使用。
am/pm | 在中午前以 12 小时配合小写 am 符号来使用；在中午和 11:59 P.M.间以 12 小时配合小写 pm 来使用。
A/P | 在中午前以 12 小时配合大写A符号来使用；在中午和 11:59 P.M.间以12 小时配合大写P来使用。
a/p | 在中午前以 12 小时配合小写a符号来使用；在中午和 11:59 P.M.间以 12 小时配合小写p来使用。
AMPM | 在中午前以 12 小时配合系统设置的 AM字符串文字来使用；在中午和 11:59 P.M. 间以 12 小时配合系统设置的 PM 字符串文字来使用。AMPM 可以是大写或小写，但必须和您的系统设置相配。其缺省格式为 AM/PM。


用户自定义日期/时间格式示例

下面表格是以用户自定义日期/时间格式来显示 December 7, 1958 的示例：

格式 | 显示结果
m/d/yy | 12/7/58
d-mmm | 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 函数)

下面表格标识了一些可用来创建用户自定义数值格式的字符：

字符 | 说明
无 | 显示没有格式的数值。
(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- 时，会用减号来表示负的乘幂。使用 E+ 或 e+ 时，会用减号来表示负的乘幂并用加号来表示正的乘幂。
- + $ ( ) | 显示一个原义字符。如想显示那些列出的字符之外的字符时，可以用反斜杠 ( \ ) 字符作前缀或以双引号 (" ") 括起来。
(\) | 将格式字符串中下一个字符显示出来。如想显示一作为原义字符并有特殊含义的字符，可将此字符置于反斜杠 (\) 之后。反斜杠本身并不会显示出来。而使用反斜杠 (\) 的效果和使用双引号是一样的。如想显示反斜杠字符，可使用两个反斜杠 (\\)。 那些不能显示为原义字符的字符是日期格式字符和时间格式字符（a, c, d, h, m, n, p, q, s, t, w, y, / 和 :）、数值格式字符（#, 0, %, E, e, 逗点和句点）和字符串格式字符（@, &, <, > 和 !）。
("ABC") | 显示双引号 (" ") 之内的字符串。如在代码中想在 format 中包含一个字符串，必须用 Chr(34) 将文本括起来（34 为双引号 (") 的字符代码）。


用户自定义数值格式表达式示例

下面的表格包含一些数值格式表达式的示例。（这些示例皆假设系统之区域设置为 English-U.S.）第一列包含格式字符串，其他列则为输出结果，假设格式化数据有列表头中给定的值。

Format（格式） | 正 5 | 负 5 | 小数 .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 |


模糊的选定内容

或者是您没有选定一个关键字，或者是您要求关于一个集成开发环境 (IDE) 的部件的帮助。如果您想要选择一个关键字，请尝试重新选择一个单个的关键字。如果您希望得到有关 IDE 的信息，请单击下面的主题：

代码或模块窗口

“立即”窗口或窗格

“本地”窗口或窗格

“对象浏览器”

“监视”窗口或窗格


Collection （“对象浏览器”）

Collection 模块含有在 Collection 对象中执行操作的过程。这些常数可以用在代码中的任何地方。

要取得某个过程的联机帮助，请按照以下步骤执行：

  1. 从“'Collection' 的成员”列表中选择此过程。

  2. 按下 {but_Help.bmp} 按钮。


Constants （“对象浏览器”）

Constants 模块含有一些其他的常数。这些常数可以用在代码中的任何地方。

要取得某个常数的联机帮助，请按照以下步骤执行：

  1. 从“'Constants' 的成员”列表中选择此常数。

  2. 按下 {but_Help.bmp} 按钮。


Conversion （“对象浏览器”）

Conversion 含有用来执行各种变换操作的过程。这些常数可以用在代码中的任何地方。

要取得某个常数的联机帮助，请按照以下步骤执行：

  1. 从“'Conversion' 的成员”列表中选择此过程。

  2. 单击 {but_Help.bmp} 按钮。

    注意 使用 Variant 变量时，显式的数据类型变换是不必要的。


DateTime （“对象浏览器”）

DateTime 模块含有处理日期时间的各种过程与属性。这些常数可以用在代码中的任何地方。

要取得某个常数的联机帮助，请按照以下步骤执行：

  1. 从“'DateTime' 的成员”列表中选择此过程。

  2. 按下 {but_Help.bmp} 按钮。


ErrObject （“对象浏览器”）

ErrObject 模块中的过程，可用来识别与处理使用 Err 对象的运行时错误。这些常数可以用在代码中的任何地方。

要取得某个常数的联机帮助，请按照以下步骤执行：

  1. 从“'ErrObject' 的成员”列表中选择此属性或过程。

  2. 单击 {but_Help.bmp} 按钮。


FileSystem （“对象浏览器”）

FileSystem 模块中的过程，可用来执行文件案、目录或文件夹，与系统的作业。这些常数可以用在代码中的任何地方。

要取得某个常数的联机帮助，请按照以下步骤执行：

  1. 从“'FileSystem' 的成员”列表中选择此过程。

  2. 按下 {but_Help.bmp} 按钮。


Financial （“对象浏览器”）

Financial 模块中的过程，可用来执行各种经济学上的运算。这些常数可以用在代码中的任何地方。

要取得某个常数的联机帮助，请按照以下步骤执行：

  1. 从“'Financial' 的成员”列表中选择此过程。

  2. 单击 {but_Help.bmp} 按钮。


FormShowConstants (“对象浏览器”)

FormShowConstants 模块中包含预定义的 UserForm 常数。 这些常数可以用在代码中的任何地方。

要取得某个常数的联机帮助，请按照以下步骤执行：

  1. 从“' FormShowConstants '的成员” 列表中选择此常数。

  2. 单击 [image] 按钮。


Global （“对象浏览器”）

Global 模块中的属性与过程，可用来执行 UserForm 对象的处理。这些常数可以用在代码中的任何地方。

要取得某个常数的联机帮助，请按照以下步骤执行：

  1. 从“'Global' 的成员”列表中选择此过程。

  2. 按下 {but_Help.bmp} 按钮。


Information （“对象浏览器”）

Information 模块中的过程，可用来返回、检测，或确认信息。这些常数可以用在代码中的任何地方。

要取得某个常数的联机帮助，请按照以下步骤执行：

  1. 从“'Information' 的成员”列表中选择此过程。

  2. 单击 {but_Help.bmp} 按钮。


Interaction （“对象浏览器”）

Interaction 模块中的过程，可用来与对象、应用程序与系统互动。这些常数可以用在代码中的任何地方。

要取得某个常数的联机帮助，请按照以下步骤执行：

  1. 从“'Interaction' 的成员”列表中选择此过程。

  2. 单击 {but_Help.bmp} 按钮。


找不到关键字

Visual Basic 联机帮助中没有找到指定的关键字，可能是您拼写有误、选择了过多或过少的文本、或者您希望得到帮助的不是Visual Basic的关键字。

还有一种可能，那就是您希望得到帮助的字是在一个未被引用的对象库中，所以，请确认是否已经对代码中使用的所有对象建立了正确的引用。

要取得某个关键字的联机帮助，最简单的方式就是将光标指到该关键字上的任何地方，再按下F1即可。不要选择此关键字。因为如果您只选择关键字的一部分或者选了一个以上的字，就会找不到需要的帮助。

当插入点定位在 Value 关键字的 "a" 与 "l" 之间，并按下F1时，就会显示 Value 属性的联机帮助，如下例：

Worksheets(1).Range ("A2").value=3.14159

若要使用内置的帮助“索引”，可以单击“帮助”菜单中的“Microsoft Visual Basic 帮助搜索。


Math （“对象浏览器”）

Math 模块中的过程，可用来执行各种数学运算。这些常数可以用在代码中的任何地方。

要取得某个常数的联机帮助，请按照以下步骤执行：

  1. 从“'Math' 的成员”列表中选择此过程。

  2. 单击 {but_Help.bmp} 按钮。


String （“对象浏览器”）

String 模块中的过程，可用来执行字符串处理。这些常数可以用在代码中的任何地方。

要取得某个常数的联机帮助，请按照以下步骤执行：

  1. 从“'String' 的成员”列表中选择此过程。

  2. 单击 {but_Help.bmp} 按钮。


VbAppWinStyle （“对象浏览器”）

VbAppWinStyle 含有可让 Shell 函数使用的常数，可用来控制应用程序窗口的样式。这些常数可以用在代码中的任何地方。

要取得某个常数的联机帮助，请按照以下步骤执行：

  1. 从“'VbAppWinStyle' 的成员”列表中选择此常数。

  2. 单击 {but_Help.bmp} 按钮。


VbCalendar （“对象浏览器”）

VbCalendar 中的常数，可用来决定 Visual Basic 使用的日历类型。这些常数可以用在代码中的任何地方。

要取得某个常数的联机帮助，请按照以下步骤执行：

  1. 从“'VbCalendar' 的成员”列表中选择此常数。

  2. 单击 {but_Help.bmp} 按钮。


VbCallType (“对象浏览器”)

VbCallType中的常数，可用来识别 CallByName 函数所使用的调用类型。

要取得某个常数的联机帮助，请按照以下步骤执行：

  1. 从“' VbCallType '的成员” 列表中选择此常数。

  2. 单击 [image] 按钮。


VbCompareMethod （“对象浏览器”）

VbCompareMethod 中的常数，可用来决定以 Instr 与 StrComp 函数比较字符串的方式。这些常数可以用在代码中的任何地方。

要取得某个常数的联机帮助，请按照以下步骤执行：

  1. 从“'VbCompareMethod' 的成员”列表中选择此常数。

  2. 单击 {but_Help.bmp} 按钮。


VbDateTimeFormat (“对象浏览器”)

VbDateTimeFormat 中的常数，可用来识别日期和时间的格式化方式。

要取得某个常数的联机帮助，请按照以下步骤执行：

  1. 从“'VbDateTimeFormat'的成员” 列表中选择此常数。

  2. 单击 [image] 按钮。


VbDayOfWeek （“对象浏览器”）

VbDayOfWeek 中的常数，在使用 DateDiff、DatePart，与 Weekday 函数时，可用来识别星期几。这些常数可以用在代码中的任何地方。

要取得某个常数的联机帮助，请按照以下步骤执行：

  1. 从“'VbDayOfWeek' 的成员”列表中选择此常数。

  2. 单击 {but_Help.bmp} 按钮。


VbFileAttribute （“对象浏览器”）

VbFileAttribute 中的常数，在使用 Dir、GetAttr，与 SetAttr 函数时，可用来识别文件属性。这些常数可以用在代码中的任何地方。

要取得某个常数的联机帮助，请按照以下步骤执行：

  1. 从“'VbFileAttribute' 的成员”列表中选择此常数。

  2. 单击 {but_Help.bmp} 按钮。


VbFirstWeekOfYear （“对象浏览器”）

VbFirstWeekOfYear 中的常数，当使用 DateDiff 与 DatePart 函数时，可用来识别怎样决定一年中的第一个星期。这些常数可以用在代码中的任何地方。

要取得某个常数的联机帮助，请按照以下步骤执行：

  1. 从“'VbFirstWeekOfYear' 的成员”列表中选择此常数。

  2. 单击 {but_Help.bmp} 按钮。


VbIMEStatus （“对象浏览器”）

只在远东地区版本才有。VbIMEStatus 中的常数，在使用 IMEStatus 函数时，可用来识别输入法 (IME)。这些常数可以用在代码中的任何地方。

要取得某个常数的联机帮助，请按照以下步骤执行：

  1. 从“'VbIMEStatus' 的成员”列表中选择此常数。

  2. 单击 {but_Help.bmp} 按钮。


VbMsgBoxResult （“对象浏览器”）

VbMsgBoxResult 中的常数，在使用 MsgBox 函数显示消息框时，可用来识别哪个按钮被单击。这些常数可以用在代码中的任何地方。

要取得某个常数的联机帮助，请按照以下步骤执行：

  1. 从“'VbMsgBoxResult' 的成员”列表中选择此常数。

  2. 单击 {but_Help.bmp} 按钮。


VbMsgBoxStyle （“对象浏览器”）

VbMsgBoxStyle 中的常数，在使用 MsgBox 函数时，可用来识别消息框的行为与外观。这些常数可以用在代码中的任何地方。

要取得某个常数的联机帮助，请按照以下步骤执行：

  1. 从“'VbMsgBoxStyle' 的成员”列表中选择此常数。

  2. 单击 {but_Help.bmp} 按钮。


VbQueryClose （“对象浏览器”）

VbQueryClose 中的常数，可用来识别造成 QueryClose 事件发生的原因。这些常数可以用在代码中的任何地方。

要取得某个常数的联机帮助，请按照以下步骤执行：

  1. 从“'VbQueryClose' 的成员”列表中选择此常数。

  2. 单击 {but_Help.bmp} 按钮。


VbStrConv （“对象浏览器”）

VbStrConv 中的常数，可用来识别以 StrConv 函数执行的字符串变换类型。这些常数可以用在代码中的任何地方。

要取得某个常数的联机帮助，请按照以下步骤执行：

  1. 从“'VbStrConv' 的成员”列表中选择此常数。

  2. 单击 {but_Help.bmp} 按钮。


VbTriState (“对象浏览器”)

VbTriState 中的常数，可用来识别三种可能的状态之一。

要取得某个常数的联机帮助，请按照以下步骤执行：

  1. 从“'VbTriState' 的成员” 列表中选择此常数。

  2. 单击 [image] 按钮。


VbVarType （“对象浏览器”）

VbVarType 中的常数，可用来识别 Variant 可包含的各种数据类型。这些常数符合 VarType 函数的返回值，且可以用在程序中的任何地方。

要取得某个常数的联机帮助，请按照以下步骤执行：

  1. 从“'VbVarType' 的成员”列表中选择此常数。

  2. 单击 {but_Help.bmp} 按钮。


Visual Basic

欢迎使用 Visual Basic 文档。

Visual Basic 包含许多文档工具，每个文档工具都设计成帮助您学习和使用本产品的某一特定方面内容。随 Visual Basic 提供的文档包括如下内容：

  • Visual Basic 用户界面帮助

    在这里可以找到关于 Visual Basic 编辑器界面元素的帮助。如命令、对话框、窗口和工具条。

  • Visual Basic 概念主题

    概念帮助主题包括帮助您理解 Visual Basic编程的信息。

  • Visual Basic 定义

    这里列出了在 Visual Basic 文档中定义的术语，按‘ a ’到‘ z ’顺序排列, 以“ access key ”开始，以“ z-order.”结束。

  • Visual Basic “如何” 主题

    在帮助的如何这一章节中可以找到有用的常见步骤。例如；如何使用“ Object Browser ”或如何设置 Visual Basic 环境选项。

  • Visual Basic 语言参考

    在语言参考中可以找到关于 Visual Basic 语言的帮助：所有的方法、属性、语句、函数、运算符、对象。

  • Visual Basic 外接程序模块

    如果您想定制 Visual Basic 的编辑器,请参阅语言参考中关于对象模块的帮助，该对象模块允许您扩展环境。

  • Microsoft 窗体参考

    在这里可以找到关于 Userforms 和控件的帮助，以及如何在 Visual Basic 中使用它们编程。


对象不支持这个动作（错误 445）

并非所有对象都支持所有动作。此错误有以下原因和解决方法：

  • 此对象不支持引用的方法或属性。

    参看对象的文档以获得更多关于对象的信息并检查属性和方法的拼写。

详细信息，可选取有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


Visual Basic 不能加载指定的项，因为它不在系统注册表中。请确认所有外接程序都已正确安装。

Visual Basic 不能加载您在“外接程序管理器”对话框的“可用的外接程序”列表中所选取的外接程序。因为它没有在系统注册表做适当的注册或尚未注册。


指定的项不能加载。把它从可用的外接程序列表中删除吗？

Visual Basic 不能加载您在“外接程序管理器”对话框的“可用的外接程序”列表中所选取的外接程序。单击“是”，将它从列表中删除；或单击“否”，将它留在列表中。不管选择那一个，都不能加载它。


选定的外接程序没有确定‘命令行安全’，可能需要某些用户调解（可能UI)

选定的外接程序没有被确认是‘命令行安全’，可能需要用户干预（可能的 UI)

导致这个错误的原因及解决办法如下：

  • “命令行安全”的意思是：外接程序被注册后，在某种程度上就意味着该外界程序不包含当通过命令行来调用 Visual Basic 时需要用户输入的用户界面。一个用户界面能够干扰无人干预过程（例如创建脚本)的操作。

    如果没有指出外接程序处于命令行安全状态（即使外接程序处于命令行安全状态），当选择外接程序和选择在加载对话框中确定命令行时，出现警告信息。这不是一个严重的问题，但只是给用户的警告，它表明选择的外接程序有可能包含UI元素，该 UI 元素能通过暂停让用户输入而出乎预料地弹出或中断它们自动化脚本的过程。

    指定外接程序处于命令行安全状态，创建（可以使用外接程序设计器），或者手工改变注册关键词的值。

详细信息，选择有问题的项目并按 F1 键（Windows系统）或 HELP（Macintosh系统）。


'item'导致访问违法，从外接程序列表中删除这个'item'？

’item’ 导致访问非法，从外接程序列表中删除这个 ’item’ 吗？

导致这个错误的原因及解决办法如下：

  • 指定的外接程序导致文件访问非法。

详细信息，选择有问题的项目并按F1 键（Windows 系统）或 HELP（Macintosh系统）。


不能吸收这个对象的事件，因为它触发的事件已经达到可接收事件者的最大数量(Error 96)

每个对象指定了同时可接收事件者的最大数量，所以只能接受一定数目的事件。这个错误具有以下的起因与解决方法：

  • 试图对窗体中控件的 WithEvents 变量使用 Set。

  • 由于这些事件的接收者数目的关系，不能对 WithEvents 变量使用 Set，。

详细信息，请选取有疑问的项目，然后按下 F1 (在Windows中) 或HELP (在Macintosh中)键。


类型不匹配：期待数组或用户定义类型

参数或是参数的类型包含数组或用户定义类型。这个错误的原因与解决方法如下所示：

  • 将指定数组或用户定义类型中的一个元素、或一个简单的变量、文字量、常数的参数传给一个期待整个数组或用户定义类型的参数。

    请改变参数或是改变参数定义。

  • 参数指定一个数组类型或用户定义类型，但与参数中所定义的不同。

    请传递一个其类型是参数所期待的数组，或是改变参数声明的定义。

详细信息，请选择有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


在当前会话结束之前，不能开始新的记录

不能进行“嵌套”的记录。这项错误的原因及解决方法如下

  • 已经有记录器正在运行。

    在开始一个新的记录之前，先退出当前的记录。

如需要其它信息，请选择有疑问的项目并按下F1 键(在Windows中) 或 HELP (在 Macintosh中)。


发现二义性的名称

标识符与另一个标识符或必须的限定词相冲。这个错误的起因与解决方法如下所示：

  • 在相同范围内，有超过一个以上的对象具有同名元素。

    可用对象名称加上句点来限定元素名，例如：

object.property

模块级别标识符与工程级标识符 ( 模块名称与引用工程名称 )可在一个过程中重用，虽然这可能会使得程序较难以维护与调试。然而，假如想要引用两个都在同一过程中的项目时，就必须对有效范围较广的项目加以限定。例如，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.

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 ) 。


应用程序描述的长度不能超过 2000 个字符

应用程序描述的长度，不能超过 2000 个字符，请从描述中删除某些字符。


AppleScript 错误

处理 script 期间发生错误。这个错误的起因与解决方法如下所示：

  • 这个错误可能与目的应用过程有关。

    请检查 script 中的标识符是否与应用过程中的相符。

  • 此错误可能与 AppleScript 有关。

    请确定使用的是否为正确的 AppleScript 语法。

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 ) 。


ByRef 参数类型不匹配

按缺省规定，一个以 ByRef （按址）方式传递的参数，必须具有该过程所允许的正确数据类型。这个错误的起因与解决方法如下所示：

  • 传递的参数，其类型不能被强迫转成所需的类型。

    例如，如果预期的是 Long，而传递的却是 Integer 变量，就会生成错误。假如您想要避免发生这种情形，可以将参数放在括弧中来传递。例如，若要传递 Variant 参数 MyVar 至一个必须是 Integer 参数的过程，您可撰写以下的调用：

    Dim MyVar
MyVar = 3.1415
Call SomeSub((MyVar))

Sub SomeSub (MyNum As Integer)
    MyNum = MyNum + MyNum
End Sub

    将参数放在括弧中，强迫其作为一个表达式来计算。在此期间，数值的小数部分会被四舍五入（并非被截断），使它符合所预期的参数类型。计算结果会被放在一个临时区，而该过程会收到该临时区的地址。因此，原来的 MyVar 会保留其值。

    注意 假如您不指定变量类型，则此变量会以缺省的类型 (Variant) 被接收。这并不一定是明显的。例如，下列的过程代码声明两个变量，第一个变量 MyVar 是一个 Variant；而第二个变量 AnotherVar 是一个 Integer。

Dim MyVar, AnotherVar As Integer

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 )。


数组大小已定

静态数组只能够设置大小。这个错误的起因与解决方法如下所示： 一次

  • 试图用 ReDim 语句来改变静态数组的大小，只有动态数组的大小能够改变。

    若不放弃重置大小，就只能使用动态数组。要定义动态数组，可使用带空括号的 Dim、Public、Private 或 Static 语句。例如：

    Dim MyArray()

    在过程中，可用 ReDim 或 Static 语句来定义动态数组，而元素的个数用变量表示：

    ReDim MyArray(n)
  • Option Base 语句放在设置数组大小之后。

    注意 Option Base 语句需放在所有数组之前。

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 ) 。


维数错误

引用一个数组时，其索引个数必须与数组声明时的维数相同。这个错误的原因与解决方法如下所示：

  • 引用数组时的维数不同于数组的实际维数。例如，一个数组的定义为 Dim X(5) (一维数组)，如果用 X(2,4) (二维数组)的方式来引用它，便会产生此错误。

    请检查该数组的声明以及引用的索引个数是否与此数组声明的维数相同。

详细信息，请选择有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


数组长度固定或临时被锁定（错误 10）

并非所有数组都可重设大小。即使数组声明成动态，或者数组是在 Variant 变量中，也会被临时锁定。此错误有以下的原因和解决方法：

  • 使用 ReDim 来改变固定大小数组的元素数。例如，在下列的代码中，在 NextOne 过程中 SomeArr 接收了固定大小的数组 FixedArr ，然后试图调整 SomeArr 的大小：
    Sub FirstOne
    Dim FixedArr(25) As Integer    ' 创建一个固定大小的数组并
    NextOne FixedArr()            ' 将之传给其它过程。
End Sub

Sub NextOne(SomeArr() As Integer)
    ReDim SomeArr(35)        ' 发生错误 10。
    . . .
End Sub

    将数组用 ReDim（如果是在过程内声明数组）声明为动态的而非固定大小，或在声明时不指定元素数（如果是在模块级别中声明数组 )。

  • 对模块层次动态数组，要重新确定大小，而某一个元素已经作为参数传给了过程。例如，在下列的代码中，ModArray 是模块层次动态数组，却将其第 56 个元素以按引用传给 Test过程：
    Dim ModArray () As Integer    ' 创建一个模块层次动态数组。
    . . .

Sub AliasError()
    ReDim ModArray (1 To 73) As Integer
    Test ModArray (45)    ' 传模块层次动态数组的元素
                                ' 给 Test 过程。
End Sub

Sub Test(SomeInt As Integer)
    ReDim ModArray (1 To 40) As Integer  ' 错误在这里发生。
End Sub

    此例并不需要传递模块层次动态数组元素，因为在模块中所有过程都可看到它。然而，如果传递元素，在过程内引用参数，数组会被锁定以避免内存的配置释放，因此，当过程返回时，会导致不能预测的情况出现。

  • 赋一个值给包含数组的 Variant 变量，但 Variant 当前被锁定。例如，如果代码使用了 For Each...Next 循环，对包含数组的 variant 执行操作的话，在进入循环后数组将会被锁定，在循环退出后释放：
    SomeArray = Array(9,8,7,6,5,4,3,2,1)

For Each X In SomeArray
    SomeArray = 301    ' 因为数组锁定导致错误。
Next X

    使用 For...Next 代替 For Each...Next 循环来执行迭代。当数组是 For Each...Next 循环的对象时，可以读入数组，但不能写入。

详细信息，可选取有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


数组的参数必须是 ByRef

以 Dim、ReDim，或 Static 声明的数组，不能以 ByVal 的方式传递。这个错误的起因与解决方法如下所示：

  • 您试图以 ByVal 的方式传递整个数组。

    数组中个别的元素可用 ByVal （按值） 传递，但整个数组必须以 ByRef （按地址方式）传递。请注意 ByRef 为缺省值。如果为了防止对数组元素的更改返回调用者，必须以 ByVal 方式传递数组的话，可以传递括号中的数组参数，或是将它放在 Variant 之中，再将此 Variant 传递至 ByVal 参数，如下所示：

    Dim MyVar As Variant
MyVar = OldArray()

详细信息，请先选取有疑问的项目，然后按下 F1 键。( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 ) 。


编辑将不能被撤销 － 继续吗

在执行这个编辑後，不能选取“撤销”命令来恢复当前的状态。这个错误的起因与解决方法如下所示：

  • 通常发生在编辑大得无法保存时。

    执行较少量的编辑。

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 ) 。


不能给数组赋值

数组中的各元素，必须个别指定其值。这个错误的起因与解决方法如下所示：

  • 试图将一个值指定给一个数组变量，但没有指定要将这个值指定给哪个元素。

    要设置数组中的一个元素，必须指定此元素的下标。例如，若 MyArray 为一个整型数组，则表达式 MyArray = 5 是无效的，下列的表达式才是正确的：

    MyArray(UBound(MyArray)) = 5
  • 试图将整个数组指定给另一个数组。例如，假如 Arr1 是一个数组，Arr2 是另一个数组，则下列两个赋值都是无效的：
    Arr1 = Arr2    ' 无效的赋值。
Arr1() = Arr2()    ' 无效的赋值。

    想要将一个数组赋值给另一个数组，确定在左侧的是大小可以调节的数组，且类型匹配。

    注意   可以将整个数组放在一个 Variant 中，使一个 variant 变量包含整个数组：

    Dim MyArr As Variant
MyVar = Arr2()

    您可以使用与正常数组相同的下标，来引用在 variant 中的数组元素，例如：

    MyVar(3) = MyVar(1) + MyVar(5)

    •

详细信息，请先选取有疑问的项目，然后按下 F1 键  ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 ) 。


不能指派或强迫 Variant （变体）为固定长度字符串数组或用户自定义类型

Variant 只能接受具有有效的 VarType 的数据的赋值。这个错误的起因与解决方法如下所示：

  • 试图传递固定长度字符串数组 。当单个固定长度字符串赋予 Variant ， Variant 被强迫为固定长度字符串，但对于固定长度字符串数组不能这样做。

    如果必须传送数组，用一个循环，将数组的单个元素赋予临时的固定长度字符串数组的元素。然后才能将数组赋予 variant ，并用 Erase 删除临时数组。但是不能用 Erase 删除固定大小数组。

  • 试图往 VarType 函数或 TypeName 函数传送固定长度字符串或用户定义类型

    送往 VarType 函数或 TypeName 函数的参数必须是有效的 Variant 类型

  • 试图给 Variant 变量赋以用户自定义类型。

    虽然不能直接给 Variant 赋以完整的用户定义类型的变量 ，但是可用 Array 函数将用户自定义类型变量的单个元素赋予 Variant。这样可以处理含有 Variant 数组的 Variant。这个变量数组的每个元素的 VarType 对应于用户定义类型的每个元素的原始类型。

  • 试图将固定长度字符串数组或用户定义类型作为要求Variant 参数的过程的参数来传送。注意，过程为后期绑定的，也就是，如果调用必须在运行时构造，所有参数必须以 Variant 类型来传送。例如，下面的代码产生这个错误：
    Dim MyForm As Object    ' Because MyForm is Object, binding is late.
Set MyForm = New Form1
Dim StringArray(10) As String * 12
' The next line generates the error.
MyForm.MyProc StringArray

    对于字符串数组，用循环将数组的每个单个成员赋予临时的可变长度字符串数组。然后才能将那个数组赋予传递给过程的 Variant。对于用户定义类型的数组，可用 Array 函数将用户定义类型变量的单个元素赋予 Variant。这样，处理了包含 Variant 数组的 Variant。

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 )。


基类名字的使用无效

基类不能使用自己的名字。该错误有以下原因和解决方案：

  • 基类试图使用自己的名字，而又不清楚正试图访问基类的默认成员。

    把基类名字放在括号内，来指明想要访问默认成员。

  • 在表达式中使用了基类的名字，但在指定试图访问的成员时存有歧义。

    在基类名字和所关心的成员之间使用歧义消除符（例如，一个惊叹号）。

  • 在 Set 语句中使用了基类名字，就象它包含了该类的引用一样。

    用基类名字来检索引用，例如，使用 GetObject。

关于其他信息，请选中有问题的条目并按 F1 键 (在 Windows中) 或 HELP (对于 Macintosh).


在不是定义类的实例的部件上不能调用 Friend 过程(Error 97)

Friend 过程可以从类外面的模块调用，但此模块必须与类在同一个工程中。这个错误具有以下的起因与解决方法：

  • 试图调用类的 Friend 过程，尽管引用变量的类型是对的，但是它指向的实例不是这个类的实例。

    例如，有两个类，classics 和 classy（实现 classy ），但是您错误地将 classy 的实例赋予了 classics 的实例。

  • 试图跨过程或跨线程访问Friend属性或方法，Friend过程不是一个类的公共界面的部分，因此不能跨过程或跨线程调度。

详细信息，请选取有疑问的项目，然后按下 F1 (在Windows中) 或 HELP (在Macintosh中) 键。


常数、固定长度字符串、数组、自定义类型与 Declare 语句不能是对象模块中的 Public 成员

并非所有对象模块中的变量都可声明成 Public。然而，按缺省规定，过程是 Public，且 Property 过程在语法结构上可模拟变量。这个错误的起因与解决方法如下所示：

  • 在对象模块中声明了一个 Public 常数。

    虽然不能在对象模块中声明 Public 常数，但可以创建一个同名的Property Get 过程。若不能创建同名的 Property Let 或 Property Set 过程，实际上创建了一个只读属性，其用法与常数相同。

  • 在对象模块中声明了一个 Public 类型的固定长度字符串。

    可用一组 Property 过程仿真固定长度字符串，并截掉超出长度的字符串数据，或通知用户超出长度。

  • 在对象模块中声明了一个 Public 数组。

    虽然过程不能返回数组，但可返回一个包含数组的 Variant。要仿真类模块中的 Public 数组，可用一组Property 过程，它们接受与返回包含数组的 Variant 。

  • 在对象模块中放了一个 Declare 语句。

    Declare 语句隐含着公用的意思，可在 Declare 语句之前加上一个 Private 关键字。

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 ) 。


在指定的行上：指定控件的指定类不是加载的控件类

Visual Basic 不能识别 ASCII 文件包含的控件类。将该类的自定义控件添加到您的工程中。


加载指定的项错误。由于加载错误，控件不能加载。继续吗？

这个错误消息出现在其它的错误发生之后。即使已为上述错误采取了适当措施，仍会看到这个消息。若仍要加载该控件请单击“是”；若要取消加载请单击“否”。


这个版本的Visual Basic 不支持设计器的使用特征，因而不能使用设计器

这个版本的 Visual Basic 不支持这种设计器的使用特征，因而不能应用它

导致这个错误的原因及解决办法如下：

  • 这个版本的 Visual Basic 不支持所选择的设计器。

    必须选择另外一个设计器或为指定版本的 Visual Basic 设计的设计器。

详细信息，选择有问题的项目并按下 F1 键（Windows 系统）或 HELP (Macintosh 系统)。


文件模式错误（错误 54）

处理文件内容中的语句，必须与打开文件时的模式一致。此错误有以下的原因和解决方法：

  • 将 Put 或 Get 语句指定给了顺序文件。

    Put 和 Get 只能在以 Random 或 Binary 访问方式打开的文件上使用。

  • 将 Print # 语句使用在非 Output 或 Append 访问方式所打开的文件上。

    用另外的语句把数据放到文件中或以合适的模式重新打开文件。

  • 将 Input # 语句使用在非 Input 访问模式所打开的文件上。

    用另外的语句把数据放到文件中或以 Input模式重新打开文件。

  • 试图对一个只读文件进行写。

    修改文件的读/写状态或放弃写入。

详细信息，可选取有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


错误的文件名或号（错误 52）

此错误发生在访问某指定文件时。此错误有以下的原因和解决方法：

  • 语句引用到如下的文件号或文件名：
    • Open 语句中没有指定或虽有指定但已经关闭。

      用 Open 语句中指定此文件名。注意，如果调用 Close 语句时没有参数，就会不小心关闭当前所有打开的文件，使所有的文件号无效。

    • 超出文件号范围(1 – 511)。

      如果代码中会产生文件号的话，请确保产生的文件号应正确。

  • 无效的文件名或文件号。

    文件名必须遵循操作系统约定。在 Microsoft Windows 中，可使用以下的约定：

    • 文件或目录名称可以有两部分：文件名和任选性的扩展名。两部分以圆点隔开，例如，myfile.new。

    • 文件名可达 255 字符。

    • 文件名必须以字母或数字开头。它可以包含大小写字符(文件名不分大小写)，但以下的字符除外：双引号(")、撇号(') 、斜杠(/)、反斜杠(\)、冒号(:)、垂直条(|)。

    • 文件名可以包含空格。

    • 以下的名称将保留，且不能用在文件或目录上：CON、AUX、COM1、COM2、COM3、COM4、LPT1、LPT2、LPT3、PRN、NUL。例如，如果要在 Open 语句中将文件名设为 PRN 的话，那么 Print # 和 Write # 语句中的缺省打印机，将会指向 Open 语句中的文件号。

    • 以下是正确的 Microsoft Windows 文件名；
        LETTER.DOC
    My Memo.Txt
    BUDGET.92
    12345678.901
    Second Try.Rpt
    • 在 Macintosh 上，文件名可以包含任何的字符，除了冒号 (:) 以外，而且也可有空格，Null 字符 (Chr(0)) 在任何文件名上都是不允许的。

详细信息，可选取有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


选定的监视表达式无效

每次选定的监视表达式不一定都是正确的。这个错误的原因与解决方法如下所示：

  • 选择“立即监视”命令，但所选择的表达式并不是一个正确的表达式。例如，不能去监视注释或 Sub 过程调用。

    请以正确的方式选定表达式，或选择“添加监视”并键入一个正确的表达式。

  • 监视表达式必须以对应此工程的区域代码语法来定义监视表达式。

    请以符合区域的方式来重写表达式。

详细信息，请选择有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


Implements 的接口错误：接口包含数据字段

这个错误有以下的原因和解决方案：

  • 接口或者类包含数据字段。

关于这方面的详细信息，请选择问题中的项并按 F1 键 （在 Windows 中）或者帮助（在 Macintosh 中）。


Implements 的接口错误：接口是从另一个包含无限制方法的纯接口派生出来的

这个错误有以下的原因和解决方案：

  • 接口是直接或间接地从另外一个含有无限制方法的纯接口中派生出来的。

关于这方面的详细信息，请选择问题中的项并按 F1 键 （在 Windows 中）或者帮助（在 Macintosh 中）。


Implements 的接口错误：接口不是由 Iunknown 派生出来的

Implements 语句用于指定一个将要在一个类模块中实现的接口或者类，这个接口或者类就出现在该类模块中。这个错误有以下的原因和解决方案：

  • 接口或者类包含了一个方法，这个方法使用的数据类型是 Basic 不支持的。

关于这方面的详细信息，请选择问题中的项并按 F1 键 （在 Windows 中）或者帮助（在 Macintosh 中）。


Implements 的接口错误：方法具有 out-only 或者 LCID 参数

Implements 语句用于指定一个将要在一个类模块中实现的接口或者类，这个接口或者类就出现在该类模块中。这个错误有以下的原因和解决方案：

  • 接口或者类包含一个方法，这个方法具有一个类型为 out-only 或者 LCID的参数。

关于这方面的详细信息，请选择问题中的项并按 F1 键 （在 Windows 中）或者帮助（在 Macintosh 中）。


Implements 的接口错误：方法的名称含有下划线

Implements 语句用于指定一个将要在一个类模块中实现的接口或者类，这个接口或者类就出现在该类模块中。这个错误有以下的原因和解决方案：

  • 接口或类包含一个名称中含有下划线字符的方法。

关于这方面的详细信息，请选择问题中的项并按 F1 键 （在 Windows 中）或者帮助（在 Macintosh 中）。


Implements 的接口错误：方法没有返回HRESULT

Implements 语句用于指定一个将要在一个类模块中实现的接口或者类，这个接口或者类就出现在该类模块中。这个错误有以下的原因和解决方案：

  • 接口或者类包含一个方法名，其返回值的类型不是 HRESULT。

关于这方面的详细信息，请选择问题中的项并按 F1 键 （在 Windows 中）或者帮助（在Macintosh 中）。


Implements 的接口错误：方法使用了 Visual Basic 不支持的类型

Implements 语句用于指定一个将要在一个类模块中实现的接口或者类，这个接口或者类就出现在该类模块中。这个错误有以下的原因和解决方案：

  • 接口或者类包含了一个 Basic 不支持的方法。

关于这方面的详细信息，请选择问题中的项并按 F1 键 （在 Windows 中）或者帮助（在 Macintosh 中）。


Implements 的接口错误：方法具有一个带有过多层次的间接的参数

Implements 语句用于指定一个将要在一个类模块中实现的接口或者类，这个接口或者类就出现在该类模块中。这个错误有以下的原因和解决方案：

  • 接口或者类包含一个方法，这个方法具有一个带有过多层次的间接的参数。例如：整形数据的两层间接或者用户定义的类型的三层间接的使用。

关于这方面的详细信息，请选择问题中的项并按 F1 键 （在 Windows 中）或者帮助（在 Macintosh 中）。


此工程的 .VBP 文件中含有一个无效或损毁的过程库引用标识符

当保存一个工程时，若曾在“引用”对话框中选定它的引用，则会在此工程的 .vbp 文件中(在早期版本的 Visual Basic 中叫做 .mak 文件) 留下一个入口。例如，数据访问对象的入口就像这样：

Reference=*\G{00025E01-0000-0000-C000-000000000046}#0.0#0#C:\WINDOWS\SYSTEM\DAO2516.DLL#Microsoft
DAO 2.5 Object Library

当一个引用已经被编辑或者损坏时，便会产生此错误。这个错误的原因与解决方法如下所示：

  • 此 .vbp 文件中的一个引用已经无效了。

    请从 .vbp 文件中删除掉不正确的行，并从“工具”菜单下的“引用”对话框中，复选适当的对象库。然后保存此工程，正确的信息便会输入到此 .vbp 文件中。

详细信息，请选择有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


无效的可选参数类型

不是所有 Visual Basic 类型都允许用作 Optional 参数。该错误有以下原因和解决方案：

  • 用无效的数据类型来定义参数。

    例如，不能有用户定义类型的 Optional 参数。也许可以用 Variant 类型的数组来实现目标，因为 Variant 数组的元素可存储不同类型的数据。

关于其他信息，请选中有问题的条目并按 F1 键 (在 Windows中) 或 HELP (对于 Macintosh).


无效的样式串（错误 93）

在 Like的查找操作中指定的样式串无效。此错误有以下原因和解决方法：

  • 对于非法字符列表的表达式，一个普通的例子就是 [a-b，其右边方括号丢失了。

    检查列表的表达式字符，是否正确。

详细信息，可选取有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


加载指定的项错误。加载属性时发生错误。继续吗？

想要加载的窗体上的控件名称，可能与工程中已存在窗体的名称相冲突。例如，加载的 Form2 包含名为 Form1 的控件，就会引发这个错误。


记录长度错误（错误 59）

Get 或 Put 语句的记录变量的长度必须和 Open 语句所指定的相同。此错误有以下的原因和解决方法：

  • 记录变量长度和其 Open 语句所指定的不同。

    请确保在定义了记录变量类型的用户定义类型中，固定长度变量应与 Open 语句的 Len 子句所描述的值相同。例如，假设 RecVar 是一个适当类型的变量。可以使用 Len 函数来指定长度，如下：

    Open MyFile As #1 Len = Len(RecVar)
  • Put 语句中的变量是(或包括)一个变量长度字符串。

    在用 Put 语句随机访问文件时，因为 2 字节长的描述符总要添加到变量长度字符串上，所以变量长度字符串必须比 Open 语句的 Len 子句所指定的记录长度至少小 2 个字符。

  • Put 语句中的变量为(或包括) Variant。

    和变量长度字符串一样，Variant 数据类型也需要 2 个字节的描述符。包含变量长度字符串的Variants，需要 4 个字节的描述符。因此，对于 Variant中的变量长度字符串，其字符串长度必须比 Len 子句所指示的记录长度至少 小 4 个字符。

详细信息，可选取有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


记录号错误（错误 63）

此错误发生在访问文件时。此错误有以下原因和解决方法：

  • Put 或 Get 语句中的记录号小于或等于零。

    检查产生记录号的计算应正确。确保含有记录号的或在计算记录号时使用的变量，其拼写应正确。除非在模块中加上 Option Explicit，不然变量名拼错了，会被视为隐含声明，且将其初始值设置为零。

详细信息，可选取有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


不能创建对指定项的引用

加载文件并建立引用时发生了错误，所以该引用未被添加。


搜索串中的括号不匹配

一个左括号一定要有一个右括号与它配对。这个错误的原因与解决方法如下所示：

  • 在搜索字符串中设置了一个左括号，但却没有与其匹配的右括号。

    请在适当位置加上一个右括号。

详细信息，请选择有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


对象库无效或包含对某个找不到其定义的对象的引用

这个错误的原因与解决方法如下：

  • 一个对象库包含有对找不到的对象定义的引用，或对象库无效。


无效的监视表达式

指定的监视表达式并不是有效的表达式。这个错误的起因与解决方法如下所示：

  • 监视表达式的语法错误。

    检查表达式的语法。请注意，监视表达式的语法与定义须对应工程的区域。

详细信息，请先选取有疑问的项目，然后按下 F1 键。( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 )


With 对象必须是用户定义类型、对象、或变体

并不是所有类型的变量都可以在 With...End With 块中使用。这个错误的原因与解决方法如下所示：

  • 试图在 With 块中使用一个不是 Object 类型、用户定义类型、或包含对象的 Variant类型的变量。

    请检查是否拼错了对象、用户定义类型、或 Variant 变量的名称。

详细信息，请选择有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


无效的，或未限定的引用

以句号开头的标识符只在 With 块中才有效。这个错误的起因与解决方法如下所示：

  • 以句号开头的标识符。

    限定此标识符或除去句号。

详细信息，请先选取有疑问的项目，然后按下 F1 键。( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 )


目标标号太远；循环、 Select Case 或 If 区块太大

虽然过程从头至尾最大可以到 64K，但是因为过程中有向前或向后的分支，因此任一方向上的分支被限制在 32,767 字节之内。这个错误的起因与解决方法如下所示：

  • 从源分支语句（GoTo 和 GoSub）到目的标号的距离超过 32,767 字节。

    请标号移近一点，或使过程小一点。

  • 循环结构太大，占据的内存超过 32K 。

    请使此循环小一点。

  • If 块结构太大，包含的 Then 或 Else 子句占据 的内存超过 32 K 。

    缩小结构。

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 ) 。


代码的执行已被中断

必要时代码的执行可以挂起。这个错误的起因与解决方法如下所示：

  • 遇到 CTRL+BREAK (Microsoft Windows)、ESC (Microsoft Excel) 或COMMAND+PERIOD (Macintosh) 组合键。

    在“错误”对话框中，单击“调试”以进入中断模式，单击“继续”重新开始，或单击“退出”停止执行。

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 ) 。


找不到工程或库

在解决丢失引用的问题前，不能运行代码。这个错误的起因与解决方法如下所示：

  • 找不到引用工程，或找不到与工程语言对应的引用的对象库。

    请在“引用”对话框中将没有解决的引用加上 MISSING 前缀。选取丢失的引用，以显示丢失的工程或对象库的路径或语言。以下是解决此问题的步骤：

解决引用的步骤

  1. 显示“引用”对话框。

  2. 选取丢失的引用。

  3. 激活对象浏览器。

  4. 使用“浏览”对话框以找寻丢失的引用。

  5. 单击“确定”。

  6. 重复以上步骤，执行解决所有丢失的引用为止。

    当您找到一个丢失的项目时，MISSING 前缀就会删除，表示链接已重新建立。若引用的工程名已经改变，就会添加新的引用，并旧的引用必须删除。

    要删除那些不必要的引用，只需清除不要的引用的复选框即可。请注意，对于 Visual Basic 对象库与主应用程序对象库的引用是不能删除的.

    应用程序可以支持其对象库的不同语言版本。要了解所需的语言版本，可单击该引用，选取在对话框下方指出的语言。

    对象库可以是扩展名为 .OLB 的独立文件，或者集成在动态链接库 (DLL)中。在每一个平台上，对象库存在不同的版本。因此，当工程被移植到另一个平台上时，例如从 Macintosh 到 Microsoft Windows，那个平台的被引用库的正确语言版本，必须在主应用程序文档所指定的位置上可用。

对象库的文件名通常以下面的方式命名：

  • Windows（3.1 版与更早）：应用程序代码 + 语言代码 + [版本].OLB。例如：

    法文的 Visual Basic for applications，Version 2 的对象库为 VAFR2.OLB。

    法文的 Microsoft Excel 5.0 的对象库为 XLFR50.OLB。

  • Macintosh：应用程序名代码+ [版本]. +OLB。例如：

    法文的 Visual Basic for applications，Version 2 的对象库为 VA FR 2 OLB。

    会是法文的 Microsoft Excel 5.0 的对象库为 MS Excel FR 50 OLB。

假如不能在系统上找到丢失的工程或库，可接洽引用工程的作者。若丢失的库是一个 Microsoft 应用程序的对象库，可用下面的方式取得：

  • 假如您有 Microsoft electronic technical support services 的访问权，请参阅此帮助文件的技术支持一节。在电子服务下，将会发现如何使用适当的服务选项的介绍。

  • 假如没有 Microsoft electronic technical support services 的访问权，可参考此 Microsoft 对象库所在之应用程序的注意。关于如何接触您当地的 Microsoft 产品支持组织的信息，也能够在这个帮助文件的技术支持一节中找到。

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 ) 。


不能添加对指定文件的引用

Visual Basic 并不见得可以访问所有的对象库或类型库。这个错误的起因与解决方法如下所示：

  • 您试图以“添加引用”对话框，来添加对 Visual Basic 不能访问的对象库或类型库的引用。

    请检查该对象的帮助文档，看看是否有 Visual Basic 可使用的其它形式。

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 )。


不能编辑模块

标记为受保护的模块可以查看，却不能够编辑。这个错误的起因与解决方法如下所示：

  • 试图编辑一个受保护的模块。

    请删除保护再重试一遍。在多数情况下，发生此种错误是因为安装了Visual SourceSafe 外接程序，且为检验该程序。

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 ) 。


本动作将重新启动您的工程--继续执行吗？

本动作将重新启动您的工程—继续执行吗？

可以在中断模式下编辑代码，但某些编辑动作会阻止继续执行。这个错误的原因与解决方法如下所示：

  • 企图进行一个会阻止继续执行的编辑动作。例如，声明了一个静态变量。

    如果选择了“是”，会停止执行，接下来便可编辑代码。若选择 “否”，则可以从断点继续执行代码。

详细信息，请选择有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


在指定的行上：不能创建内嵌的指定对象

在从文本文件中加载窗体、用户控件、用户文档或属性页时，不能创建嵌入的对象。例如，如果先前已在窗体中插入 Microsoft Word 文档，然后又从系统中删除 Microsoft Word，将会产生这个错误。该消息会被写入错误日志文件中。


因为控件不能创建，所以不能退出设计方式

在退出设计方式之前，所有控件都必须实例化。这个错误具有以下的起因与解决方法：

  • 不能创建错误消息对话框中指定的控件。

    只有在所有控件都实例化并适当连接后，才能运行代码。请确定控件需要的所有文件在再次试验之前都可用。

详细信息，请选取有疑问的项目，然后按下 F1 (在Windows中) 或 HELP (在 Macintosh中)键。


不能处理对象指定的事件

不能处理该对象的事件。也许对象缺少该事件，或者存在但出了错，或被有意禁用了。

在Object Browser中检查该对象和它的事件，获得该对象和它的事件的信息。


在指定的行上：不能加载指定的属性

ASCII 文件包含未知的属性。在加载这个窗体时该属性会被跳过。


不能激活对象（错误 31027）

这个对象的源文档并未装入，或创建此对象的应用程序不可使用。

这个错误发生在试图激活一个链接对象（ 设定 Action = 7 ），且在 SourceDoc 属性中所指定的文件已被删除，或不再存在。

这个错误也发生在激活一个对象（ 设定 Action = 7 ），而由 Verb 属性所指定的动作无效。某些提供对象的应用程序可支持不同的动作，取决于应用程序的状态。应用程序提供的所有动作，均列在 ObjectVerbs 属性列表中。然而，某些动作在应用程序的当前状态下无效。


不允许赋值给常量

常量表示的是只读值。该错误有以下原因和解决方案：

  • 试图把新的值赋给用 Const声明的变量，或赋给类型库常量。

    如果需要赋新的值，声明一个普通的所需类型变量，并把值赋给该变量。如果需要限定值集的变量，可以用 Enum 语句声明一个枚举类型。

关于其他信息，请选中有问题的条目并按 F1 键 (在 Windows中) 或 HELP (对于 Macintosh).


不能预期的错误；退出

出现不能预期的错误，Visual Basic 不能继续进行。 可能是硬件问题，或者是系统中其它软件的影响。


不能执行所需的操作（错误 17）

如果此操作会导致工程的当前状态无效，则操作将不能执行。此错误有以下原因和解决方法：

  • 所要求的操作不能作用在工程当前的状态。例如，当程序正处于中断模式时，使用“引用”对话框来添加一个对工程或对象库的新引用时，就会发生此错误。

    停止执行当前的代码，然后重试此操作。

  • 试图修改正在执行的代码。例如，试图从文件读出代码然后加到正在执行的模块中。

    虽然可以修改工程中当前并非真正执行的模块，但不能修改正在运行的模块。如要要做这样的修改，必须停止当前正在运行的模块，再添加或修改，然后重新执行。

详细信息，可选取有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


ActiveX 部件不能创建对象或返回对该对象的引用（错误 429）

创建对象要求该对象的类已在系统注册表中注册，而且任何相关的动态链接库 (DLL)必须能使用。此错误有以下的原因和解决方法：

  • 类没有注册。例如，系统注册表中没有类的说明，或虽有类说明，但找不到文件，或指定的文件类型错误。

    如果可能的话，试着启动对象的应用程序。如果注册信息过期或错误，应用程序应该检查注册表并更正信息。如果启动应用程序没有解决问题，请重新执行应用程序的安装程序。

  • 对象需要的 DLL 不能使用，可能因为找不到，或是已损坏。

    确保所有相关的 DLL 都可使用。例如，Data Access Object (DAO) 需要支持多平台的 DLL。如果这是造成错误的原因，则要为此对象重新执行安装程序。

  • 对象在机器上使用，但它是授权的 Automation 对象，而且在具体的例子授权中不能确认可用。

    一些对象在部件找到授权键后，才能被具体的例子说明，并且在当前的机器上的实例说明中，确认对象已被注册。当通过正确安装的类型库或对象库对一个对象进行引用时，就能自动提供正确的键。

    如果 CreateObject 或 GetObject 的调用结果，是用例子说明，那么，对象必须找到键。在这种情况，它会搜寻系统注册表或查找它在安装时建立的指定文件，例如，扩展名为 .lic 的文件。如果此键找不到，则对象不能被说明。如果用户建立对象应用程序，删除必须文件，或改变系统注册表，则对象不能找到此键。如果此键找不到，对象也不能用例子说明。实例说明可在开发系统中工作，但不能在用户系统中。它对用户重装登记的对象是必须的。

  • 使用 GetObject 函数获得用 Visual Basic 所创建类的引用。

    GetObject 不能获得用 Visual Basic 所创建类的引用。

  • 对该对象的访问显式地被拒绝。

    例如，试图访问当前正在使用的数据对象，且此对象已被锁定以防止死锁情形发生。如果是这样的情形，可以在其他时间去访问对象。

详细信息，可选取有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


不能创建需要的临时文件（错误 322）

创建可执行文件，需要建立一个临时性文件。此错误有以下原因和解决方法：

  • 包含 TEMP 环境变量所指定目录的驱动器已满。

    从已满的驱动器中删除文件或在 TEMP 环境变量中指定其他的驱动器。

  • TEMP 环境变量所指定的驱动器或目录无效或为只读。

    在 TEMP 环境变量中指定一个正确的驱动器，或从指定的驱动器或目录中删除只读的设置。

详细信息，可选取有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


此时不能进入中断模式

中断模式下，过程仍然在运行，但是其行动已被挂起。这个错误的起因与解决方法如下所示：

  • 试图进入中断模式，例如，按下 CTRL+BREAK (Windows) or COMMAND+PERIOD (Macintosh),在“标准”或“调试”工具条按下“中断”按钮，或执行到一个断点。

    工程中由于使用扩展性 （外接程序） 对象模型可造成此一改变。这会避免过程被挂起，您可以继续运行，或退出运行，但不能挂起运行。

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 ) 。


不能显示系统信息

从“关于 Microsoft Visual Basic”对话框选择“系统信息”时，Visual Basic 不能显示系统的信息。系统可能没有足够的内存，或所需文件已经损坏或丢失。


不能创建嵌入对象（错误 31032）

该创建对象的应用程序，不能创建如 SourceDoc 属性中所指定的对象。

例如，这个错误的发生是在试图要嵌入一个电子数据表对象，而 SourceDoc 指定的电子数据表太大，以致电子数据表应用程序不能装入时。


不能在中断模式执行代码

中断模式发生在挂起代码执行时。这个错误具有以下的起因与解决方法：

  • 试图运行来自“宏”对话框的代码，然而此时 Visual Basic 还在运行程序代码，只不过处于中断模式。

    可能在还不知道的情况下就处于中断模式，例如，当语法错误或 运行时错误发生时。在运行来自“宏”对话框的代码之前，继续运行挂起的代码，或结束当前代码的执行。可以直接修正这个错误，然后选取“继续”，或者返回到“宏”对话框并重新启动宏。

详细信息，请选取有疑问的项目，然后按下 F1 (在Windows中) 或 HELP (在Macintosh中)键。


在设计模式不能立即执行语句

设计时，代码并没有正在运行或者被挂起等待执行。这个错误的起因与解决方法如下所示：

  • 试图在“立即”窗口执行语句，但代码并非处于运行方式。

    请启动代码运行，并执行挂起的过程。然后可以在“立即”窗口执行代码。

详细信息，请将指针指到“立即”窗口，并按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 ) 。


不能执行指定的程序

当生成可执行的本机代码时，有必要运行一些额外程序。这个错误具有以下的起因与解决方法：

  • 内存或系统资源不够，不能一些代码生成器或链接器。

    关闭尽可能多的应用程序，释放内存及其它系统资源。

  • Visual Basic 安装不正确。

  • 重新安装 Visual Basic。

详细信息，请选取有疑问的项目，然后按下 F1 (在 Windows中) 或 HELP (在Macintosh中) 键。


此时不能退出time

当 Visual Basic 处在运行或中断模式，或者有对话框或消息框正在显示时，都不能退出 Windows。


该文档已用禁用的宏打开

宿主应用过程可能禁用或启用宏。这个错误具有以下的起因与解决方法：

  • 用禁用的宏打开文档。

  • 请关闭该文档，然后用启用宏重新打开。

详细信息，请选取有疑问的项目，然后按下 F1 (在Windows中)或HELP (在Macintosh中)键。


在 ~ 中不能找到 DLL 输入点 ~

输入点是 DLL (Windows) 或代码资源(Macintosh) 过程的名称或表示该过程的序号。这个错误具有以下的起因与解决方法：

  • 类型库不正确地描述了输入点，也许是拼错了名称或指定的序号不对。

  • 请与厂商接洽得到正确的类型库。

详细信息，请选取有疑问的项目，然后按下 F1 (在Windows中) 或 HELP (在Macintosh中) 键。


事件处理程序无效

事件处理过程的参数列表必须符合事件的声明。这个错误的起因与解决方法如下所示：

  • 事件处理过程的参数数目不对。

    删掉多余的参数或者添加漏掉的部分。

  • 事件处理过程中，某些参数的数据类型错误。

    参数类型必须符合事件声明。

  • 事件处理过程是 Function，而非 Sub。

    在此必须是 Sub，因为事件处理过程不能返回值。

  • 其它的类型库使用了此事件名称。

    用类型库名限定名称，以避免冲突。

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 ) 。


在平台上、或用当前使用的版本来加载工程时，缺乏足够的工程信息

保存工程时，会顺便保存一些额外的信息，以便在以后的版本或不同的平台上加载这个工程。这个错误的起因与解决方法如下所示：

  • 在保存工程时收到一个错误信息，指出内存不足以保存所有信息（指将来用不同的版本或在不同的平台上加载这个工程所必需的信息）。

    用先前保存文件时使用的 Visual Basic 版本来加载文件，或在先前保存文件时的平台上加载文件，然后再保存一次。若在保存过程中没有收到任何错误信息，则应当能够在当前版本或当前平台是加载该工程。

详细信息，请先选取有疑问的项目，然后按下 F1 键。( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 )


不能加载模块；无效的格式

模块必须是文本格式。这个错误的起因与解决方法如下所示：

  • 您试图加载一个二进制格式的文件作为模块。

    某些 Visual Basic 的版本允许以二进制与文本的格式来保存代码。假如可能的话，请以它最后一次被保存的格式来重新加载，并将它存储为文本格式。

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 ) 。


所指定的项目是二进制窗体，不能装入 Visual Basic

由早期 Visual Basic 版本所创建的二进制窗体，不能装入到当前版本的 Visual Basic 中。只有 Visual Basic 2.0 以及 3.0 版支持将二进制窗体转成 ASCII。如果有 Visual Basic 2.0 或 3.0 版，可以将 1.0 版所创建的窗体装入并将其存成文本文件。然后在当前版本的 Visual Basic 中导入这些窗体。


因为模块被隐藏，所以不能执行要求的操作

这个错误来源于於 Visual Basic 扩展性 （外接程序） 对象模型。这个错误的起因与解决方法如下所示：

  • 此模块被隐藏。您不能修改一个隐藏模块，或从中取得信息。

    请显示此模块，并重新操作。

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 ) 。


属性或方法调用不能包含私有对象的引用，不论是作为参数还是作为返回值 (Error 98)

私有对象绝不能传递到工程外部。下面列出的被禁止的所有情况，可能是产生该错误的原因：

  • 客户调用了过程外的部件的属性或方法，并试图把私有对象的引用作为参数来传递。客户调用了过程外的部件的属性或方法，并且该过程试图返回私有对象的引用，或试图把这样的引用赋值给 ByRef 参数。

  • 过程外部件对其客户调用回调方法，并试图传递私有对象的引用。

  • 过程外部件试图把私有对象作为正产生的事件的参数来传递。

  • 客户试图把私有对象引用赋值给它正处理的事件的 ByRef 参数。

请注意，尽管 Visual Basic 阻止非可视化私有对象的引用在过程间传递，但仍然存在 Visual Basic 不能检测到这种错误的情况，因而也就不能阻止它。私有对象不要设计得能在工程外部使用。如果把它们传递给客户，就可能会损害程序的稳定性，以及导致其和将来的 Visual Basic 版本不兼容。如果需要把自己的私有类传递给客户，则设置 Instancing 属性值而不是 Private。

关于其他信息，请选中有问题的条目并按 F1 键 (在 Windows中) 或 HELP (对于 Macintosh).


外接程序不能引用工程

工程是动态的；而外接程序是静态的。这个错误的起因与解决方法如下所示：

  • 试图从引用另一个工程的工程中创建外接程序。

    工程语义的更改可能会影响其引用的工程或外接程序。因此，您不能在引用其他工程的工程中创建外接程序。

详细信息，请先选取有疑问的项目，然后按下 F1 键。( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 )


工程在访问之前必须先对它进行保存。

不能对未存盘的工程添加引用。这项错误的原因及解决方法如下：

  • 试图对尚未存盘的工程添加引用。

    在添加引用之前先将工程存盘。

如需要其它信息，请选择有疑问的项目并按下F1 键(在Windows中) 或 HELP (在 Macintosh中)。


不能删除缺省的引用

总存在一个缺省的引用。这个错误的起因与解决方法如下所示：

  • 试图删除一个引用，这个引用总是应当可用的。例如，类型库或对象库引用。

    请勿试图删除这些引用。

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 ) 。


不能在 TEMP 目录中保存文件（错误 735）

一些部件常常需要在磁盘上保存临时性信息。此错误有以下原因和解决方法：

  • 不能找到名称是 TEMP 的目录。

    创建一个名为 TEMP 的目录，而且设置 TEMP 环境变量为此路径。

  • 包含的 TEMP 目录的驱动器或分区，对于保存信息空间不够。

    将不需要的文件清除掉，以增加驱动器中可使用的空间，或在另一分区中创建一个 TEMP 目录，然后设置 TEMP 环境变量为此路径。

详细信息，可选取有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


没有足够的内存来保存 Undo 信息

执行此编辑后，就不能用“撤销”命令来恢复成原本的状态了。这个错误的起因与解决方法如下所示：

  • “撤销”命令不能记录这么大的编辑操作。

    执行较小的编辑动作。

详细信息，请先选取有疑问的项目，然后按下 F1 键。( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 )


不能在此时设置工程名

工程名在此时不能设置。


不能显示指定的名字，因为它是隐含的

某些名字在类型库中是存在的，但被标记为隐含的了。该错误有以下原因和解决方案：

  • 指定了类型库中的一个名字，但它被标记为隐含的了。

    通常不能查看隐含的类型库成员。在对象浏览器上下文菜单上选择 Show Hidden Members 来使隐含的成员可见。然后就可以查看该成员信息了。

关于其他信息，请选中有问题的条目并按 F1 键 (在 Windows中) 或 HELP (对于 Macintosh).


不能跳转到指定的类型，因为它在指定的库中，该库当前没有被引用

该错误有以下原因和解决方案：

  • 试图指定该工程中没有引用的库的类型。

    通过 References 对话框来设置该类型库的引用。

关于其他信息，请选中有问题的条目并按 F1 键 (在 Windows中) 或 HELP (对于 Macintosh).


这个控件只用于‘item'设计器

这个控件只用于 'item' 设计器

导致这个错误的原因及解决办法如下：

  • 选择的控件只有在指定设计器中起作用。

    必需选择另外的控件或另外的设计器。

详细信息，选择有问题的项目，并按 F1 键（Windows 系统）或 HELP (Macintosh 系统)。


Null 的使用无效（错误 94）

Null是 Variant 子类型，用来说明数据项没有包含合法的数据。此错误有以下原因和解决方法：

  • 要得到 Variant 变量或表达式的值是 Null 。例如：
    MyVar = Null
For Count = 1 To MyVar
    . . .
Next Count

    确保变量所含为正确值。

详细信息，可选取有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


参数无效。不能写数组（错误 328）

给该方法所传递的参数无效。这项错误的原因及解决方法如下：

  • 在 User 控件的 WriteProperties 事件中，试图做 PropBag.WriteProperty X 的操作，其中 X 是一个数组。 这是不支持的动作。

    必须逐个地写数组的各个元素。


Illegal非法参数，由于对象不支持持久性，因此不能写对象

非法参数，由于对象不支持持久性，因此不能写对象。

导致这个错误的原因及解决办法如下：

  • 试图向一个 PropertyBag 对象写一个对象，但是这个对象不支持任何一个 ActiveX 持久接口。.

    为了写这个对象，必需访问这个对象的代码。该对象必需是 Visual Basic 创建的对象，并且 Persistable 属性设置为 True。另外，这个类必需是 Public 或 可创建的 Public，并且这个类已存在于一个ActiveX DLL、ActiverX Exe或用户部件工程中。

详细信息，选择有问题的项目并按下 F1 键（Windows 系统）或 HELP（Macintosh 系统）。


Illegal 非法参数，不能写用户定义类型parameter. Can't write user-defined type.

非法参数，不能写用户定义类型。

导致这个错误的原因及解决办法如下：

  • 试图向一个 PropertyBag 对象写用户定义类型，这是不支持的。

    为了正常工作，可以向 PropertyBag 对象逐个写用户定义类型的项目。

详细信息，选择有问题的项目并按下 F1 键（Windows 系统) 或 HELP（Macintosh 系统）。


Case Else 在 Select Case 之外

Case Else 语句只能用在 Select Case 与 End Select 之间。这个错误的起因与解决方法如下所示：

  • 将 Case Else 语句放在 Select Case...End Select 区块以外。

    请将 Case Else 语句移到 Select Case...End Select 区块中。

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 ) 。


Case 没有对应的 Select Case

Case 语句必须出现在 Select Case...End Select Block 区块之中。这个错误的起因与解决方法如下所示：

  • Case 语句没有与前面的 Select Case 语句配合使用。

    请检查 Select Case...Case 结构中其它的控制结构，并检查它们的配合是否正确。例如，Select Case...End Select 结构中的一个 If 没有与 End If 配合使用，就会发生这个错误。

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 ) 。


不能删除控件或引用；正在使用中

您想要删除的 ActiveX 控件或引用，正被工程中的某个窗体使用着。首先从窗体中删除该控件或引用的对象，然后在列表中取消对它的选择。


模块之间循环相关

在模块、常数与用户定义类型之间不允许循环相关。这个错误的起因与解决方法如下所示：

  • 模块中的用户定义类型或常数引用第二个模块中的用户定义类型或常数，而此用户定义类型或常数又引用第一个模块中的用户定义类型或常数。

    请删除这些相关引用。

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 ) 。


只在对象模块中有效

某些 Visual Basic 语句或构造只在对象模块（窗体、类模块等等）中有效。该错误有以下原因和解决方案：

  • 试图在非类模块中使用无效的语句或构造（例如， Implements 语句、WithEvents 关键字、或者事件吸收）。

    把产生该错误的语句放到对象模块中。

关于其他信息，请选中有问题的条目并按 F1 键 (在 Windows中) 或 HELP (对于 Macintosh).


所指定的名字与存在的模块、工程或对象库冲突

这个错误可能是因为下列的原因：

  • 所装入的窗体、用户控件、用户文档或属性页所包含的对象中，有名称冲突。这可能是因为此文件已经被 Visual Basic 以外的编辑器修改了。

  • 将窗体的名称更改为与工程、其它窗体或模块的名称相同时，能产生这样的错误。 将工程的名子更改成与窗体或模块的名子相同时，这个错误也会发生。


在指定的行上：类名太长；按指定的长度截尾

ASCII 文件包含的控件名，其长度超过 40 个字符。该类会被加载，但是其名称会缩短为 40 个字符。


类未被注册。'item 1' 未注册

类未被注册。’item1’

导致这个错误的原因及解决办法如下：

  • 指定的类模块未被注册。

详细信息，选择有问题的项目并按 F1 键（Windows系统） 或 HELP （Macintosh系统）。


类未在本地机器上注册（错误 463）

CreateObject 函数需要一个有效的服务器。该错误发生的原因和解决方法如下：

  • 指定了一个服务器参数，但是指定的类 progid （CreateObject 函数的第一个参数）未在本地系统上注册。

详细信息，可选取有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


不能清除剪贴板（错误 520）

剪贴板被打开但不能清除。这项错误的原因及解决方法如下：

  • 其它应用程序正在使用剪贴板，并且不会将其释放给此应用程序。

    请在代码中为这种情形设定一个错误捕获程序，并提供一个含有“重试”及“取消”按扭的信息框，让用户在暂停后可再重试。


不能打开剪贴板（错误 521）

剪贴板已由其它应用程序打开。这项错误的原因及解决方法如下：

  • 其他的应用程序正在使用剪贴板，且不能将其释放给此应用程序。

    请在代码中为这种情形设定一个错误捕获程序，并提供一个含有“重试”及“取消”按扭的信息框，让用户在暂停后可再重试。


无效的剪贴板格式（错误 460）

指定的剪贴板格式与执行的方法不兼容。这项错误的原因及解决方法如下：

  • 试图以 vbCFText 或 vbCFLink 之外的剪贴板格式，来使用 GetText方法 或 SetText 方法。

    请删除无效的格式，并从两个正确格式中指定一个。

  • 试图以 vbCFBitmap、vbCFDIB 或 vbCFMetafile 之外的剪贴板格式，来使用 GetData 或 SetData 方法。

    请删除无效的格式，并从三个正确图形格式中指定一个。


指定的格式与数据格式不匹配（错误 461）

指定的 Clipboard 格式与要执行的方法不兼容。这项错误的原因及解决方法如下：

  • 试图以 vbCFText 或 vbCFLink 之外的剪贴板格式，来使用 GetText 方法或 SetText 方法。

    在使用这些方法前，请先使用 GetFormat 方法来检测剪贴板的当前内容是否符合指定的格式。

  • 试图以 vbCFBitmap、vbCFDIB 或 vbCFMetafile 之外的剪贴板格式，来使用 GetData 方法或 SetData 方法。

    在使用这些方法前，请先使用 GetFormat 方法来检测剪贴板的当前内容是否符合指定的格式。


此命令将使调试器停止。

某些命令或动作使得 Visual Basic 停止代码的分析。这项错误的原因及解决方法如下：

  • 某些编辑动作，如声明一个 Static 变量，及某些命令，如添加新的模块 或窗体，会使正在运行或挂起的代码停止。

    如果不想停止正在运行的代码，就不要添加或执行这个命令。

如需要其它信息，请选择有疑问的项目并按下F1 键(在Windows中) 或 HELP (在 Macintosh中)。


代码资源锁定错误（错误 455）

本错误仅出现在Macintosh中。当访问一个代码资源时，必须锁定它。此错误有以下原因和解决方法：

  • 在代码资源上调用了过程。虽然找到代码资源，但当试图锁定资源时，发生了错误。

    检查 Hlock 所返回的错误，例如，"Illegal on empty handle"或"Illegal on free block"。。

详细信息，可选取有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


代码资源未找到（错误 454）

此错误只有在 Macintosh 上才会发生。此错误有以下原因和解决方法：

  • 在代码资源上调用了过程，但找不到代码资源。

    检查确保应可使用此资源和适当地引用此资源。

详细信息，可选取有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


隐藏模块中的编译错误 <模块名称>

不能显示被保护的模块。这个错误的起因与解决方法如下所示：

  • 指定模块的代码中有一个编译错误，但它不能被显示，因为该工程是被保护的。

    去掉该工程的保护，然后再次运行代码查看错误。

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 ) 。


在数组中不能放置条件断点

数组没有相关的单一值。这个错误的起因与解决方法如下所示：

  • 试图设置一个条件断点 （或称作监看点），当整个数组的值改变时，挂起过程的执行。

    将条件断点设在数组中的某个元素。

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 ) 。


在指定的项目中发现了冲突的属性。所以将使用缺省值

窗体、用户控件、属性页、用户文文件或类模块中的某些属性语句，与它们的类型所要求的设置值冲突。例如，窗体必须使它的 VB_PredeclaredId 属性为 True。如果该文件是由 Visual Basic 以外的编辑器所修改，则会发生该错误。


在指定的项目中发现名称冲突。所以将使用指定的名称

该窗体的名称在某窗体、用户控件、属性页或用户文档的源文件中出现两次。如果该文件是由 Visual Basic 以外的编辑器所修改，则会发生该错误。


对象的使用无效

试图以无效的方式来使用对象。这个错误的起因与解决方法如下所示：

  • 试图通过将 Nothing 赋予对象，来终止对象引用，但却省略了 Set 关键字：
    MyObject = Nothing

    请使用 Set 语句将对象设置为 Nothing。假设 MyObject 是一个对象，必须用 Set 语句将它设为 Nothing：

    Set MyObject = Nothing

    省略 Set 关键字相当于隐式使用了 Let，它可能引起赋值操作，而不是指派引用。而 Nothing 不能用在赋值操作中。

  • 试图在表达式中使用 Nothing。

    不用 Nothing 重写表达式。

详细信息，请先选取有疑问的项目，然后按下 F1 键。( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 )


无效的常数数据类型

并非所有的数据类型都可以赋予常数。这个错误的起因与解决方法如下所示：

  • 试图将常数类型声明为用户定义类型、对象或数组。

    删除声明，或重新声明为变量。

详细信息，请先选取有疑问的项目，然后按下 F1 键。( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 )


指定的项正被指定的工程引用，所以不能更新

指定的控件正被多个工程引用。为某个工程更新它，可能使它对其它工程变成无效。


在指定的行上：不能设置指定的属性

Visual Basic 不能按 ASCII 文件中的窗体描述所指示的那样，设置指定控件的属性。


Could不能启动Internet资源管理器 not start Internet Explorer

不能启动Internet Explorer

导致这个错误的原因及解决办法如下：

  • 一个未知问题正在阻止Internet Explorer 运行。

    试着让 Internet Explorer 独立启动来确认它正常工作。

详细信息，选择有问题的项目并按下 F1 键（Windows 系统）或 HELP（Macintosh 系统）。


指定的文件不能装入。

并不是所有的文件都可装入 Visual Basic for applications。这项错误的原因及解决方法如下：

  • 试图装入的文件格式 Visual Basic 不能解释，或者文件被损坏。

    不能装入此文件。

如需要其它信息，请选择有疑问的项目并按下 F1 键(在Windows中) 或 HELP (在 Macintosh中)。


在指定的行上：不能加载指定的控件；名称已被使用

ASCII 文本文件中命名的控件不能被加载，因为它的名称已经在该应用程序中使用。


在指定的行上：控件名太长；按规定的长度截尾

ASCII 文件包含的控件名超过 40 个字符。该控件会被加载，但是其名称会缩短为 40 个字符。


在指定的行上：不能加载指定的控件；找不到许可证

当从文本文件中加载窗体、用户控件、用户文档或属性页时，不能加载 ActiveX 控件。该控件可能丢失或毁坏了。重新安装该控件并重试一遍。该消息会被写入错误日志文件中。


警告：自定义语言设置值不能移植

并非所有的语言设置值都具有可移植性：

  • 在代码中使用一个自定义的语言设置值。

    当为代码选择一个命名的语言和国家/地区设置时，代码中的语言习惯便会依据系统“控制面板”中该语言的设置。可以使用命名的代码区域设置，但此代码可能不能在其他区域或其他设置不同的系统上工作。主机应用程序会依据它所运行机器上“控制面板”中的设置来分析一些字符串。

    若目标机器的“控制面板”中的设置与编写代码的机器不同，由主机应用程序分析出来的字符串便不能工作，例如，有些代码是与小数点符号相关，而每个地区的小数点符号都不一样。所以，除非不准备把代码送给其他用户，不然不应该使用一个命名的语言设置。如果计划将代码送给其他用户，请选择一个预定义的区域。

详细信息，请选择有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


工程间不可循环引用

工程间的循环引用是不允许的。例如，假如 MyProj 引用 YourProj，则 YourProj（或一个引用 YourProj 的工程）不能再引用 MyProj。这个错误的起因与解决方法如下所示：

  • 试图在一工程中添加对另一个工程的引用，而前者已是后者之一部分。

    删除引用的循环引用。

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 ) 。


指定的系统 DLL 不能装入（错误 298）

找不到由操作系统提供的 .dll 文件；例如，DDEML.DLL、 VERSION.DLL 或 WINSPOOL.DRV。这项错误的原因及解决方法如下：

  • 该文件没有放在正确的路径上。

    请确保 DLL 被放在 Windows System 的路径。

  • DLL被损坏或被删除。

    重新装入 DLL。

  • 内存或交换空间不足。

    请关闭一些其它的应用程序，以释放内存。


语言或国家/地区已经改变

这个错误的起因与解决方法如下所示：

  • 改变了 Visual Basic 环境中缺省的语言或国家/地区。

    虽然这是合法的，却也有可能给您带来一些困扰。

详细信息，请先选取有疑问的项目，然后按下 F1 键。( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 )


Deftype 语句必须放在声明之前

Def type 语句包括 DefInt、DefDbl、DefCur 等。这个错误的起因与解决方法如下所示：

  • 模块级别中的变量 声明在 Def type 语句之前。

    请将 Def type 语句移到所有变量声明之前。

  • Def type 语句出现在过程中。

    请将 Def type 语句移到模块级中，放在所有变量声明之前。

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 ) 。


设备不可用（错误 68）

此错误有以下的原因和解决方法：

  • 访问的设备没有联机或是根本不存在。

    检查设备的电源以及设备和计算机间的连接应正常。如果是要使用网络上的打印机，那么请确保计算机和打印机有逻辑连接，例如， LPT1 连接上网络打印机 ID。

  • 网络连接可能断开。

    重新连上网络然后重试该操作。

详细信息，可选取有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


不能用不同的驱动器重新命名（错误 74）

Name 语句必须在当前的驱动器上重新命名文件。此错误有以下原因和解决方法：

  • 用 Name 语句要将一个文件转移到不同的驱动器上。

    使用 FileCopy 将文件写到另一个驱动器上，然后用 Kill 语句删除旧的文件。

详细信息，可选取有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


工程中一个或多个文件已被更改。现在要保存这些更改吗？

工程中文件的某一属性值或代码语句已经更改，并且这些更变尚未保存。这是在加载其它工程之前的最后一次保存机会。


磁盘已满（错误 61）

此错误有以下的原因和解决方法：

  • 磁盘没有足够的空间完成 Print #、Write # 或 Close 操作。

    将一些文件移到其他磁盘或删除掉一些文件。

  • 磁盘没有足够的空间来创建所需文件。

    将一些文件移到其他磁盘或删除掉一些文件。

详细信息，可选取有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


磁盘未准备好（错误 71）

此错误有以下的原因和解决方法：

  • 指定的驱动器中没有磁盘。

    将磁盘放到驱动器中，然后重试一次。

  • 指定驱动器的门没有关好。

    将门关好然后重试一次。

详细信息，可选取有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


还要显示加载错误吗？

单击“确定”以查看更多的错误，否则单击“取消”。


除数为零（错误 11）

除数为零是不允许的。此错误有以下情况和解决方法：

  • 表达式的值作除数使用，但其为零。

    检查在表达式中变量的拼写。拼写错误的变量名会被当成数值变量并且初始值为零。检查表达式中变量的前一个操作，尤其是从其他过程传送给过程的参数。

详细信息，可选取有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


DLL 的调用约定错误（错误 49）

传送给动态链接库 (DLL)或Macintosh代码资源例程的参数必须符合例程的需要。调用约定要检查个数、类型、参数的顺序等。此错误有以下的原因和解决方法：

  • 程序调用被传递了错误的参数类型的 DLL（在Windows中）或代码资源（在Macintosh中）中的例程时。

    确保所有的参数的类型和调用的例程中指定的声明符合。

  • 程序调用被传递了错误的参数数目的 DLL（在Windows中）或代码资源（在Macintosh中）中的例程时。

    请确保参数数目和所调用的例程的声明符合。

  • 程序调用 DLL 的例程，但没有使用 StdCall 调用约定。

    如果 DLL 例程需要的是按值参数，那么请在例程的声明中确保这些参数是以 ByVal 进行了声明。

  • 对于Windows DLL的Declare 语句包括了 CDecl。

    CDecl 关键字仅在 Macintosh 中应用。

详细信息，可选取有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


加载 DLL 时的错误（错误 48）

动态链接库 (DLL) 就是在 Declare 语句的 Lib 子句中所指定的库。此错误有以下的原因和解决方法：

  • 此文件并非可执行的 DLL。

    如果此文件是正文源文件，它必须编译并链接成可执行的 DLL 形式。

  • 此文件并非 Microsoft Windows DLL。

    取得此文件相应的 Microsoft Windows DLL 版。

  • 此文件是早期的 Microsoft Windows DLL，而且和 Microsoft Windows 保护方式不兼容。

    取得更新的版本。

  • 此 DLL 引用到其他不存在的 DLL。

    取得此被引用的 DLL 并让它能提供其他 DLL 使用。

  • 此 DLL 或所引用的 DLL 并不在所指定的目录中。

    移动 DLL 到所引用的目录或将 DLL 所在的目录添加到路径中。

详细信息，可选取有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


没有创建已检测的公共部件。详细信息请按F1键 .

没有检测到可创建的公共部件。详细信息请按F1键。

导致这个错误的原因及解决办法如下：

  • 工程必须至少有一个可创建的公共部件。

详细信息，选择有问题的项目并按 F1 键（Windows系统） 或 HELP （Macintosh系统）。


重复的 Deftype 语句

同一范围中的 Def type 语句必须指定唯一的字母范围。这个错误的起因与解决方法如下所示：

  • 此 Def type 语句的部分或所有字母范围，已经被另一个 Def type 语句使用了。

    请重新写入此语句，直到没有重叠的字母范围。

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 ) 。


定义重复

一个条件编译常数只能有一个值。这个错误的起因与解决方法如下所示：

  • 指定两个值给相同的条件式编译常数，例如：
    #Const Mac = 0
#Const Mac = 1

    删除一个定义。

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 ) 。


关键字已经与集合中的元素关联（错误 457）

关键字是在 Add 方法中所指定的字符串，它应唯一地识别集合中具体的成员。此错误有以下原因和解决方法：

  • 为集合成员指定的关键字，已经用来标识其他集合成员。

    对此成员选择一个不同的关键字。

详细信息，可选取有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


指定的项不能被加载，其名称已被使用了

不能同时加载某特定种类的两个项目。


类型与名称都相同的重复资源

一般，Windows 资源文件含有应用程序使用的位图、文本串及其它类似数据。这个错误具有以下的起因与解决方法：

  • 试图在工程中使用的 Windows 资源文件含有多个类型相同名称相同的资源，或者该文件含有Visual Basic 自动创建的资源。

  • 使用另一个资源文件。重建无效的资源文件。删除重复的资源。

详细信息，请选取有疑问的项目，然后按下 F1 键 (在 Windows中) 或 HELP (在Macintosh中)。


重复的 Option 语句

在每一个模块中，每一种 Option 语句只能有一句。这个错误的起因与解决方法如下所示：

  • 在这个模块中不止一次地定义了 Option Base、Option Compare、Option Explicit 或 Option Private 语句。

    删除重复。

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 ) 。


过程名重复

已经利用相同的名称定义（或试图去定义）一个以上的过程。请更改其中某一过程的名称。确保同一过程中的重复 Declare 语句拥有同样的 Alias 子句。


<Item> 是无效的控件类型(Error 720)

<Item> 不是有效的控件类型 (错误 720)

只有有效的 ActiveX 部件才能作为窗体上的控件赋值。该错误发生的原因和解决方法如下：

  • 试图把不是有效的控件作为窗体上的控件赋值。

    参阅建立ActiveX 控件的帮助主题，确定什么是可接受的控件。

详细信息，可选取有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


'item' 在这个工程中尽管'item'被引用，但是它没有在任何项目组中使用，因此，不能添加这个'item'。为了改正这个错误，在工程选项卡中不要选择‘删除关于未使用的ActiveX 控件信息’。

在这个工程中尽管该 'item' 被引用，但是它没有在任何项中使用，因此，不能添加这个 'item'。为了改正这个错误，在工程选项卡中不要选择 ‘删除有关没有用的 ActiveX Control 的信息’。

导致这个错误的原因及解决办法如下：

  • 由于指定的部件没有被工程中的任何项使用，因此，不能添加这个指定的部件。

    在“工程”菜单下面的“工程选项”对话框中清除“删除有关没有用的 ActiveX Control 的信息”。

详细信息，选择有问题的项目并按下 F1 键（Windows 系统）或 HELP (Macintosh 系统)。


Else 没有配对的 If

Else 之前必须有一个 If 。这个错误的起因与解决方法如下所示：

  • 一个 Else 语句被使用时没有一个配对的 If 语句。

    请检查在 If...End If 结构中的其它控制结构，并确认它们被正确地配对。也请检查 If 块的格式是否正确。

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 ) 。


不允许空的 Enum 类型

Enum 类型指定枚举的名称和成员。这个错误的起因与解决方法如下所示：

  • 在 Enum匛nd Enum 块中命名一个枚举，但没有指定任何成员。

    请在 Enum匛nd Enum 块中至少添加一个成员。

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 ) 。


无选定的监视表达式

当选择“立即监视”命令前，必须选择一个表达式。这个错误的原因与解决方法如下所示：

  • 在选择“立即监视”命令前，没有先选择一个表达式。

    在选择“立即监视”前，在代码窗口中突出显示监视表达式。

详细信息，请选择有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


必须指定搜索字符串

当在对象浏览器中搜索时，必须输入字符串。该错误有以下原因和解决方案：

  • 在 Object Browser 中开始了一个搜索，但没有指定要搜索的文本。

    输入搜索字符串。

关于其他信息，请选中有问题的条目并按 F1 键 (在 Windows中) 或 HELP (对于 Macintosh).


必须指定搜索串

必须指定搜索串。这个错误的原因与解决方法如下所示：

  • 试图在未指定匹配字符串前，就要开始一项搜索操作。

    必须指定搜索串。可以将替换字符串指定为一个零长度的字符串，不过零长度的字符串作为搜索字符串是没有意义的。

详细信息，请选择有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


清空监视表达式

“添加监视”对话框要求一个表达式项。这个错误的起因与解决方法如下所示：

  • 没有在“添加监视”对话框中提供监视表达式。

    请添加一个表达式至“添加监视”对话框中，或是按下 ESC 键。

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 ) 。


期待 End 函数

Exit procedure 语句必须与 Exit procedure 发生在其中的过程匹配。这个错误的起因与解决方法如下所示：

  • 您使用 End Property 或 End Sub 来结束一个函数过程。

    在此请使用 End Function。

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 ) 。


End If 没有对应的 If 块

End If 语句必须有相应的 If 语句。这个错误的起因与解决方法如下所示：

  • If 子句被省略或是被与 End If 隔开了。

    检查在 If...End If 结构中的其它控制结构，检查它们是否配对。检查 If 块的格式是否正确。

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 ) 。


输入超出文件尾（错误 62）

不能对文件尾位置后进行读入。此错误有以下原因和解决方法：

  • Input # 或 Line Input # 语句要到已读完文件或空文件中读入数据。

    在 Input # 语句之前直接使用 EOF 函数来测试是否处在文件的结尾。

  • 在以 Binary 访问所打开的文件上使用 EOF 函数。

    EOF 只能用在顺序 Input 访问所打开的文件上。在 Binary 访问所打开的文件上使用 Seek 和 Loc。

详细信息，可选取有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


期待 End Property

Exit procedure 语句必须与 Exit procedure 发生在其中的过程匹配。这个错误的起因与解决方法如下所示：

  • 使用 End Function 或 End Sub 来结束一个属性过程。

    在此请使用 End Property。

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 ) 。


End Select 没有 Select Case

End Select 必须与前面的 Select Case 配对。这个错误的起因与解决方法如下所示：

  • End Select 语句没有配对的 Select Case 语句。

    这通常由于从一个过程中复制一个 Select Case 块至另一个过程中时，导致一个多余的 End Select 遗留在 Select Case 区块下，或留在 End Select 语句後。请检查每一个 End Select 语句，确定它终结一个 Select Case 结构。

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 ) 。


期待 End Sub

Exit procedure 语句必须与 Exit procedure 发生在其中的过程匹配。这个错误的起因与解决方法如下所示：

  • 使用 End Function 或 End Property 来结束一个子过程。

    在此请使用 End Sub。

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 ) 。


End With 没有 With

End With 必须与先前的 With 配对。这个错误的起因与解决方法如下所示：

  • End With 语句没有配对的 With 语句。

    检查 With...End With 结构中的其它控制的结构，检查它们是否配对。例如，在 With...End With 结构中的 If 没有配对的 End If 时，就会发生这个错误。

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 ) 。


期待变量或过程，而非 Enum 类型

Enum 类型的名称只能出现在声明枚举类型的语句中，或作为限定符。这个错误的起因与解决方法如下所示：

  • Enum 类型的名称被用来取代该类型的枚举变量。

    声明 Enum 类型的变量，或在当前范围中找出一个先前的声明，并使用该变量。

  • Enum 类型的名称被用来替代变量或过程名称。

    请检查造成此错误的标识符的拼写。在指定 Enum 类型的地方，使用变量或过程的名称。

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 ) 。


装入文件错误（错误 31037）

在试图读入指定文件（设置 Action = 12）时发生错误。可能的原因是：

  • FileNumber 属性无效。

  • 文件并不是以 Binary 方式打开的。

  • 文件没有适当的存盘（设置 Action = 11）。

  • 文件损坏。

  • 文件位置并不是在有效 OLE 对象的起点。


加载时错误。详情请参考指定的项

某些事情始料未及地出现在 ASCII 窗体文件中。Visual Basic 创建的日志文件提供了有关该错误的详细信息。应检查该日志文件，决定该问题的严重性。有时可以平安地忽略掉这些错误（例如，版本号丢失或无效...）。然而有时，这些错误会使窗体不能正常运行（例如，MyControl 控件中的 MyClass 类不是加载的控件类）。


加载时产生的错误

请检查错误日志文件以获得更详细的帮助信息。


保存文件错误（错误 31036）

Visual Basic 不能将对象写入指定的文件（设置 Action = 11 或 18）。可能的原因是：

  • FileNumber 属性无效。

  • 指定的文件并不是以 Binary 方式打开的。

  • 磁盘空间不足。


事件没有找到

在 RaiseEvent 语句中指定的事件必须与定义好的事件相符。该错误有以下原因和解决方案：

  • 在 RaiseEvent 语句中指定了一个名字，但事件定义找不到。

    确认事件名拼写正确。

关于其他信息，请选中有问题的条目并按 F1 键 (在 Windows中) 或 HELP (对于 Macintosh).


过程声明与事件描述或与同名过程不匹配的描述

Procedure declaration does not match description of event or procedure having same name

类模块中有一过程，其名称与某事件的名称冲突。这个错误的起因与解决方法如下所示：

  • 过程虽与某事件同名，但特征不同（参数的数目与类型）。当添加一个参数到事件过程时，可能会发生这种情况。例如，若将窗体之 Form_Load 事件过程的定义改成如下所示时，就会发生此错误：
    Sub Form_Load (MyParam As Integer)
. . .
End Sub

    若此过程并非该事件的事件过程，则请改变其名称。若是的话，请使参数列表（如果有的话）与事件所要求的一致起来。

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 ) 。


Exit Do 不在 Do...Loop 内

Exit Do 只在 Do...Loop 语句中有效。这个错误的起因与解决方法如下所示：

  • Exit Do 语句在 Do...Loop 之外。

    请把 Do 语句放在 Exit Do 之前。

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 ) 。


Exit For 不在 For...Next 内

Exit For 只在 For...Next 循环中有效。这个错误的起因与解决方法如下所示：

  • Exit For 语句在 For...Next 之外。

    请把 For 语句放在 Exit For 之前。

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 ) 。


Exit 函数不能用于子过程或 Property 过程中

Exit 语句必须与 Exit 发生在其中的过程匹配。这个错误的起因与解决方法如下所示：

  • 您在 子过程 或 Property 过程 中使用 Exit 函数。

    对以上过程要使用 Exit Sub 或 Exit Property。

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 ) 。


Exit Property 不能用于函数或子过程中

Exit 语句必须与 Exit 发生在其中的过程匹配。这个错误的起因与解决方法如下所示：

  • 在子过程或函数中使用 Exit Property。

    请使用适当的 Exit 语句。

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 ) 。


Exit Sub 不能用于函数或 Property 过程中

Exit 语句必须与 Exit 发生在其中的过程匹配。这个错误的起因与解决方法如下所示：

  • 在函数或 Property 过程中使用了 Exit Sub。

    请使用适当的 Exit 语句。

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 ) 。


期待数组

具有下标的变量名称，表示此变量是数组。这个错误的起因与解决方法如下所示：

  • 指定的语法适合数组，但在范围内没有这个名称的数组。

    请检查并确定此变量的名称没有写错。除非模块包含 Option Explicit，否则一个变量在它第一次使用时就会被创建。假如将数组变量的名称写错，就可能创建一个变量，但它并不是一个数组。

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 ) 。


Select Case 与第一个 Case 语句间的语句或标签无效

除了注释之外，在 Select Case 语句与第一个 Case 子句之间不能放置任何东西。这个错误的原因与解决方法如下所示：

  • 在 Select Case 与第一个 Case 子句间放置了一个语句。例如：
    Select Case SomeVar
    ' 这是一行注释且放在这里是正确的。
    Stop    ' 即使一个 Stop 语句在这里也是无效的。
    Case SomeValue
    . . .
End Select

    在 Select Case 语句之后必须立即接上它的第一个 Case 语句。如果想在其间放置的表达式是一行注释，请记住以注释限定符 (') 开头。否则的话将此表达式放到有用的地方或将其删除。

详细信息，请选择有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


If 块缺少End If

因为不完整的语句造成的错误。这个错误的起因与解决方法如下所示：

  • 使用 If 语句时，缺少配对的 End If 语句。

    If 语句必须有配对的 End If 语句。对嵌入式 If...End If 语句而言，必须确保每个封闭的 If...End If 结构中，应有配对的 If...End If 结构。

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 ) 。


Select Case 没有 End Select

每个 Select Case 结构必须有一个 End Select 语句来结束。这个错误的原因与解决方法如下所示：

  • 使用了一个 Select Case 语句，但却没有与其相对应的 End Select 语句。

    请检查是否有不成对的 Select Case...End Select 结构在另一个 Select Case...End Select 结构内。如果代码中的 Select Case 语句是嵌入的，则每个都要有一个 End Select 与之配对。

详细信息，请选择有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


期待 End With

With 块必须被终结。这个错误的起因与解决方法如下所示：

  • 没有适时终结 With 块。

    将 End With 放在块的末尾。

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 ) 。


期待函数或变量

语句的语法指示一个变量或函数调用。这个错误的起因与解决方法如下所示：

  • 这个名称并非已知变量或函数过程的名称。

    请检查这个名称的拼写。确定在引用此名称的程序部分，有这个名称的变量或函数是可见的。例如，假如函数被定义为 Private ，或变量没有定义为 Public，它只在它拥有者的模块中为可见的。

  • 试图不适当地给一个过程名赋值。例如假如 MySub 是一个子过程，则下面的代码会产生这个错误：
    MySub = 237    ' 产生预期函数或变量的错误

    虽然可以使用带 Property Let 过程或函数的赋值语法，来返回一个对象或包含对象的 Variant，但不能使用带子过程、Property Get 或 Property Set 过程的赋值语法。

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 ) 。


期待过程，而非模块

在当前范围中，没有以此名称命名的过程，但有以此名称命名的模块。您可以调用过程，但不能调用模块。这个错误的起因与解决方法如下所示：

  • 在过程调用中使用了模块名。

    请检查此过程名称的拼写。确定想要调用的过程，不为另一个模块所私有。

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 ) 。


期待过程，而非工程或库

在当前范围中，没有以此名称命名的过程，但有以此名称命名的工程。这个错误的起因与解决方法如下所示：

  • 在过程调用中使用了工程名。

    请检查此过程名称的拼写。确定想要调用的过程，不为另一个模块所私有。

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 ) 。


期待过程，而非用户自定义类型

在当前范围中，没有以此名称命名的过程，但有以此名称命名的用户定义类型。可以调用过程，但不能调用用户自定义类型。这个错误的起因与解决方法如下所示：

  • 在过程调用中使用了用户自定义类型名。。

    请检查此过程名称的拼写。确定要调用的过程，不是另一个模块私有的。

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 ) 。


期待过程，而非变量

在当前范围中，没有以此名称命名的过程，但有以此名称命名的变量。可以调用过程，但不能调用变量。这个错误的起因与解决方法如下所示：

  • 在过程调用中使用了变量名。。

    这个错误也可能是有效过程名的拼写错误引起的，因为拼错的名称可以被曲解为隐式定义的变量。请检查此过程名的拼写，确定要调用的过程不是另一个模块私有的。

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 ) 。


Do 没有配对的 Loop

每一个 Do 必须对应一个终结的 Loop。这个错误的起因与解决方法如下所示：

  • 使用一个 Do 语句，却没有一个终结的 Loop 语句。

    请检查 Do...Loop 结构中的其它控制结构，看使用是否正确。例如，在 Do...Loop 结构中，没有 End If 的 If 块会产生这个错误。

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 ) 。


For 没有 Next

每一个 For 语句必须有配对的 Next。这个错误的起因与解决方法如下所示：

  • For 语句没有配对的 Next 语句。

    检查 For...Next 结构。

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 ) 。


期待子过程、函数过程或 Property 过程

语句的语法指示一个子过程、函数过程或 Property 过程调用。这个错误的起因与解决方法如下所示：

  • 在程序的这一部分，指定的名称并非范围中的 子过程、函数过程或 Property 过程。

    请检查此名称的拼写。请注意假如此过程被定义为 Private ，它只能在它自己的模块中被调用。

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 ) 。


期待：<various>

语法中的期待部分没有找到。这个错误通常位于被选项的左方，但并不总是明显的。例如，可以用、也可不用 Call 关键字来调用子过程。然而，假如用了Call 关键字，必须将参数括在括号内。这个错误的起因与解决方法如下所示：

  • 期待：语句的结尾。在过程调用中不适当地使用括号：
    X = Workbook.Add F:= 5    ' 错误起因於没有括号。
Call MySub 5                ' 错误起因於没有括号。

    请在函数调用中使用指定参数的括号，或在使用 Call 关键字的子过程调用中使用括号。

  • 期待： )。过程调用的不正确语法。例如，函数调用单独出现，而子过程调用有时候需要 Call 关键字，依赖於如何指定它们的参数。
    Workbook.Add (X:=5, Y:=7)    ' 没有表达式的函数调用。
YourSub(5, 7)                ' 没有 Call 的子过程调用。

    在表达式中总是使用函数调用。如果在子过程调用的括号内有多个的参数时，必须使用 Call 关键字。

  • 期待：表达式。例如，当从对象浏览器中粘贴代码时，可能忘记给命名参数赋值。
    Workbook.Add (X:= )    ' 错误因为没有给
                            ' 命名的参数赋值。

    或者为该参数添加一个值，或者如果它是可选的，就删除它。

  • 期待：变量。例如，也许对变量名使用了限制关键字。在下面的示例中，Input # 语句期待一个变量作为其第二个参数。因为 Type 是一个限制性的关键字，因此它不能作为变量名。
    Input # 1, Type    ' Type 关键字不能用作
                        ' 变量名。

    请重新命名变量，使其不再与限制性关键字冲突。

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 ) 。


期待用户自定义类型，而非工程

在当前范围中没有以此名称命名的用户定义类型，但有以此名称命名的工程。可以定义一个变量为具有用户定义类型，但不是工程类型。这个错误的起因与解决方法如下所示：

  • 工程名被当作用户定义类型的名称。

    请检查此用户定义类型名称的拼写，确定此用户自定义类型不是另一个模块所私有的。

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 ) 。


While 没有 Wend

一个 While 语句在没有与其对应的 Wend 语句的情况下被使用。这个错误的原因与解决方法如下所示：

  • 打开一个 While...Wend结构，却没有关闭它。

    在一个 While...Wend 结构内可能还有个 While...Wend 结构，请检查它们的匹配是否不正确。

详细信息，请选择有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


在删除之前要导出所指定的对象吗

可以将窗体及模块导出，并在以后需要时装入。这项错误的原因及解决方法如下：

  • 正在将窗体或模块从一个工程中删除。

    若要保留模块，请先将它导出。以后还可以再导入。

如需要其它信息，请选择有疑问的项目并按下F1 键(在Windows中) 或 HELP (在 Macintosh中)。


表达式太复杂（错误 16）

在不同平台间，浮点表达式许可的子表达式数并不同。例如，在 32- 位 Microsoft Windows 操作系统中，浮点表达式的嵌套深度只能到 8。此错误有以下原因和解决方法：

  • 浮点表达式包含太多嵌套子表达式。

    将表达式分成几个表达式以避免不需要的错误产生。

    注意 在 Visual Basic 较早的版本，错误 16 是 " 字符串表达式太复杂 "，这种错误不会再出现了。但是，如果有早期的代码会去处理此错误，应该将其删除以避免和此新的错误混淆。

详细信息，可选取有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


外部名未定义

可以用以方括号 ([ ]) 来表示外部名称。这个错误的起因与解决方法如下所示：

  • 在方括号中指定的标识符对于主应用程序没有意义。

    检查名称的拼写，以确定它与宿主期待的名称一致。

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 ) 。


文件已存在（错误 58）

此错误有以下的原因和解决方法：

  • 此错误发生在运行时要添加一个新文件名时， 例如，在 Name 语句中所指定的文件名和已存在的相同。

    在 Name 语句中指定一个新的文件名或删除已有的文件。

  • 当使用“另存为” 命令来保存当前所装载的工程，但此工程名已经存在。

    如果不想代替其他工程的话，请使用不同的工程名。

详细信息，可选取有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


文件已打开（错误 55）

有时候文件必须在其他 Open 或其他操作发生前先关闭。此错误有以下的原因和解决方法：

  • 对一个已经打开的文件，执行顺序输出模式的 Open 语句。

    必须将要打开成其他方式的顺序访问方式文件先关闭。例如，必须先将打开成 Input 的文件先关闭再打开成 Output。

  • 如 Kill、SetAttr 或 Name 等语句，引用到一个打开的文件。

    在执行此语句前先关闭此文件。

详细信息，可选取有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


文件名不能使用字符设备名称（错误 320）

在 Visual Basic 中，给出的文件名不能与字符设备驱动程序相同。这项错误的原因及解决方法如下：

  • 试图使用 AUX、CON、COM1、COM2、LPT1、 LPT2、LPT3、LPT4 或 NUL 等为文件名。

    请为文件取另一个名称。


文件格式无效（错误 321）

Visual Basic 窗体文件损坏。这项错误的原因及解决方法如下：

  • 窗体中有一个损坏的 ActiveX 控件。

    请试着更换窗体上的 ActiveX 控件。

  • 当前版本的 ActiveX 控件中的属性数，与期望的属性数不匹配。

    请试着换成较早版本或较晚版本的 ActiveX 控件。


指定的项是只读文件

请求保存到只读文件中。只读文件在“工程资源管理器”中显示为 [image] 。不能保存只读文件。请使用“另存为”。


找不到指定的文件（错误 53）

所指定的文件找不到。此错误有以下的原因和解决方法：

  • 如 Kill、Open 或 Name 等语句，引用到一个不存在的文件。

    检查文件名的拼写以及指定的路径。

  • 试图调用动态链接库 (DLL)或Macintosh代码资源中的过程，但找不到在 Declare 语句的 Lib 子句中所指定的库或资源文件名。

    检查文件名的拼写以及指定的路径。

  • 在开发环境中，如果试图打开并不存在的工程或装载不存在的文本文件，将发生错误。

    检查文件名或工程名的拼写以及指定的路径。

详细信息，可选取有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


指定的文件没有找到

检查不能找到的文件名的消息。该错误有以下原因和解决方案：

  • 不能按照指定找到错误消息中的文件名。

    请确认正确指定了驱动器名、路径和文件名。

关于其他信息，请选中有问题的条目并按 F1 键 (在 Windows中) 或 HELP (对于 Macintosh).


在指定的行上：指定的文件不能被加载

语法错误会使 Visual Basic 不能分析和加载文件，而窗体名称的冲突也会阻碍加载 ASCII 窗体。该窗体将不被加载，且窗体的名称也不会显示在“工程资源管理器”中。

确定引起该错误的文件是正确格式的 ASCII 窗体，并且在工程中不同的窗体之间不存在冲突。


当前工程不支持这种类型的文件

导致这个错误的原因及解决办法如下：

  • 试图打开的文件是一个无效的工程文件，或者含有这个 Visual Basic 主机应用程序和 Visual Basic 环境不支持的特征。

    确定打开的工程文件是一个有效的工程文件（您创建的并且保存在同一 Visual Basic 主机应用程序和 Visual Basic 环境下的工程文件）。

    详细信息，选择有问题的项目并按 F1 键（Windows 系统）或 HELP (Macintosh 系统)。


不允许命名的参数

命名参数并非在所有的情况都允许使用。这个错误的原因与解决方法如下所示：

  • 试图用命名的参数作为数组索引，例如：
    MyVar = MyArray(MyNamedArg := 1)

    请以普通的变量或常数表达式作为数组的索引。

  • 试图把命名的参数指定给一个对象，例如：
    MyVar = MyObject(MyNamedArg := 1)

    如果该对象需要参数，请使用变量或常数表达式。例如，若某个对象本身在默认情况下就是一个方法，此对象的名称便代表一个默认方法。若此方法需要参数，请以位置的方式来指定它。

  • 试图给一个外部名称指定命名的参数：
    MyVar = [MyName](MyNamedArg := 1)

    若外部变量需要参数，请以普通的变量或常数表达式来指定。

  • 试图给一个对象的数据成员指定命名的参数，例如：
    MyVar = [MyObject].MyProperty(MyNamedArg := 1)

    若数据成员需要参数，请以普通的变量或常数表达式来指定。

详细信息，请选择有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


固定长度字符串不允许作为对象模块的一个公共成员的类型；私有对象模块不允许作为公共对象模块的一个公共成员的类型

这个错误有以下的原因和解决方案：

  • 不允许将一个对象模块的公共成员的类型设置为固定长度字符串。请使用其他变量类型。

  • 不允许将一个公共对象模块的公共成员的类型设置为一个私有对象模块。请使用其他类型。


对于对象模块中定义的公共用户定义类型中的字段，固定长度字符串和 new 限定符的使用是不允许的

这个错误有以下的原因和解决方案：

  • 对于对象模块中定义的公共用户定义类型中的字段，固定长度字符串和 new 限定符的使用是不允许的


For Each 不能用于用户自定义类型的数组或固定长度字符串的数组上

For Each 结构只对固有类型的集合和数组有效，包括对象的数组。同样，固定长度字符串的数组不能使用 For Each 来迭代。这个错误的起因与解决方法如下所示：

  • 在 For Each 结构中，数组中的元素有用户定义类型。

    使用普通的 For...Next 循环来迭代数组中的元素。

  • 在 For Each 结构中，数组中的元素有固定长度字符串类型。

    使用普通的 For...Next 循环来迭代数组中的元素。

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 ) 。


数组中的 For Each 控制变量必须是 Variant

控制变量是 For Each...Next 语句语法的 element 部分。这个错误的起因与解决方法如下所示：

  • 数组中的控制变量不是 Variant 。

    确定 For Each...Next 的 group 部分是 Variant 类型的变量。

  • 详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 ) 。


For Each 只能用于集合对象或数组

For Each 结构只能用于集合与数组。这个错误的起因与解决方法如下所示：

  • 将不是集合或数组的对象指定为 For Each 语法的 group 部分。

    请检查您想要重复的工程的拼写，确定它对应至过程代码这部分有效范围中的一个集合对象或数组。

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 ) 。


For Each 控制变量必须是 Variant 或 Object

控制变量是 For Each...Next 语句语法的 element 部分。这个错误的起因与解决方法如下所示：

  • 集合中的控制变量不是 Variant 或 Object 类型。

    确定 For Each...Next 的 element 部分是 Variant 或 Object。

  • 数组中的控制变量不是 Variant 。

    确定 For Each...Next 的 element 部分是 Variant。

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 ) 。


For 控制变量已经使用

当嵌套 For...Next 循环时，必须在每一个循环中使用不同的控制变量。这个错误的起因与解决方法如下所示：

  • 内层的 For 循环使用了和外层的 For 循环相同的计数器。

    检查嵌套循环的重复。例如，如果外层的循环使用了 For Count = 1 To 25，则内层的循环就不能使用 Count 为其控制变量。

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 ) 。


指定文件中包含的窗体类，Visual Basic for Applications 不支持；文件不能装入。

Visual Basic for Applications 仅支持 UserForm 窗体对象。 这项错误的原因及解决方法如下：

  • 试图装入 Visual Basic 之前版本的窗体，或当前独立版本 Visual Basic 的窗体。

    可能最容易的方法就是以 Visual Basic for Applications 工具箱中的 UserForm 来重新设计窗体。如果可以的话，将窗体以 ASCII格式加以存储，将窗体修改後再导入。然而，必须完全了解不同窗体包装的格式及限制。

如需要其它信息，请选择有疑问的项目并按下 F1 键(在Windows中) 或 HELP (在 Macintosh中)。


在指定的行上：指定的窗体名称已在使用中；不能加载该窗体

ASCII 文件所含窗体的名称已被该应用程序使用。该窗体没被加载。


指定文件所标记的版本，当前的 Visual Basic 版本不支持，不能装入

试图装入一个 Visual Basic 1.0 版或以后版本的窗体。当前的版本并没有支持此功能。


向前引用用户自定义类型

用户定义类型必须定义在它可以被引用之前。这个错误的起因与解决方法如下所示：

  • 在用户自定义类型的定义出现之前就声明这个用户自定义类型的变量。下面的示例中，变量 OtherVar 在其类型 (OtherType) 尚未定义前就先声明了：
    Type MyType
    OtherVar As OtherType
End Type

Type OtherType
    WholeVar As Integer
    RealVar As Double
End Type

    重新调整类型声明的位置，这样就不会发生向前引用。

  • 在自身内部嵌套用户自定义类型。
    Type MyType
    MyVar As Integer
    OtherVar As MyType
End Type

    删除自我引用的嵌套类型。如果在一个类型中嵌套另一个类型，而后者已经在后者中间声明过了，就会间接发生这个错误。检查每个嵌套类型的定义以消除重复。

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 ) 。


参数数错误或无效的属性赋值（错误 450）

传给过程的参数数必须和过程定义的参数数匹配。此错误有以下的原因和解决方法：

  • 在调用过程时，所给的参数数和过程所要求的不一样。

    与程序声明或定义进行比较，检查调用中的参数列表。

  • 为控件指定的索引不在控件数组中。

    指定的索引作为一个参数解释，但既不是所要的索引也不是所要的参数，所以发生错误。可删除索引，或在过程后新创建控件数组。在控件的属性外壳或设计时的属性窗口中，将 Index 属性设为非零值。

  • 要给只读属性进行赋值，或要赋值给不存在 Property Let 过程的属性。

    给属性赋值与将值当作参数传送给对象的 Property Let 过程是一样的。正确地对 Property Let 过程进行定义；它必须具有比对应的 Property Get 过程参数多出一个以上的参数。如果属性是只读的，就不能给它赋值。

详细信息，可选取有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


等号左边的函数调用必须返回 Variant 或对象

函数调用可以出现在赋值号的左边，但是只有在其返回值为 Object 或 Variant 时。这个错误的起因与解决方法如下所示：

  • 在赋值号左边的函数，其返回类型不是 Variant 或 Object。

    请改变返回的类型。请注意如果返回值是包含对象的对象或 Variant，则给对象的缺省属性赋值。如果返回的 Variant 不是一个对象，则赋值号没有作用。

  • 调用的方式是正确的，但调用不能完成。例如：试图设置一个只有在设计时间才能设置的属性。

    请进入设计方式，并在“属性”窗口中设置该属性。删除程序中设置该属性的代码。

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 ) 。


在只写属性上Property Get不能执行（错误 394）

并非所有属性都能返回信息。错误有以下原因和解决方法：

  • 不能返回要访问的属性信息。

    不能决定属性的状态。

详细信息，可选取有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


Property Get在运行时不能执行（错误 393）

并非所有属性在运行时都返回信息。此错误有以下原因和解决方法：

  • 访问的属性在运行时是只读的。

    终止执行然后在设计时查看属性。

详细信息，可选取有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


不能 Get 或 Put 对象引用变量，或含有对象引用的自定义类型变量

对象引用是临时的，并且很容易在关闭与打开文件间变成无效的。这个错误的起因与解决方法如下所示：

  • 在 Get 或 Put 语句中的变量包含，或被声明为包含一个对象的引用。

    假如此变量是一个对象的引用，便不能在 Get 和 Put 语句使用它。如果要将对象的属性值放入文件，每个属性必须被个别地指定。

  • Get 或 Put 语句中的用户定义类型变量包含的元素为对象引用。

    假如变量的 Type 语句包含的元素代表一个对象（例如，它在一个类模块中被定义，具有 Object 数据类型，是一个窗体或控件等等），从定义中将它删除，或者定义一个为了 Get 和 Put 语句使用的新类型，在该类型的定义中没有 Object 类型的元素。

    假如有 Variant 类型的用户自定义类型的元素，请确定没有对象引用赋予该元素。 Variant 可以接受这样的赋值式，但假如其用户自定义类型在 Get 或 Put 中被使用，将会造成这个错误。

    请注意，您可以使用 Input #、Line Input #、Print # 或 Write #，将一个对象的缺省属性写入磁盘。

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 ) 。


不能创建 AutoRedraw 图象（错误 480）

Visual Basic 不能以自动重绘窗体或图片的方式，创建持久性位图。这项错误的原因及解决方法如下：

  • 没有足够的内存将 AutoRedraw 属性设置成 True。

    设置 AutoRedraw 属性为 False，并在 Paint 事件过程中执行自己的重绘，或是将 PictureBox 控件或 Form 对象变得小一点，重试一次将 AutoRedraw 设置成 True 的动作。


打印机驱动程序不支持指定的属性（错误 483）

当前所用打印机的驱动程序，不支持 Printer 对象的这项属性。这项错误的原因及解决方法如下：

  • Printer 对象属性的功能，取决于打印机生产商所提供的驱动程序。有些属性的设置可能没有作用，或者几个不同属性的设置的作用可能都相同。某些设置可能会产生错误。

    详细信息，参见该驱动程序厂家的文档。


问题可能源于打印机，请检查打印机的安装是否正确（错误 484）

发生某些问题，使得不能从系统取得打印机信息。这项错误的原因及解决方法如下：

  • 尚未在 Windows 的“控制面板”中安装打印机。.

    请打开 “控制面板”，双击“打印机” 图标，并单击“添加打印机” 来安装打印机。

  • 打印机未联机。

    请实际使打印机转换成联机状态。

  • 打印机卡纸或是没纸。

    实际将这些问题排除。


不能打印已最小化窗体的图像

导致这个错误的原因及解决办法如下：

  • 窗体最小化时，不能打印窗体图像。

    最大化窗体图像，重试打印操作。

详细信息，选择有问题的项目并按 F1 键（Windows系统） or HELP （Macintosh系统）。


不能将窗体映象打印到这种类型的打印机上（错误 486）

必须用能绘图的打印机来打印窗体映象。


图片无效（错误 481）

指定了无效的图形格式给 Picture 属性。这项错误的原因及解决方法如下：

  • 试图指定位图、图标或 Windows 图元文件（.wmf）以外的图形格式，给窗体或控件的 Picture 属性。

    请确认要装入到 Picture 属性的文件，是一个 Visual Basic 所支持的图形文件。


图片的类型无效（错误 485）

试图装入的源文件，格式不符合对象的某些属性。这项错误的原因及解决方法如下：

  • 试图使用 LoadResPicture 方法，作为窗体的 Icon 属性，要装入一个位图。

    请将窗体的属性改成 Picture 属性，或是将 LoadResPicture 的 format 参数 改变成 vbResIcon。

  • 试图用 LoadResPicture 方法，装入光标资源，作为对象或控件的 MousePointer 属性之外的某些属性。

    请将属性引用改变为 MousePointer。


打印机错误（错误 482）

发生某些问题，使得打印工作停顿。这项错误的原因及解决方法如下：

  • 没有从 Windows 的“控制面板”中安装好打印机。

    请打开“控制面板”，双击“打印机” 图标，并单击“添加打印机” 来安装打印机。

  • 打印机未联机。

    请实际使打印机转换成联机状态。

  • 打印机卡纸或是没纸。

    实际将这些问题排除。

  • 试图将窗体，打印到一个只能接受文本的打印机上。

    换到一个可以打印图形的打印机上。


找不到Windows Help .exe 文件

不能显示帮助

Windows 帮助应用程序不能使用。如果MSDN库查看器在计算机上，请确保它在所指定的路径上。如果它没有在计算机上，在查看帮助前必须安装它。


出现所指定的系统错误

Visual Basic 遇到一个由系统或外部部件所产生的错误。


未找到方法或数据成员（错误 461）

集合、对象或用户定义类型不包含引用的成员。该错误发生的原因和解决方法如下：

  • 对象或成员名称拼写错误。

    检查名称拼写并检查 Type 语句或对象文档，以确定成员以及对象或成员名称的正确拼写。

  • 您指定了一个超出范围的集合索引。

    检查 Count 属性以确定某个集合成员是否存在。注意，集合索引从 1 开始，而不是从 0 开始，因此 Count 属性返回最大可能的索引数。

详细信息，可选取有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


标识符太长

标识符的长度不能超过 255 个字符。这个错误的起因与解决方法如下所示：

  • 标识符的长度超过 255 个字符。

    减短标识符的长度。

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 ) 。


区间无值

数组中元素个数的指定方式是有限制的。这个错误的原因与解决方法如下所示：

  • 不正确地指定数组上下限。例如，下列的数组区间都是无效的：
    Dim MyArray(10 To -5)    ' 不允许递减。
Dim MyArray(0 To 0)        ' 数组中没有元素。

    请确定语法是正确的。例如， 下列的数组区间是有效的：

    Dim MyArray(-5 To 10)

详细信息，请选择有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


无效的字符

该字符不能被用于当前的内容中。这个错误的起因与解决方法如下所示：

  • 可能使用了无效的字符，如括号或连字号，做为变量名称的一部分。

    请比较此名称的拼写与其声明是否一致。

详细信息，请先选取有疑问的项目，然后按下 F1 键。( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 )


固定长度字符串的长度无效

这个错误的起因与解决方法如下所示：

  • 固定长度字符串被声明为零长度。

    固定长度字符串必须至少有一个字符。

  • 固定长度字符串超过 65,529 的限制。

    减短固定长度字符串的长度。

    注意 可变长度字符串的长度可以超过该上限，也可以是零。

详细信息，请先选取有疑问的项目，然后按下 F1 键。( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 )


For 循环未初始化（错误 92）

必须初始化 For 循环的计数器。此错误有以下原因和解决方法：

  • 跳转到了 For...Next 循环中。

    将跳入循环中的操作删除，放置在 For...Next 循环中的标签不能推荐使用。

详细信息，可选取有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


无效的过程调用或参数（错误 5）

有些调用操作不能完成。此错误有以下的原因和解决方法：

  • 参数值可能超出了允许的范围。例如，Sin 函数只接受特定范围的值。正的参数小于 2,147,483,648的是可接受的，而等于 2,147,483,648 则会产生错误。

    检查参数的许可范围。

  • 如果所要调用的过程不适于当前平台的话，也会发生此错误。例如，有些程序可能只应用到 Microsoft Windows 或 Macintosh 等。

    检查过程的特定平台信息。

详细信息，可选取有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


方法对不适当的对象无效

并非所有的方法都可以被所有的对象执行。这个错误的原因与解决方法如下所示：

  • 调用了一个方法，但却没有指定对象名称，且此方法对隐含对象无效。例如，在没有有效的对象限定符情况下，不能在标准模块中使用 Line 方法，因为标准模块不能显示 Line 方法的输出。

    请显式地限定某对象可接受的方法调用。例如，可以在一个窗体或图象框上指定 Line 方法。

    说明 标准模块中其他需要显式的对象限定符的方法有 Circle、Print 和 PSet。

详细信息，请选择有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


所指定的名字不是一个合法的对象名

窗体以及控件 的名称，必须以字母为开头，并且其最大长度为 40 个字符，其中能包含字母、数字以及下划线（_）。

请注意窗体或控件的 Name 属性与 Label 属性 — Caption, Text, 和 Value 等属性不同— 它们会在运行时 标识或显示出控件的内容。这些属性 可以是被限制的关键字, 开始的字符可以是数字， 并且可以包含非字母数字字符。


无效的 ParamArray 使用

定义为 ParamArray 的参数不正确地用在过程中。这个错误的起因与解决方法如下所示：

  • 试图将 ParamArray 作为参数，传递至另一个期待数组或 ByRef Variant 的过程中。

    将 ParamArray 参数指定我 Variant ，然后传递此 Variant。

  • 试图在过程中使用带 ParamArray 参数的 Erase 或 ReDim 语句。

    删除 Erase 或 ReDim。对 ParamArray 参数不能执行这些操作。

详细信息，请先选取有疑问的项目，然后按下 F1 键。( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 )


在“立即”窗口中无效

在“立即”窗口中并非允许所有的语句。这个错误的起因与解决方法如下所示：

  • 使用了声明性的语句。例如，Const、Declare、Def type、Dim、Function、Option Base、Option Explicit、Option Compare、Option Private、Private、Public、 Property 过程声明语句（Property Let、Property Set，与 Property Get）、ReDim、Static、Sub 与 Type，都不可用在“立即”窗口中。

    请从“立即”窗口中删除声明性语句。

  • 使用了控制流语句，例如，Sub、Function、Property、GoSub、GoTo、Return 与 Resume.

    请从“立即”窗口中删除这些语句。

  • 在“立即”窗口中，分隔的物理行之间没有逻辑地连接，因此这些语句被理解为多个物理行，例如，象这样的 If 语句块是不能正确执行的。

    象这样的块可以键入单一的物理行，每个语句间使用冒号 (:) 隔开。反过来，可以在“立即”窗口中用续行符 ( _)，将单一行延伸至数个物理行。

  • 试图在“立即”窗口中执行使当前程序状态为无效，并需要重新初始化程序的代码。

    请从“立即”窗口中将出现问题的代码删除。

详细信息，请先选取有疑问的项目，然后按下 F1 键。( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 )


变量未定义

使用 Option Explicit 语句要保护的模块，让模块里面不要有任何未经声明的变量，如此可以消除因编辑错误而导致创建新变量的可能性。这个错误的原因与解决方法如下所示：

  • 已经使用了 Option Explicit 语句，要求变量必须显式声明，但却仍然在不经声明情况下使用一个变量。

    请显式地声明此变量，或者如果是不小心拼错变量名，请将其更正。

详细信息，请选择有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


此编辑会使这个对象类模块与先前所指定的可兼容的 ActiveX 部件不兼容

若一个兼容的 ActiveX 部件已经作为上一个发布的可执行文件或动态链接库 (DLL)存在，必须小心不要改动它的接口。这个警告的原因与解决方法如下所示：

  • 试图编辑一个对象模块的代码，但此对象模块已经用可执行文件的形式来表示。

    如果所作的修改影响到此对象的接口，该类将不能被前一版本向上兼容且不能用新版本来替换旧版本编译出来的代码。

    在 Visual Basic 中，当选择“工具”菜单中的“工程选项”时，兼容的 ActiveX部件的名字会出现在对话框里。

    重点 要接受编辑，请单击错误信息对话框中的“确定”。如果要撤消编辑，请单击“取消”按钮。

详细信息，请选择有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


同一属性的 Property 过程的定义不一致，或含有可选的参数或 ParamArray

同一属性的 Property Get、Property Let，与 Property Set 过程的参数必须严格一致，除了以下两种情况： Property Let 有一个额外的参数，其类型必须符合相应的 Property Get 之返回值；Property Set 也比相应的 Property Get 多一个参数，其类型可以是 Variant、Object、类名称、或在对象库中指定的对象库类型。这个错误的起因与解决方法如下所示：

  • Property Get 过程的参数数量并非比相对之 Property Let 或 Property Set 过程少一。

    请视情况添加 Property Let 或 Property Set的参数，或者删除 Property Get 的参数。

  • Property Get 的参数类型必须与 Property Let 或 Property Set 的相应参数类型严格一致，除了额外的 Property Set 参数。

    请修改参数类型，使其符合。

  • Property Let 额外参数的类型必须符合相应的 Property Get 过程的返回值。

    请修改 Property Let 额外参数的声明或 Property Get 的返回值，使其符合。

  • Property Set 额外参数的类型可以跟相应的 Property Get 之返回值不同，但必须是 Variant、Object、类名称，或有效的对象库类型。

    请确定 Property Set 过程之额外参数的类型为 Variant、Object、类名或对象库类型。

  • 使用 Optional 或 ParamArray 参数来定义 Property 过程。

    ParamArray 与 Optional 参数不能用于 Property 过程。请重定义，且勿使用这些关键字。

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 ) 。


不正确的 OLE 版本

OLE 动态链接库 (DLL) 的版本与主应用程序(Windows) or code resource (Macintosh) 所期待的不匹配。在 Microsoft Windows，应用程序首先在当前目录中搜寻 DLL ，然后沿着 path 设置，最后在 WINDOWS\SYSTEM 目录中搜寻 DLL。这个错误的起因与解决方法如下所示：

  • 在找到主应用程序所期待的 DLL 之前，先找到旧的 OLE DLL。

    不要使用两个 DLL 版本。

注意，在 Macintosh 机上， OLE 文件一般只放在 Extensions 文件夹中，因而不可能发生这种错误。

详细信息，请先选取有疑问的项目，然后按下 F1 键。( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 )


无效的类型声明字符

类型声明字符有效，但并非对所有的数据类型都存在；且在某些情形下是不允许的。这个错误的起因与解决方法如下所示：

  • 一个类型声明字符被追加到用具有 As 子句的 Private、Public 或 Static 语句声明的变量中。

    删除类型声明字符。

  • 一个类型声明字符被追加至不一致的文本中。例如， (&) 是 Long 整型的类型声明字符，如果用到不同类型的数据中就会导致错误：
    10.253&

    改正类型声明字符。

详细信息，请先选取有疑问的项目，然后按下 F1 键。( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 )


不正确的 DLL 版本

Visual Basic 的每个版本只能运用其相应的动态链接库 (DLL)。这个错误的起因与解决方法如下所示：

  • Visual Basic 动态链接库的版本与主应用程序不匹配。程序企图调用 DLL or code resource中的例程，但此库or code resource的版本与 Visual Basic 或主应用程序不一致。

    请取得此库 or resource的正确版本，并且确定在 path 中，旧的版本不在可用版本之前。

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 ) 。


'item' 在ActiveX EXE 工程中，'item'设计器不能是公有的

在ActiveX EXE 工程中，'item'设计器不能是公有的

导致这个错误的原因及解决办法如下：This error has the following causes and solutions:

  • 在 ActiveX exe 工程中，指定设计器的 Instancing 属性不能设置为 Public。

详细信息，选择有问题的项目并按下 F1 键（Windows 系统）或 HELP（Macintosh 系统）。


这个特性需要Internet资源管理器'item'或更大，你可以根据下面的网址得到最新的版本：

这个特性需要 Internet Explorer 'item' 或更高版本，可以根据下面网址得到最新版本：www.microsoft.com。

导致这个错误的原因及解决办法如下：

  • 要使这一特性正确起作用，必需有指定版本的 Internet Explorer。

    检查 http://www.microsoft.com 网址来获得Internet Explorer 最新的可用版本。

详细信息，选择有问题的项目并按 F1 键（Windows系统）或 HELP （Macintosh系统）。


本地的、非静态变量太多

本地的、非静态变量是定义在一个过程中，且每次过程调用时被重新初始化。这个错误的原因与解决方法如下所示：

  • 这个过程的本地的、非静态变量及编译器所产生的暂时性变量所占用的内存总和超过了 32K。

    请在适当的地方将一些变量以 Static 语句声明。Static 变量可以在过程间彼此调用时保留其自身的值。因为分配给它们的内存资源与非静态变量是不一样的。

详细信息，请选择有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


模块级别的变量太多

模块级 变量是在模块的声明区中、模块的过程之前声明的变量。这个错误的原因与解决方法如下所示：

  • 此模块中所有的模块级变量所占用的内存超过了 64K。

    这是此模块的存储限制。如果可以的话，把一些变量放在别的模块中，并声明为 Public，或者若有些模块级变量只在一个过程中有用到，可以在该过程中声明该变量。如果将变量在模块级声明是因为想让它们在过程彼此调用时依然保持它们的值，可以在引用它们的过程内将它们声明为 Static。

    说明 在不同的操作系统中可用空间可能不一样。

详细信息，请选择有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


对象模块必须实现接口中的所有过程

接口是未实现的过程样本的集合。这个错误的起因与解决方法如下所示：

  • 在 Implements (Visual Basic 5.0 only)语句中指定了一个接口，但并未为接口中的所有过程添加代码。

    必须为接口中所有指定的过程撰写过程代码。能有空的过程。过程应当完成所要求的行为。

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 ) 。


内部错误（错误 51）

确保此错误不是由 Error 语句或 Raise 方法所产生。此错误有以下原因和解决方法：

  • 在 Visual Basic 中发生了内部出错。

    除非此调用不是由 Error 语句或 Raise 方法所产生，不然请与 Microsoft 产品支持服务联系，告知所发生的情况。

详细信息，可选取有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


在指定的行上：不能加载指定的控件；包含控件的不是有效的容器

试图将控件加载到一个无效的容器中。


操作符 AddressOf 的使用无效

AddressOf 运算符将参数修改为返回函数的地址，而不是返回函数调用的结果。这个错误的起因与解决方法如下所示：

  • 试图将 AddressOf 用于类方法名。

    只有 .bas 模块中的 Visual Basic 过程名才可以用 AddressOf 修改。不能指定类方法。

  • AddressOf 修改的过程名被定义在不同工程的模块中。

  • 试图用 AddressOf 修改 DLL 函数名或定义在类型库中的函数名。

  • DLL 与类型库函数不能用 AddressOf 修改。

    过程定义必须在当前工程的模块中。请将定义移到这个工程的模块中，或在该工程中包含它的当前模块。

详细信息，请先选取有疑问的项目，然后按下 F1 键。( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 )


子过程、函数过程或 Property 过程含有无效的属性

在过程中，有的属性是无效的。这个错误的起因与解决方法如下所示：

  • Public 或 Private 属性出现在过程定义体中。

    从过程中删除该属性。若要给变量更大的范围，将声明移到模块级别中。在过程中声明的变量总是 Private。

详细信息，请先选取有疑问的项目，然后按下 F1 键。( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 )


剪贴板格式非法（错误 460）

剪贴板只接受指定格式的数据。此错误有以下原因和解决方法：

  • 把数据从部件放到剪贴板，但数据的格式与剪贴板不兼容。

    查阅部件的文档以决定使用剪贴板从部件可传递的数据。

详细信息，可选取有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


在指定的行上：指定的 CLSID 无效。

当从文本文件中加载窗体、用户控件、用户文档或属性页时，不能加载对象。文件中指定的 CLSID 无效。它只应用于属性对象，例如 Font 对象。该消息被写入错误日志文件中。


兼容的 ActiveX 部件必须是 Visual Basic 可执行文件 或 DLL

兼容的 ActiveX 部件是指定兼容的 ActiveX 部件。这个错误的起因与解决方法如下所示：

  • Visual Basic 试图访问指定为兼容的 ActiveX 部件的对象，但该文件不是使用 Visual Basic 创建的可执行文件或动态链接库 (DLL)。

    在“工程”菜单的“工程属性”对话框中，“兼容 ActiveX 部件”字段必须是以 Visual Basic 创建的可执行文件与 DLL 文件。若有可能，加载工程到 Visual Basic 中，并选取“文件”菜单的“生成可执行文件”命令，来创建 Visual Basic 可执行文件。若该文件已是可执行文件，但不是以 Visual Basic 所创建的，或者该文件不能加载到 Visual Basic，请参考其帮助文档，看看能否将其转成 Visual Basic 可执行文件，或者厂商是否可以提供 Visual Basic 版本的可执行文件。

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 ) 。


条件编译常数声明语法错误

在 “选项”对话框输入的条件编译常数 与在代码中声明的常数不同。这个错误的起因与解决方法如下所示：

  • 在 “选项”对话框中输入常数声明时，使用了不适当的语法。

    正确的语法是简单地将整型值赋予标识符。请确定语法是否正确，各常数间是否用分号 (:) 隔开：

    constantname = [{+ | – }]integervalue : [{+ | – }]constantname = integervalue [...]

详细信息，请先选取有疑问的项目，然后按下 F1 键。( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 )


不支持已编译部件和设计环境部件的交互作用

不支持已编译部件和设计环境部件之间的交互作用

导致这个错误的原因及解决办法如下：

  • 当两个部件一起运行时发生这一错误，其中一个部件以前已经编译（如窗体或用户部件）而现在正在使用运行时环境（msvbvm60.dll) 运行，而另一个部件正在 IDE 中运行。例如，一个已编译的用户部件在IDE的窗体中运行。

    由于正在 IDE 中运行的项目和已编译的对象之间的内部内存结构稍有不同或并不总是互相兼容，因而出现这一问题。通常当你通过一个 Property 或 Sub 过程向一个主机窗口或其它部件传递一个用户控件实例（Me) 时才会出现这一问题。

详细信息，选择有问题的项目并按 F1 键（Windows系统）或 HELP（Macintosh系统）。


这个控件不能用于 'item' 设计器

导致这个错误的原因及解决办法如下：

  • 选择的控件在指定设计器中无效。

    必须选择一个另外的控件或设计器。

详细信息，选择有问题的项目，并按下 F1 键（Windows 系统）或 HELP（Macintosh 系统）。


在指定的行上：指定的控件名无效

SCII 文件所包含的某个控件名称，在 Visual Basic 中是无效的字符串。该控件不会被加载。


指定的 DLL 函数未找到（错误 453）

在用户库引用中找到动态链接库 (DLL)，但在 DLL 内找不到指定的 DLL 函数。此错误有以下的原因和解决方法：

  • 在函数声明中指定了错误的序号：

    检查序号或以名称调用的函数。

  • 所给的 DLL 名称虽正确，但指定的函数的版本并非当前的。

    从机器上可得到正确的版本，但如果路径中含有错误版本的目录是在含有正确版本的目录之前的话，就会访问到错误的 DLL。检查机器上不同的版本，如果是较旧的版本，联系供给商以取得较新的版本。

  • 如果在 32-位 Microsoft Windows 平台上工作的话，DLL 名称和别名（如果使用的话）都必须正确。

    确保 DLL 名称和别名都正确。

  • 有些 32-位 DLL 包含少量不同版本的函数，以适应 Unicode和 ANSI字符串。函数名称尾端的 "A" 表示是 ANSI 版本。函数名称尾端的 "W" 表示是 Unicode 版本。

    如果函数有字符串类型参数，试着在函数名称尾端加上 "A"。

详细信息，可选取有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


无效的事件名字

因为事件过程名字是通过下划线来把对象名字和事件名字连接起来而构成的。该错误有以下原因和解决方案：

  • 使用了下划线作为了事件名字的一部分。

    从事件名字中删除下划线。

关于其他信息，请选中有问题的条目并按 F1 键 (在 Windows中) 或 HELP (对于 Macintosh).


文件格式非法（错误 321）

磁盘文件一般以特定的格式来存放数据。此错误有以下原因和解决方法：

  • 装载一个文件到部件中，但文件中数据的格式与部件不兼容。

    查阅部件的文档以决定磁盘文件数据应适合的格式，而且部件应提供格式转换的支持。

  • 将部件数据保存到文件中，但部件数据的格式与文件的格式不兼容。

    查阅部件的文档以决定部件应提供格式转换的支持。

详细信息，可选取有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


指定的项目是无效的键。指定的文件不能装入

文件包含有无效键时，就不能装入。


在指定的行上：指定的属性有一无效的文件引用

对于 ASCII 文件中对某个文件的引用，Visual Basic 不能在指定的目录中找到这个文件。


在指定的行上：指定的窗体名称无效；不能加载这个窗体

该 ASCII 文件所包含的窗体名称不是 Visual Basic 中的有效字符串。该窗体没有加载。


在指定的行上：指定的属性有一个无效的属性索引

ASCII 文件包含的属性名，其属性索引超过 255。


关键字 Me 的使用无效

关键字 Me 可出现在类模块中。这个错误的起因与解决方法如下所示：

  • 关键字 Me 出现在标准模块中。

    关键字 Me 不能出现在标准模块中，因为标准模块不能代表对象。若从类模块中复制代码，则必须用指定对象或窗体名来取代 Me，以保持原来的引用。

  • 关键字 Me 出现在 Set 赋值号的左边：
    Set Me = MyObject    ' 造成“关键字 Me 的使用无效”错误。

    删除 Set 赋值号。

    注意 关键字 Me 可出现在 Let 赋值号的左边，此时会设置 Me 所代表的对象的缺省属性。例如：

Let Me = MyObject    ' 显式 Let 的有效赋值号。
Me = MyObject    ' 隐式 Let 的有效赋值号。

详细信息，请先选取有疑问的项目，然后按下 F1 键。( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 )


关键字 New 的无效使用

关键字 New 仅能用于可创建的对象（类的实例或 Automation 对象）。这个错误的起因与解决方法如下所示：

  • 试图用具体例子来说明某事，但它只能有一个实例。例如，试图创建某模块的新实例，在语句中指定了 Module1 ，如下：
    Dim MyMod As New Module1

    您当然不能如愿，因为模块只能有一个实例。

  • 试图用具体例子来说明 Automation 对象，但它并非一个可创建的对象。例如，试图创建一个列表框的实例，且在语句中指定了 ListBox ，如下：
    ' 就创建变量的语法来说是正确的。
Dim MyListBox As ListBox
Dim MyFormInst As Form
' 对创建对象的实例来说，这里的语法不对了。
Set MyFormInst = New Form
Set MyListBox = New ListBox

    ListBox 与 Form 都是类名，而非对象名。可用它们指定引用某个对象类型的变量，如上面的 Dim 语句。但不能在 Set 语句中使用它们来示例对象自己。在 Set 语句中，必须指定具体的对象，而不是一般的类名：

    ' 这才是正确的创建窗体或列表框的语法。
Set MyFormInst = New Form1
Set MyListBox = New List1

详细信息，请先选取有疑问的项目，然后按下 F1 键。( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 )


无效的序号（错误 452）

调用的动态链接库 (DLL)，指定使用 #num 语法用数字代号来代替过程名称 。此错误有以下的原因和解决方法：

  • 试图将 num 表达式转成序号时失败。

    确保表达式所表示的数字有效或是用过程名称调用。

  • num 中所含不能指定任何 DLL 函数。

    请确保 num 可指定一个有效的 DLL 函数。

  • 类型库中的错误声明，使得序号内部使用无效。

    注释超出代码，隔离了引起问题的过程调用。可以为该过程写一个 Declare 语句，并且将问题告知类型库供给商。

详细信息，可选取有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


所指定对象对于 Show() 不能作为所有者窗体使用（错误 371）

必须是适当的对象才能使用 Show 方法。


无效的图片（错误 481）

只有图片可以赋值给 Picture 属性或 Picture 对象。此错误有以下原因和解决方法：

  • 所赋值的不是作为图标、位图或 Microsoft Windows 的图元的数据，给 Picture 属性或 Picture 对象。

    参看属性的帮助主题以决定 Picture 对象或 Picture 属性可接受的图片类型。

详细信息，可选取有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


无效的过程名

过程命名上有一些限制，是标识符命名规则中所没有的。这个错误的起因与解决方法如下所示：

  • 试图定义一个过程，但是使用的名称是无效的，因为宿主已经将该标识符用作其它。 例如，若主应用程序为 Microsoft Excel，就不能以 R1C1 来定义过程，因为该标识符在 Microsoft Excel 中已另作它用。

    请为此过程另选一个名称。

  • 过程名是受限制的关键字，超过 255 个字符，或没以字母开头。

    请为此过程另选一个名称。

详细信息，请先选取有疑问的项目，然后按下 F1 键。( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 )


指定的工程文件包含有无效的键值

指定的键值无效，请改正它。


无效的属性数组索引（错误 381）

属性值可能由一个数组的值所组成。此错误有以下原因和解决方法：

  • 部件的属性数组下界为零，上界则为数组的元素数减 1。不过，也可以下界为 1，上界为数组的元素数。

    检查部件的文档以确保在指定的属性的索引值在正确的范围内。

详细信息，可选取有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


无效的属性名Invalid property name

无效的属性名

导致这个错误的原因及解决办法如下：

  • 输入的属性名无效。也就是说，该属性名已经使用，或被系统保留使用，或包含无效的字符。

详细信息，选择有问题的项目并按下 F1 键（Windows系统）或 HELP（Macintosh 系统）。


无效的属性值（错误 380）

大多数属性只接受一定类型和一定范围的值。此错误有以下原因和解决方法：

  • 赋给属性的值不正确。

    参看属性的帮助主题，以决定属性的类型和取值范围。

详细信息，可选取属性项目并按 F1（在Windows中）或HELP（在Macintosh中）。


在指定的行上：指定的属性名无效

ASCII 文件所包含的某个属性名不是该控件有效的属性。


在指定的行上：指定的属性值无效

ASCII 文件包含的某个属性值，对该控件而言是无效的。该属性值会被它的缺省值替代。


指定的工程文件包含有无效的键值。有效的范围是 0 到 'item3'

关键字值的范围是有限制的。请将关键字值保持在所指定的范围。


无效的 ReDim

并非每个数组都可以重新决定大小的。这个错误的起因与解决方法如下所示：

  • 变量被隐含声明为 Variant，而您试图使用 ReDim 将它改变为一个数组。

    Variant 可以包含一个数组，但是如果它不是显式声明，就不可以使用 ReDim 使它成为数组。在使用 ReDim 指定它能够包含的元素数目之前，先声明 Variant。例如，在下面的代码中，ReDim AVar(10) 会导致无效的 ReDim 错误，但是 ReDim BVar(10) 不会：

    AVar = 1    ' 隐含声明 AVar。
ReDim AVar(10)    ' 导致无效的 ReDim 错误。
.
.
.
Dim BVar    ' 显式声明 BVar。
ReDim BVar(10)    ' 没有错误。
  • 试图使用 ReDim 来改变包含於 Variant 中的数组的不止一个维的大小。

    只可以用 ReDim 来改变 Variant 中数组的最后一维的大小。若要创建具有多维，且每一维的大小都能重新调整的数组，这个数组就不能包含在 Variant 中，并且必须以正常的方式声明它。

  • 只能用 ReDim 来改变正常数组中元素的数目，但不能改变那些元素的类型。

    如果想要可以改变元素类型的数组，请使用含在 Variant 中的数组。如果第一次声明这个数组，可用如下代码来改变其元素的类型和数目：

    Dim MyVar As Variant    ' 声明变量。
ReDim MyVar(10) As String    ' 更改为 String 子类型数组。
ReDim MyVar(20) As Integer    ' 更改为 Integer 子类型数组。
ReDim MyVar(5) As Variant    ' 更改为 Variant 子类型数组。
  • 您试图将 ReDim 用于 Automation 对象之成员的数组。

    删除 ReDim。

    注意 如果不指定变量类型，该变量即为 Variant（缺省）。这并不总是明显的。例如，下面的代码声明两个变量，第一个变量，MyVar，是 Variant；第二个变量，AnotherVar，是 Integer。

Dim MyVar, AnotherVar As Integer

详细信息，请先选取有疑问的项目，然后按下 F1 键。( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 )


在指定的行上：不能创建指定的引用

不能创建由某个程序行所指示的引用。


资源文件中格式不正确（错误 325）

当访问资源文件时，应确保资源格式必须正确。此错误有以下原因和解决方法：

  • 检索的资源文件是无效的格式，或文件的指定的资源是无效的格式。

    如果文件内容损坏，应从原磁盘重新安装此文件。如果错误仍在，请联系资源产品的供给商，以得到更新的文件或适当格式的资源版本。

详细信息，可选取有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


无效模板

模板的派生类不能作为模板。该错误有以下原因和解决方案：

  • 试图创建模板部件，但试图从模板来派生它。

    不能从模板派生出模板类。

关于其他信息，请选中有问题的条目并按 F1 键 (在 Windows中) 或 HELP (对于 Macintosh).


Visual Basic中不支持的类型

并不是所有的变量类型都被 Visual Basic 支持。这个错误的原因与解决方法如下所示：

  • 过程中使用了一种变量类型，但 Visual Basic for Applications 却没有与之等效的变量类型。例如，Visual Basic 中并没有 pointer 和 unsigned integer 这两种类型，所以如果试图从对象库中创建一个属于其中一种类型的变量，便会产生这个错误。在下列示例中，即使 Rainbow 可能是个正确的结构，但若包含 Visual Basic 不能认可的类型的话，则 Visual Basic就不能创建此种类型的变量。
    Dim MyVar As Rainbow    ' 产生错误。

    对一个对象库中的函数来说，若此变量类型是一个正确的参数类型，这个错误只代表不能在用户代码当中创建此种类型的变量。虽然有时不能声明对象文件上所指定的数据类型，不过 Visual Basic 中还是有一些等效类型可供使用。例如，虽然 Visual Basic 没有指针类型，还是可以利用 AddressOf操作符将一个函数指针传入一个 API 函数中（仅对Visual Basic 5.0）。并且，复选 Variant 类型的子类型。可以把这些等效类型当作是 Visual Basic 中不直接提供的类型来使用。然而，在一些情况下，Visual Basic 可能连等效类型都没有。例如，普通的数据指针便完全没有等效类型。

详细信息，请选择有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


函数标记为受限制的，或使用了 Visual Basic 不支持的类型

类型库 or 对象库中的过程，并不是每一个都能被每种编程语言访问的。类型或对象库的设计者可以设计一些函数，限制它们不被宏语言访问。这个错误的起因与解决方法如下所示：

  • 试图使用一个受限制的函数。

    在程序中不可用此函数。请参阅该过程库的帮助文档，看看是否有相同功能的方法。

  • 试图使用的函数的参数类型或返回的类型不是 Visual Basic 所支持的。

    可以用 Visual Basic 等价的类型来仿真返回类型。请检查 Variant 数据类型的子类型。这可能也适用于引用时所期待的非 Basic 参数。不过在仿真非 Basic 类型时，不能以按值方式来传递 Variant 数据类型。

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 ) 。


变量使用了Visual Basic不支持的类型（错误458）

并非每个程序语言都能使用出现在类型库或对象库中的每个变量。此错误有以下原因和解决方法：

  • 使用定义在类型库或对象库的变量，但 Visual Basic 不支持其数据类型。

    在 Visual Basic 程序中不能使用 Visual Basic 不能识别的变量。

详细信息，可选取有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


Visual Basic 不支持的调用约定

Visual Basic 不支持那些参数须依特定顺序传递，且须指定参数类型的过程调用约定。这个错误的起因与解决方法如下所示：

  • 使用 Visual Basic 不支持的调用约定调用此过程。例如，Visual Basic 不支持 16 比特 Microsoft Windows 环境下的 Pascal 调用约定。

    若 Visual Basic 不支持此调用约定，就不能从 Visual Basic 中调用此过程。请检查对象的帮助文档，看看是否还有其它方法可循。

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 ) 。


接口不能实现

不是所有的接口都能在 Visual Basic (Implements 只在 Visual Basic 5.0 中有效 ) 中实现。这个错误的起因与解决方法如下所示：

  • 此接口的某些元素是 Visual Basic 所不支持的。例如：Visual Basic 不具有无符号的长整型类型 (unsigned long integer type)，Visual Basic 不能设计象 "out-only" 这样的过程 参数。虽然 Visual Basic 支持在 Visual Basic 标识符中使用下划线字符 (_)，却不能实现在它的成员名称使用下划线的接口。

    在 Visual Basic 中不能实现该接口。

详细信息，请先选取有疑问的项目，然后按下 F1 键。( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 )


Set Next 语句只适用于当前过程中可执行的代码行

可以选择“设置下一个语句”命令，来指示当这个中断的程序继续执行时应该从何处开始。这个错误的原因与解决方法如下所示：

  • 选择这个命令时，光标所在行并没有可执行语句。

    将光标放在一个有可执行语句的行然后重试一次。声明、行标签及注释都不能被执行，所以那些只有声明、标签及注释的行都不能作为“设置下一个语句”命令的目标。

  • 当选择该命令时，光标所在行在当前执行的过程之外。

    将光标转到当前执行过程的一行上。


无效的数据格式

从文件中读入的数据不是期待的格式。这个错误的起因与解决方法如下所示：

  • 工程文件或对象库文件不是损坏了，就是其格式不能被辨识。

    设法得到工程文件或对象库文件的新版本。

  • 可能试图将可执行文件 .exe 加载到模块中。

    加载源代码。

  • 可能使用了“引用”对话框及“对象浏览器”添加对文件的引用，该文件不是有效的对象库，或者它所包含的 Basic 工程的格式不为主应用程序支持。例如，Microsoft Excel 不支持 .bas 文件、.frm 文件、以及含有 Basic 代码的 Microsoft 工程文件。

    请将出现问题的文件加载至创建它的应用程序中，然后以兼容的格式保存它一次。例如，对象库源代码可以被 MKTYPLIB 处理；和 QuickBasic 和 Visual Basic 代码可以保存为文本格式，等等。

详细信息，请先选取有疑问的项目，然后按下 F1 键。( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 )


无效的内部枚举

不是所有类型在枚举定义中都是有效的。该错误有以下原因和解决方案：

  • 试图指定字符串或某些其它无效类型来作为 Enum 成员的值。

    用来指定 Enum 成员的常数表达式的值必需是 Long 类型或其它 Enum 类型。

关于其他信息，请选中有问题的条目并按 F1 键 (在 Windows中) 或 HELP (对于 Macintosh)。

未知错误

导致这个错误的原因及解决办法如下：

  • 发生不可预见错误,关闭并重新启动系统。

详细信息，选择有问题的项目，并按下F1键 （windows系统） 或HELP （Macintosh 系统）。


在过程内无效

此语句不能出现在子过程或函数过程中。这个错误的起因与解决方法如下所示：

  • 下列语句之一出现在过程中：Declare、Def type、Private、Public、Option Base、Option Compare、Option Explicit、Option Private Enum与 Type。

    从过程中删除这些语句。这些语句可以放在模块级别中。

详细信息，请先选取有疑问的项目，然后按下 F1 键。( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 )


Type 块内的语句无效

只有元素名称及其 As type 子句以及注释可以出现在 Type...End Type 语句块内。这个错误的原因与解决方法如下所示：

  • 把一个无效的语句放在用户定义类型的定义中。

    请删除掉除了注释、元素名称及 As type 子句以外的任何东西。

详细信息，请选择有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


在 Enum 之外是无效的

Enum 这种数据类型可用来创建一组明确的常数（称作枚举值）。这个错误具有以下的起因与解决方法：

  • 在 Enum 定义以外的地方使用了End Enum。

    检查可能来自 Enum 定义主体和 End Enum 之间的任何文本。

详细信息，请选取有疑问的项目，然后按下 F1 (在Windows中) 或 HELP (在Macintosh中)键。


在过程外无效

该语句必须发生在子过程、函数过程或 Property 过程（Property Get、Property Let 和 Property Set）内部。这个错误的起因与解决方法如下所示：

  • 一个可执行的语句，如 Static 或 ReDim，出现在模块级别中。

    在模块级中 Static 是不需要的，因为所有的模块级变量都是静态的。在模块级中用 Dim 来代替 ReDim。想要在模块级中创建动态数组，请用 Dim 加空括弧来声明它。

    注意 在模块级只能使用注释与声明性语句，例如 Const、Declare、Def type、Dim、Option Base、Option Compare、Option Explicit、Option Private、Private、Public 和 Type。子过程、函数过程和 Property 过程语句发生在它们的过程体之外，但在过程内声明。

详细信息，请先选取有疑问的项目，然后按下 F1 键。( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 )


Type 块外的语句无效

Type...End Type 语句块外的变量声明语法与用户定义类型的元素的声明语法是不一样的。这个错误的原因与解决方法如下所示：

  • 试图在 Type...End Type 区块外或语句外声明一个变量。

    当在一个 Type...End Type 区块外以 As 子句声明一个变量时，请使用下列声明性的语句，Dim、ReDim、Static、Public 或 Private。例如，下列代码中的第一个 MyVar 声明便会产生这项错误，第二及第三个 MyVar 声明则是正确的：

    MyVar As Double    '无效的声明语法。

Dim MyVar As Double

Type AType
    MyVar As Double    ' 这是一个正确的声明语法
End Type    ' 因为它位于 Type 块内。
  • 使用了一个 End Type 语句，但却没有与之相对应的 Type 语句。

    请检查是不是有一个不匹配的 End Type，若有，在前面加上Type语句，若这个 End Type 语句是多出来的，就把它删除。

详细信息，请选择有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


设备 I/O 错误（错误 57）

外部设备时常会有无法预测的错误。此错误有以下原因和解决方法：

  • 当程序在使用像打印机或驱动器这类设备时，发生了输出/输入错误。

    确保设备操作正常，然后重试一次。

详细信息，可选取有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


'item'设计器只用于 DLL 工程中

导致这个错误的原因及解决办法如下：This error has the following causes and solutions:

  • 指定设计器只能用在 ActiveX DLL 工程中。

    试着在 ActiveX DLL 工程中使用这种设计器。

详细信息，选择有问题的项目并按 F1 键（Windows 系统）或 HELP（Macintosh 系统）。


标签未定义

这个错误的起因与解决方法如下所示：

  • 引用的行标签或行号 （例如在 GoTo 语句中）在引用的范围之外

    标签必须在含有该引用的过程中，行标签只有在其所属的过程中才可见。

详细信息，请先选取有疑问的项目，然后按下 F1 键。( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 )


对象库的语言设置与当前工程不兼容

此引用不能被添加。这个错误的原因与解决方法如下所示：

  • 企图添加一个对象库的引用，但其区域却与当前工程的区域不兼容。所以这个引用不会被添加进去。想使用此对象库，必须先创建一个与它的区域兼容的工程。

    请试着以给定语言对 Visual Basic for Applications 及主机应用程序进行注册。此对象库便可出现在“引用”对话框。

    说明 当 Visual Basic 是主机应用程序时，改变一个工程的语言设置是不可能的。任何被使用的对象库都必须与 English/U.S. 设置兼容。


#ElseIf 之前必须有配对的#If 或 #ElseIf ，而且其后要有#ElseIf、#Else 或 #End If

#ElseIf 是一个条件编译指令。这个错误的起因与解决方法如下所示：

  • #ElseIf 之前没有配对的 #If 或 #ElseIf 子句。

    将 #If 语句放在 #ElseIf 之前，或删除放置不正确的 #End If。

  • #ElseIf 之前有 #Else 或 #End If 子句。

    正确结束前一个 #If 区块，或将前一个 #Else 改成 #ElseIf。

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 ) 。


在 #Else 子句之前必须有配对的 #If

#Else 是一个条件编译指令。这个错误的起因与解决方法如下所示：

  • #Else 之前没有相对应的 #If 或 #ElseIf 子句。

    请检查前一个 #If 和这一个 #Else 之间是否被另一个 #End If 隔开了。在一个 #If 区块中只能有一个 #Else，若使用连续的两个 #Else 子句就会造成此错误。

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中) 或 HELP ( 在 Macintosh 中 )。


必须以 #End If 结束 #If 块

#If 是一个条件编译命令。这个错误的原因与解决方法如下所示：

  • 发现一个 #If 块没有以 #End If 结束。

    请把 #End If 加到适当位置。

详细信息，请选择有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


在 #Else If、 #Else or #End If 之前必须有配对的 #If

#Else If、#Else 与 #End If 都是条件编译指令。这个错误的起因与解决方法如下所示：

  • #Else If、#Else 或 #End If 之前没有配对的 #If 子句。

    请检查前一个 #If 和这一个有问题的子句之间是否被另一个插入块隔开了，或者 #If 之前有一个数字符号 (#)。若都不是，请将 #If 摆在适当的位置。

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中) 或 HELP ( 在 Macintosh 中 ) 。


对象已装入（错误 360）

此控件数组中的控件已经装入。这项错误的原因及解决方法如下：

  • 试图以 Load 语句，在运行时添加一个控件到控件数组中，但是所引用的索引值已经存在。

    请将索引改成一个新值，或是检查代码是否以相同的索引值，多次执行 Load 语句。


指定的文件是旧版本。此程序需要较新版本（错误 368）

ActiveX 控件 是旧版本。这项错误的原因及解决方法如下：

  • 当前版本的 ActiveX 控件中属性的属性数与所期望的属性数不匹配。

    请以较晚版本的 ActiveX 控件来替换。


在当前状态下不能卸载（错误 365）

某些情况下，不能从一个窗体中卸载一个窗体或控件。这项错误的原因及解决方法如下：

  • 对于具有 Paint 事件窗体上的控件，或其 Paint 事件程序中有一个 Unload 语句的窗体。

    请从 Paint 事件程序中删除此 Unload 语句。

  • ComboBox 中的 Change、Click 或 DropDown 事件中有一个 Unload 语句。

    请从事件程序中删除 Unload 语句。

  • 在 HScrollBar 或 VScrollBar 控件的 Scroll 事件中有一个Unload 语句。

    从事件程序中删除 Unload 语句。

  • 在 Data、Form、MDIForm 或 PictureBox 控件的 Resize 事件中有一个 Unload 语句。

    请从事件中删除 Unload 语句。

  • 在 MDIForm 的 Resize 事件中有一个 Unload 语句，它试图卸载一个 MDI 子窗体。

    请从事件中删除 Unload 语句。

  • 在 Data 控件的 RePosition事件 或 Validate 事件中有一个 Unload 语句。

    请从事件中删除 Unload 语句。

  • 在 OLE Container 控件的 ObjectMove 事件中有一个 Unload 语句。

    请从事件中删除 Unload 语句。


The ActiveX设计器的类型信息和保存的不匹配，不能被加载.

ActiveX设计器的类型信息和保存的不匹配，不能被加载。

导致这个错误的原因及解决办法如下：

  • 由于ActiveX设计器的类型信息和保存的不匹配，因此，工程不能加载。这可能是一个已损坏的文件。

    试着加载这个工程的一个复本。

详细信息，选择有问题的项目并按 F1 键（Windows系统）或 HELP（Macintosh系统）。


找不到所指定的 ActiveX 控件（错误363）

正被装入的窗体包含有一个 ActiveX 控件，它不是当前工程的组成部分。 这项错误的原因及解决方法如下：

  • 可能手工编辑了工程的 .vbp 文件，添加了一个含有不属于本工程 ActiveX 控件的窗体。

    请在窗体装入后，使用“文件”菜单中的“添加文件”命令，将该 ActiveX 控件添加到本工程中。

  • 可能手工编辑了工程的 .vbp文件，添加了一个窗体，其中含有较早版本的 ActiveX 控件。

    请在窗体装入后，删除窗体中较早的版本，再放入以后版本的控件。


不能装入或卸载此对象（错误 361）

Load 语句或 Unload 语句中引用了无效的对象或控件。这项错误的原因及解决方法如下：

  • 试图装入或卸载一个不可装入的对象，例如 Screen、Printer 或 Clipboard。

    从代码中删排错误的语句。

  • 试图装入或卸载不属于 控件数组的控件。例如，假设存在有一个 Name 属性为 Text1 的 TextBox，则 Load Text1 将会造成这项错误。

    请从代码中删除错误的语句，或改变对控件数组中控件的引用。

  • 试图在父菜单的 Click 事件中卸载一个 Menu 控件。

    请用其它过程卸载此 Menu 控件。

  • 试图卸载 Menu 控件中最后一个可见的菜单项目。

    请在卸载菜单项目之前，先检查控件数组中其它菜单项目的 Visible 属性设，或是从代码中删除错误的语句。


激活控件'tem 1'时失败。这个控件可能和你的应用程序不兼容。确定使用版本的控件是由你的应用程序提供.

激活控件 ’item1’ 时失败。这个控件可能和你的应用程序不兼容。确定使用的控件是由提供给您的应用版本。

导致这个错误的原因及解决办法如下：

  • 由于指定控件和应用程序不兼容，因此应用程序不能激活这一控件。当系统目前使用的控件版本和你的应用程序提供的控件版本不相同时，发生这一错误。

详细信息，选择有问题的项目并按 F1 键（Windows系统）或 HELP（Macintosh系统）。


Failed 从‘item2’中加载控件‘item1’时失败。‘item2’的版本可能较低。确定使用的控件是由你的应用程序提供的版本。

从 ‘item2’ 中加载控件 ‘item1’时失败。’item2’的版本可能过时。确定使用的控件是提供给您的应用程序版本。

导致这个错误的原因及解决办法如下：

  • 正在使用的版本过时。

详细信息，选择有问题的项目并按 F1 键（Windows系统） 或 HELP（Macintosh系统）。


对象已卸载（错误 364）

窗体已从它的 _Load 过程中卸载。这项错误的原因及解决方法如下：

  • 一个在其 _Load 过程中有 Unload 语句的窗体，被隐含地装入。例如，下面将会隐含地装入 YourForm，如果它尚未装入的话：
    MyForm.BackColor = YourForm.BackColor.

    请从 Form_Load 过程中删除 Unload 语句。


对象没有 Property Let 过程

不能给属性赋值，除非它有 Property Let 方法。这个错误具有以下的起因与解决方法：

  • 试图给属性赋值，但它没有 Proeprty Let 方法。

  • 不能直接给这个属性赋值，若这个类是您创建的，您可用 Property Let 方法来修改其接口。否则，请查阅此部件的文档，看看是否有其它间接的方式。

详细信息，请选取有疑问的项目，然后按下 F1 (在Windows中) 或 HELP (在 Macintosh中)。


指定的库或工程已被引用了

“添加引用”对话框显示被引用的库及工程。这个错误的原因与解决方法如下所示：

  • 选择了“添加引用”对话框中的“浏览”按钮，然后选定了一个类型库或工程，但该类型库或工程却已在“添加引用”对话框的“可使用的引用”中列出。

    想让一个工程或对象库成为工程中的一部分，请显示“引用”对话框，并确定此类型过程库或工程名已被复选。

详细信息，请选择有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


含有这个符号的库不是当前工程引用的，所以该符号未定义。现在您想添加对该库的引用吗？

  • 类型与对象信息都内含在库中。这个错误具有以下的起因与解决方法： 这个符号的定义在类型库中。

  • 若想将符号定义为包含在库中，单击“确定”，以添加对该库的引用。

详细信息，请选取有疑问的项目，然后按下 F1 (在Windows中) 或HELP (在Macintosh中)键。


对象库未注册

Visual Basic for Applications 对象库已不再是一个独立文件，它已被集成到动态链接库 (DLL)中。

在较早期的版本当中，当启动一个使用 Visual Basic for Applications 的应用程序时，特定的对象库会被装入。这个错误的原因与解决方法如下所示：

  • 企图装入前一个版本的 Visual Basic for Applications 对象库 (vaxxx.olb) 或主机应用程序对象库。然而，却不能在系统注册表中找到正确的语言版本。

    请重新注册应用程序。在 Macintosh 上，请从 Macintosh Preferences 文件夹中删除 vba.ini 文件，并重新启动应用程序。

详细信息，请选择有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


行太长

Visual Basic 代码的物理行最多可含 1023 个字符。这个错误的起因与解决方法如下所示：

  • 一行中含有太多字符。

    用续行符 ( _) 可创建长的逻辑行。一个逻辑行，即 24 个连续的续行字符，最多可以包含 25个物理行。这样，逻辑行的字符总量可达 10,230 字符。如果超过了，必须将该行分为若干语句，或指定一些表达式为中间变量。

详细信息，请先选取有疑问的项目，然后按下 F1 键。( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 )


添加监视表达式的最大数目

监视窗口中所能包含的监视表达式数目是有限制的。这个错误的原因与解决方法如下所示：

  • 在监视窗口所添加的监视表达式已达上限。

    请删除一个监视表达式，以便添加一个新的监视表达式，或是在立即窗口中显示想知道的值。

详细信息，选择问题项然后按F1键 （在Windows中）或HELP（在Macintosh中）。


对象不支持当前的区域设置（错误 447）

并非所有对象都支持全部的区域设置。此错误有以下的原因和解决方法：

  • 在当前的工程中，对并不支持此区域设置的对象进行访问。例如，如果当前工程的区域设置为加拿大法语，那么所要访问的对象也必须支持那个区域设置。

    检查对象所支持的区域设置。

  • 对象依靠动态链接库 (DLL)或Macintosh代码资源中对国际语言的支持，但是它们，例如，OLE2NLS.DLL，有可能过期了。

    获取最新版本的 DLL，且它是能支持当前工程区域的 DLL。

详细信息，可选取有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


Loop 没有 Do

Do 循环必须以 Do 语句开头。这个错误的起因与解决方法如下所示：

  • 将没有终结的循环块嵌套在另一个循环中。

    改正 Do...Loop 的语法。

详细信息，请先选取有疑问的项目，然后按下 F1 键。( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 )


远程处理的类型库或对象库的连接已丢失。（错误 442）

在远程访问期间(当访问的对象为另一个进程的一部分，或正在另一个机器上执行)，与含有对象信息的库连接时，产生了中断。此错误有以下原因和解决方法：

  • 与远程处理的对象库或类型库的连接中断。

    请按下列步骤重新连接：

    1. 重新激活应用程序对象。

    2. 在错误对话框中进入它的帮助主题单击“确定”，然后会显示出“引用”对话框。

    3. 失去的引用在左侧会出现 MISSING 字样。

    4. 删除失去的引用。

    5. 在“引用”对话框中，单击复选框选取在步骤 1 中的对象。

详细信息，可选取有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


Lset 不允许

LSet 用来使字符串和用户定义类型 变量中的数据向左对齐。这个错误的起因与解决方法如下所示：

  • 试图对含有字符串、对象或 Variant 的用户定义类型使用 LSet。

    必须各别赋值元素，从这个用户自定义类型变量至另一个。

详细信息，请先选取有疑问的项目，然后按下 F1 键。( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 )


只有在字符串和用户定义类型上才允许LSet

LSet 用来使字符串和用户定义类型 变量中的数据向左对齐。这个错误的起因与解决方法如下所示：

  • 指定的变量并非字符串或用户自定义类型。

    若试图将整个数组赋予另一个数组，LSet 就不能正常的运作。必须使用循环，各别赋值每个元素。

  • 试图对一个对象使用 LSet。

    LSet 也可以用来将用户定义类型变量中的元素赋予一个不同的，但兼容的用户定义类型。虽然对象与用户定义类型类似，但不能对其使用 LSet。同样地，也不能对含有字符串、对象或 Variant 的用户定义类型变量使用 LSet。

详细信息，请先选取有疑问的项目，然后按下 F1 键。( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 )


必须是变量--不能给这个表达式赋值

必须是变量—不能给这个表达式赋值

这个错误通常都发生在企图给一个不能接受该赋值的东西赋值。这个错误的原因与解决方法如下所示：

  • 企图使用数值表达式来当作 Len 函数的参数。

    Len 函数不接受数值表达式、数值、文字量，以及二进制数值表达式，但它接受字符串、数值变量、字符串表达式以及用户定义类型 变量。

  • 使用函数调用或是表达式作为 Input #、Let、Get、Put 的参数。例如，可能使用了一个参数，这个参数看来似乎是对一个数组变量的有效引用，但事实上是一个同名的函数调用

    请不要将函数调用作为 Input #、Let、Get、Put 的参数。

  • 企图给一个先前已声明为常数的标识符赋值。

    请更改标识符的名字。

  • 试图使用一个非变量来当作 For...Next 结构的循环计数器。

    请使用变量作为计数器。

  • 试图指定一个值给一个只读属性或一个包含多个变量 (如 X + Y) 的表达式。每一次赋值都会将一个值放在内存中的一个位置。所指定的表达式必须代表一个唯一可写入的位置。

    请赋值给一个单一的、可接受数据的变量名。

  • 试图使用一个未经声明但已在类型库中定义为常数的变量。

    请改变此变量的名字，或显式地声明它。

详细信息，请选择有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


在指定的行上：控件的最大嵌套层超过了指定的项

ASCII 文件所含控件的嵌套超过七层。


成员标识符已存在于导出此对象模块的对象模块中

对象模块成员使用的标识符名称，不能与导出它们的对象模块中的标识符冲突。这个错误的原因与解决方法如下所示：

  • 对象模块中的过程或数据成员标识符，使用了一个在导出它们的对象模块中已使用的标识符。例如，Form 中已有 BackColor 属性，所以下列代码会引发此错误。
    ' Form 里面已有一个 BackColor 属性。
Dim BackColor As Integer    ' 产生错误。

Function BackColor()    ' 产生错误。
End Function

    修改对象模块中与成员标识符冲突的标识符。

    注意 下面的名称不能被用作属性或方法名，因为它们属于基本的IUnknown和IDispatch接口：QueryInterface、AddRef、Release、GetTypeInfoCount、GetTypeInfo、GetIDsOfNames、Invoke。使用这些名称将会引起编译错误。

详细信息，请选择有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


在指定的行上：所有的控件必须在菜单之前；不能加载指定的控件

控件出现在 ASCII 窗体文件中的位置不对。所有的控件必须在菜单之前加载。


在指定的行上：在指定的文件中，控件类丢失了或无效了

在 ASCII 文件的窗体描述中，包含未知的控件类，或类名不是 Visual Basic 的有效字符串。


在指定的行上：在指定的文件中，控件名丢失了或无效了

在 ASCII 文件的窗体描述中，包含未知的控件名，或控件名不是 Visual Basic 的有效字符串。


右括号丢失

在语句中的括号必须成对。这个错误的原因与解决方法如下所示：

  • 有个左括号而没有右括号与其匹配。

    在要括起来的内容的末尾，补上一个右括号。

详细信息，请选择有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


在指定的行上：语法错误：指定的属性漏掉了等号 (=)。

ASCII 文件包含的某个属性名与其值之间少了等号 (=)。该属性不会被加载。


Visual Basic for Applications 对象库未找到

Visual Basic for Applications 对象库不再是一个独立文件；它被集成到动态链接库 (DLL)中。

在一些特殊情况下，可能需要用到符合此工程语言以前版本的对象库(vaxxx.olb 或 vaxxxx.olb)，但却找不到。这个错误的原因与解决方法如下所示：

  • 对象库整个不见了、不在预期的目录中、或是版本不对。

    请查找磁盘，确定对象库是位于主机应用程序文件所指定的正确目录中。

如果找不到的过程库，是由主机应用程序 所安装的语言版本。最简单的解决方法便是重新运行 setup 过程。若一个工程需要一个与主机应用程序所附的语言对象库不同的语言对象库(例如，若某人送一个工程，此工程是在另一台语言设置不同的机器上写成的)，请确定正确语言版本的 Visual Basic 对象库已包含在此工程中，且已安装在预期的位置上。

应用程序可能会支持其对象库的不同语言版本，想查看需要哪种语言，请显示 “引用” 对话框，并察看对话框的底部显示哪种语言。

在每个平台上，对象库以不同的语言版本存在。然而将工程在平台间转移时，例如，从 Macintosh 到 Microsoft Windows，该平台引用过程库的正确语言版本，一定要在主机应用程序文件中所指定的位置可见。请注意有些语言内码是双字符，有些是三字符。

Visual Basic 对象库的文件名是由下列部分所组成：

  • Windows: 应用程序代码 + 语言代码 + [版本号].OLB。例如：

    法文版 Visual Basic for Applications 对象库的第二版本的文件名便是 vafr2.olb。

  • Macintosh: 应用程序名 语言代码 [版本号] OLB。例如：

    法文版 Visual Basic for Applications 对象库的第二版本的文件名便是

    VA FR 2 OLB。

若在系统中找不到丢失的一个工程或对象库，请洽询此引用工程的作者。若丢失的是一个 Microsoft 应用程序对象库，可用下列方法来获得：

  • 若能方便取得 Microsoft 电子工艺支持服务，请参考此帮助文件的工艺支持部分。在电子服务下，将可找到如何使用适当服务的指导选项。

  • 若没有 Microsoft 电子工艺支持服务，可以用 application note 的形式来索取 Microsoft 对象库。此帮助文件的工艺支持部分，也有关于如何洽询当地的 Microsoft 产品支持部的信息。

详细信息，请选择有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


显示模式窗体时不能显示非模式窗体

导致这个错误的原因及解决办法如下：

  • 在消除模式窗体之前试图显示一个非模式窗体。

    首先消除模式窗体。

详细信息，选择有问题的项目并按 F1 键（Windows系统） 或 HELP （Macintosh系统）。


名称与已有的模块、工程或对象库相冲突

模块、对象库及引用工程在同一工程中，必须用唯一的名称来命名。这个错误的原因与解决方法如下所示：

  • 在此工程中已经有一个模块、工程或对象库使用了这个名称。文件扩展名并不能视为文件名的一部分，所以尽管扩展名不同，也不能用来区别两个文件。

    请为名称重复的模块、工程、对象库取一个不同的的名称。

  • 企图添加一个引用到工程、对象库，而其文件名（不包含副文件名）与当前工程中的一个模块的名称相同。

    请改变此模块的名称，或改变未能添加的文件的文件名。

详细信息，请选择有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


必须首先关闭或隐藏最上方的形式窗体（错误 402）

试图关闭或隐藏形式窗体，但它并非位于 z-顺序的最上方。这项错误的原因及解决方法如下：

  • 另一个形式窗体在 z-顺序 中，高于当前所要关闭或隐藏的形式窗体。

    首先对 z-顺序 中较高的形式窗体，使用 Unload 语句或 Hide 方法。形式窗体是以将 style 参数设置成 1 - vbModal 的 Show 方法来显示的。


窗体己经显示；形式上不能再进行 Show（错误 400）

不能用 Show 方法，形式上显示一个可见的窗体。这项错误的原因及解决方法如下：

  • 试图在可见的窗体上，将 style 参数 设置成 1 – vbModal，使用 Show 方法。

    请在形式上显示窗体之前，对窗体使用 Unload 语句或 Hide 方法。


模块太大

模块包含了工程中的代码。这个错误的原因与解决方法如下所示：

  • 此模块的代码太多了。

    创建一个新模块并把原有模块中的一些过程转到新模块中。若原有模块内有些数据的声明为模块级别，但却又必须被新模块所见，请将这些数据声明为 Public。

    说明 注释并不算是代码。也就是说删掉注释并不能消除这项错误。

详细信息，请选择有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


模块的类型无效

标准模块不能表示一个类，也不能用变量的形式实例化。这个错误的起因与解决方法如下所示：

  • 将标准模块的名称使用在 Dim 或 Set 声明中。

    请检查模块名称的拼写，并确定它对应着窗体、MDI 窗体，或类模块。

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 ) 。


期待变量或过程，而非模块

在当前的范围中没有以此名称命名的变量或过程，但有以此名称命名的模块。这个错误的起因与解决方法如下所示：

  • 模块的名称被当作变量或过程。

    请检查变量或过程名称的拼写，确定所要引用的名称不是另一个模块所私有的。模块名称可以用作限定符，但不可以单独使用。

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 ) 。


模块未找到

模块并不是从一个代码引用中装入的，它必须是工程中的一部分。这个错误的原因与解决方法如下所示：

  • 所需要的模块并不在指定的工程中。例如，当 MyModule 不在 MyProject 这个工程中时，MyModule.SomeVar = 5 这个语句便会产生此错误。

    关于工程中模块的信息，参见主机应用程序的文档。


当前范围内出现重复的声明

指定的名称在此范围级上已被使用。例如，假如两个变量定义在不同的过程中时，它们可以有相同的名称；但如果被定义在同一个过程中则不可以。这个错误的起因与解决方法如下所示：

  • 一个新的变量或过程，与已经存在的变量或过程有相同的名称。例如：
    Sub MySub()
    Dim A As Integer
    Dim A As Variant
    . . .        ' 此处为其它声明或过程的过程代码。
End Sub

    请检查当前的过程、模块或工程，并删除任何重复的声明。

  • Const 语句使用一个与已经存在之变量或过程相同的名称。

    请将出现问题的常数删除或重新命名。

  • 不止一次地声明一个固定数组。

    删除或重新命名。

搜索重复的名称。当指定所要查找的名称时，省略所有的类型声明字符，因为假如名称相同而类型声明字符不同就会发生冲突。

请注意，模块级别变量可以与被声明在过程中的变量同名，但如果想在过程中引用模块级变量时，必须以模块名称来限定它。在过程中、模块名称和引用工程名称可以作为变量名被重复使用，并且也能被限定。

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 ) 。


必须是行中的第一个语句

并非所有的关键字都可以出现在代码行的开头。这个错误的原因与解决方法如下所示：

  • 在同一行中 Sub、Function 或 Property 语句之前，放置了另一个语句。

    Sub、Function 或 Property 语句必须是所在行中的第一个语句(只有关键字 Public,、Private 或 Static 可在其前面).

  • 在同一行中 End If、Else 或 ElseIf 语句之前，放置了另一个语句。

    End If、Else 或 ElseIf (只有在一个 If 块结构中使用时) 语句必须是所在行中的第一个语句。

详细信息，请选择有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


'item' 'item'设计器必须是公有的，并且在标准EXE 工程中不能使用它

'item' 设计器必须是公有的，并且在标准 EXE 工程中不能使用它

导致这个错误的原因及解决办法如下：

  • 指定设计器的Instancing 属性必须设置为 Public。

    在标准EXE工程中，不能使用这种设计器。

详细信息，选择有问题的项目并按下 F1 键（Windows 系统）或 HELP（Macintosh 系统）。


'item' 'item'设计器不能是私有的

'item'设计器不能是私有的

导致这个错误的原因及解决办法如下：T

  • 指定设计器的 Instancing 属性不能设置为Private。

详细信息，选择有问题的项目并按下 F1 键（Windows 系统）或 HELP（Macintosh系统）。


在指定的行上：指定的属性必须是引号括起来的字符串

ASCII 文件包含的属性应该出现在引号 (" ") 之中，但是引号漏掉了。在窗体描述中，这一行将被忽略。


这个编辑需要复位

在大多数情况下，可以编辑代码并从编辑的地方继续运行该代码。该错误有以下原因和解决方案：

  • 修改代码后需要从初始化的地方开始重新运行代码。

    如果破坏了过程中的代码，且当前执行行不再处于和该过程中断前相同的上下文中，就可能会发生这个错误。

关于其他信息，请选中有问题的条目并按 F1 键 (在 Windows中) 或 HELP (对于 Macintosh).


必须指定打印的项目

没有指定要打印的内容。 当从“ 文件”菜单选取“打印”命令之后，对于“打印”对话框中的“窗体”或“代码”复选框，至少有一个应当复选。


已指定的命名参数

在每次过程调用中，参数表中的命名参数只能用一次。这个错误的原因与解决方法如下所示：

  • 在一次过程调用中，多次指定了相同的命名参数。例如，若过程 MySub 期待命名参数 Arg1 与 Arg2，则下列调用便会产生这个错误：
    Call MySub(Arg1 := 3, Arg1 := 5)

    请删除重复的参数指定。

  • 同一个参数，既用位置来指定，又用命名参数的方式来指定，例如：
    Call MySub(1, Arg1 := 3)

    请删除其中一种重复的指定方式。

详细信息，请选择有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


对象不支持命名的参数（错误 446）

并非所有对象都支持命名参数。此错误有以下原因和解决方法：

  • 访问的对象其方法不支持指定的参数。

    当执行此对象的方法时，请指定参数到相应位置。参看部件的文档以获得更多参数位置及类型的信息。

详细信息，可选取有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


未找到命名的参数（错误 448）

除非命名参数在过程定义中出现，不然可能在过程执行时不能使用。此错误有以下原因和解决方法：

  • 指定一个命名的参数，但过程中没有定义此参数的名称。

    检查参数名称的拼写。

详细信息，可选取有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


需要属性数组索引 （错误 385）

属性的值是由数组组成，而不是单一的值。此错误有以下原因和解决方法：

  • 没有指定所要访问的属性数组的索引值。

    检查部件的文档以找出数组的适当索引范围。然后在属性访问语句中再指定正确的索引值。

详细信息，可选取有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


该名称的过程已经存在

在同一范围之内，过程名称必须唯一。应改变过程的名称。


Next 控制变量的引用无效

在 For...Next 循环的 Next 部分的数值变量，必须与 For 部分的变量相符。这个错误的起因与解决方法如下所示：

  • For...Next 循环之 Next 部分的变量，与 For 部分的变量不同。例如：
    For Counter = 1 To 10
    MyVar = Counter
Next Count

    请检查 Next 部分之变量的拼写，是否与 For 部分的相符。

详细信息，请先选取有疑问的项目，然后按下 F1 键。( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 )


Next，没有 For

Next 语句之前一定要有一个 For 语句与之配对。这个错误的原因与解决方法如下所示：

  • Next 语句没有与其相对应的 For 语句.

    请检查 For...Next 结构内的其他控制结构，看它们是否正确地配对。例如，在 For...Next 结构内，没有与 If 配对的 End If 便会产生这个错误。

详细信息，请选择有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


在这行上不允许有断点

断点 只能被放置於语句中正确的部分。这个错误的起因如下：

  • 在不能接受断点的行上放置断点，例如：
    • 该行只包含注释。

    • 该行只包含行标签。

    • 该行只包含声明 (Const、Dim、Static、Type，等等)。

    • 在隐含模块中的任一行。

    • 在“立即”窗口中的任一行。

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 ) 。


在指定的行上：在指定菜单上不能设置 Checked 属性，父菜单不能是被选定的

Checked 属性设置为 True 的顶层 Menu 控件，出现在 ASCII 窗体文件中。顶层菜单不可以有核取记号。该 Menu 控件会被加载，但是它的 Checked 属性不会被设置。


对象的类尚未设置（错误 31018）

当设置 Action = 0（CreateEmbed 方法） 而未指定源文档(SourceDoc 属性），则 Class 属性必须设置成在系统上可用对象的类名称。

在设计时，要显示可用对象的类名列表，请单击 OLE 容器控件，并选择“插入对象”命令。


对象不是源自动化事件

对象必须提供缺省的源接口，才能为其编写事件过程。这个错误具有以下的起因与解决方法：

  • 试图为对象编写事件过程，但该事件在对象之外不可用。

    请查阅对象的帮助文档，可能会有关于其它间接方式的建议，可以用来处理这个事件。

详细信息，请选取有疑问的项目，然后按下 F1 (在Windows中) 或 HELP (在Macintosh中)键。


不能对所指定的设计器高速缓存文件写入；只能用正常文件装入

所用的 ActiveX 设计器 不能将信息写入高速缓存文件， 所以设计器只能用未缓存的信息装入。

要改进下次启动 Visual Basic 的性能，ActiveX 设计器将编写一个高速缓冲文件。设计器可能会因为磁盘空间太少或对驱动器没有访问权限而不能写入高速缓冲文件。请确保有足够可用的磁盘空间并且拥有对驱动器的访问权限。如果此问题仍然存在，请与 ActiveX 设计器的厂商联系。


行不是可执行语句

声明与注释不是可执行语句。这个错误的起因与解决方法如下所示：

  • 选取了“执行至光标处”命令，但该光标不在含可执行语句的行上。

    将光标放在靠近光标行的可执行语句上。

详细信息，请选取“运行”菜单中的“执行至光标处”命令，然后按下 F1 键。( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 )


指定的项不能被加载

语法错误会使 Visual Basic 不能分析以及加载文件，而窗体名称的冲突也会阻碍加载 ASCII 窗体。该窗体将不被加载，并且窗体的名称也不会显示在“工程资源管理器”中。

确定引起该错误的文件是正确格式的 ASCII 窗体，并且在工程中不同的窗体之间不存在冲突。


指定的项不能被注册

指定的文件不能在系统注册表中注册。这个错误与 Visual Basic 开发环境的部件所使用的类型库有关，表示在系统注册表中，该指定文件的项目已经损坏或该 DLL 本身已经丢失或损坏。


没有相关的帮助主题

并非所有的错误都具有相关的帮助主题。这个错误具有以下的起因与解决方法：

  • 这个错误没有帮助主题。

  • 请查阅 Readme 文件，在此可以找到一些最新的信息。


在指定的行上：找不到索引属性，而指定的控件已存在

该控件不能被加载，因为它没有索引，且它与先前加载的控件同名。


内存不足不能装入文件

Visual Basic 不能取得足够的内存装入文件。请关闭其它的应用程序然后重试一次。


无窗口控件不能有菜单

导致这个错误的原因及解决办法如下：

  • 试图在一个无窗口控件上添加菜单，这是不允许的。

    如果希望在控件上添加菜单，请选择窗口控件。

详细信息，选择有问题的项目，并按 F1 键（Windows 系统）或 HELP（Macintosh 系统）。


指定的区域已搜索过了。

当单击“替换”对话框中的“搜索下一个”或“替换”按钮时，替换的总个数没有指出。这种情况是由以下原因所产生且会造成下列影响：

  • 当进行搜索及替换操作时，可以指定复盖区域 — 选定文本、过程、模块或工程。

    若曾选定一个区域，那么此区域就成为默认搜索区域。若之前没有选定过任何区域，则当前模块便是默认搜索区域。要改变搜索范围，请选定“替换”对话框中另一个不同的搜索选项。

详细信息，请选择有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


在标准模块或者私有类中定义的枚举类型不能用作公共对象模块中的公共过程的参数或返回类型、公共数据成员、或公共用户定义类型的字段

在标准模块或者私有类中定义的私有枚举类型和枚举类型不能用作公共对象模块中的公共过程的参数或返回类型、过程、公共数据成员、或公共用户定义类型的字段

这个错误有以下的原因和解决方案：

  • 使用了一个非显露的枚举作为一个公共过程的参数或返回类型、或者作为一个显露的类的公共数据成员。

在这里，“显露的”就是说该枚举是从正在定义的 ActiveX 服务器中被显露的，也就是说该枚举是在一个 ActiveX Exe 或者 Dll 工程的公共类中声明的。


没有对象（错误 31004）

试图对一个不存在的对象执行某个动作。


无选定的文本

一定要通过选定文本才能执行这项操作。这个错误的原因与解决方法如下所示：

  • 在“查找”或“替换”操作之前，并没有选定任何文本。

    有些主机应用程序允许在查找及替换文本时指定选定范围，即使没有文本被选定。要选定文本，将光标转到欲选区域的起始处，然后按下 SHIFT 键并移动箭头键或在欲选区域的末尾处单击鼠标键来完成选定。若不想查找选定文本，请撤消“选定”选项。

详细信息，请选择有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


在指定的行上：在指定的菜单上不能设置Shortcut 属性，父菜单不能有快捷键

有定义的快捷键的顶层 Menu 控件，出现在 ASCII 窗体文件中。顶层菜单不能有快捷键。该 Menu 控件会被加载，但是它的 Shortcut 属性不会被设置。


属性或方法未找到（错误 423）

对象名称的拼写必须和对象库中的定义匹配。此错误有以下原因和解决方法：

  • 引用到 对象方法 或 对象属性，但 方法 或 属性 没有定义。

    可能将对象的名称拼错。查看对象定义了什么属性和方法，显示对象浏览器。选择相关的对象库来查看属性和方法的列表。

详细信息，可选取有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


所请求的类型库或向导不是 VBA 工程

并非所有 Visual Basic 中可用的元素都是既可读又可写的。该错误有以下原因和解决方案：

  • 试图从 Visual Basic 工程中对外接程序或类型库进行写操作。

    不能直接对作为 Visual Basic 工程的组成部分的预封装外接程序或类型库进行写操作。

关于其他信息，请选中有问题的条目并按 F1 键 (在 Windows中) 或 HELP (对于 Macintosh).


Property let过程未定义，并且property get过程没有返回一个对象（错误 451）

一些属性、方法和操作只能虱

适用于 Collection 对象。此错误有以下原因和解决方法：

  • 所指定的操作或属性虽只限于集合，但该对象并非集合。

    检查对象或属性名的拼写，或确保此对象为一个 Collection 对象。同样需检查用 Add 方法将对象添加到集合的语法应正确，并且检查所有标识符其拼写应正确。

详细信息，可选取有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


当前模块不支持 Print 方法

在所有的模块中，并非所有的方法与属性都适用。这个错误的起因与解决方法如下所示：

  • 试图在不能显示任何东西的对象上使用 Print 方法。例如，在标准模块中，不能不加限定地使用 Print 方法。

    请删除对 Print 方法的引用，或用一个适合的对象限定它。例如，用 Debug 对象限定它，以便在调试阶段在“立即”窗口中显示它的参数。

  • 试图在不能接受 Line、Circle、PSet 或 Scale 方法的对象上使用这些方法。例如，它们不能不加限定地出现在标准模块或 OLE Automation 类模块中。

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 ) 。


需要对象（错误 424）

引用属性和方法经常需要一个明确的对象限定符。此错误有以下的原因和解决方法：

  • 当引用对象属性或方法时，没有提供正确的对象限定符。

    如果没有提供的话，指定一个对象限定符。例如，从窗体的模块中引用窗体属性时，虽然可以省略对象的限定符，但是当从标准模块中引用一个属性时，则必须指定限定符。

  • 提供一个对象限定符，但不能识别出对象。

    检查对象限定符的拼写，并确保在所引用的程序中此对象是可见的。在 Collection 对象中，请检查每个 Add 方法的使用，以确保语法应正确，以及所有部件的拼写应正确。

  • 提供了正确的对象限定符，但调用的其他部分有错误。

    将非法路径当作主机应用程序中“文件打开”命令的参数会引起错误。请检查参数。

  • 在指定对象的引用时，没有使用 Set 语句。

    如果指定 CreateObject 调用的返回值为 Variant 变量，那么如果省略 Set 语句的话，此错误就可能会发生。在以下的代码示例中，创建一 个 Microsoft Excel 隐含实例，且返回 Variant RetVal 的缺省属性 ("Microsoft Excel" 字符串）并赋给 Variant RetVal，然后将 RetVal 当作对象引用时，发生了此错误：

    Dim RetVal                                ' 为一个 Variant。
' 缺省属性赋值为类型 8，即 Variant RetVal。
RetVal = CreateObject("Excel.Application")
RetVal.Visible = True                ' 错误在此发生。

    当给引用的对象赋值时，请使用 Set 语句。

  • 试图对正常对象执行无效动作时，就会发生此错误。例如，如对只读属性赋值时，就有可能接收到此错误。

    请检查对象的文档以确保执行的动作都正确。

详细信息，可选取有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


没有使用此对象的权限（错误 419）

没有访问此对象所需的权限。这项错误的原因及解决方法如下：

  • 当前没有权力访问这个对象。

    改变权限赋值，请洽询系统管理员或是该对象的创建者。


这个部件不支持该类事件（错误 459）

并非每一个部件都支持事件的客户吸收。此错误有以下原因和解决方法：

  • 与一个部件共同使用WithEvents变量，而该部件不能作为指定事件集合的事件源。例如，您可能正吸收一个对象的事件，然后创建另一个对象，而它将Implements第一个对象。尽管您可能认为可以从已实现的对象吸收事件，但其实这并不是自动进行的。Implements仅仅为方法和属性实现接口。

    不能对一个不是事件源的部件吸收事件。

  • 对于 Private UserControls，不支持 WithEvents，因为引发 ObjectEvent 所需的类型信息在运行时不可用。

详细信息，可选取有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


此部件不引发任何事件

一个事件过程必须对应由某一对象引发的事件，这个错误的原因与解决方法如下所示：

  • 为一个不引发事件的对象写了一个事件过程。

    不要写没有对应事件的事件过程。

  • 试图在不引发事件的类上使用 WithEvents。

    不要在不引发事件的类上使用 WithEvents。

详细信息，请选择有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


对象用法无效（错误 425）

大多数对象只能以特定方式使用，通常可能是试图在相关范围之外使用一个对象。例如，传递给拖放事件的有关对象的引用，就只能使用在相关事件中。


这个对象的一个或多个实例正在运行，此时，不能删除这个对象。

导致这个错误的原因及解决办法如下：

  • 试图删除一个正在运行的对象。

    从工程中删除这个对象之前必须关闭这个对象的所有实例。

详细信息，选择有问题的项目并按下 F1 键（Windows 系统）或 HELP（Macintosh 系统）。


找不到此部件的授权信息。未具有使用设计环境此项功能的合适授权（错误 429）

未被授权使用这个 ActiveX 控件。这项错误的原因及解决方法如下：

  • 在设计时 试图将 ActiveX 控件放置在一个窗体上，或试图与窗体上的 ActiveX 控件一起将窗体添加给工程，但是在注册表找不到相关的信息。

    注册表中的信息可能被删除了或是被损坏。请重新安装 ActiveX 控件或是接洽控件的供应商。


找不到窗体（错误 424）

找不到窗体。这项错误的原因及解决方法如下：

  • 试图以 Add 方法添加一个窗体到 UserForms 集合对象，但是没有这个名称的窗体类。例如， UserForms.Add "MyForm"，其中 MyForm 并不存在。

  • 请确认对于此工程该类名可以使用。


在指定的行上：不能创建内嵌的指定对象；找不到许可证

当从文本文件中加载窗体、用户控件、用户文档或属性页时，不能创建嵌入的对象，因为找不到许可证。必须要有使用该对象的许可证。请与对象的供应商连系以取得更详细的信息。该消息会被写入错误日志文件中。


对象变量或 With 块变量没有设置（错误 91）

创建对象变量有两个步骤。第一，必须先声明对象变量。然后必须用 Set 语句将一个正确的引用赋值给对象变量。同样地，With...End With 块必须先用 With 语句进入点来执行初始化。此错误有以下的原因和解决方法：

  • 试图使用的对象变量，还没有用一个正确对象的引用来赋值。

    给对象变量指定或再指定一个引用。例如，如果在下列的代码中省略 Set 语句的话，那么引用 MyObject 将会产生错误：

    Dim MyObject As Object    ' 创建对象变量。
Set MyObject = Sheets(1)    ' 创建一个正确的对象引用。
MyCount = MyObject.Count    ' 计数值赋给 MyCount。
  • 试图用的对象变量已经被设为 Nothing。
    Set MyObject = Nothing    ' 释放此对象。
MyCount = MyObject.Count    ' 引用了已释放的对象。

    再指定引用给对象变量。例如，使用新的 Set 语句给对象设置新的引用。

  • 此对象是正确的对象，但没有被设置，因为在对象库中，在 “引用” 对话框中没有被选取。

    在 “添加引用” 对话框选择对象库。

  • 在 With 块内GoTo 语句的去向。

    不要跳进 With 块。确保块使用 With 语句进入点以执行初始化。

  • 当选了 “设置下一条语句” 命令时，在 With 块内指定了一行。

    With 块必须用 With 语句执行初始化。

详细信息，可选取有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


指定的项是旧的文件格式。在保存时，将采用新的格式

这个文件是由先前的 Visual Basic 版本所创建。当要保存它时，将采用当前版本的格式。


自动化错误（错误 440）

当访问 Automation 对象时，发生了特定类型的错误。此错误有以下原因和解决方法：

  • 当执行某个方法时，或是得到或设置对象变量的属性时，发生了此错误。创建此对象的应用程序会报告此错误。

    检查 Err 对象的属性以决定错误的来源和性质。同样地，也可以在访问语句前，直接使用 On Error Resume Next 语句，然后在访问语句后检查错误。

详细信息，可选取有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


在自动化操作时文件名和类名找不到（错误 432）

GetObject 函数需要一个正确的文件名及路径，或系统登记的类名称。此错误有以下原因和解决方法：

  • 调用 GetObject 函数时所指定的文件名或类找不到。

    检查名称然后重试一次。确保 类 参数的名称和系统所登记的匹配。

详细信息，可选取有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


自动化对象没有缺省值（错误 443）

指定一个没有属性或方法的对象名称时，Visual Basic 会当作引用了该对象的缺省成员（属性或方法 )。然而，并非所有对象都设有缺省成员。此错误有以下原因和解决方法：

  • Visual Basic 不能决定指定对象的缺省成员。

    检查对象的文档，并且给出属性或方法的规格说明。

详细信息，可选取有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


对象不支持这个属性或方法（错误 438）

并非所有对象都支持所有属性和方法。此错误有以下原因和解决方法：

  • 指定的方法或属性在 Automation 对象中并不存在。

    参看对象的文档以获得此对象更多的信息，并检查属性和方法的拼写应正确。

  • 指定 Friend 过程做为被调用的后期绑定。

    在编译时间必须知道 Friend 过程的名称，它不能出现在后期绑定的调用上。

详细信息，可选取有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


类不支持自动化（错误 430）

并非所有的对象都能显露自动化接口。此错误有以下原因和解决方法：

  • 虽然在指定的 GetObject 或 CreateObject 函数调用中找到此类，但并没有显露编程的接口。

    除非一个对象有支持自动化的接口，否则不能写代码来控制该对象的行为。检查创建此对象的应用程序的文档，以了解在此对象类上使用自动化的限制。

  • 您将一个工程从 .dll 更改为 .exe，或从 .exe 更改为 .dll。如果您有一个已经编译并注册了的 .dll 服务器，然后您将工程类型更改为 .exe 并重新进行了编译，因为 .dll 和 .exe 已经在您的系统中注册了，因此您无法创建任何一个对象。您必须手工取消对旧的 .dll 或 .exe 的注册来避免这一问题。

    发生这一问题的原因是工程兼容性和将工程从 .exe 更改为 .dll 综合造成的。在工程兼容性中，CLSID 被保留，而不是 IID 被保留。因为 CLSID 被保留，所以最后被注册的类带有两个服务器，一个是进程内服务器，另一个是本地服务器。当创建一个实例时，将选择进程内服务器。当发生界面查询时，.dll 不支持 IID，因为它是新的。

详细信息，可选取有问题的项目，并按下 F1 （在 Windows 中）或 HELP （在 Macintosh 中）键。


内存不足不能运行；退出

Visual Basic 不能取得足够的内存来运行。请关闭其它的应用程序然后重试一次。


无足够内存来完全地保存工程

当要保存一个工程时，通常还要再保存一些额外的信息，使这个工程可以在以后的版本或其他平台上被装入。这个错误的原因与解决方法如下所示：

  • 内存不足，不能保存必需信息，以便在以后版本 Visual Basic 或其他平台上装入这个工程。

    如果计划在未来版本 Visual Basic 或其它平台上打开一个工程，请关闭一些应用程序，然后再保存。

详细信息，请选择有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


内存溢出；一些监视可能被删除

当系统将内存耗尽时，监视表达式会被删除以得到足够的内存来解决这种困境。这个错误的原因与解决方法如下所示：

  • 装入了太多应用程序、工程或模块。

    为了继续工作，请从内存中删除掉任何可有可无的元素，包括任何装入的已经不必要的应用程序、工程或模块。

详细信息，请选择有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


此操作在 DLL 中不允许

并非在动态链接库 (DLL)中允许所有的 Visual Basic 语句。这个错误具有以下的起因与解决方法：

  • 试图从类创建一个 DLL，但该类含有一个不能从 DLL 执行的语句。

    请检查类，并删除任何不能在 DLL 中运行的语句。例如，End语句。

详细信息，请选取有疑问的项目，然后按下 F1 (在Windows中)或HELP (在Macintosh中)键。


可选的参数必须是变体型

可选的参数可以是任何内在的数据类型，但它必须是一个有单一默认值的类型。这个错误的原因与解决方法如下所示：

  • 试图将无默认值的参数指定为 Optional，如数组。

    请确定任何指定为 Optional 的参数都是有默认值的。

详细信息，请选择有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


在对象模块中不允许 Option Private Module

Option Private Module 语句可以使一个模块的内容不能在其他工程中使用，也就是此模块只保留给自己的工程。这个错误的原因与解决方法如下所示：

  • Option Private Module 语句 出现在一对象模块中

    请先从模块中删除 Option Private Module 语句。对象模块有默认的 Option Private Module 特性。不能从代码中来改变这种默认特性。想知道如何让对象模块成员可以被较广泛地访问，参见主机应用程序的文档。

详细信息，请选择有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


下标越界（错误 9）

只能在定义的范围内访问数组元素和集合成员。此错误有以下的原因和解决方法：

  • 引用了不存在的数组元素.

    下标比可能下标范围大或小，或是在应用程序中这一边的数组没有指定范围。检查数组的声明以确认其上界和下界。若使用的是重新指定范围的数组，应使用 UBound 和 LBound 函数来决定数组访问。如果索引指定为变量，应检查变量名的拼写。

  • 声明数组时没有指定元素的数目。例如，下列的代码就会导致此错误：
    Dim MyArray() As Integer
MyArray(8) = 234    ' 导致错误 9。

    Visual Basic 并不会将没有指定范围的数组自动设为 0 – 10。相反必须使用 Dim 或 ReDim 来指定数组中元素的数目。

  • 引用了不存在的集合成员。

    试着使用 For Each...Next 结构代替指定元素下标。

  • 使用速写形式的下标，结果指定了错误的元素。

    例如，当在集合上使用 ! 运算子时，! 自动指定了一个键。例如 object!keyname.value 和 object.item(keyname).value 是一样的。在此例中，集合中如果 keyname 表示一个错误键，错误就会产生。若要改进此错误，在集合对象中使用正确的键名称或索引。

详细信息，可选取有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


资源不足

某种名为“句柄”的资源，用来处理内部许多操作。这个错误的原因与解决方法如下所示：

  • 代码已经达到了某种资源的限制。

    请试着保存、关闭及重新装入代码。若仍然会发生这个错误，请减少代码中对象的引用数量。

详细信息，请选择有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


内存不足（错误 31001）

对所指定的操作，您的系统不能分配或访问足够的内存或磁盘空间。


内存溢出（错误 7）

需要更多的内存空间，或是遇到 64K 段边界限制。此错误有以下的原因和解决方法：

  • 打开了太多的、文档或资源文件。

    关闭不需要的应用程序、文档或资源文件。

  • 模块或过程太大了。

    将庞大的模块或过程分成几个。虽然这样不能节省内存空间，但可避免 64K 段边界限制。

  • 在 Microsoft Windows 标准模式下执行。

    按增强方式重新启动 Microsoft Windows 。

  • 在 Microsoft Windows 增强方式下执行，但超出了虚拟内存的空间。

    空出一些磁盘空间以增加虚拟内存，或至少确保有空馀的空间。

  • 一些驻留程序在运行。

    减少一些驻留程序。

  • 设备驱动程序装载的太多。

    减少一些不需要的设备驱动程序。

  • Public 变量超出了空间。

    减少 Public 变量的数量。

详细信息，可选取有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


堆栈空间溢出（错误 28）

堆栈是内存的一个工作区，会随着程序运行的需要而增长或缩小。此错误有以下的原因和解决方法：

  • 有太多活动的 Function、Sub 或 Property 过程调用。

    检查过程的嵌套是否太深，尤其是递归过程，即自己调用自己的过程。确保递归能终止，使用 “调用” 对话框来查看活动的过程 (在堆栈上)。

  • 本地变量需要更多可用的本地变量空间。

    试着在模块级别中声明某些变量。可以在静态过程，即在 Property、Sub 或 Function 关键字前加上 Static，声明所有变量，或可以在过程内使用 Static 语句来声明各个 Static 变量。

  • 有太多定长字符串。

    定长字符串在过程中可快速访问，比可变长度字符串使用更多堆栈空间，因为字符串数据本身要放在堆栈上。可试着重新定义一些定长字符串成为变长字符串。当声明一变长字符串时，只有字符串描述符 (非数据本身) 会放在堆栈上。可以在没有堆栈空间的模块层次上定义字符串。在模块层次申明变量是缺省为 Public，所以在模块上所有过程皆可见到字符串。

  • DoEvents 函数调用的嵌套太多。

    利用“调用” 对话框，在堆栈上查看正在活动的过程。

  • 代码引起了事件层叠。

    所谓事件层叠就是引起一个事件，此事件会调用已在堆栈上的事件过程。事件层叠和不能中止的递归过程调用是相似的，但不太明显，因为是由 Visual Basic 所调用，而不是在代码中调用。使用“调用” 对话框来查看那些正在活动的过程 (在堆栈上)。

显示“调用” 对话框，在“调试” 窗口中选取过程框右边的“调用”按钮或选择“调用” 命令。详细信息，可选取有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


串空间溢出（错误 14）

Visual Basic 允许使用非常大的字符串。然而，其他程序的需求和处理字符串的方法可能导致这种错误。错误有以下的原因和解决方法：

  • 使用的表达式为计算所创建的临时字符串，可能产生此错误。例如，下列的代码在一些操作系统上将产生 Out of string space 的错误：
    MyString = "Hello"
For Count = 1 To 100
    MyString = MyString & MyString
Next Count

    将字符串赋值给其他名称的变量。

  • 系统内存溢出，致使不能给字符串分配空间。

    删除不需要的应用程序以增加可用的内存空间。

详细信息，可选取有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


溢出（错误 6）

当赋值超出目标的限制时，就会发生溢出。此错误有以下的原因和解决方法：

  • 赋值、计算或数据类型的结果的转换太大，以致于不能在变量类型所允许的范围内表示出来。

    赋值给足够表示值的范围的类型的变量上。

  • 给属性的赋值超过属性能接受的最大值。

    确保赋值适合属性的范围。

  • 试图在计算中使用一个数字，并且该数字被强制为一个整数，但是结果超过了整数的范围，例如：
        Dim x As Long
    x = 2000 * 365   ' 错误: 溢出

    要解决这个问题，请按如下方式键入该数字：

        Dim x As Long
    x = CLng(2000) * 365

详细信息，可选取有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


带 ParamArray 参数的过程不能用命名的参数调用

调用用 ParamArray 定义的过程 时，所有参数都必须是依次序定位的。这个错误的起因与解决方法如下所示：

  • 命名参数的语法用于过程调用中。

    命名的参数调用的语法不能用来调用包含 ParamArray 参数的过程。若只要支持 ParamArray 的几个元素，请在要省略的参数位置上使用逗号作为占位符。例如，在下面的调用中，假如 ParamArray 参数在 Arg2 之后，只传递 ParamArray 中第一个、第三个和第六个值：

    MySub Arg1, Arg2, 7,, 44,,,3

    注意 ParamArray 总是代表参数列表中最后一项。

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 ) 。


ParamArray 必须声明为一个 Variant 数组

ParamArray 参数的每个参数可以是不同的数据类型。然而，参数本身必须声明为一个 Variant 类型的数组。可以提供任何数量的参数给 ParamArray。当调用发生时，调用所提供的每个参数，都会变成 Variant 数组中一个相对应的元素。例如：

Sub MySub(ParamArray VarArg())
    . . .
End Sub
Call MySub ("First arg", 2, 3.54)

这个错误的原因与解决方法如下所示：

  • 在过程的定义中，ParamArray 参数被定义成一个某种 Variant 类型以外的数组。

    请重新将参数类型声明成一个 Variant 数组。

  • 虽然没有把 ParamArray 参数指定为任何数据类型，但却把过程定义在一个 Def type 语句的有效范围内，故参数会被隐含声明为一个 Variant 以外的类型。

    请在 ParamArray 参数指定中，加上一个显式的 As Variant 子句。

详细信息，请选择有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


不能有含可选参数的参数数组

可以用 ParamArray来定义可接收可变长参数列表的过程。Optional参数指的是调用者可以提供或忽略该参数而不产生错误。该错误有以下原因及解决方案：

  • 在同一参数列表中同时使用了 ParamArray 和 Optional 关键字。

    删除 Optional 或 ParamArray 参数。不能在同一参数列表中同时使用这两个关键字。可以对想用的参数列表类型使用任一方法。

关于其他信息，请选中有问题的条目并按 F1 键 (在 Windows中) 或 HELP (对于 Macintosh).


参数不是任选项（错误449）

参数的个数和类型必须与要求的匹配。此错误有以下的原因和解决方法：

  • 不正确的参数数。

    应提供所有必须的参数，例如，Left 函数需要两个参数；第一个表示要处理的字符串，第二个表示从字符串左边返回的字符数。因为参数不是任选项，所以必须全部提供。

  • 省略的参数不是任选项。

    只有调用的是用户自定义过程，且过程声明中参数声明为 Optional 时，才可以省略参数。可以在调用时提供所有需要的参数，或是将参数声明为 Optional。

详细信息，可选取有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


在指定的行上：指定的父菜单不能加载为分隔符

ASCII 文件所含 Menu 控件的父菜单或顶层菜单被定义为菜单分隔符。顶层菜单不能是菜单分隔符。该分隔符不能被设置。


路径/文件访问错误（错误 75）

在文件访问或磁盘访问操作期间，例如，Open、MkDir、ChDir 或 RmDir，操作系统不能连接路径和文件名连接。此错误有以下的原因和解决方法：

  • 文件指定的格式不正确。

    文件名可以包含完整限定的（绝对）或相对的路径。完整限定的路径以驱动器名称（如果路径在另一台驱动器上）为开始，并且列出从根目录到文件的路径。任何非完整限定的路径都是相对于当前驱动器和目录的。

  • 试图保存到只读文件上。

    更改目标文件的只读属性或以其他文件名保存。

  • 在顺序 Output 或 Append 模式下试图打开只读文件。

    以 Input 方式打开文件，或是要更改文件的只读属性。

  • 试图更改数据库或文档中的一个 Visual Basic 工程。

    不能对工程进行设计上的更改。

详细信息，可选取有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


路径未找到（错误 76）

此文件路径包括指定的驱动器加上目录以及子目录，必须能遍历到文件的位置。路径可以是相对的或绝对的。此错误有以下原因和解决方法：

  • 在文件访问或磁盘访问期间，例如，Open、MkDir、ChDir 或 RmDir，此时操作系统不能找到指定的路径。

    重新指定路径。

详细信息，可选取有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


找不到命名的数据值（错误 327）

找不到数据值。


权限被否定（错误 70）

试图对写保护的磁盘进行写操作，或要访问加锁文件。此错误有以下的原因和解决方法：

  • 为顺序 Output 或 Append 写，打开一个写保护文件。

    用 Input 方式打开文件，或者修改文件的写保护属性。

  • 用顺序 Output 或 Append 方式，打开有写保护的磁盘上的文件。

    从磁盘上删除写保护，或者使用 Input 方式文件。

  • 写入已被其他进程锁定的文件。

    等其他进程释放后再打开此文件。

  • 试图访问注册表，但用户权限不包括此类注册表访问。

    在 32 位 Microsoft Windows 系统上，用户必须有访问当前系统注册表的权限。改变用户权限，或由系统管理员来修改。

详细信息，可选取有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


有效的数值是整数 2 到 60

企图将 Grid Width 或 Grid Height 设置在允许的范围之外。 对于这个字段来说可以接受的值是 2 到 60 之间（包括它们在内）的整数。


有效的数值是整数 1 到 32

企图将 TabStop Width 设置在允许的范围之外。对于这个字段来说可以接受的值是 1 到 32 之间的整数。


打印机错误（错误 482）

此错误有以下原因和解决方法：

  • 打印机发生错误，但没有其他的信息返回到发送文件的计算机上。

    直接检查打印机，确保所有计算机和打印机间的连接无误。大部分打印机都能提供显示错误信息，像 "Out of paper," "Offline," 等。

详细信息，可选取有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


Private Enum 类型和用户定义类型不能作为公共过程的参数或返回类型、公共数据成员、或公共用户定义类型

Public 过程在工程内的所有模块中都是可见的，而 Private Enum 类型在其模块以外不可见。这个错误的原因与解决方法如下所示：

  • Public 过程是在一个 Public 类中，但它的返回值或某一参数却是在一个标准模块或 Private 类中定义。

    请将其声明为 Enum Public。它必须处于一个类模块中

详细信息，请选择有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


只有在公共对象模块中定义的公共用户定义类型可以被使用为类模块公共过程的参数或返回类型、或作为公共用户定义类型的字段

这个错误的原因与解决方法如下：

  • 试图使用一个公共用户定义类型作为类模块公共过程的参数或返回类型、或作为公共用户定义类型的字段。只有在公共对象模块中定义的公共用户定义类型才可以这样使用。


私有对象模块不能在公共对象模块中被用作公共过程的参数或返回类型、公共数据成员、或公共用户定义类型的字段

这个错误的原因与解决方法如下：

  • 试图使用一个私有对象模块作为公共对象模块的参数、或公共过程的返回类型、数据成员、或公共用户定义类型的字段，这是不允许的。


过程太大

当编译时，一个过程编译出来的代码不能超过 64K。这个错误的原因与解决方法如下所示：

  • 编译时此过程编译出来的代码超过 64K。

    请将此过程及其他太大的过程拆分成两个或数个较小的过程。

详细信息，请选择有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


不能显示隐藏的过程

在隐藏模块中的任何东西都是隐藏的。这个错误的起因与解决方法如下所示：

  • 试图查看隐藏模块中的过程。

    请先将此模块改为非隐藏式，才能查看过程。假如要查看隐藏过程中生成错误的那一行，请再执行一次（将此模块改为非隐藏後）过程，以便查看错误。

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 )。


期待变量或过程，而非工程

在当前范围中没有以此名称命名的变量或过程，但有以此名称命名的工程。这个错误的起因与解决方法如下所示：

  • 工程名被当作变量或过程。

    请检查变量或过程名称的拼写，确定所要引用的名称不是另一个模块所私有的。工程名可以用作限定符，但不可以单独使用。

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 ) 。


工程不查看。

工程不可查看

导致这个错误的原因及解决办法如下：

  • 试图观察的工程被锁定。

    参考主机应用程序文档来帮助怎样使工程可查看。

详细信息，选择有问题的项目并按 F1 键（Windows系统） 或 HELP （Macintosh系统）。


工程未找到

找不到工程。这个错误的原因与解决方法如下所示：

  • 指定了一个无法找到的工程名。

    请检查指定工程的方式是否有任何错误。

详细信息，请选择有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


因为该工程被保护，不能执行操作

当一个工程被保护时， 有些动作是禁止的。这项错误的原因及解决方法如下：

  • 不小心对此工程加上了保护。

    将保护删除，然后重试一次。

  • 这个工程被特意加上了保护。

    在当初加上保护的人把它删除之前，不能执行此动作。

如需要其它信息，请选择有疑问的项目并按下F1 键(在Windows中) 或 HELP (在 Macintosh中)。


工程中己有指定的项

您指定的文件已经是工程的一部分，不能在工程中再添加相同的文件。也不能在工程中保存与其它文件同名的文件。


工程名太长。名字被截短

如果工程名字超过了允许的长度， 它将会被截短为可允许的最大长度。


工程文件是只读的

此工程文件不能写。要改变它的话，可以先用不同的文件名将它保存，或删除其只读属性。


这个工程目前被其它工程引用而不能被关闭。

目前这个工程被其他工程引用而不能被关闭

导致这个错误的原因及解决办法如下：

  • 试图关闭的指定工程正在被其他工程引用。

    从其他工程删除引用后再关闭这个工程。

详细信息，选择有问题的项目并按下 F1 键（Windows 系统）或 HELP（Macintosh 系统）。


Property Let 或 Property Set 要求的参数

Property Let 与 Property Set 过程的目的是给属性一个新值。这个错误的起因与解决方法如下所示：

  • 在设置属性时，值并非出现在右边。

    将值放於用来设置属性的表达式的右边。

  • 在此过程定义中，被定义来接受表达式右边所传递的值的参数丢失或放错位置了。

    请为该过程定义的值参数列指定一个参数。假如过程使用超过一个以上的参数，则属性值参数在参数列中必须最后一个出现。

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 ) 。


属性未找到（错误 422）

并非所有对象都支持同样的属性。此错误有以下原因和解决方法：

  • 此对象不支持指定的属性。

    检查属性名的拼写，也有可能访问 "text" 之类的属性，而此对象所支持的是 "caption" 或类似的指定属性。应检查对象的文档。

详细信息，可选取有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


属性值无效（错误 380）

将不适当的值赋给一个属性。这项错误的原因及解决方法如下：

  • 试图将一个对象或控件的属性的值，设置为超出其所允许的范围。

    请将属性值改为正确的设置。例如，MousePointer 属性就必须设置在整型的 0 - 15 或 99 的范围内。


所指定的属性是只写的（错误 394）

该属性 是不能读入的。这项错误的原因及解决方法如下：

  • 这个属性不能读入；例如，ctl.property = 3 可能是正确的，但 "Print ctl.property" 则会产生错误。

    请修改代码，并删除对这个属性的引用。


在运行时不能读入所指定的属性（错误 393）

该属性仅在设计时可以使用。这项错误的原因及解决方法如下：

  • 试图在运行时 读入一个只能在设计时可访问的属性。

    请修改程序的代码，并删除对这个属性的引用。


所指定的属性是只读的（错误 383）

该属性在设计时和运行时均为只读的。这项错误的原因及解决方法如下：

  • 试图设置或修改一个只能读入的属性。

    请从过程中删除对属性的引用，或是将引用改变成在运行时仅返回属性值。


窗体最小化或最大化时不能被移动或改变大小。

导致这个错误的原因及解决办法如下：

  • 当窗体处于最大化或最小化时试图移动或改变窗体的大小，这是不允许的。

详细信息，选择有问题的项目并按 F1 键（Windows系统） 或 HELP （Macintosh系统）。


在运行时不能设置指定属性（错误 382）

该属性在运行时是只读的。这项错误的原因及解决方法如下：

  • 试图设置或改变一个只能在设计时 设置的属性。

    请从过程中删除对属性的引用，或是将引用改变成在运行时仅返回属性值。


模块范围内不允许带限定符的名称

在一些情况下，一些主机应用程序不允许包含带限定符名称的过程调用。这个错误的原因与解决方法如下所示：

  • 在一个过程调用中，用 “点” 表示法 (qualifier.item) 来指定一个模块名称。

    得到这个错误可能是因为该主应用程序已经知道指定的限定符，所以在过程调用中不再需要这项信息。在这种情况下，可以直接把所有限定符忽略，该主应用程序会正确地处理这个过程调用。想知道带限定符的名称其他限制的原因，参见该主机应用程序的文件。

详细信息，请选择有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


限定符必须是集合

两个标识符间出现惊叹号的用法，是集合特有的。这个错误的原因与解决方法如下所示：

  • 在惊叹号(!)左边所使用的名称不是一个集合的名称。

    假设此名称代表一个集合，请确定它的拼法是正确的。请注意惊叹号刚好也是 Single 数据类型的类型声明字符。若这个有问题的名称不是一个集合，那么有可能是加在变量名称后的 ! 类型声明字符，不小心连接到了另一个名称。

详细信息，请选择有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


无效的限定符

限定符被用来消除二义性。这个错误的起因与解决方法如下所示：

  • 在当前范围中，此限定符不能标识工程、模块、对象，或用户定义类型 变量。

    请检查此限定符的拼写，并确定此限定的标识符是位于当前的范围之中。例如，在 Private 模块中的用户自定义类型变量，只有在那个模块中为可见的。

详细信息，请先选取有疑问的项目，然后按下 F1 键。( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 )


在指定行上的项目中，应为属性名的地方却是引号括起来的字符串

在 ASCII 窗体文件中，出现引号括起来的字符串的地方原本应为属性名。属性名不放在引号 (" ") 里面。


不能从磁盘读入

读入磁盘时发生一个常规性错误。这个错误的原因与解决方法如下所示：

  • 磁盘机门没有关好。

    若磁盘机是活动的，请检查驱动器门。必要的话把它关好。

  • 磁盘片可能插反了。

    请按正确的方向重新插入磁盘片。

  • 磁盘片可能没有正确地格式化。

    如果不在意丢失当前存在上面的数据，请重新格式化磁盘。

  • 遇到一个网络上的问题。

    请重新启动网络。

  • 插入的软盘是某种磁盘机不能阅读的密度。

    请换另一台磁盘机，或是把需要的数据拷贝到的磁盘机所能读入的磁盘片中。

详细信息，请选择有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


文件是只读的

该文件不能写。要改变它的话，必须用不同的文件名将它保存，或删除其只读属性。


不能给只读属性赋值

某些属性不能被赋值。这个错误的起因与解决方法如下所示：

  • 您试图给不能赋值的属性赋值。

    在某些情况下，属性只在某些特定时候才能接受赋值。例如，可在设计时赋值，但不能在运行时赋值。单击指定属性的在线帮助，了解它何时能接受赋值。

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 ) 。


在私有对象模块中不能定义KWID_tkPUBLIC 用户自定义类型

在私有对象模块中不能定义KWID_tkPUBLIC 用户定义类型

对象模块中的用户定义类型不能为 Public。这个错误的起因与解决方法如下所示：

  • 试图在对象模块中定义 Public 用户自定义类型。

    将用户自定义类型的定义移到标准模块中，然后在对象模块或其它模块中声明该类型的变量。若只是要在它出现的模块中使用该类型，可以在对象模块中放入 Type...End Type 定义，并在定义之前加上 Private 关键字。

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 )。


不能记录正在执行的模块

必须停止执行，才能记录。这个错误的起因与解决方法如下所示：

  • 在执行模块代码时试图记录一个宏。

    停止执行或按下CTRL+BREAK (Windows) or COMMAND+PERIOD (Macintosh)，再开始记录。

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 ) 。


用户定义类型不能以 ByVal 的方式传递

用户定义类型只能按引用（缺省值）来传递，而不能按值传递。这项错误可能直到执行此调用时才会报告。这个错误的原因与解决方法如下所示：

  • 在一个用户定义类型的参数定义中，放置了一个 ByVal 关键字。

    请删除这个 ByVal 关键字。如果不希望因过程或函数的调用而造成参数的改变，用 Dim 声明一个该类型的临时变量然后将此变量传给此过程。

详细信息，请选择有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


不能改变数组元素的数据类型

ReDim 只能被用来改变数组中元素的数目。这个错误的起因与解决方法如下所示：

  • 试图使用 ReDim 重新声明数组的数据类型。

    请声明一个所要数据类型的新数组，然后使用转换函数将原来数组中的各元素，赋予新数组中对应的元素。

    也可以将此数组放在 Variant 变量中。这可以用一个简单的赋值式来完成：

    Dim MyVar As Variant
MyVar = MyIntegerArray()

    这将创建一个包含与原来数组类型相同之数组的 Variant。然后可以将任何有效 VarType 的变量赋予 variant 中的数组元素。

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 ) 。


不能访问系统注册表（错误 335）

读出或写入系统注册表的试图失败。


所指定的 ActiveX 部件没有正确注册或没有找到

部件必须在系统注册表中注册，这项错误的原因及解决方法如下：

  • 这个部件的注册信息无效，所以不能找到这个部件。

    请更改注册。如果必要的话，重新安装此部件。

  • 该部件被直接删除，而没有使用卸载程序。

    在注册表指定的目录中，将该部件文件替换掉。

如需要其它信息，请选择有疑问的项目并按下F1 键(在Windows中) 或 HELP (在 Macintosh中)。


ActiveX部件不能正确注册（错误 336）

ActiveX 部件尚未注册在系统注册表 中。


部件未被正确注册

没有正确地注册部件

导致这个错误的原因及解决办法如下：

  • 指定的部件未被正确注册。

详细信息，选择有问题的项目并按 F1 键（Windows系统） 或 HELP （Macintosh系统）。


ActiveX 部件的运行有错（错误 338）

ActiveX 部件的 .exe 可执行文件不能正确运行。注册表 中的信息可能有问题。


访问系统注册表错误

有些操作需要访问系统的注册数据库。这个错误的起因与解决方法如下所示：

  • 系统的注册数据库已坏。

    再运行主应用程序 的 安装程序。

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 ) 。


找不到 ActiveX 部件（错误 337）

找不到所需要的.exe 或.dll 文件。


指定的区域已搜索过，并执行了替换

当单击“替换”对话框中的“全部替换”按钮后，这个信息会指出替换的总个数。这种情况是由以下原因所产生且会造成下列影响：

  • 当进行搜索及替换操作时，可以指定复盖区域 — 选定文本、过程、模块或工程。

    若曾选定一个区域，那么此区域就成为默认搜索区域。若之前没有选择过任何区域，则当前模块便是默认搜索区域。要改变搜索范围，请选定“替换”对话框中另一个不同的搜索选项。

详细信息，请选择有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


指定区域已搜索过并且执行了1次替换

当单击“替换”对话框中的“全部替换”按钮后，这个信息会指出替换的总个数。这种情况是由以下原因所产生且会造成下列这些影响：

  • 当进行搜索与替换操作时，对于指定的搜索文本只找到一例。可以指定复盖区域 — 选定文本、过程、模块或工程。

    若曾选定一个区域，那么此区域就成为默认搜索区域。若之前没有选择过任何区域，则当前模块便是默认搜索区域。要改变搜索范围，请选定“替换”对话框中另一个不同的搜索选项。

详细信息，请选择有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


替换内容太长（错误 746）

替换内容不能超出指定的最大长度。此错误有以下原因和解决方法：

  • 替换内容的长度超过允许的长度

    查阅部件的文档以得到最大长度。

详细信息，可选取有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


要求常数表达式

常数必须初始化。这个错误的起因与解决方法如下所示：

  • 试图以一个变量、用户定义类型的实例、对象或函数调用的返回值来初始一个常数。

    请以纯文本、先前声明的常数或被运算符（预期 Is 逻辑运算子）联结的纯文本与常数来初始常数。

  • 试图声明一个数组，而用变量来指定元素的个数。

    想要在过程中声明一个动态数组，请用 ReDim 声明此数组并用变量来指定元素的个数。

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 ) 。


未发生错误而出现Resume（错误 20）

Resume 语句只能在错误处理程序内出现，而且只能在活动的错误处理程序中执行。此错误有以下的原因和解决方法：

  • 将 Resume 语句放在错误处理程序的代码之外。

    将此语句移到错误处理程序之内，或删除它。

  • 代码即使没有错误也跳到了错误处理程序之中。

    也许拼错了行标签。不能经过过程跳到标签，所以搜寻过程中注明错误处理程序的标签。如果找到了重复的 GoTo 语句的目标标签，而不是属于 On Error GoTo 语句的目标标签的话，修改行标签使与所要的目标标签一致。

详细信息，可选取有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


Return，无与之相对的GoSub（错误 3）

Return 语句要有一个对应的 GoSub 语句。此错误有以下原因和解决方法：

  • Return 语句没有对应的 GoSub 语句。

    确保没有不小心被删除的 GoSub 语句。

与 For...Next、While...Wend 和 Sub...End Sub 是在编译时间匹配不同，GoSub 和 Return 是在运行时匹配。

详细信息，可选取有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


RSet 只允许在字符串中

RSet 是用来让固定长度或可变长度的字符串向右对齐。这个错误的原因与解决方法如下所示：

  • 试图把 RSet 语句用于一个非字符串的变量。

    可以的话，请试着将此变量转换为一个字符串，否则就不要用 RSet。

    注意 纵然 LSet 语句可以用来将用户定义类型变量中的元素赋给不同类型但兼容的用户命名类型变量的元素，但不鼓励这种赋值，因为这种做法的可移植性不能保证。

详细信息，请选择有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


运行时错误 <number>:

这个错误是用户命名的，它的原因与解决方法如下所示：

  • 发生了一个错误，Visual Basic 中没有可以与之相对应的错误。

    请按照产生此错误的对象或对象库的文件中所述，来处理这项错误。

详细信息，请选择有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


已经到达搜索范围的起点，还要从终点继续吗？

搜寻并未成功。这个状况的起因与解决方法如下：

  • 往上搜寻已达指定范围的最前端。

    可从指定范围最底端再重新搜寻，或干脆中止并重置范围。


搜索的文本未找到（错误 744）

此错误有以下原因和解决方法：

  • 找不到指定的文本。

    文本不存在。

详细信息，可选取有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


搜索串太长或太复杂

Visual Basic 的样式匹配能力并非无限。这个错误的原因与解决方法如下所示：

  • 指定的搜索串太长了，或是不能理解指定的通配符组合。

    请减少查找字符串的长度或复杂程度后再做一次查找。

详细信息，请选择有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


已达搜寻范围的结尾；要继续从开头搜寻吗

搜寻没有成功。这个错误的起因与解决方法如下所示：

  • 向下搜寻已经到达指定范围的尾端。

    可以从搜寻范围的开头继续搜寻，或取消和改变搜寻的范围。


文件搜索失败：不能从磁盘中读写

Seek 语句是直接在磁盘上操作的。这个错误的原因与解决方法如下所示：

  • 企图去读入一个写保护、只读或锁住的磁盘或文件。

    请将写保护属性删除或者改变只读属性或锁定状况，请注意若文件已经被另一个进程锁定，将不能删除这项锁定。

  • 这个文件已经不存在了，例如，一个可删除磁盘已经被物理地改变了。

    如果这个文件曾经移到另一磁盘上，请从该磁盘访问它。否则，不能访问此文件。

  • 企图读入一个工程文件、对象库或类型库，但此文件已经被损毁了。

    请取得一份此库文件或工程文件的新备份。

详细信息，请选择有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


关于这个主题的详细信息请参阅 Readme 文件

在帮助文件完成后，此产品仍然会有一些附加的帮助主题。这些主题的帮助解释，可以在主机应用程序的 Readme 文件中找到。

详细信息，请选择有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


其它应用程序当前正在访问程序中的对象。现在结束该程序会造成那些程序的错误。现在结束程序吗？

正在运行的 Visual Basic 程序所包含的 Automation 对象正被至少一个的其它应用程序所访问。中止程序，可能会在其它应用程序中引起错误。单击“是”退出程序，单击“否”继续运行程序。


Property Set不允许（错误 387）

并非所有属性都支持返回引用。此错误有以下原因和解决方法：

  • 对不能返回引用的属性要取得该属性的引用。

    只用 Let 属性和 Get 属性访问此属性。

详细信息，可选取有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


Property Set不能在只读属性下使用（错误 383）

在运行时有可能不能取得对属性的引用。此错误有以下原因和解决方法：

  • 运行时在只读中取得属性的引用。

    可以对读写来使用一个引用，此属性必须在运行时支持读写操作均允许的引用。只能在此属性上使用 Get 属性。

详细信息，可选取有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


Property Set在运行时不能执行（错误 382）

在运行时有可能不能取得对属性的引用。此错误有以下原因和解决方法：

  • 在运行时的只读或只写中要取得对属性的引用。

    可以对读和写使用引用，此属性必须在运行时支持读写操作均允许的引用。

详细信息，可选取有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


需要 SHARE.EXE

开始 Visual Basic 前必须先运行 share.exe 程序。这个错误的原因与解决方法如下所示：

  • 在开始 Visual Basic 前没有先执行 share.exe。

    关闭应用程序，启动 share.exe，然后再重新启动应用程序。若希望以后都可以避免这个错误，请再 autoexec.bat 文件中加上一行对 share.exe 的调用，这样就可以在每次开机时自动启动 share.exe。

详细信息，请选择有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


'item' 'item'是一个单线程部件，因而不能在多线程工程中使用。改变'item'的线程模式或与当前版本的部件代理商联系

’item’ 是一个单线程部件，因而不能在多线程工程中使用。改变’item’的线程模式或与该部件代理商联系来更新版本。

导致这个错误的原因及解决办法如下：

  • 试图在一个多线程工程中使用一个单线程部件。

    改变线程模式为单线程部件模式，或该部件代理商联系来更新版本。

详细信息，选择有问题的项目并按下 F1 键（Windows系统）或 HELP（Macintosh 系统）。


固定的或静态的数据不可大于 64K

固定的或静态的数据包括人工变量、固定长度的字符串、和固定数组。这个错误的起因与解决方法如下所示：

  • 试图分配超过 64K 的模块级别数据。

    减少声明的数据量。请注意虽然模块级数据大小的限制是 64K，但模块级的可变长度字符串和数组可以超过这个限制。

  • 试图在模块中分配超过 64K 的静态过程级别数据。

    减少声明的这种类型的数据量。来自一个模块中所有过程的静态数据，总共不应超过 64K （并非每个过程 64K）。请注意静态的可变长度字符串与数组可以超过这个限制。

  • 用户定义类型的大小超过 64K。

    减少用户自定义类型的大小。通常，用户自定义类型的大小等于为它的元素指定的大小的总和。在一些平台上，为了使它们在词的边界上对齐，在元素之间可能会被填塞。如果将一个用户自定义类型嵌套在另一个之中，嵌套类型的大小必须包括在新类型的大小之中。

  • 在过程中，试图声明一个引起超过 32K 的用户自定义类型变量。

    虽然在模块级，用户自定义类型变量的限制是 64K，但在过程中用户自定义类型变量不能超过 32K。减少用户自定义类型所需的大小，或使用模块级的变量。

  • 在过程中声明的固定长度字符串的大小超过了 65,464。

    减少固定长度字符串的长度。请注意可变长度字符串可以超过这个限制。

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 ) 。


未找到搜索文本

找不到搜索文本。这个错误的原因与解决方法如下所示：

  • 在指定搜索范围的起始点与结束点之间，找不到任何匹配的文本。

    如果要继续搜索，可以扩大搜索范围。

  • 当使用一个样式匹配表达式时，没有提供左括号。

    请提供左括号。

详细信息，请选择有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


语句太复杂

Visual Basic 不能分析这个语句。这个错误的原因与解决方法如下所示：

  • 由于语句的复杂性而不能进行分析。

    请将这个语句拆分成几个较小的部分，或者以逻辑运算符和If...Then...Else 语句的组合来替换复杂的条件子句。

  • 语句或函数使用了太多的嵌套函数调用。

    先进行函数调用，并将结果存放在一个变量中；然后在引起此错误的语句中使用此变量来降低复杂性。

详细信息，请选择有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


End Sub、End Function或 End Property 后面只能出现注释

只有注释、目录、及声明可以在过程外面。这个错误的原因与解决方法如下所示：

  • 在过程外面放置了可执行的代码。

    任何过程外的非声明行，都必须由一个注释限定符 (') 起头。声明性语句必须出现在第一个过程声明之前。当代码执行时注释会被忽略掉。

详细信息，请选择有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


语法错误

Visual Basic 不能判断应该采取什么动作。这个错误的原因与解决方法如下所示：

  • 一个关键字或参数拼错了。

    关键字及命名参数的名称，必须与它们的语法格式匹配。请查阅联机帮助，并改正拼法。

  • 标点符号不正确。

    例如，当把可选的参数省略时，必须补上一个逗号 (,) 以作为省略的参数的占位符。

  • 一个未定义的过程。

    请检查过程名称的拼法。

  • 试图在一个过程声明中同时指定 Optional 及 ParamArray。

    一个参数不能既是 ParamArray 又是 Optional。请选择其一并删除另一个。

  • 试图定义一个带有Optional或ParamArray参数的事件过程。

    从参数中删除Optional或ParamArray关键字。

  • 试图在RaiseEvent语句中使用一个命名参数。

    事件不支持命名参数。

详细信息，请选择有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


远程服务器机器不存在或不可用（错误 462）

CreateObject 函数需要一个有效的服务器。该错误发生的原因和解决方法如下：

  • 指定了一个服务器参数，但是访问不到或找不到该服务器。

详细信息，可选取有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


MDI 在多线程的工程中不能使用MDI窗体,任何MDI窗体将从多线程工程中删除。 为了在这个工程中保留MDI窗体，请选择Cancel并改变线程模式到只有一条线程的线程缓冲池。

在多线程工程中不能使用 MDI 窗体，任何 MDI 窗体将从多线程工程中删除。 为了在工程中保留 MDI 窗体，请选择“取消”并改变线程模式为只有一条线程的线程缓冲池。

导致这个错误的原因及解决办法如下：

  • 试图向一个多线程工程添加一个 MDI 窗体。

    如果希望在工程中保留 MDI 窗体，请改变线程模式为只有一条线程的线程缓冲池。

详细信息，选择有问题的项目并按 F1 键（Windows 系统）或 HELP（Macintosh 系统）。


参数太多

一个过程至多只能有 60 个参数。这个错误的原因与解决方法如下所示：

  • 指定的参数超过了 60 个。

    若必须指定超过 60 个参数，请定义一个用户定义类型，将多个不同类型的参数收集到其中，或是使用 ParamArray 为最后的参数，然后传递多个值给它。亦可将多个参数放到一个数组中来传递。

详细信息，请选择有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


DLL 应用程序客户太多（错误 47）

Visual Basic 中动态链接库 (DLL)一次只能容纳 50 个主机应用程序访问。此错误有以下原因和解决方法：

  • 应用程序和其他 Visual Basic 主应用程序（一些可能是应用程序访问的）都同时访问 Visual Basic DLL。

    减少访问 Visual Basic 的打开的应用程序数。

详细信息，可选取有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


维数太多

数组的维数不可以超过 60。这个错误的原因与解决方法如下所示：

  • 试图声明一个维数超过 60 的数组。

    请减少维数。

  • 虽然数组的声明没有超过此维数限制，但却没有足够的内存来创建此数组。

    请腾出更多的内存或是降低维数。若数组是一个 Variant 类型的数组，或是被包含在一个 Variant 类型中，可以用其部件的数据类型来创建相同维数的数组。例如，若此数组只包含整型，请将它声明为 Integer 类型的数组，比起每个元素都是 Variant，这样占用的内存会少。

详细信息，请选择有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


文件太多（错误 67）

同时打开的磁盘文件的数量有限制。此错误有以下的原因和解决方法：

  • MS-DOS 操作系统：在根目录下创建了太多的文件，超过了操作系统的许可。

    MS-DOS 操作系统限制了根目录下可以创建的文件数，通常为 512。如果程序要在根目录下打开、关闭或保存文件，可将程序改为在子目录下工作。

  • MS-DOS 操作系统：打开的文件数超过 CONFIG.SYS 文件中 files= 所设的数。

    增加CONFIG.SYS 文件中 files= 所设置的文件数，然后重新启动。

  • Macintosh：程序打开的文件数超过 40 。

    在 Macintosh 中，标准限制是 40 个。此限制可用工具修改引导块的 MaxFiles 参数来改变。

详细信息，可选取有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


行继续标志太多

以续行符能连接的行数是有限制的。这个错误的原因与解决方法如下所示：

  • 代码中用行继续字符连接的行超过 25 行，即一行中连续的续行符超过 24 个。

    物理上增加一些连续行的长度，以尽量减少行继续字符，或是将此结构拆分成多个语句。

详细信息，请选择有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


工程含有太多过程、变量及常数名称

  • 一个工程的过程、变量、常数及参数的名称，都保存在名称表中。这个错误的原因与解决方法如下所示：

  • 工程中名称表内的名称个数，超过了 32,768。

    名称表格内可能有一些内容是暂时的复制。可以利用将工程保存至磁盘上，并关闭它来紧缩名称表。若在重新打开此工程后这个问题还是存在，请利用本地变量名可以在多个过程间重新使用的特性，来减少名称的使用，然后再保存、关闭并重新打开工程来重新紧缩名称表。

详细信息，请选择有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


翻译失败。详细信息请查阅 trnslate.log 文件。

当前的 Visual Basic 版本只为向后兼容性执行翻译。该错误有以下原因和解决方案：

  • 翻译意外失败。

    该错误通常是由于被破坏的类型库引用而产生的。详细内容可以从指定的翻译日志中获得。

关于其他信息，请选中有问题的条目并按 F1 键 (在 Windows中) 或 HELP (对于 Macintosh).


可捕获的错误

可捕获的错误通常发生在应用程序运行时，但也有一些会发生在开发期间或编译时间。可使用 On Error 语句与 Err 对象来探测并回应可捕获的错误。1 – 1000 之间未使用的错误号都是保留给 Visual Basic 以后使用的。

代码 信息

3没有返回的GoSub

5无效的过程调用

6溢出

7内存不足

9数组索引超出范围

10此数组为固定的或暂时锁定

11除以零

13类型不符合

14字符串空间不足

16表达式太复杂

17不能完成所要求的操作

18发生用户中断

20没有恢复的错误

28堆栈空间不足

35没有定义 子程序、函数，或属性

47DLL 应用程序的客户端过多

48装入 DLL 时发生错误

49DLL 调用规格错误

51内部错误

52错误的文件名或数目

53文件找不到

54错误的文件方式

55文件已打开

57 I/O 设备错误

58文件已经存在

59记录的长度错误

61磁盘已满

62输入已超过文件结尾

63记录的个数错误

67文件过多

68设备不可用

70没有访问权限

71磁盘尚未就绪

74不能用其他磁盘机重命名

75路径/文件访问错误

76找不到路径

91尚未设置对象变量或 With 区块变量

92For循环没有被初始化

93无效的模式字符串

94Null 的使用无效

97不能在对象上调用 Friend 过程，该对象不是定义类的实例

298系统 DLL 不能被加载

320在指定的文件中不能使用字符设备名

321无效的文件格式

322不能建立必要的临时文件

325源文件中有无效的格式

327未找到命名的数据值

328非法参数，不能写入数组

335不能访问系统注册表

336ActiveX 部件不能正确注册

337未找到 ActiveX 部件

338ActiveX 部件不能正确运行

360对象已经加载

361不能加载或卸载该对象

363未找到指定的 ActiveX 控件

364对象未卸载

365在该上下文中不能卸载

368指定文件过时。该程序要求较新版本

371指定的对象不能用作供显示的所有者窗体

380属性值无效

381无效的属性数组索引

382属性设置不能在运行时完成

383属性设置不能用于只读属性

385需要属性数组索引

387属性设置不允许

393属性的取得不能在运行时完成

394属性的取得不能用于只写属性

400窗体已经显示，不能显示为模式窗体

402代码必须先关闭顶端模式窗体

419允许使用否定的对象

422找不到属性

423找不到属性或方法

424需要对象

425无效的对象使用

429ActiveX 部件不能建立对象或返回对此对象的引用

430类不支持自动操作

432在自动操作期间找不到文件或类名

438对象不支持此属性或方法

440自动操作错误

442连接至型态程序库或对象程序库的远程处理已经丢失

443自动操作对象没有默认值

445对象不支持此动作

446对象不支持指定参数

447对象不支持当前的位置设置

448找不到指定参数

449参数无选择性或无效的属性设置

450参数的个数错误或无效的属性设置

451对象不是集合对象

452序数无效

453找不到指定的 DLL 函数

454找不到源代码

455代码源锁定错误

457此键已经与集合对象中的某元素相关

458变量使用的型态是 Visual Basic 不支持的

459此部件不支持事件

460剪贴板格式无效

  461. 未找到方法或数据成员

462远程服务器机器不存在或不可用

463类未在本地机器上注册

480不能创建 AutoRedraw 图象

481图片无效

482打印机错误

483打印驱动不支持指定的属性

484从系统得到打印机信息时出错。 确保正确设置了打印机

485无效的图片类型

486不能用这种类型的打印机打印窗体图象

520不能清空剪贴板

521不能打开剪贴板

735不能将文件保存至 TEMP 目录

744找不到要搜寻的文本

746取代数据过长

31001内存溢出

31004无对象

31018未设置类

31027不能激活对象

31032不能创建内嵌对象

31036存储到文件时出错

31037从文件读出时出错


类型声明字符与声明的数据类型不匹配

一个变量的数据类型是不会被在其后附加的类型声明字符所改变的。这个错误的原因与解决方法如下所示：

  • 声明一个特定类型的变量，在同一范围内用此名称来引用它，然而却在其名称后附加一个不一致的类型声明字符。

    若希望能够改变赋给变量的数据类型，请将此变量声明为 Variant。如果只是不小心附加了一个不正确的类型声明字符，请将其删除或更正。

详细信息，请选择有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


类型声明字符不允许

在 Visual Basic 中是可以使用类型声明字符，但有些数据类型(包括 Byte、Boolean、Date、Object和 Variant) 是没有相关的类型声明字符的。这个错误的原因与解决方法如下所示：

  • 试图在一个变量声明中使用类型声明字符，但此变量已经使用了与 Dim、Static、Public 等搭配的 As 子句。

    请删除类型声明字符或是 As 子句。

  • 试图使用类型声明字符来引用一个变量，但此变量是隐含声明的，并不需要类型声明字符：
    MyVar = 20    ' 隐含声明。
MyVar% = 25    ' 错误产生。

    请删除类型声明字符或重新声明此变量。

    注意 若一个显式的变量声明中包含类型声明字符，以后对其引用时，是否包括此字符是可选的。例如：

Dim MyStr$
MyStr = "Because it was explicitly declared, the $ is optional."

详细信息，请选择有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


要求类型声明字符

是否有必要使用类型声明字符取决于标识符的声明形式。这个错误的原因与解决方法如下所示：

  • 一个原本以类型声明字符隐含声明的变量，却没有以类型声明字符来引用它。例如：
    MyStr$ = "Implicit declaration"
MyStr = "Trying to refer to MyStr$, but error results" _
 & "from calling it MyStr."

    请显式地声明或是在以后的引用中附加上类型声明字符。

    说明 若一个显式地变量声明中有类型声明字符，以后对其引用时，此字符是可以省略的。例如：

Dim MyStr$
MyStr = "Because it was explicitly declared, the $ is optional."

详细信息，请选择有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


类型不匹配（错误 13）

当前 Visual Basic为了完成数据类型的赋值，能够对许多数值进行转换，而较早的版本则做不到。然而，此错误仍可能发生并且有 下列几种原因和解决方法：

  • 变量或属性类型错误。例如，一个整型值的变量不能赋给字符串值，除非整个字符串可识别成为整型。

    尽量在兼容的数据类型间赋值。例如，Integer 可以被赋给 Long，Single 可以被赋给 Double，而任何类型（除了用户类型）可以赋给 Variant。

  • 将对象传给了需要单一属性或值的过程。

    传递正确的单一属性或调用给工程的方法。

  • 使用了表达式所要的模块或工程名称，例如：
    Debug.Print MyModule

    指定可以显示的表达式。

  • 将传统 Basic 错误处理例程与拥有 Error 子类型 (10, vbError) 的 Variant 值混合，例如：
    Error CVErr(n)

    识别一个错误，要将其映射到 Visual Basic 或用户错误，然后产生错误。

  • CVErr 值不能转换成 Date。例如：
    MyVar = CDate(CVErr(9))

    使用 Select Case 语句或一些类似的结构映射返回的 CVErr。

  • 在运行时，此错误通常说明在无效子类型的表达式中使用了 Variant，或 包含数组的 Variant 中出现了 Print # 语句。

    可用循环显示每个元素以打印数组，。

详细信息，可选取有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


Sub, Function, 或 Property 未定义（错误 35）

调用 Sub、Function 或 Property 的过程必须定义。此错误有以下的原因和解决方法：

  • 过程名称拼错。

    检查拼写并改正。

  • 试图从另一个工程调用过程，但并没有在“引用” 对话框中将该引用添加到该工程。

添加引用

  1. 显示“引用” 对话框。

  2. 查找包含要调用过程的工程名。如果“引用” 对话框中没有所要的工程名，请按“浏览”按钮来搜寻它。

  3. 选取工程名左边的复选框。

  4. 单击“确定”。
  • 调用的过程看不到所指定的过程。

    在模块中声明为 Private 的过程不能被模块外部的过程调用。如果 Option Private Module 起作用的话，其他工程就不能使用模块中的过程。寻找以确定过程的位置

  • 申明Windows动态链接库 (DLL)例程或Macintosh代码资源例程，但例程不在指定的库或代码资源中。

  • 检查序号（如果正使用的话）或例程名称。请确保 DLL 或Macintosh代码资源的版本是正确的。例程有可能只存在于较后的 DLL 或Macintosh代码资源版本。如果在路径中，错误版本的目录在含有正确版本的目录之前的话，就会访问到错误的 DLL或Macintosh代码资源。所给的 DLL 或Macintosh代码资源名称虽正确，但并非指定函数所包含的版本。

详细信息，可选取有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


用户定义类型未定义

在 Visual Basic 中可以创建用户自己的数据类型，但它们必须先在 Type...End Type 语句中或是在一个注册过的对象库或类型库中定义，这个错误的原因与解决方法如下所示：

  • 试图以一个未定义的类型来声明变量或参数，或者是指定了一个未知的类或对象名称。

    请在一个模块中使用 Type 语句来定义新的数据类型。若正试图创建一个类的引用，则这个类必须要被工程所见。若程序中要引用一个类，工程中必须有这个指定的类模块。

  • 要声明的类型在另一个模块中已经被声明为 Private。

    请在标准模块中定义此类型，这样可以让它成为 Public。

  • 这是一个有效的类型，但是定义它的对象库或类型库并没有在 Visual Basic 中注册。

    请显示“引用”对话框，然后选择适当的对象库或类型库。例如，如果不复选“引用”对话框中的 Data Access Object，像 Database、Recordset、TableDef这样一些类型就不能被识别，在代码中引用它们便会产生此错误。

详细信息，请选择有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


Unexpected error

This error has the following causes and solutions:

  • An unanticipated error occurred. Try shutting down the system and restarting it.

For additional information, select the item in question and press F1 (in Windows) or HELP (on the Macintosh).


意外的编译错误

当在编译过程中发生了完全没有预料到的错误时，就会发生这个错误。


未知错误；请与 Microsoft 技术支持接洽

这种情况可能严重也可能不严重。这个错误的原因与解决方法如下所示：

  • 在主机应用程序或 Visual Basic 中，发生了一个非预期的错误。

    不要认定这是一个严重的错误。不过应该留意错误代号并将其报告给 Microsoft Technical Support。

详细信息，请选择有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


在指定的项中有一或多个属性无效。一些或全部属性值可能设置得不对

指定的工程 文件中有一个或多个无效的属性设置值。该错误只与工程文件有关。


无法确认的工程语言

应用程序当前不支持要被装入的工程所指定的这个区域代码。这个错误的原因与解决方法如下所示：

  • 这个工程是在支持此区域代码的系统上创建的，但后来却被移到一个不能辨认此区域代码的系统上。例如，当前机器的 ole2nls.dll 可能就不认识此区域代码。

    请在当前的系统上安装合适的动态链接库 (DLL)。

  • 找不到这个工程正确的对象库。

    请确定正确的对象库是否可用，例如，确定路径是否包含这些对象库所在的目录。

详细信息，请选择有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


Property 的使用无效

在此处应该使用另一种属性过程。这个错误的起因与解决方法如下所示：

  • 试图对只读属性执行写操作

    若唯一的 Property 过程是 Property Get，便不能给该属性赋值。请撰写一个 Property Let 过程，否则就不要试图写入属性值。

  • 试图读一个只写属性。

    若唯一的 Property 过程是 Property Let，便不能读这个属性值。请撰写一个 Property Get 过程，否则就不要试图读入属性值。

  • 试图设置一个引用，但该属性只有 Property Get 或 Property Let 过程。

    请撰写一个 Property Set 过程，否则就不要试图设置引用。

详细信息，请先选取有疑问的项目，然后按下 F1 键。( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 )


不再支持的文件格式

并非所有的文件格式在所有的环境下都是可读的。这个错误的起因与解决方法如下所示：

  • 试图加载一个用 Visual Basic 老版本创建的二进制文件。

    将该文件加载到创建该文件的 Visual Basic 版本中，用文本格式保存它，然后再次试一次。

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 ) 。


不支持的对象库功能

对象库中有些功能可能是 Visual Basic.所没有的。这个错误的原因与解决方法如下所示：

  • 企图访问一个对象库中 Visual Basic 不支持的数据类型或函数。

    请洽询此对象库的作者，来得知何时使用此对象库以及与其搭配使用的工具的详细信息。

详细信息，请选择有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


应用程序定义的或对象定义的错误

当以 Raise 方法生成的错误或者是 Error 语句，不符合 Visual Basic for Applications 所定义的错误时，显示这条消息。若 Error 函数的参数不符合 Visual Basic for Applications 所定义的错误，也会返回此消息。这可能是您自定义的错误，或者是由对象所定义的，包括主应用程序，如 Microsoft Excel、Visual Basic 等等。例如，Visual Basic 窗体所生成的一些窗体相关错误，它们不能在程序中简单的指定一个号码，做为 Raise 方法或 Error 语句的参数。这个错误具有以下的起因与解决方法：

  • 应用程序执行了一个 Err.Raise n 或 Error n 语句，但代码 n 并非由 Visual Basic for Applications 所定义的。

    您必须使用 Err.Raise 并指定额外的参数，这样，用户才能了解错误的本质。例如：可添加一个描述字符串、来源或帮助信息。为了再生成一个捕获的错误，若在重新生成一个错误前不执行 Err.Clear，则此步骤是有效的。若先执行 Err.Clear，就必须在 Raise 方法中填入其它的参数。请检查错误发生的情况，并确定正在重新生成相同的错误。

  • 有可能从其它应用程序中访问对象时，错误返回到您的程序中，而此错误不是 Visual Basic 所能侦查到的。

    请检查访问过的对象的文档。Err 对象的 Source 属性应该含有产生错误的应用程序或对象的程序标识符。若要了解对象返回的错误的内容，最好在访问对象的代码中使用 On Error Resume Next 结构，而不要使用 On Error GoTo line 语法。

    注意 在过去，程序员常会使用一个循环，来打印出所有可捕获的错误（trappable error）的消息字符串。典型的代码如下：

    For index = 1 to 500
    Debug.Print Error$(index)
Next index

    这段代码仍可列出 Visual Basic for Applications 的全部错误消息，但宿主定义的错误会显示“应用程序或对象定义错误”，例如 Visual Basic 中，那些与窗体、控件等有关的错误。它们中有许多是可捕获的运行时错误。可使用帮助中的“搜索”对话框来找出宿主应用程序所指定的可捕获错误的列表。单击“搜索”对话框，在第一个文本框中键入“可捕获的”，然后单击“显示主题”。再在较低的列表框内选取“可捕获的错误”，最后单击“显示”。

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 ) 。


出现用户中断（错误18）

进程的中断执行是很有用的，如果不进行处理则会使应用程序中止。此错误有以下原因和解决方法：

  • 用户按 CTRL+BREAK 或其他中断键。

  • 在开发环境中可继续执行。避免在运行时出现这种情况，应使用合适的方法处理此错误。

详细信息，可选取有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


字符串值长得无法处理；放弃加载窗体

窗体中即将加载的内嵌字符串太长，以至于不能处理。


上下文中尚未创建此变量

在“监视”窗口或“立即”窗口里显示一个变量，或者是在“立即”窗口中给此变量赋值之前，必须创建此变量。这个错误的原因与解决方法如下所示：

  • 不是在中断模式下执行“单步执行”命令之前，就要显示一个刚在代码中输入的本地变量的值

    逐行执行代码以强制编译这个新的语句。

  • 试图显示一个刚添加到过程中的本地变量的值，但这个过程是用“调用”对话框中沿调用链向下从很远处传送过来的。

    必须真正返回到该过程才能在上下文中显示该变量。

详细信息，请选择有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


"立即”窗口没有足够的内存来创建变量

“立即”窗口没有足够的内存来创建变量

“立即”窗口的内存有限。这个错误的起因与解决方法如下所示：

  • 在“立即”窗口中指定了必须用具体例子说明的变量，因为它在程序代码中并未创建。

    在“立即”窗口中删除对该变量的引用。或者在程序代码中声明该变量，使它不需在“立即”窗口中创建。

详细信息，请先选取有疑问的项目，然后按下 F1 键。( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 )


指定的工程文件损坏，不能装入

Visual Basic 不能读入此工程文件。这可能是因为此文件已经被 Visual Basic 以外的编辑器修改了。若要解决这个问题，可以撤消对文件所做的修改。


指定的工程文件包含有无效的键。工程不能装入

工程文件包含有无效的键时，将不能装入该工程。


版本号丢失或无效

不是找不到版本记号，就是不能辨识所指定的版本。确认在这个 ASCII 窗体中，不是空格、也不是注释的第一个程序行指定了正确的版本。


光标处的标识符不是过程名称

试图查看一个过程，但是在插入点的标识符不是一个过程名称。这个错误的起因与解决方法如下所示：

  • 标识符不是过程名称。

    请检查此标识符的拼写。

详细信息，请先选取有疑问的项目，然后按下 F1 键 ( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 ) 。


Wend 没有 While

每个 Wend 语句的前边必须有一个与其对应的 While 语句。这个错误的原因与解决方法如下所示：

  • 在没有前置 While 语句的情况下，使用了一个 Wend 语句。

    请检查引起这个问题的 While...Wend 循环内是否嵌套一个无穷循环。

详细信息，请选择有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


不能对对象数组元素的Variant 进行 ReDim, Erase, 或赋值。

不能对含有元素是With 对象的数组的 Variant 进行 ReDim、Erase 或赋值

导致这个错误的原因及解决办法如下：

  • 试图对含有元素是 With 对象的数组的 Variant 变量进行 ReDim Erase或赋值。

    例如，下面的代码将产生这个错误：

    Type Test
Name as Integer
End Type
Sub Main()
Dim c(0) As Test
Dim e
e = c
With e(0)
ReDim e(1)
End With
End Sub

详细信息，选择有问题的项目并按 F1 键（Windows系统） 或 HELP （Macintosh系统）。


向导不能引用工程

向导可以引用另一个向导，但是不能引用工程。该错误有以下原因和解决方案：

  • 在 Make Wizard 命令期间，发现一个工程引用。

    删除该工程引用。

关于其他信息，请选中有问题的条目并按 F1 键 (在 Windows中) 或 HELP (对于 Macintosh).


不能写入磁盘

在写入磁盘时发生一个常规性错误。这个错误的原因与解决方法如下所示：

  • 磁盘机门没有关好。

    若磁盘是活动的，请检查磁盘机门。必要的话把它关好。

  • 磁盘片可能插反了。

    请按正确的方向重新插入磁盘片。

  • 磁盘片可能没有正确地格式化。

    如果不在意损失当前存在上面的数据，请重新格式化软盘。

  • 遇到一个网络上的问题。

    请重新启动网络。

  • 插入的软盘式是某种密度，使得磁盘机不能阅读。

    请换另一台磁盘机，或是把要的数据拷贝到的磁盘机所能读入的磁盘片中。

详细信息，请选择有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


无效的访问模式

在 Open 语句中所指定的访问类型，对指定的文件类型无效。这个错误的起因与解决方法如下所示：

  • 为输入打开文件时，指定了非法的访问模式。

    为输入打开文件时，可以省略访问模式的指定，但如果指定它时，访问模式必须是 Read。对于为输入而打开的文件，Write 和 Read Write 都是无效的。

  • 为追加打开文件时，指定了无效的访问模式。

    为追加打开文件时，可以省略访问方式的指定，但是如果指定它时，访问模式必须是 Write。对于为追加而打开的文件，Read 和 Read Write 两者都是无效的。

  • 为输出打开文件时，指定了无效的访问模式。

    为输出打开文件时，可以省略访问方式的指定，但是如果指定它时，访问模式必须是 Write。对于为输出而打开的文件，Read 和 Read Write 两者都是无效的。

详细信息，请先选取有疑问的项目，然后按下 F1 键。( 在 Windows 中 ) 或 HELP ( 在 Macintosh 中 )


操作系统版本错误； 要求用 Windows 95 或 Windows NT 3.51所指定的版本

若要运行这个版本的 Visual Basic，必须在 Windows 95 或 Windows NT 3.51所指定的版本中才能执行。


在另外一个不同的应用程序中运行VBA时,创建了这个VBA工程。只能在创建这个工程的应用程序中打开它

导致这个错误的原因及解决办法如下：

  • 试图打开一个在其他主机应用程序中创建的工程文件。

  • 确定试图打开的工程文件是创建并且保存在相同的 Visual Basic 主机应用程序中的文件。

  • 详细信息，选择有问题的项目，并按 F1 键（Windows 系统）或 HELP（Macintosh 系统）


不允许没有成员用户定义类型

用户定义类型中最少要有一个元素。这个错误的原因与解决方法如下所示：

  • 在 Type...End Type 定义中指定了一个空的用户定义类型。

    请检查 Type 语句中是否有注释限定符是不小心放上去的。

详细信息，请选择有问题的项目，并按下 F1 （在Windows中）或HELP（在Macintosh中）键。


Add 方法示例

本示例使用 Add 方法将 Inst 对象（类 Class1 之示例，其中包含 Public 变量 InstanceName ）加到 MyClasses 集合对象中。若要观察程序的运作，插入一个类模块，并在 Class1 的模块级中声明公用变量 InstanceName（键入 Public InstanceName）来保存每个示例的名称。类名就用缺省的 Class1。将下列代码复制与粘贴到某个窗体模块的 Form_Load 事件过程中。

Dim MyClasses As New Collection    ' 建立集合对象。
Dim Num As Integer    ' 定义计数变量。
Dim Msg
Dim TheName    ' 用来保存用户指定的名称的变量。
Do
    Dim Inst As New Class1    ' 建立 Class1 的新示例。
    Num = Num + 1    ' 将计数变量加一，并让用户输入名称。
    Msg = "Please enter a name for this object." & Chr(13) _
     & "Press Cancel to see names in collection."
    TheName = InputBox(Msg, "Name the Collection Items")
    Inst.InstanceName = TheName    ' 将输入的名称存到对象的示例中。
    ' 如果名称不是空字符串，则将该示例加到集合对象中。
    If Inst.InstanceName <> "" Then
        ' 将该示例加到集合对象中。
        MyClasses.Add item := Inst, key := CStr(Num)
    End If
    ' 清除对当前示例的引用，以准备下一个。
    Set Inst = Nothing
Loop Until TheName = ""
For Each x In MyClasses
    MsgBox x.instancename, , "Instance Name"
Next


Item 方法示例

本示例使用 Item 方法取得集合对象中对象的引用。假设 Birthdays 为 Collection 对象，下列代码用键“SmithBill”及“SmithAdam”作为 index 参数，从集合引用中取出代表 Bill Smith 的生日和 Adam Smith 的生日的对象。请注意，示例中的第一次调用明确使用了 Item 方法，但第二次却没有。两次调用都会成功，因为 Item 方法就是 Collection 的缺省方法。示例中用 Set 指定给 SmithBillBD 及 SmithAdamBD 对象的引用，可用来访问该对象的属性及方法。若要试用本示例程序，请自行建立一个集合，并至少添加引用到的两个对象。

Dim SmithBillBD As Object
Dim SmithAdamBD As Object
Dim Birthdays
Set SmithBillBD = Birthdays.Item("SmithBill")
Set SmithAdamBD = Birthdays("SmithAdam")


Print 方法示例

本示例使用 Print 方法在“调试”窗口的“立即”面板中显示变量 MyVar 的值。请注意，Print 方法只能用于可显示文本的对象。

Dim MyVar
MyVar = "Come see me in the Immediate pane.”
Debug.Print MyVar


Remove 方法示例

本示例说明如何使用 Remove 方法将 Collection 对象 MyClasses 中的对象删除。代码在每次循环中都将索引为 1 的对象删除。

Dim Num, MyClasses
For Num = 1 To MyClasses.Count
    MyClasses.Remove 1    ' 将第一个对象删除
            ' 直到删除所有对象为止。
Next Num


+ 运算符示例

本示例使用 + 运算符来计算数值的和。+ 运算符也可以用来做字符串的串接操作。不过，最好还是使用 & 运算符来做字符串的串接操作。如果 + 运算符两边的表达式中混着字符串及数值的话，其结果会是数值的求和。如果都是字符串作“相加”，则返回串接起来的字符串。

Dim MyNumber, Var1, Var2
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"（字符串被串接起来）。


二进制兼容的 DLL 或 EXE 包含一个找不到其定义的 Implements 类型

如果您有一个二进制兼容（Binary Compatible）的服务器，该服务器实现了一个包含在另一个 DLL 中的接口，则您在对它进行重新编译时必须小心。以下是该警告的原因和解决方法：

  • 另一个 DLL 是作为工程兼容（Project Compatible）来重新编译的，更改了接口 GUID。因为这是一个不可见的更改，所以可能会成为一个未预期的错误。如果其他人给您一个工程兼容的 DLL 来引用，也可能发生这个错误。

    一般来说，当一个工程的二进制兼容 DLL 或 EXE 对 typelib 的引用中断时发生这个错误。引用中断发生在下列情况：当一个被引用的 typelib 被另一个文件（例如重新编译了的 DLL/EXE）所覆盖时、当您删除了 typelib 文件时、或者当您将对 typelib 的引用移动到一个机器上，但是没有移动被引用的 typelib 或没有注册被引用的 typelib 时。

    一个可能的解决办法是，通过在您的机器上得到一份被引用的 typelib 的副本并对它进行注册。您不能使用原来的，因为在重新编译时它被覆盖了。如果这样做失败了，那么只好停止将 DLL/EXE 作为您的二进制兼容版本使用了。


二进制兼容 DLL 或 EXE 包含了一个找不到其定义的参数类型或返回类型

如果您有一个包含一个参数或返回类型的二进制兼容（Binary Compatible）服务器，该参数或返回类型包含在另一个 DLL 中，则您在进行重新编译时必须要小心。以下是该警告的原因和解决方法：

  • 当您对工程设置二进制兼容并重新编译工程时，会自动设置工程兼容，更改接口的内部 GUID。因为这是一个不可见的更改，所以可能会成为一个未预期的错误。

    一般来说，当一个工程的二进制兼容 DLL 或 EXE 对 typelib 的引用中断时发生这个错误。引用中断发生在下列情况：当一个被引用的 typelib 被另一个文件（例如重新编译了的 DLL/EXE）所覆盖时、当您删除了 typelib 文件时、或者当您将对 typelib 的引用移动到一个机器上，但是没有移动被引用的 typelib 或没有注册被引用的 typelib 时。

    一个可能的解决办法是，通过在您的机器上得到一份被引用的 typelib 的副本并对它进行注册。您不能使用原来的，因为在重新编译时它被覆盖了。如果这样做失败了，那么只好停止将 DLL/EXE 作为您的二进制兼容版本使用了。


For...Next 语句示例

本示例使用 For...Next 语句创建一个字符串，其内容为由 0 到 9 的十个数字所组成的字符串，每个字符串之间用空格隔开。外层循环使用一个变量当作循环计数器，每循环一次，变量值减一。

Dim Words, Chars, MyString
For Words = 10 To 1 Step -1     ' 建立 10 次循环。
    For Chars = 0 To 9    ' 建立 10 次循环。
        MyString = MyString & Chars    ' 将数字添加到字符串中。
    Next Chars    ' Increment counter
    MyString = MyString & " "    ' 添加一个空格。
Next Words


Set 语句示例

该示例使用 Set 语句将对象引用赋给变量。假定 YourObject 指向一个具有 Text 属性的合法对象。

Dim YourObject, MyObject, MyStr
Set MyObject = YourObject    '对象引用赋值。
'MyObject 和 YourObject 引用同一个对象。
YourObject.Text = "Hello World"    '初始化属性。
MyStr = MyObject.Text    '返回 "Hello World"。

'脱离关联。MyObject 不再引用 YourObject。
Set MyObject = Nothing    '释放该对象。


由于当前注册权限，不能更新对'item'的加载操作。

由于当前注册权限，不能更新对 'item'的加载行为。

导致这个错误的原因及解决办法如下：

  • 在“外接程序管理器”对话框中，Visual Basic 不能加载从“可用外接程序”列表中选定的外接程序，因为外接程序没有被正确注册或在系统中未被注册。

详细信息，选择有问题的项目并按 F1 键（Windows系统）或 HELP（Macintosh系统）。


工程<name>已被修改，希望现在保存所做的修改吗？

工程〈name〉已被修改，希望现在保存所做的修改吗？

导致这个错误的原因及解决办法如下：

  • 工程中一个或多个文件的属性设置或代码语句已被修改且仍未保存。这是在加载另外一个工程之前,最后一次保存所做的修改的机会。

详细信息，选择有问题的项目并按 F1 键（Windows系统）或 HELP（Macintosh系统）。


版本号必需介于0-9999之间

导致这个错误的原因及解决办法如下：

  • 在工程属性对话框的“生成”选项卡中，试图分配一负数、非数字字符或者一个大于9999的数字来作为一个工程的“主版本”、“次版本”或“修正”部件的版本号。使用介于0-9999（含0 和 9999）之间的数字作为版本号。

详细信息，选择有问题的项目并按 F1 键（Windows系统）或 HELP（Macintosh系统）。


不能显示帮助文件

导致这个错误的原因及解决办法如下：

  • 如果正在运行WinHelp，则此时不能应用 Windows Help 应用程序。如果你的计算机系统中存在 Winhelp.exe，确定路径是否正确；如果不存在，运行 Microsoft Windows 9x 或 Microsoft Windows NT 安装程序安装 Winhelp.exe。

  • 如果在您的计算机上有 HH.exe，如果运行 HTMLHelp，请确定路径是否正确；如果不存在，在您查看帮助之前必需先安装它。

详细信息，选择有问题的项目并按 F1 键（Windows系统）或 HELP（Macintosh系统）。


无效的基地址

输入了一个无效的基地址，导致这个错误的原因及解决办法如下：

  • 在“工程属性”对话框的“编译选项卡”中,选定了一个无效的基地址。

    一个有效的基地址必需是 64K 的倍数，且大于 64K，小于 &H7FFF0000。

    这个错误发生在 ActiveX DLL 或 ActiveX 控件工程中。

详细信息，选择有问题的项目并按 F1 键（Windows系统） 或 HELP （Macintosh系统）。


在代码生成器或连接器中出现未知错误

导致这个错误的原因及解决办法如下：

  • 代码生成器或连接器导致一个未知错误。

    单击“是”在Notepad中显示错误。

    这个错误最有可能是由于磁盘空间较小或其他与磁盘有关的问题引起。.

详细信息，选择有问题的项目并按 F1 键 （Windows系统） 或 HELP（Macintosh系统）。


作为一个ActiveX部件，文件'item'是不可注册的 f.

文件 ‘item’ 不可作为 ActiveX 部件是来注册。

导致这个错误的原因及解决办法如下：

  • 试图注册一个无效的 ActiveX 部件的控件动态连接库（.dll)。确定使用正确的控件或 .dll。有关详细信息，请与ActiveX 部件代理商联系。

详细信息，选择有问题的项目并按 F1 键（Windows系统）或 HELP （Macintosh系统）。


程序ID字符串太长'item'。程序ID字符必需是39个或更少。

程序ID字符串太长 ’item’。程序 ID字符必需是少于等于39个。

导致这个错误的原因及解决办法如下：

  • ActiveX 部件的程序 ProgID 字符串不能大于 39 个字符。通过链接工程名和类模块名创建程序 ID。

详细信息，选择有问题的项目并按 F1 键 （Windows系统）或 HELP（Macintosh系统）。


工程文件'item1'包含无效的关键词 'item 2'。

工程文件 ’item1’ 包含无效的关键词 ’item2’

导致这个错误的原因及解决办法如下：

  • Visual Basic 工程（.vbp)文件包含一个Visual Basic不能识别的关键词，文件可能被损坏。

    为了更正错误，安装指定文件的备份或应用文本编辑器修改文件。

    警告 除非使用 Visual Basic ，在其他编辑器种修改 Visual Basic 文件会使文件损坏。这仅适用于高级用户。

详细信息，选择有问题的项目并按 F1 键（Windows系统）或 HELP（Macintosh系统）。


部件'item'或它的从属文件未被正确注册：文件丢失或损坏

部件 'item' 或它的从属文件未被正确注册：文件丢失或无效

导致这个错误的原因及解决办法如下：

  • 指定的文件被移动或删除。

  • 指定的文件未被正确注册。

    重新安装并正确注册指定文件。详细信息，请与对象代理商联系。

详细信息，选择有问题的项目并按 F1 键（Windows系统） 或 HELP（Macintosh系统）。


部件没有成功地创建所需的对象

部件不能正确创建所需对象

导致这个错误的原因及解决办法如下：

  • ActiveX 部件的可执行文件（*.exe)不能正确运行。

    注册表中的信息可能存在问题。

详细信息，选择有问题的项目并按 F1 键（Windows系统） 或 HELP（Macintosh系统）。


在注册位置未找到部件

在注册处没有找到部件

导致这个错误的原因及解决办法如下：

  • 未找到所需的可执行文件（*.exe)或动态连接库文件(*.dll)。

详细信息，选择有问题的项目并按 F1 键（Windows系统） 或 HELP （Macintosh系统）。