3.VBA初步19Excel与VBA程序设计Copyright©2005马维峰3.VBA初步3.1.VBA简介VBA是VisualBasicforApplication的缩写,是一种应用程序自动化语言。所谓应用程序自动化,是指通过程序或者脚本让应用程序,例如MicrosoftExcel、Word自动化完成一些工作,例如在Excel里自动设置单元格的格式、给单元格充填某些内容、自动计算等。在前面的章节里,我们通过使用宏来设置Excel单元格的格式、填充单元格的内容,而使宏完成这些工作的正是VBA。VBA的由来在20世纪90年代早期,使应用程序自动化还是充满挑战性的领域。对每个需要自动化的应用程序,人们不得不学习一种不同的自动化语言。例如,可以使用Excel的宏语言使Excel自动化,使用WordBasic使MicrosoftWord自动化,等等。因此,Microsoftt决定开发一种应用程序共享的通用自动化语言VBA,这就是VisualBasicforApplication(VBA)的由来。VisualBasicforApplication可以看做是非常流行的应用程序开发语言VisualBasic的一个子集,VisualBasic其他子集还包括VBScript等。VBA具有VB语言的大多数特征和易用性,它最大特点就是将Excel作为开发平台来开发应用程序,可以应用Excel的所有已有功能,例如数据处理、图表绘制、数据库连接、内置函数等等。本部分将对VBA及其开发环境IDE(集成开发环境)、VBA的基本语法、应用VBA自动化Excel做一简单介绍。文中会涉及到一些诸如对象、事件等部分读者可能不熟悉或不清楚的概念,对于此类问题可直接忽略之,因为在后面会有详细介绍。本部分也不是一个VBA的参考文档,只是其语法、特征的快速浏览和介绍。学习完本部分的内容后,读者应该可以应用Excel和VBA进行一些简单的开发。3.VBA初步20Excel与VBA程序设计Copyright©2005马维峰3.2.VBA快速入门3.2.1.VBA开发环境VBA集成开发环境(IDE,IntegratedDevelopmentEnvironment3的缩写)是进行VBA程序设计和代码编写的地方,同一版本的Office共享同一IDE。VBA代码和Excel文件是保存在一起的,可以通过点击“工具―宏―VisualBasic编辑器”打开VBA的IDE环境(图3-1),进行程序设计和代码编写。打开VBAIDE的方法:z通过“工具―宏―VISUALBASIC编辑器”z通过快捷键“ALT+F11”z右键单击工具栏,选择“VisualBasic”,此工具栏有录制宏,打开VBAIDE等的快捷按钮:3翻译为中文即“集成开发环境”。3.VBA初步21Excel与VBA程序设计Copyright©2005马维峰图3-1VisualBasicIDE环境图3-1为ExcelVBA的IDE环境,对于所有使用同一版本VBA的应用程序,都共享相同的IDE环境。对于同一程序,例如Excel,不管你打开几个Excel文件,但启动的VBA的IDE环境只有一个。缺省情况下,VBAIDE环境上方为菜单和工具条(图3-1),左侧上方窗口为工程资源管理器窗口,资源管理器窗口之下为属性窗口,右侧最大的窗口为代码窗口。在资源管理器窗口可以看的所有打开和加载的Excel文件及其加载宏。每一个Excel文件,在VBA下,称为一个工程,如果你同时打开了多个Excel文件,则在VBAIDE下可以看到有多个工程存在。每个Excel文件(工作薄)对应的VBA工程都有4类对象(图3-2)。,包括:zMicrosoftExcel对象z窗体z模块z类模块MicrosoftExcel对象代表了Excel文件及其包括的工作薄和工作表等几个对象,包括所有的Sheet和一个Workbook,分别表示文件(工作薄)中所有的工作表(包括图表),例如缺省情况下,Excel文件包括3个Sheet,在资源管理器窗口就包括3个Sheet,名字分别是各Sheet的名字。ThisWorkbook代表当前Excel文件。双击这些对象会打开代码窗口(图3-1右侧窗口),在此窗口中可输入相关的代码,响应工作薄或者文件的一些事件,例如文件的打开、关闭,工作薄的激活、内容修改、选择等(有关事件、Excel对象模型见后)。窗体对象代表了自定义对话框或界面,例如你编写了一个VBA求个人所得税的小程序,需要输入税率、收入等参数,那么就可以使用窗体设计一个对话框,来获取用户输入。模块是自定义代码,包括我们录制的宏等VBA代码保存的地方。类模块是以类或对象的方式编写的代码保存的地方。通过创建类模块,在VBA中也可以创建自己的类和对象,我们在“VBA语言”一章会详细介绍VBA的面向对象编程的问题。关于各对象的具体含义和使用后面会详细介绍,这里只是做个最初的了解。在工程资源管理器窗口的右键菜单下,有添加用户窗体、模块、类模块的选项,也可以将已有的模3.VBA初步22Excel与VBA程序设计Copyright©2005马维峰块移除、导入和导出。在工程资源管理器之下,也可以通过将一个工程中的模块用鼠标拖拽到另一个工程实现模块在工程之间的拷贝。图3-2VBA工程资源管理器窗口包括2个VBA工程建议随时更改ExcelVBA工程的名称,其缺省名称为“VBAProject”,可以通过选中工程,在属性窗口更改为有意义的名称,或者在菜单的“工具-VBAProject属性”对话框中更改。在VBA工程资源管理器之下是属性窗口(图3-3),主要用于对象属性的交互式设计和定义,例如选中图3-2中的VBAProject,在属性窗口即可更改其名称。属性窗口除了更改工程、各对象、模块的基本属性外,主要用途是用户窗体(自定义对话框)的交互式设计。图3-3显示的就是一个打开的窗体(UserForm)的属性窗口。3.VBA初步23Excel与VBA程序设计Copyright©2005马维峰图3-3VBA属性窗口在IDE窗口的右侧,可以打开代码窗口。在资源管理器窗口中的每一个对象会对应一个代码窗口(用户窗体包括一个设计窗口和一个代码窗口)。可以通过在对象上双击、在右键菜单或资源管理器工具栏上选择查看代码(或对象)打开代码窗口。对于IDE环境、菜单、工具栏的具体使用和说明,在后面的讲解中会逐步讲解说明。单击“视图-对象浏览器”或工具栏上的“对象浏览器”按钮即可打开对象浏览器窗口(图3-4),在此窗口内可查看当前工程及其引用对象的属性、方法和事件。对象浏览器对于熟悉和查看相应的Excel对象、引用对象(包括COM对象、其他Excel程序)所包含的类、属性、方法和事件非常有用,特别是在没有相应的帮助资料或者文档的情况下,对象浏览器是查看一个对象的内容的最有效的工具。3.VBA初步24Excel与VBA程序设计Copyright©2005马维峰图3-4VBAIDE环境的对象浏览器上部可以选择对象,也可以输入一些查询条件;左侧为对象列表;右侧是对象的成员,包括属性、方法和事件;下部为成员或者对象的说明3.2.2.在VBAIDE下进行开发熟悉了VBA的IDE环境后,我们来开发VBA之旅的第一个程序。新建一个Excel文件,通过菜单或键盘快捷键打开VBA集成开发环境,在VBAProject上单击右键,选择“插入-模块”。这样,系统将打开一个代码窗口,在窗口中输入以下代码4。#001SubMyFirstVBAProgram()#002DimstrNameAsString#003DimstrHelloAsString#004strName=InputBox(请输入你的名字:)#005strHello=你好,&strName&!#006MsgBoxstrHello#007EndSub将鼠标光标放置在这段代码之内,单击菜单“运行-运行子过程/用户窗体”,或者4代码内的“#003”为行号,在实际代码中不能输入,在此只为文中叙述方便,之后不再重复。3.VBA初步25Excel与VBA程序设计Copyright©2005马维峰在工具栏单击运行按钮,则可运行这段代码。运行结果会显示一个对话框,输入一些内容后,会显示相应的问候语。同样,这段代码可以和宏一样,在Excel下选择并执行。与其他程序设计语言不同,VBA程序是事件驱动的,没有Main函数之类的入口的概念。如果在IDE环境下,鼠标光标不在任何过程内,单击工具栏或运行菜单的运行,会显示一个对话框,要你选择要运行的过程。本质上,VBA代码应该只是一些完成具体工作的集合,而通过界面元素或者Excel的事件驱动执行,你可以通过自定义按钮、菜单,并指定一个宏(VBA过程,自定义界面也可以通过编程手段完成此类工作),通过单击此按钮即可调用相应的VBA代码,或者将调用绑定在Excel的某个事件下。下面我们简单看一下上面这段代码的组成,代码第1行表示这是一个新的过程,名称为“MyFirstVBAProgram”,第2、3行定义了2个变量,其类型为字符串类型,第4行调用InputBox这个内置函数,并将返回值赋给strName这个变量,第5行将几个字符串组合成一个新的字符串,第6行调用MsgBox这个函数,显示一个对话框,第7行表示过程结束。VBA程序由不同的模块组成,在模块内部,可以定义不同的变量、过程或函数,由此组成一个完整的程序。代码窗口的设置中文环境下VBAIDE代码窗口缺省的设置比较糟糕,字体为宋体,大小是9磅,使用不很方便,可以在“工具-选项”对话框下的“编辑器格式”页内设置代码窗口字体、颜色、背景。字体建议使用CourierNew,大小可以按照自己的分辨率设置标准以阅读清楚为宜。在此模块内,再新建一段代码:#001FunctionMyAdd(varA,varB)AsVariant#002MyAdd=varA+varB#003EndFunction此段代码非常简单,只有3行,第1行表示这是一个函数,具有2个参数varA,和varB,函数与过程的差别在于函数有返回值,第2行将参数varA,和varB的和赋给函数,代表其返回值。函数无法直接运行,必须从工作表或者其他程序调用,例如,我们可以写以下一段简单的程序调用此函数:#001SubTestAdd()3.VBA初步26Excel与VBA程序设计Copyright©2005马维峰#002Dima,b,c#003a=12#004b=34#005c=MyAdd(a,b)#006MsgBoxc#007EndSub其中第5行为函数MyAdd的调用,函数将返回值赋给c。需要说明的是,VBA中,调用过程可以使用Call语句,也可省略,调用过程时,其参数的括号可以省略,但调用函数必须有括号。也可以直接在工作表内使用自定义的函数,例如在工作表中,我们可以和Excel内置函数一样使用自定义的函数(图3-5),Excel会负责参数传递,将返回值赋给相应的单元格,在引用参数改变时会自动重新计算,总之,与内置函数的使用没有什么不同。图3-5在工作表中使用自定义函数以上通过2个例子简单介绍了VBA编程的过程和概念,后面我们将正式进入VBA编程之旅,逐步讲解模块、函数与过程、数据类型、基本语法等概念。VBA程序的保存当关闭VBAIDE的时候,不会提示保存用户所做的修改,当我们退出Excel保存其文件时,VBA程序代码也随之保存,因为VBA代码是寄生于Excel或其他文档的,保存文档即保存了VBA代码。对于一般的VBA程序,这点没有什么问题,但如果是在进行加载宏的开发,那么退出IDE环境时,一定要点击其文件菜单或工具栏的保存,保存所做修改,否则会丢失所做的任何修改。3.2.3.模块、过程和函数VBA代码必须存放在某个位置,这个地方就是模块。模块是作为一个单元保存在一起的VBA定义和过程的集合。VBA中有两种基本类型的模块:标准模块和类模块。模块可以包括2类子程序:过程或者函数。3.VBA初步27Excel与VBA程序设计Copyright©2005马维峰一般