VBA概述之在Office产品中创建自己的应用程序

VBA概述

    VBA(Visual Basic For Application)是VB语言在Office产品中的应用,它基于Visual Basic For Windows发展而来,Visual Basic For Windows是Microsoft于1992年推出的开发Windows应用程序的程序设计语言,由于语言简单,易用易学,所以深受用户的欢迎。而VBA的语法结构与Visual Basic For Windows基本相似,但它们之间是有本质区别的,Visual Basic For Windows是一种编程语言,它可以创建独立的应用程序,而VBA是一种语法结构类似于Visual Basic For Windows的脚本语言,一般来说,它都是被嵌入在Microsoft的Office产品中来执行的。

    在Office 2000之前,VBA在Word、Excel、Access等Office系统软件中的运用是不一样的(那个时候Office家族中的产品为数不多),但是到Office 2000就统一起来了。Excel是第一个包含有VBA的Office产品,也是至今应用VBA最广泛的软件之一。自Office 2000之后,Excel、Word、PowerPoint、Access中已经有了统一标准的宏语言VBA,其中Excel和Access的VBA最为成熟(从Office 2000开始,Office家族中的产品开始多起来)。

    从Office 2003开始,Microsoft在Office家族中逐渐增加了很多产品,如OneNote、Publisher、InforPath、Visio等,但是除了对VBA中的对象进行了扩充外,在VBA的应用推广上并没有特别大的改变,而且有些产品由于使用上的问题也没有提供对VBA的扩展。

    如今,Office 2007已经到来,并且在对VBA的支持上也出现了一些变化,随着Microsoft .NET产品系列的不断扩大和深入,.NET也嵌入到Microsoft的各个不同的产品中,而其中VSTO就是专门针对VBA在Office产品中应用的一个升级方案,我会在接下来的一些文章中向读者介绍它。不过Excel仍然是Office家族中使用VBA最广泛的产品,因此,我会以Excel为例来介绍VBA的使用,并在Office 2007软件基础上做一些示例。

    首先来看看我们使用VBA在Excel中可以做些什么事情。

    Excel是一款功能很强大的用于处理表格数据的软件,它可以被用来做很多不同的工作,如记录客户的名字和学生的考试分数、进行收支预算、分析实验数据、制作发货单和表格、通过给定的数据统计图表等等,Excel的各种不同的功能被应用到各行各业,但有一点是相同的,那就是当要处理的数据量很大时,所有的用户都期望让Excel可以非常聪明地自己处理一些事情,“让Excel动起来”正是VBA可以办到的!

    例如我们可以写一个VBA程序来格式化报表,并把它打印出来,经过开发和测试,我们最终可以只用一个命令就完成所有的工作,而不用自己动手去一个个地敲命令、点击鼠标查找菜单…Excel可以在一瞬间完成所有的工作,何乐而不为呢?

 

VBA在Excel中的几种习惯用法

    先看看我们在Excel中经常会用到的VBA:

    1. 反复插入文本。如果你经常需要在表格里插入一段文本,如公司的名称、版权信息等,你就可以写一个VBA程序来代替你做这件事。当然这再简单不过了,类似的情况会有很多,例如你还可以让VBA帮助你插入公司所有员工的姓名(这些信息也许来源于一个网站或者数据库)。

    2. 自动完成反复的工作。如果你是一名销售经理,需要经常写一份“月底销售报告”递交给老板,如果这些表格里的数据来源于同一个地方,并且表格的样式没有特别大的变动,那么你完全可以通过VBA编写一个逻辑,让Excel自己去搜集这些信息然后生成一张漂亮的表格,而这个时间里你要么去做其它更重要的事情,要么在一边舒舒服服地喝一杯咖啡看着电脑为你干活儿。而老板也会为你有如此高的工作效率而对你另眼相看。

    3. 录制宏完成相同的动作。Excel中的宏其实也是VBA应用的一种,它是由Excel自动根据你所指定的命令生成的VBA代码,执行这些代码就相当于执行了这些命令。在Excel中,我们在一个表格里做完一项工作,同时录制了一个宏,然后可以在其它的表格里反复执行这个宏,Excel可以毫无保留地帮我们将这项工作“复制”在所有的表格里。

    4. 自定义命令。在Excel中,我们可以把反复要使用的一系列操作写到一个宏里,然后绑定到快捷键或按钮上,以后只需要使用一个快捷键或点击一个按钮就可以迅速地完成一系列命令。

    5. 自定义工具栏。听起来有些不可思议!我们可以通过VBA编写的代码在Excel的工具栏上放置自己的按钮,随时点击它。

    6. 自定义菜单。不仅可以定制工具栏,我们甚至可以通过VBA将自己的命令放到Excel的菜单上,是不是很强啊?

    7. 制作数据表模板。通过制作数据表模板来帮助那些Excel初学者更快地完成工作,以减少他们所浪费的时间。

    8. 自定义工作表函数。虽然Excel拥有很多的功能函数(如Sum何Average等),但总是在实际的应用中显得不够,我们可以通过VBA添加自己的功能函数,用来完成一些特定的计算,从而简化计算过程。

    9. 开发完全由宏来驱动的应用。花点时间,VBA还可以让你做很多大型的应用程序,包括定制对话框、OnScreen Help、数据同步、数据搜集工具,以及其它更多的功能组件。

    10. 打造完全属于自己的Excel插件。Excel本身的插件已经很多了,通常情况下都够用,不过我们还是可以通过VBA开发属于自己的专有插件。Excel中用来生成统计图表的功能就是一个插件,叫Analysis ToolPak。

    通过VBA可以开发Excel的很多功能,甚至于访问网络资源、遍历Windows域、访问远程机器上的文件等,只要去认真研究VBA语言本身提供的对象,我们还可以发现更多令人惊奇的东西。VBA真的很强大!

 

