VBA编程

本章内容

◆ VBA编程基础

◆ 创建和设计VBA程序

◆ VBA程序调试与运行

一、VBA编程基础知识

在执行简单的操作时,宏可以完成,如窗体的打开与关闭、工具栏的显示和隐藏等。对于稍复杂一些的任务,则可用Visual Basic for Application进行编程完成。

1.VBA的数据类型

下面对VBA中的数据类型、数据类型之间的转换、数据类型的对比进行介绍。

⑴ 数据类型

下表列出VBA中的基本数据类型。

类型名声明符字节

————————————————

Byte(单字节型) 1

Integer(整型) % 2

Long(长整型) & 4

Single(单精度型) ! 4

Double(双精度型) # 8

Currency(货币型) @ 8

String(字符型) $ n*1

Boolean(布尔型) 2

Date(日期型) 8

Variant(变体型) x

Object(对象型) 4

————————————————

其中,字节、整型、长整型、单精度、双精度、货币等数据类型都属于数值数据类型,可以进行各种数学运算。字符型数据类型用来声明字符串。布尔型数据类型用来表示一个逻辑值,为真时显示True,为假时显示Flase。日期型数据类型用来表示日期,日期常量必须用#括起来,如#2001/3/26#。变体型数据类型可以存放系统定义的任何数据类型,如数值、字符串、布尔及日期等,其数据类型由最近放入的值决定。

用户可以使用Type语句定义任何数据类型。用户自定义数据类型可以包括数据类型数组,或当前定义的用户自定义类型的一种或多种元素。

语法:

[ Private | Public ] Type 类型名

元素名 As 数据类型

[ 元素名 As 数据类型 ]

……

End Type

例如:定义班级中学生的基本情况数据类型如下:

Public Type Students

Name As String(8)

Age As Integer

End Type

声明变量:

Dim Student As Students

引用数据:

Student.Name=”张三”

Student.Age=15

下面是详细参考内容

◆ 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 值。

⑵ 数据类型之间的转换

在进行VBA编程过程中,用户可以将一种数据类型的数据转换成另一种特定类型的数据。如:

A=Cstr(2000),则将数值转换为字符型数据。下面列出这些转换函数:

函数名目标类型

——————————

Cbyte Byte

Cint Integer

Clng Long

Csng Single

Cdbl Double

Ccur Currency

Cdate Date

Cvar Varriant

——————————

⑶ 数据类型的对比

在Access中,有4种不同的编辑环境需要用户指定数据类型——表设计视图、查询参数、VBA代码、SQL查询视图。下表列出数据类型与VBA数据类型对比。

字段数据类型 VBA数据类型

——————————————————————

Yes/No Boolean

Number(Byte) Byte

AutoNumber(Long Integer) Long

Currency Currency

Date/Time Date

Number(Double) Double

OLE Object String

AutoNumber/GVI(同步复制ID) 不支持

Memro string

Number(Single) Single

Number(Integer) Integer

Text String

Hyper Link String

不支持 Variant

——————————————————————

2.常量

定义常量来代替那些固定不变量的数字或字符串,可以提高代码的可读性和可维护性。VBA中有一部分常量是系统预先定义的,可以直接使用。用户也可以使用自己定义的常量,但在使用之前必须声明,以便分配内存空间。语法如下:

[Public/Private] Const 常量名 [As 数据类型] = 表达式

例如:

Const Pi=3.14159265358979323

Public Const A1 As Integer=6

Const BornDay=#03/23/80#

Private Const A2=”Abcdef258”

常量有3个范围级别:过程级别(在过程中声明的)、私有模块级别(Private)、公共模块级别(Public)。

Access支持3种类型的常量:

◆ 符号常量:需要声明的常数都是符号常量。

◆ 固有常量:是Access或引用对象库的一部分。

◆ 系统定义常量:True、False、Null。

其中,符号常量可以按上述方法声明;系统定义常量只有上述三个。而固有常量则比较复杂一些,它是系统自动定义的,它由应用程序列与控件提供。它采用两种方法来限定常数:通过前缀(如VBA对象库的常数都以Vb开头,如Vb Tile Horizontal)或通过库应用([Libyan]|[mdul name] Constant)。

