序言 2.既然可以录制宏,为何还要手写代码?首先,宏录制的局限性很大,很多 动作(比如鼠标行为)是录不下来的。另外宏只能录制顺序的多个指令 如上面的比较复杂一点的循环就不可能录制。而且宏录制不能覆盖ⅤBA 的强大功能。例如ⅦBA可以直接读写文件系统中的任何文件。这些动作是 录不下来的。最后,录制宏得到的代码非常死板,不灵活,而且很冗余, 如果你知道了怎么写,就会立刻抛掉这个宏录制功能。事实上 Powerpoint2007已经取消了宏录制。 3.VBA能干什么?如果你想避免重复劳动,或者需要多个文档协作,VBA是 最好的选择。虽然默认下,VBA只可以操作VB自带的库和 Office的库, 但可以通过添加引用的方式来为其扩充功能。理论上VBA可以操作任何 WindOws api(代表你的 Windows能做的任意事情),和任意用COM封装 的组件。比如像 Acrobat, EndNote等都是这么做的。它们可以使自身的 功能和办公紧密结合。如果你高兴,大可以写一个Word用的聊天插件 4.VBA不能干什么?什么时候不适合使用VBA?VBA的功能取决于其库。如 果没有库提供一个功能(比如让 Excel一个单元格显示一副图片),那么 VBA也不能帮你。此外,你还可以用VBA编写插件来完成普通 Office不 能完成的功能。此外,如果你开发的项目过于庞大,则应该换一门更专业 的编程平台(比如.Net),以便更好的组织代码和査错。VBA比较适合短 小的,与工作任务很直接的问题。 5.VBA能访问某个文本文件么?当然可以。VBA直接提供OPEN关键字来访问 文件。 VBA能模拟键盘输入么?当然可以。VBA直接提供 SendKeys函数来做到这 7.VBA会被保存在哪里?VBA是保存在 Office文档中的,具体可以是某一个 文档,或者某一个文档的模板中。具体的位置需要在工程视图中选择(如 上图)。如果你希望一批文档都能用到同一个功能,最好先写个模板,然 后将ⅦBA写到模板里。然后利用此模板来生成多个文档。当然,VBA代码 也可以单独导出保存。在工程视图中右键单击某一个模块然后点“导出文 件”即可。 8.不同 Office组件可以互操作么?当然可以。VBA的功能是由COM库来添 加的。默认情况下某一个 Office组件只引用了当前这个组件的库。但是 你也可以手动添加其他库的引用。在VBA开发环境的“工具”菜单里点击 “引用”,就可以添加 Windows上安装的任意COM组件。这样,不光不同 Office组件可以互操作,你可以操作比如 Media Player,IE等程序。 9.VBA可以写图形界面么?当然可以。不然就说不上” Visua1”了。WB一向 支持一种被称为 UserFor皿的模块。你可以在上面添加各种控件。 10.VBA还提供哪些其他的功能?VBA可以捕捉 Office的事件,于是可以编写 如“当打开一个文档,要做某事”;“当 Excel计算发生了错误,则做某 事”这样的程序。VBA还有定时器,让你可以做周期性的工作。 1.除了VBA,还有哪些开发平台可以操作0 ffice?实际上,任何可以使用 COM组件的语言都可以访问 Office的功能。在微软平台上的各种语言基 本上都满足这个条件。不过有几个平台是专门针对0 ffice的。如.Net上 的WST0( Visual studio Tools for Office Developers)。这是一个利 用 Visual studio进行 Office开发的集合环境,适合大型项目。不过为
序言 4 2. 既然可以录制宏,为何还要手写代码?首先,宏录制的局限性很大,很多 动作(比如鼠标行为)是录不下来的。另外宏只能录制顺序的多个指令, 如上面的比较复杂一点的循环就不可能录制。而且宏录制不能覆盖 VBA 的强大功能。例如 VBA 可以直接读写文件系统中的任何文件。这些动作是 录不下来的。最后,录制宏得到的代码非常死板,不灵活,而且很冗余。 如果你知道了怎么写,就会立刻抛掉这个宏录制功能。事实上 PowerPoint2007 已经取消了宏录制。 3. VBA 能干什么?如果你想避免重复劳动,或者需要多个文档协作,VBA 是 最好的选择。虽然默认下,VBA 只可以操作 VB 自带的库和 Office 的库, 但可以通过添加引用的方式来为其扩充功能。理论上 VBA 可以操作任何 Windows API(代表你的 Windows 能做的任意事情),和任意用 COM 封装 的组件。比如像 Acrobat,EndNote 等都是这么做的。它们可以使自身的 功能和办公紧密结合。如果你高兴,大可以写一个 Word 用的聊天插件:) 4. VBA 不能干什么?什么时候不适合使用 VBA?VBA 的功能取决于其库。如 果没有库提供一个功能(比如让 Excel 一个单元格显示一副图片),那么 VBA 也不能帮你。此外,你还可以用 VBA 编写插件来完成普通 Office 不 能完成的功能。此外,如果你开发的项目过于庞大,则应该换一门更专业 的编程平台(比如.Net),以便更好的组织代码和查错。VBA 比较适合短 小的,与工作任务很直接的问题。 5. VBA 能访问某个文本文件么?当然可以。VBA 直接提供 OPEN 关键字来访问 文件。 6. VBA 能模拟键盘输入么?当然可以。VBA 直接提供 SendKeys 函数来做到这 一点。 7. VBA 会被保存在哪里?VBA 是保存在 Office 文档中的,具体可以是某一个 文档,或者某一个文档的模板中。具体的位置需要在工程视图中选择(如 上图)。如果你希望一批文档都能用到同一个功能,最好先写个模板,然 后将 VBA 写到模板里。然后利用此模板来生成多个文档。当然,VBA 代码 也可以单独导出保存。在工程视图中右键单击某一个模块然后点“导出文 件”即可。 8. 不同 Office 组件可以互操作么?当然可以。VBA 的功能是由 COM 库来添 加的。默认情况下某一个 Office 组件只引用了当前这个组件的库。但是 你也可以手动添加其他库的引用。在 VBA 开发环境的“工具”菜单里点击 “引用”,就可以添加 Windows 上安装的任意 COM 组件。这样,不光不同 Office 组件可以互操作,你可以操作比如 Media Player,IE 等程序。 9. VBA 可以写图形界面么?当然可以。不然就说不上”Visual”了。VB 一向 支持一种被称为 UserForm 的模块。你可以在上面添加各种控件。 10.VBA 还提供哪些其他的功能?VBA 可以捕捉 Office 的事件,于是可以编写 如“当打开一个文档,要做某事”;“当 Excel 计算发生了错误,则做某 事”这样的程序。VBA 还有定时器,让你可以做周期性的工作。 11.除了 VBA,还有哪些开发平台可以操作 Office?实际上,任何可以使用 COM 组件的语言都可以访问 Office 的功能。在微软平台上的各种语言基 本上都满足这个条件。不过有几个平台是专门针对 Office 的。如.Net 上 的 VSTO(Visual Studio Tools for Office Developers)。这是一个利 用 Visual Studio 进行 Office 开发的集合环境,适合大型项目。不过为
了使用它,你必须得安装 Visual studio2005或者2008。这对于办公族 来说负担过重了。只有开发复杂的插件,或者开发企业办公管理系统的人 才应该使用它。此外 Apache基金会有一个POI项目,可以让Java程序访 问 Office文档。这样用Java开发,同时又想自动生成 Office文档的人 比如用Java写实验,但想用 Excel文档统计实验结果)可以利用POI 来达到他们的目标。不过POI目前不支持 Office2007的文件格式
序言 5 了使用它,你必须得安装 Visual Studio 2005 或者 2008。这对于办公族 来说负担过重了。只有开发复杂的插件,或者开发企业办公管理系统的人 才应该使用它。此外 Apache 基金会有一个 POI 项目,可以让 Java 程序访 问 Office 文档。这样用 Java 开发,同时又想自动生成 Office 文档的人 (比如用 Java 写实验,但想用 Excel 文档统计实验结果)可以利用 POI 来达到他们的目标。不过 POI 目前不支持 Office 2007 的文件格式
基本编程元素 1.基本编程元素 这一期就是要介绍在ⅦBA环境下你能使用什么东西。一般来讲,新手往往对到底 写什么会引起什么结果感到比较混乱。比如写 MsgBox可以出现对话框,但写 MessageBox为什么就不可以。在VBA中,直接写代码,而不是在Sub里写就会 报错?为何是Sub,而不是Suc,不是Sud?等等。我会将最常见的做概要性的 讲解。但是我不会深入去介绍每个细节的语法。精简够用就好。如果有必要,你 可以查任何的关于VB的参考手册。 Sub与 Function 最基本的问题是:如果你写了很多模块,每个模块有很多代码,那么你的程序代 码是从哪一句开始执行?答案是,VB将代码组成一段一段的,每段从头到尾执 行(当然,这是粗略的说,因为代码还可能有跳转和循环)。每一段叫做一个 Sub或着一个 Function。Sub是子过程“ Subroutine”的简称。比如像如下的代 码就定义了一个Sub Sub Testo MsgBox Hello"Show Hello with a messagebox End Sub 其中”Sub”这个关键字标志着Sub的开始, End Sub则表示其结束。其中的Sub 和 End Sub是关键字。所谓关键字就是VB定义好的,有特殊意义的词汇。在写 代码时不可以写错一个字母,否则就不被程序解释器接受(但是你可以不区分大 小写,VBA开发环境会自动帮你调整)。如果你在开发环境中写了这段代码就会 发现关键字都被表为蓝色。其他的,如For,Next,If,Then, While等都是关 键字。以上代码中的Test是一个名称,即这个Sub的名称。你可以随意定义这 个名称,只要其不包含一些特别的符号,并且不和关键字重名(注意:绝对不能 包含空白字符,如空格或制表符)。写完这段代码后,在 Office的“宏”对话 框列表里就能看到一项“Test”了。代码中的括号是用于定义参数的。如果想在 Sub/ Function上加输入参数,都是在括号中写一个列表,即 参数名1As类型1,参数名2As类型2,… 参数和类型在下面的“变量与类型”一节更详细的介绍。即使没有参数也要写个 空括号来占位置。这是VB的要求。之后,当你将键盘光标放在这个Sub里,并 点击上面的绿色箭头;或者到“宏”对话框执行Test,这个Sub就被执行了。 另外值得注意的是单引号后边的文字,称为注释。VB中所有写在单引号后边的 文字都会被解释器忽略掉,它们仅仅是给人看的。所以你可以在写代码时加上注 释,方便其他人看懂你的程序
基本编程元素 6 1. 基本编程元素 这一期就是要介绍在 VBA 环境下你能使用什么东西。一般来讲,新手往往对到底 写什么会引起什么结果感到比较混乱。比如写 MsgBox 可以出现对话框,但写 MessageBox 为什么就不可以。在 VBA 中,直接写代码,而不是在 Sub 里写就会 报错?为何是 Sub,而不是 Suc,不是 Sud?等等。我会将最常见的做概要性的 讲解。但是我不会深入去介绍每个细节的语法。精简够用就好。如果有必要,你 可以查任何的关于 VB 的参考手册。 Sub 与 Function 最基本的问题是:如果你写了很多模块,每个模块有很多代码,那么你的程序代 码是从哪一句开始执行?答案是,VB 将代码组成一段一段的,每段从头到尾执 行(当然,这是粗略的说,因为代码还可能有跳转和循环)。每一段叫做一个 Sub 或着一个 Function。Sub 是子过程“Subroutine”的简称。比如像如下的代 码就定义了一个 Sub。 Sub Test() MsgBox "Hello" 'Show Hello with a messagebox End Sub 其中”Sub”这个关键字标志着 Sub 的开始,End Sub 则表示其结束。其中的 Sub 和 End Sub 是关键字。所谓关键字就是 VB 定义好的,有特殊意义的词汇。在写 代码时不可以写错一个字母,否则就不被程序解释器接受(但是你可以不区分大 小写,VBA 开发环境会自动帮你调整)。如果你在开发环境中写了这段代码就会 发现关键字都被表为蓝色。其他的,如 For,Next,If,Then,While 等都是关 键字。以上代码中的 Test 是一个名称,即这个 Sub 的名称。你可以随意定义这 个名称,只要其不包含一些特别的符号,并且不和关键字重名(注意:绝对不能 包含空白字符,如空格或制表符)。写完这段代码后,在 Office 的“宏”对话 框列表里就能看到一项“Test”了。代码中的括号是用于定义参数的。如果想在 Sub/Function 上加输入参数,都是在括号中写一个列表,即 参数名 1 As 类型 1,参数名 2 As 类型 2,... 参数和类型在下面的“变量与类型”一节更详细的介绍。即使没有参数也要写个 空括号来占位置。这是 VB 的要求。之后,当你将键盘光标放在这个 Sub 里,并 点击上面的绿色箭头;或者到“宏”对话框执行 Test,这个 Sub 就被执行了。 另外值得注意的是单引号后边的文字,称为注释。VB 中所有写在单引号后边的 文字都会被解释器忽略掉,它们仅仅是给人看的。所以你可以在写代码时加上注 释,方便其他人看懂你的程序
基本编程元素 Function和Sub是很类似的东西。比如: Function Add(al As Integer, a2 As Integer) As Integer sum= a1+a2 Add sum End Function 这个例子实现了一个 Function,含义是将两个整数加起来。这次我添加了两个 参数a1和a2用于输入,其类型均为 Integer。参数的语法Sub和 Function是 样的。形式上, Function和Sub仅仅有关键字的差别。 Function与Sub最大 的不同就在于 Function需要返回一个值,而Sub不需要。第一行最后那个“As Integer”是指返回值的类型。返回的语法是: Function名称=想要返回的值 那么什么叫“返回”呢?这是因为程序段之间是可以互相调用的。Sub和 Function可以调用其他的Sub和 Function。整个程序的执行顺序大致如下图所 程序开始 程序结束 图中的矩形相当于一个Sub或者 Function,箭头代表程序的执行顺序(注意矩 形的长短不代表代码的长短,而仅仅是排版需要;并且调用层数不一定是3层 每个Sub/ Function都可以调用其他的Sub/ Function,这种形式造成了一种层数 无限定的树状结构。在调用时,上层可以以参数的形式给予下层输入,而下层将 控制权返回给上层的时候,也可以给上层一个返回值(只有 Function可以)
基本编程元素 7 Function 和 Sub 是很类似的东西。比如: Function Add(a1 As Integer, a2 As Integer) As Integer sum = a1 + a2 Add = sum End Function 这个例子实现了一个 Function,含义是将两个整数加起来。这次我添加了两个 参数 a1 和 a2 用于输入,其类型均为 Integer。参数的语法 Sub 和 Function 是 一样的。形式上,Function 和 Sub 仅仅有关键字的差别。Function 与 Sub 最大 的不同就在于 Function 需要返回一个值,而 Sub 不需要。第一行最后那个“As Integer”是指返回值的类型。返回的语法是: Function 名称=想要返回的值 那么什么叫“返回”呢?这是因为程序段之间是可以互相调用的。Sub 和 Function 可以调用其他的 Sub 和 Function。整个程序的执行顺序大致如下图所 示: 图中的矩形相当于一个 Sub 或者 Function,箭头代表程序的执行顺序(注意矩 形的长短不代表代码的长短,而仅仅是排版需要;并且调用层数不一定是 3 层)。 每个 Sub/Function 都可以调用其他的 Sub/Function,这种形式造成了一种层数 无限定的树状结构。在调用时,上层可以以参数的形式给予下层输入,而下层将 控制权返回给上层的时候,也可以给上层一个返回值(只有 Function 可以)
基本编程元素 比如上面的Sub“Test”调用了VB已经定义好的 MsgBox这个 Function来完 成工作(是不是觉得 MsgBox应该是一个Sub?实际上 MsgBox会返回一个整数值 表示用户是按哪个键关闭对话框的,比如“确定”,“取消”,“重试”等。只 不过在最简单的情况下我们不关心这个返回值罢了)。另外,我们也可以写一个 程序让Test调用Add Sub Testo sum Add(3, 4) MsgBox sum End Sub 这样就能用对话框显示3与4的和了。在实践当中,Sub一般用于执行某个动作; 而 Function则在 Excel自定义函数中特别有用。VB为开发者提供了一个很大的 库,即你可以直接使用许许多多的Sub和 Function来完成常见的任务(这和 Office库无关),比如字符串操作的 Substr,Trim,Len:;文件操作的Dir, Write; 数学运算的Log,Sqr等。完整的清单可以在任何一本VB的参考手册上找到。 ●变量与类型 我们在算数的时候需要草稿纸,将计算的中间结果记录下来。计算机算数也不例 外,也得需要在内存中开辟一些空间来记录这些内容。定义一块空间的方法的代 码是 Dim var 或者 Dim var As Type 或者就像上文Test中的sⅧ那样不经定义直接使用。其中Dim和As是关键字, 而var就是变量名。你可以随意定义变量名称,只要其不包含一些特别的符号, 并且不和关键字重名。既然是分配一块内存空间,那么分配空间有多大呢,又是 怎么使用的呢?这就由类型来定义了。一个类型规定了要分配的空间的大小和内 部结构,比如 Integer整数就分配2个Byte(所以其范围是-3276832767) 而Long长整型数分配4Byte; Double双精浮点数(小数)就分配8个Byte; String 字符串的长度就是其存储字符串长度+一块用于存放字符串的长度的额外空间。 以上这些类型由VB定义,被称为基本类型(还有其它几个基本类型可以使用) VB会尽可能在你混用这些基本类型时进行自动转换。比如: Dim str As String Dim n As Integer str= 12 now str is 12 n=34now n is 34 n= 23. 45 ' now n is 23
基本编程元素 8 比如上面的 Sub “Test” 调用了 VB 已经定义好的 MsgBox 这个 Function 来完 成工作(是不是觉得 MsgBox 应该是一个 Sub?实际上 MsgBox 会返回一个整数值 表示用户是按哪个键关闭对话框的,比如“确定”,“取消”,“重试”等。只 不过在最简单的情况下我们不关心这个返回值罢了)。另外,我们也可以写一个 程序让 Test 调用 Add。 Sub Test() sum = Add(3,4) MsgBox sum End Sub 这样就能用对话框显示 3 与 4 的和了。在实践当中,Sub 一般用于执行某个动作; 而 Function 则在 Excel 自定义函数中特别有用。VB 为开发者提供了一个很大的 库,即你可以直接使用许许多多的 Sub 和 Function 来完成常见的任务(这和 Office 库无关),比如字符串操作的 Substr,Trim,Len;文件操作的 Dir,Write; 数学运算的 Log,Sqr 等。完整的清单可以在任何一本 VB 的参考手册上找到。 变量与类型 我们在算数的时候需要草稿纸,将计算的中间结果记录下来。计算机算数也不例 外,也得需要在内存中开辟一些空间来记录这些内容。定义一块空间的方法的代 码是: Dim var 或者 Dim var As Type 或者就像上文 Test 中的 sum 那样不经定义直接使用。其中 Dim 和 As 是关键字, 而 var 就是变量名。你可以随意定义变量名称,只要其不包含一些特别的符号, 并且不和关键字重名。既然是分配一块内存空间,那么分配空间有多大呢,又是 怎么使用的呢?这就由类型来定义了。一个类型规定了要分配的空间的大小和内 部结构,比如 Integer 整数就分配 2 个 Byte(所以其范围是-32768 ~ 32767); 而 Long 长整型数分配 4Byte;Double 双精浮点数(小数)就分配 8 个 Byte;String 字符串的长度就是其存储字符串长度+一块用于存放字符串的长度的额外空间。 以上这些类型由 VB 定义,被称为基本类型(还有其它几个基本类型可以使用)。 VB 会尽可能在你混用这些基本类型时进行自动转换。比如: Dim str As String Dim n As Integer str = 12 'now str is "12" n = "34" 'now n is 34 n = 23.45 'now n is 23