VBA的优缺点

    前面说了那么多VBA可以做的事情(尽管还远远不止这些),那么VBA到底好在哪些地方呢?Excel几乎能自动完成所有你想做的事,只要能写出Excel命令,它就可以完成功能,所以VBA的自动化就体现了下面这些优点:

    1. Excel在自动化具体任务时代码执行的顺序不变(有的时候这看起来倒是一件好事)。

    2. 可以肯定的是,让Excel自动化一项工作肯定比手动去完成要快得多(我想没有人愿意手动去完成那些繁琐而重复性的工作)。

    3. 如果拥有近乎完美的宏代码,Excel会永远无故障地运行(不过任何代码都是有缺陷的)。

    4. 任何人都可以用Excel自动化一项具体工作,即使他根本不懂计算机编程(Excel的宏录制功能帮了很大的忙)。

    5. 很多看似不太可能做到的事情都可以用Excel做得漂漂亮亮的(前段时间我刚用Excel为一个网站做了一个前台数据录入工具)。

    6. 对于那些既花时间又费精力的事儿,你再也不用坐在电脑前郁闷了,调用一个VBA编写的命令,剩下的事情你就不用管了,出去放松一下吧。

    当然,就像所有的编程语言一样,VBA也会有一些缺点,从应用的角度来看有以下几点(其它不好的地方应该也都从Visual Basic For Windows那里继承过来了):

    1. Excel的宏虽然可以为你自动生成一些VBA代码,但大多数时候还是需要你自己去编写代码将这些功能组织起来,如果你没有一点编程经验的话,这个对你来说恐怕有点棘手。不过还好,VBA学起来还是很容易的。

    2. 想要运行VBA必须要事先安装Office软件,尤其是Excel。它不可能像Visual Basic For Windows程序那样只需要双击一个exe文件就能执行起来(这看来也是脚本语言的局限性)。

    3. VBA是变化的,在不同的Office版本中,VBA都有一些细微的变化,这将导致你在Office 2000中编写的VBA代码在Office 2003中无法正确执行,反过来也一样。

 

在Excel中开始VBA程序

    我所演示和开发测试的环境都是建立在Excel 2007上,读者如果想演练,最好也在相同的软件环境下。

    首先打开Excel,默认安装配置下Excel 2007没有显示“开发工具”菜单,我们需要打开它。点击窗体左上角的“Office按钮”,选择“Excel选项”,在对话框中选择“常用”选项卡,勾选“在功能区显示‘开发工具’选项卡(D)”,确定。现在我们在Excel的菜单区就可以看到“开发工具”了,点击它,就可以开始我们的VBA程序了。

11 12 13

    为了让你的VBA程序或者宏代码能够顺利运行,你需要确认一下宏的执行安全设置。点击“宏安全性”,在对话框中选择“启用所有宏”,并勾选“信任对VBA工程对象模型的访问”。现在我们可以完全自由地去编写我们的VBA程序了。