用户可以使用对象浏览器来查看所有对象库中的固有常量列表。具体操作如下:

◆ 单击数据库窗口【对象】栏下的【模块】按钮,再单击工具栏中的【代码】按钮,进入模块代码窗口。

◆ 单击代码窗口工具栏中的【对象浏览器】窗口。

◆ 要查看可以使用的常量,在【对象浏览器】窗口中的【工程/库】下拉列表框中选择【所有库】选项。此时,在窗口的【类】列表框中将显示所有引用对象库中的类。

◆ 在【搜索文字】下拉列表框中输入“Constant”,然后单击【对象浏览器】工具栏上的【搜索】按钮,则会在【搜索结果】列表框中显示所有固有常量类型。所有的这些固有常量都可以在宏或VBA中使用,用户可以在任何时候,在任何允许使用符号常量或用户自定义常量的地方使用固有常量。

Access中主要有以下几种类型的固有常量:操作常量、DAO常量、事件过程常量、关键字常量、Run Command 方法常量、安全常量、VBA常量和Var Type函数常量。

下面是VBA定义的一些常数,使程序设计变得更为简单。下列常数可在程序代码中的任何地方代替实际值:

◆ 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 白色

◆ 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 常数

常数值描述

vbUseSystem 0 使用 NLS API 设置。

vbSunday 1 星期日(缺省)

vbMonday 2 星期一

vbTuesday 3 星期二

vbWednesday 4 星期三

vbThursday 5 星期四

vbFriday 6 星期五

vbSaturday 7 星期六

◆ Dir、GetAttr 和 SetAttr 常数

常数值描述

vbNormal 0 正常的(Dir 和 SetAttr 的缺省值)

vbReadOnly 1 只读的

vbHidden 2 隐藏的

vbSystem 4 系统文件

vbVolume 8 卷标

vbDirectory 16 目录或文件夹

vbArchive 32 文件自上一次备份后已经改变

vbAlias 64 在 Macintosh上,标识符是一个别名。

◆ 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 模式

◆ Instr、StrComp 常数

常数值描述

VbUseCompareOption -1 使用Option Compare语句的设置进行比较。

VbBinaryCompare 0 进行二进制的比较。

VbTextCompare 1 进行文字的比较。

vbDatabaseCompare 2 用于 Microsoft Access(仅限于Windows),进行以数据库所含信息为基础的比较。

◆ 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 键

◆ Miscellaneous 常数

常数等于描述

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 常数

常数值描述

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 窗口缩小为图符。当前活动窗口仍为活动窗口。

◆ 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 工具提示背景色

◆ 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 数组

3.变量

程序中的变量为临时在座单元,可存放文字、数值、日期和对象属性。每个变量都有一个名字,程序通过变量名对变量进行存取操作。

⑴ VBA的变量命名规则

变量名必须以英文字母开头。

变量名长度不可以超过255个字符。

除英文字母、数字、下划线外,其他字符尽量避免使用。

变量名不能与VBA本身的函数过程、语句以及方法同名。

变量名在同一作用域内不能相同。

VBA变量不区分大小写。为了便于识别数据类型,在给变量或常量命名时,常常采用给变量名或常量名加前缀的方法。在VBA中,有一些约定俗成的常量和变量的命名前缀。如下表:

数据类型前缀

——————————

Byte Byt

Integer Int

Long Lng

Single Sng

Double Dbl

Currency Cur

String Str

Boolean Bln

Date Date

Variant Vnt

Object Obj

用户自定义 Udt

——————————

⑵ 变量声明

VBA变量声明有两种方法:

◆ 隐性声明。如果没有指定变量的类型而使用变量,则此变量默认为Variant类型。这种声明方式不但增加了程序运行的负担,而且极容易出现数据运算问题,造成程序出错。

◆ 显性声明。语法:Dim 变量名 [As 类型] 如:

Dim X

Dim W As Integer

Dim A As String, B As Currency, C As Integer

注意:如果这样声明:Dim x,y,z As Integer,则x,y为Variant类型。

⑶ 变量的应用范围

变量有三个范围级别

◆ 过程级别。在过程内,只有在声明此变量的过程中才可使用的变量称为局部变量。用户可以使用Dim 或 Static关键字来定义。如:

Dim x As Single

Static y As single

用Dim 定义的局部变量只有在它所在的过程运行时才会有值,而Static定义的局部变量在整个程序运行期间均有值,所以它可以作为中间变量保存结果。

◆ 私有模块级别

在程序中,公共模块中的变量对于所有模块的所有过程均可用,而私有模块中的变量只对所属模块过程可用。

用户可以在窗体、报表和标准模块顶部的声明部分用Dim或Private定义模块级的变量。由Dim语句在声明部分所声明的变量,其范围默认为私有的。

◆ 公共模块级别

如果将一个变量声明为公共模块级变量,那么他就可以为工程所有过程调用。它通过Public来声明。

⑷ 变量的生存期

在给变量声明了应用范围后,变量就有了一个生存周期,即变量保留数值的时间。具体地说,就是变量第一次(声明时)出现到消失时的持续时间。

Dim语句声明的过程级别变量将把数值保留到退出此过程为止。如果该过程调用了其他过程,则在这些过程运行的同时,属于调用者过程的变量将保留它的值。

如果用户希望保存某个过程局部变量的值,可以用Static声明。如果过程级别的变量是用Static关键字来声明的,则只要有代码正在运行,此变量就会保留它的值;而当所有代码都完成运行后,变量将不再起作用,所以它的生成周期和模块级别变量是一样的。

模块级别的变量与静态变量是不同的,在标准模块或类模块中变量会保留它的值直到停止款运行代码。在对象类模块中,只要仍有一个属于此对象类的实例存在,变量就会一直保留它的值。模块级别的变量会一直占用内存资源,直到重新设置它们的值,所以应只有必要时才使用它们。

如果在Sub或Function语句前面加上Static,则此过程中所有级别的变量值在调用期间将保留。

4.数组

⑴ 声明数组

格式:Public/Private/Static/Dim 数组名([下标] To 上界) [As 数据类型]

例如:Public Workers(8) As Integer

Dim Workers(8) As Integer

Static Workers(8) As Integer

上述例子中,下标默认为0,上界为8,共9个元素。也可以人为指定下标,如:

Dim Workers(1 To 8) As Integer

通常可以通过一个For循环处理数组:

Static Numbers(1 To 15) As Integer

Dim I As Integer

For I=1 To 15

Numbers(I)=30

Next I

⑵ 二维数组和多维数组

可以如下定义二维数组和多维数组:格式:

Dim 数组名([下标] To 上界,[[下标] To 上标,……]) [As 数据类型]

例如:

Static Aa(19,19) As Integer

Static Aa(1 To 20,1 To 20) As Integer

下面将值20赋给上述数组:

Dim I As Integer,J As Integer

Static Aa(19,19) As Integer

For I=0 To 19

For J=0 To 19

Aa(I,J)=20

Next J

Next I

多维数组的语法结构同二维数组大致一样,仅在声明时多了几项。

⑶ 动态数组

如果在程序运行之前不能肯定数组的大小,可以使用动态数组,建立动态数组的步骤如下:

声明空维表:Dim Array()

然后用ReDim语句配置数组个数。ReDim语句声明只能用在过程中,它是可执行语句,可以改变数组中元素的个数,但不能改变数组的维数。每次用ReDim配置数组时,原有数组的值全部清零。请看如下例子:

Dim Aa() As Integer

Dim I As Integer,J As Integer

ReDim I Aa(7,5)

For I=0 To 7

For J=0 To 5

Aa(I,J)=I*J

Next J

Next I

ReDim I Aa(9,2)

For I=0 To 9

For J=0 To 2

Aa(I,J)=2*(I*J)

Next J

Next I

5.运算符

⑴ 算术运算符

加+ 减- 乘* 除/ 整除/ 乘方^ 求余Mod

⑵ 连接运算符