14     点击Visual Basic,可以打开VB编辑器(简称VBE),我们的几乎所有的VBA代码都是在这里编写的。当然,如果你曾经是一位VB程序员,那么你会对这个编辑界面再熟悉不过了,它几乎就和VB 6的编辑界面一样,也有工程窗口、属性窗口和代码窗口,在这里我们同样可以添加控件、引用、模块以及Excel对象等元素。另外,通过选择代码编辑窗口上方的两个下拉列表,我们可以为不同对象的不同事件编写代码。所谓事件,就是我们在点击或选择控件时所完成的一系列动作,如命令按钮的点击事件,下拉列表下拉项的选择,复选框或单选框的选择等。

15     有关如何编写VB代码以及VB代码的基本特性已经不是本文要讨论的内容(事实上这些内容大家在学习计算机编程基础知识时也已经都了解过了),这里只对在Excel中使用VBA的一些情况做一下介绍。

    1. VBA中将Excel录制的宏写到一个VBA模块中(先了解了解什么叫做VB模块),它已经包含了一系列独立的命令,可以作为一个VBA过程被调用。

    2. 一个VBA模块有很多“子过程”组成,它执行了“对象”上的一些操作,可以独立运行。例如我们在Excel Sheet上添加一个Active控件(注意大多数时候我们在VBA中所使用的都是Active控件而不是表单控件),比如添加一个命令按钮,双击它,在代码编辑窗口中就可以添加相应的命令了。下面的代码是当用户点击命令按钮后提示1+1的结果。

16

Private Sub CommandButton1_Click()
   
Dim sum As Integer
    sum
= 1 + 1
   
MsgBox "The answer is " & sum
End Sub

    Excel中可以使用的Active控件不是特别多,这也表示了在VBA中用户对UI的控制没有特别多的选择,当然,如果你的电脑上注册了其它可用的Active控件,只要允许,你完全也可以把它们引用到Excel中,只要点击“Active控件”中的最后一个图标,在对话框中选择要引用的Active控件即可。VBA中控件的使用和VB中相同,这里就不再一一介绍了。回到Excel主界面,退出设计模式(只需要再次点击“设计模式”按钮即可),点击我们刚才添加的命令按钮,屏幕上出现了我们刚才在代码中添加的对话框。

17    3. VBA模块中有很多的函数,函数一般返回单一值,它既可以被别的模块调用,也可以当做工作表函数来使用。

    4. VBA提供了很多的已有对象,其中包括了WorkBook、WorkSheet、Cell Range、Chart以及Shape等重要对象。

    5. Excel对象有其自身的层次结构。一个对象可以包含其它的对象,占据层次结构最顶端的是Excel,而它本身就是一个对象,在代码中叫做Application,它包含了WorkBook和CommandBar等重要对象,WorkBook则又包含了WorkSheet和Chart等对象,WorkSheet又包含了Range和PivotTable等对象…这些层次结构的对象组成了我们VBA代码的基本部分。

    6. 同类对象组织在一起就形成了集合,如WorkBook中包含的所有WorkSheet被称之为WorkSheet集合,而Chart集合则由全部的Chart对象组成。

    7. 凡是层次结构中的对象都可以在VBA中使用,跟大多数面向对象语言一样(虽然VB和VBA还不能被称之为完全意义上的面向对象语言),我们使用“.”运算符来调用。如Application.WorkBooks(“Book1.xls”),它表示WorkBooks集合中的一个名称为Book1.xls的对象(该对象为一个Excel文件),然后我们可以在这个对象中引用Sheet对象,如Application.WorkBooks(“Books.xls”).WorkSheets(“Sheet1”)。如果想进一步指定一个具体的单元格,就可以这样Application.WorkBooks(“Books.xls”).WorkSheets(“Sheet1”).Range(“A1”)。

    8. Excel中的当前活动对象可以让我们在代码中使用一种简便的方式来调用对象。如果Book1.xls就是当前正在编辑的工作表,那么刚才我们引用对象的方式就可以简写为WorkSheets(“Sheet1”).Range(“A1”)。当然,如果当前编辑的工作表就是Sheet1,可以直接写成Range(“A1”)。

    9. Excel中各种对象都有其自身的属性。对象的属性可以理解为对象的设置项,即便是一个单元格(Range),也有它自己的属性,如Value(单元格的当前值)和Address(单元格在工作表中的地址)等。HasTitle(是否包含标题)和Type(图表类型)则是Chart对象的属性。VBA允许用户判断或更改对象的属性值。

 

    10. 在使用对象属性时,必须用“.”运算符来连接对象名和属性名,如WorkSheets(“Sheet1”).Range(“A1”).Value可以查看当前工作表Sheet1中单元格A1的当前值。

    11. 变量赋值。同VB代码一样,在VBA代码中允许使用变量来存储数值、文本和对象,如interest = WorkSheets(“Sheet1”).Range(“A1”).Value将工作表Sheet1的单元格A1的值赋值给一个interest变量。

    12. 对象还包括了可以在其上调用的方法。所谓方法,就是Excel在对象上可以执行的动作,如ClearContents被用来清除Range内的内容。

    13. 方法的调用和属性的获取类似,也需要使用“.”运算符,如WorkSheets(“Sheet1”).Range(“A1”).ClearContents。

    14. VBA包含了现代编程语言的所有语言结构,如数组、分支结构、循环结构、集合对象等。

    通过以上一些简单的介绍,相信读者已经对VBA有了一个大致的了解,我在后面的章节中将会陆续介绍VBA中的一些对象和用法。

 