连接运算就是将两个表达式连接在一起。+和&都能完成这个工作,但应尽量使用&以。如:

A1=#7/1/97#

A2=”香港回归祖国”

A3=A1&A2

则变量A3的值为“97-7-1香港回归祖国”

⑶ 比较运算符

大于> 小于< 大于等于>= 小于等于<= 等于= 不等于<>

⑷ 逻辑运算符

非Not 与And 或Or 异或Xor 逻辑相等(同或)Eqv 隐含(逐位比较)Imp

下面是真值表

A

B

Not A

A Or B

A And B

A Xor B

A Eqv B

A Imp B

0

0

1

0

0

0

1

1

0

1

1

1

0

1

0

1

1

0

0

1

0

1

0

0

1

1

0

1

1

0

1

1

⑸ 运算符的优先级

运算符的优先级顺序为:算术运算、连接运算、比较运算、逻辑运算。

6.条件语句

VBA支持以下3种条件判断语句:

⑴ If…Then

If<条件> Then <程序代码>

例如:If I<5 Then Print“$”

又如:If (I<5 And I>0) Then Print “$”

⑵ If…Then…Else

If<条件1> Then

<程序代码1>

[Else If<条件2> Then

<程序代码2>]

[Else

<程序代码N+1>]

End If

例如:

If Money>10000 Then

Tax=Money*0.2

Else If Money>1000 Then

Tax=Money*0.15

Else

Tax=Money*0.1

End If

⑶ Select Case

当条件表达式仅有一个测试变量时,使用Select Case结构更有效。其语法如下:

Select Case<测试条件>

Case <结果值1>

<程序代码1>

[Case <结果值2>

<程序代码2>]

[Case Else

<程序代码N>]

End Select

例如:

Select Case X

Case 1

Print “One”

Case 2

Print “Two”

Case 3

Print “Three”

Case 4

Print “Best”

Case Else

Print “Bad”

End Select

7.循环语句

⑴ Do…Loop

通过Do来执行循环,有如下四种格式。其中While是条件为真时循环,Until是条件为假时循环。

格式一:

Do While<条件表达式>

<循环代码>

Loop

例如:

Sub Command1.Click()

Dim I As Intger

I=1

Do While I<=20

Print I

I=I+1

Loop

End End

格式二:

Do

<循环代码>

Loop While<条件表达式>

Sub Command1.Click()

Dim I As Intger

I=1

Do

Print I

I=I+1

Loop While I<=20

End End

格式三:

Do Until<条件表达式>

<循环代码>

Loop

例如:

Sub Command1.Click()

Dim I As Intger

I=1

Do Until I<=20

Print I

I=I+1

Loop

End End

格式四:

Do

<循环代码>

Loop Until<条件表达式>

Sub Command1.Click()

Dim I As Intger

I=1

Do

Print I

I=I+1

Loop Until I<=20

End End

⑵ For…Next

格式:

For 变量=初值 To 终值学者[Step 步长]

<循环体>

Next [变量]

例子:

For I=1 To 10 Step 1

Print 2^I

Next I

⑶ While…Wend

格式:

While<条件表达式>

<循环体>

Wend

例子:

N=1

While N<=5

Beep

Wend

⑷ 循环的退出

可以通过Exit退出循环。例如:

Private Sub Command1_Click()

Dim I, J As Integer

J = Form!Text2.Value

For I = 1 To 100

If I = J Then

Exit For

End If

Next I

MsgBox "你输入的值是: " & I

End Sub

8.模块与过程

⑴ 模块

模块作为Access的对象之一,主要用来存放用户编写的VBA代码,如同窗体是存放控件对象的容器一样,模块是代码的容器。

整个模块窗口分为两个部分:通用区和过程区。通常模块由以下一些部分组成:

◆ 声明部分用户可以在这部分定义常量、变量、用户自定义类型和外部过程,在模块中,声明部分与过程部分是分割开来的。用户在声明部分中设定的常量和变量是全局性的,声明部分中的内容可以被模块中的所有过程调用。

◆ 事件过程事件过程是一种自动执行的过程,用来对由用户或程序代码启动的事件或系统触发的事件做出响应。事件过程包括函数过程和子过程。

从与其他对象的关系来看,模块又可分为两种基本类型:

◆ 类模块类模块是指包含新对象定义的模块。

◆ 标准模块标准模块是指存放整个数据库都可用的子程序和函数的模块。标准模块包括通用过程和常用过程,通用过程不与任何对象相关联,常用过程可以在数据库的任何地方运行。

⑵ 过程

一个过程就是一个VBA代码单元,它包含一系列的语句和方法,以便执行或计算数值。

过程有两种:一种是子过程,另一种是函数过程。

子过程用来执行一个操作或一系列操作,但是它不返回值。函数过程将返回一个值,并可传递参数。

二、创建VBA程序

1.VBA的编程环境

通过单击数据库窗口【对象】栏下的【模块】按钮,选择需要编写或修改的模块,即弹出一个编写VBA程序的窗口,如下图:

2.编写VBA语句

VBA语句是一个完整的结构单元,它代表一种操作、声明或定义。一条语句通常占一行,用户也可以使用冒号在一行中包含多条语句。如果一条语句过长,用户可以使用行继续符(下划线)结束,在下一行的接着写。

VBA中语句分为三种:

◆ 声明语句:在声明语句中,用户可以给变量、常数或程序取名称,并且指定数据类型。

◆ 赋值语句:用于指定变量或变量的值,指定变量为某一表达式。

◆ 执行语句:在VBA语句中,一条执行语句可以执行初始化操作,也可以执行一个方法或函数,并且可以循环或从代码块中分支执行。

3.创建事件过程

下面是一个综合性的例子:

代码如下:

Option Compare Database

Private Sub Command10_Click()

X = InputBox("Please enter X")

Select Case X

Case "1"

MsgBox "One"

Case "2"

MsgBox "Two"

Case "3"

MsgBox "Three"

Case "4"

MsgBox "Best"

End Select

End Sub

Private Sub Command11_Click()

Dim I As Integer, J As Integer

I = 21

J = 21

Form_MyForm1!Label5.Caption = ""

Do While I <= 20

Form_MyForm1!Label5.Caption = Form_MyForm1!Label5.Caption & I & ","

I = I + 1

Loop

Form_MyForm1!Label16.Caption = ""

Do

Form_MyForm1!Label16.Caption = Form_MyForm1!Label16.Caption & J & ","

J = J + 1

Loop While J <= 20

End Sub

Private Sub Command12_Click()

Dim I As Integer, J As Integer

I = 1

J = 1

Form_MyForm1!Label5.Caption = ""

Do Until I > 20

Form_MyForm1!Label5.Caption = Form_MyForm1!Label5.Caption & I & ","

I = I + 1

Loop

Form_MyForm1!Label16.Caption = ""

Do

Form_MyForm1!Label16.Caption = Form_MyForm1!Label16.Caption & J & ","

J = J + 1

Loop Until J > 20

End Sub

Private Sub Command13_Click()

Dim I As Integer, J As Integer

J = InputBox("请输入要查找的值")

For I = 1 To 100

If I = J Then

Exit For

End If

Next I

If I <= 100 Then

MsgBox ("找到!")

Else

MsgBox ("未找到!")

End If

End Sub

Private Sub Command2_Click()

Static Numbers(1 To 15) As Integer

Dim I As Integer

Form_MyForm1!Label5.FontSize = 16

Form_MyForm1!Label5.BackColor = 8404992

Form_MyForm1!Label5.Caption = ""

For I = 1 To 15

Numbers(I) = I

Form_MyForm1!Label5.Caption = Form_MyForm1!Label5.Caption & Numbers(I) & " "

Form_MyForm1!Text0.Value = Numbers(I)

Next I

End Sub

Private Sub Command6_Click()

Dim I As Integer, J As Integer

Static Aa(19, 19) As Integer

Form_MyForm1!Label5.BackColor = 4194432

Form_MyForm1!Label5.FontSize = 9

Form_MyForm1!Label5.Caption = ""