Excel简史

    我觉得还是有必要在这里介绍一下Excel的发展历史,因为不同版本的Excel对VBA的支持是不一样的。

    1. Excel 2:在Windows平台上,Excel最开始的版本号是2,这是为了和Mac平台上的Excel保持版本一致。Excel 2诞生于1987年,不过后来几乎没有人再用它。

    2. Excel 3:于1990年末发布,其中XLM宏语言也随之一起发布。

    3. Excel 4:于1992年初面试,继续包含了XLM宏语言。

    4. Excel 5:1994年上半年问世,VBA第一次在这个版本中露面。

    5. Excel 95:从技术角度讲应该是Excel 7(其中没有Excel 6这个版本),该版本于1995年夏天开始问世,是一个32位的版本,运行在Windows 95和NT平台上,其中增强了一些VBA的功能,并继续支持XLM。不过,Excel 95的文档格式和Excel 5相同。

    6. Excel 97:也可以被称为Excel 8,诞生于1997年元月,需要Windows 95和NT的支持。在此版本中,VBA在功能上有了很大的增强,其接口几乎全部被重新设计过,同时它还采用了全新的文件格式(之前的版本不能打开这种格式)。

    7. Excel 2000:即Excel 9,于1999年6月发布,仅增强了一点点功能,不过在用户体验方面改善了很多,尤其是网络用户。

    8. Excel 2002:也叫Excel 10或Excel XP,于2001年下半年发布。在这个版本中最大的特性就是数据恢复(即Excel崩溃之后可以自动恢复崩溃之前的数据),同时它也是第一个使用版权保护的版本。

    9. Excel 2003:Excel 11,这应该是目前来说使用人数最多的版本,也是最为成熟的版本,不过较前一版本而言它并没有增加什么新特性。

    10. Excel 2007:随Office 2007产品同时发布,这个版本有了很大的改变,除了界面风格的改变外,还增加了按颜色筛选和排序的功能(这可是个很有用的功能,我在Excel 2003的时候还曾经用VBA开发过类似于这样的功能),同时,Office 2007的系列产品在文件格式上也有了很大的改变,Excel 2007的文件后缀为xlsx,它是一种完全公开的支持XML可扩展的文件格式,这里有一篇文章介绍了Excel 2007的这种新文件格式。

http://blog.excelhome.net/user1/fanjy/archives/2007/940.html

    了解Excel的发展历史和各个版本的不同是非常重要的,因为我们需要确保不同版本的Excel对VBA的支持情况,避免别人在使用我们编写的VBA程序时出现莫名其妙的错误,如VBA的Split函数是在Excel 2000中才引入的,如果在Excel 2000之前的版本中使用含有Split函数的VBA程序,则会出现编译错误。

 

结语

    VBA在Excel中的应用非常广泛,深入了解并应用VBA,可以大大提高我们在使用Excel时的工作效率,达到意想不到的效果。另外,顺便还要说一句,Excel在针对不同的数据类型时可以保存为不同类型的文件,在含有VBA的Excel文件中,为了保证今后能够顺利打开文件并执行其中的VBA代码,建议读者将Excel文件保存为xlsm类型(它表示一种启用宏的工作簿)。

    本文只是一个开篇,简单介绍了VBA的发展历史和应用范围,并举例说明了一下如何在Excel中编写并运行自己的VBA程序,接下来我会详细向大家介绍VBA中形形色色的对象的使用方法,其中大家也会看到一些难以想象的功能,不过这都很简单,毕竟VBA只是脚本,它并不复杂!

 

(在此感谢好友杨智——Jeffrey R. Young提供的帮助)

posted @ 2009-03-29 22:15  Jaxu  阅读(7681)  评论(2编辑  收藏  举报