For I = 0 To 19

For J = 0 To 19

Aa(I, J) = 20

Form_MyForm1!Label5.Caption = Form_MyForm1!Label5.Caption & Aa(I, J) & " "

Next J

Next I

End Sub

Private Sub Command7_Click()

Dim Aa() As Integer

Dim I As Integer, J As Integer

ReDim Aa(7, 5)

Form_MyForm1!Label5.Caption = ""

For I = 0 To 7

For J = 0 To 5

Aa(I, J) = I * J

Form_MyForm1!Label5.Caption = Form_MyForm1!Label5.Caption & Aa(I, J) & " "

Next J

Form_MyForm1!Label5.Caption = Form_MyForm1!Label5.Caption & " ,"

Next I

ReDim Aa(9, 2)

Form_MyForm1!Label16.Caption = ""

For I = 0 To 9

For J = 0 To 2

Aa(I, J) = 2 * I * J

Form_MyForm1!Label16.Caption = Form_MyForm1!Label16.Caption & Aa(I, J) & " "

Next J

Form_MyForm1!Label16.Caption = Form_MyForm1!Label16.Caption & " ,"

Next I

End Sub

Private Sub Command8_Click()

Dim a, b, c

a = InputBox("Please enter a")

b = InputBox("Please enter b")

c = a Xor b

Form_MyForm1!Text0.Value = c

End Sub

Private Sub Command9_Click()

Dim Money As Currency

Money = InputBox("Please enter Money")

If Money > 10000 Then

Tax = Money * 0.2

ElseIf Money > 1000 Then

Tax = Money * 0.15

Else

Tax = Money * 0.1

End If

cont = MsgBox("应缴税金为" & Tax & "确定按是,不确定按否查看帮助", 4 + 48)

If cont = 6 Then

Else

MsgBox ("不理解也得理解!!!")

End If

End Sub

4.创建过程

事件过程是VBA编程的核心,但有时还需要利用VBA中的两类通用过程:Function过程和Sub过程,对事件过程加以改进,以提高代码的可读性和可维护性。

⑴ Function过程

如果用户需要在窗体或报表中重复使用某一表达式,可以使用一个函数过程代替这个表达式。

例如:

Function Summ(x, y) As Integer

Summ = x + y

End Function

Private Sub Command2_Click()

Dim a As Integer, b As Integer, c As Integer

a = InputBox("请输入a")

b = InputBox("请输入b")

c = Summ(a, b)

MsgBox ("c=a+b=" & a & "+" & b & "=" & c)

Form_MyForm2!Label5.Caption = "c=a+b=" & a & "+" & b & "=" & c

End Sub

⑵ Sub过程

Sub过程的定义与Function过程的定义类似,它们的重要区别在于,Sub过程没有返回值,不能用于表达式中。

Function Summ(x, y) As Integer

Summ = x + y

End Function

Sub subSumm()

Dim a As Integer, b As Integer, c As Integer

a = InputBox("请输入a")

b = InputBox("请输入b")

c = Summ(a, b)

MsgBox ("c=a+b=" & a & "+" & b & "=" & c)

Form_MyForm2!Label16.Caption = "c=a+b=" & a & "+" & b & "=" & c

End Sub

Private Sub Command2_Click()

Call subSumm

End Sub

三、VBA程序对数据库的操作

1.Microsoft Jet和ODBCDirect工作区模型

⑴ Microsoft Jet工作区

VB可以简单地打开一个现存的数据库,或是自己建立一个新的数据库。数据库类型可以是Microsoft Jet数据库(.mdb)、ISAM(索引查找访问模式,如Paradox数据库),也可以是通过 Microsoft Jet数据库引擎连接的ODBC数据库。

可以利用对象变量或DDL特性来改变数据库结构。例如下面的代码把一个新的字段对象加入到现存的数据库表中:

Dim dbs As Database,tdf As TableDef,fld As Field

Set dbs = OpenDatabase(“BiBlio.mdb”)

Set tdf = dbs.TableDefs(“Authors”)

Set fld = tdf.CreateField(“Address”,dbText,20)

Tdf.Fields.Append Fld

VB具有进行数据处理、事务处理、数据备份、安全处理等工作的强大功能。

⑵ ODBCDirect工作区模型

ODBCDirect工作区模型主要通过连接数据库、查询设计、

2.使用DAO操作数据

打开数据库:

Private Sub Command7_Click()

Dim dbExam As Database

Set dbExam = OpenDatabase("d:/st.mdb", True, True)

MsgBox ("The dataBase [" & dbExam.Name & "] is now open")

End Sub

字段值增一

Private Sub Command8_Click()

Dim dbExam As Database

Dim strSql As String

strSql = "UPDATE st1 SET Age=Age+1"

Set dbExam = OpenDatabase("d:/Access教程/st.mdb")

dbExam.Execute strSql

MsgBox ("St数据库中的St1表的Age字段已增一更新")

dbExam.Close

End Sub

根据提示更新数据

Private Sub Command9_Click()

Dim dbExam As Database

Dim strSql As String

Dim i As Integer

i = InputBox("Please enter i")

strSql = "UPDATE st1 SET Age=Age+" & i

Set dbExam = OpenDatabase("d:/Access教程/st.mdb")

dbExam.Execute strSql

MsgBox ("St数据库中的St1表的Age字段已更新" & i)

dbExam.Close

End Sub

添加记录之一

Private Sub Command10_Click()

Dim dbExam As Database

Dim intCommand As Integer

Set dbExam = OpenDatabase("st.mdb")

Set rstExam = dbExam.OpenRecordset("st1", dbOpenDynaset)

With rstExam

.AddNew

!Name = "八八先生"

!Age = 88

!Tel = "8888888"

intCommand = MsgBox("正在添加新记录,继续吗?", vbYesNo)

If intCommand = vbYes Then

.Update

MsgBox ("st1表已增加一条记录")

Else

.CancelUpdate

MsgBox ("已放弃增加记录")

End If

End With

dbExam.Close

End Sub

添加记录之二

Private Sub Command11_Click()

Dim dbExam As Database

Dim intCommand As Integer

Dim Na As String

Dim Ag As Integer

Dim Te As String

Set dbExam = OpenDatabase("st.mdb")

Set rstExam = dbExam.OpenRecordset("st1", dbOpenDynaset)

Na = Text17.Value

Ag = Text2.Value

Te = Text4.Value

With rstExam

.AddNew

!Name = Na

!Age = Ag

!Tel = Te

intCommand = MsgBox("正在添加新记录,继续吗?", vbYesNo)

If intCommand = vbYes Then

.Update

MsgBox ("st1表已增加一条记录")

Else

.CancelUpdate

MsgBox ("已放弃增加记录")

End If

End With

dbExam.Close

End Sub

提取字段值

Private Sub Command12_Click()

Dim dbExam As Database

Dim intCommand As Integer

Dim Na As String

Dim Ag As Integer

Dim Te As String

Set dbExam = OpenDatabase("st.mdb")

Set rstExam = dbExam.OpenRecordset("st1", dbOpenDynaset)

Form_MyForm2!Label16.Caption = ""

With rstExam

.MoveFirst

While rstExam.EOF <> True

Na = !Name

Ag = !Age

Te = !Tel

Form_MyForm2!Label16.Caption = Form_MyForm1!Label16.Caption & Na & "," & Ag & "," & Te & "/"

.MoveNext

Wend

End With

dbExam.Close

End Sub

删除记录

Private Sub Command13_Click()

Dim dbExam As Database

Dim intCommand As Integer

Set dbExam = OpenDatabase("st.mdb")

Set rstExam = dbExam.OpenRecordset("st1", dbOpenDynaset)

With rstExam

.MoveLast

intCommand = MsgBox("正在删除最后一条记录,继续吗?", vbYesNo)

If intCommand = vbYes Then

.Delete

MsgBox ("st1表已删除一条记录")

Else

MsgBox ("已放弃删除记录")

End If

End With

dbExam.Close

End Sub

本页共1051段,26706个字符,44953 Byte(字节)