Excel VBA编程实战宝典(光盘内容另行下载,地址见书封底)(txt+pdf+epub+mobi电子书下载)


发布时间:2020-05-15 18:18:40

点击下载

作者:伍远高

出版社:清华大学出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

Excel VBA编程实战宝典(光盘内容另行下载,地址见书封底)

Excel VBA编程实战宝典(光盘内容另行下载,地址见书封底)试读:

前言

Excel 2013是Microsoft Office 2013的组件之一,该软件主要用来对表格数据进行管理、分析、统计等,是办公人员最常用的软件之一。如果想要让Excel 2013发挥最大的功效,则可以借助于VBA开发各种电子表格应用程序。

使用VBA可以为Excel 2013应用程序提供新的功能或增强现有的功能,从而减少用户在Excel中的操作步骤,提高工作效率。如果要以Excel 2013为平台,使用VBA进行二次开发,则需要读者能熟练地操作Excel软件,并具有一定的程序设计能力。

本书便是一本以最新的Excel 2013为版本,系统介绍VBA编程技术的图书。本书内容全面,涵盖广泛,几乎涉及VBA编程从入门到进阶的大部分技术,适合学习阶段的读者阅读。本书以实战为原则,讲解时不是罗列枯燥的语法知识,而是每个技术点都结合典型实例进行讲解,每章最后还给出了针对性的实战练习题,并且在本书的最后给出了一个综合项目案例的开发过程。相信通过本书的学习,读者可以很好地掌握Excel VBA编程。本书特色□ 适用于多个版本:本书除第20章介绍的Excel 2013新增RibbonX功能的内容外,其余章节的内容都可应用到Excel 2000/XP/2003/2007/2010/2013的各版本中。使用各版本的用户都可以通过本书学习VBA知识。□ 内容全面:市场上大多数介绍VBA类的书籍,都只是详细介绍了Excel对象模型的使用,没有程序设计基础的读者需要参考其他书籍来学习VB程序设计方面的知识。本书除了详细介绍Excel对象模型的使用外,还详细介绍了VB程序设计基础,使初学者通过本书就可学习到完整的Excel VBA程序设计的相关知识。□ 专业性强:本书除了介绍VBA相关知识外,还介绍了在Excel中调用Windows API、使用ADO访问数据库、控制其他Office应用程序、使用类模块以及制作帮助系统等应用程序开发中的高级内容,使读者开发的Excel应用程序更专业。□ 知识点和实例相结合:本书每个知识点都以实例代码来讲解。在本书最后以一个完整的进销存管理系统的开发过程为例,使读者能够通过实例进一步巩固前面各章所学的知识。□ 视频教学:为了便于读者高效、直观地学习本书内容,作者专门为本书中的重点内容录制了大量的多媒体教学视频辅助读者学习,从而达到更好的学习效果。

本书对Excel 2013的新增功能,以及实际开发应用程序中经常要用到,而其他书籍很少介绍的功能也进行了详细的介绍。例如:□ 使用RibbonX,在第20章中详细介绍了使用XML自定义Excel 2013功能区的方法。□ 制作COM加载宏,在第26章中介绍了用VB开发COM加载宏的方法。□ 操作VBE,在第28章中介绍了用VBA代码控制Excel VBE开发环境的方法。□ 制作帮助系统,在第30章中介绍了为Excel应用程序制作帮助文件的方法。本书内容

本书程序是在Windows 7和Excel 2013中开发运行的,全书共分为7部共31章。

第1篇 Excel 2013应用程序开发简介,包括1~3章,分别介绍了Excel开发平台概述、使用宏、Excel VBA的开发环境等内容。

第2篇 VBA基础知识,包括4~9章,分别介绍了VBA基础、程序控制结构、使用数组、使用过程、管理模块等程序设计的基本知识,第9章还详细介绍了字符串和日期的处理方法。

第3篇 掌握Excel对象模型,包括10~15章,详细介绍了Excel中常用对象的属性、方法和事件的使用方法(包括Application对象、Workbook对象、Worksheet对象、Range对象和Chart对象等常用对象的使用)。

第4篇 用户界面设计,包括16~21章,分别介绍了使用Excel内置对话框、创建自定义对话框、使用标准控件、使用ActiveX控件、使用RibbonX界面、使用CommandBars等内容。

第5篇 使用外部数据,包括22~25章,分别介绍了控制其他Office程序、处理文件、使用ADO访问数据库、Excel 2013与Internet等内容。

第6篇 VBA高级应用,包括26~30章,分别介绍了使用Excel加载宏、使用类模块、用代码操作VBE、使用Windows API、制作应用程序的帮助等内容。

第7篇 综合应用程序设计,第31章为一个综合实例——进销存管理系统,本章详细介绍了该实例的开发过程,通过该实例的开发,进一步巩固前面各章所学的知识。本书超值DVD光盘内容□ 本书各章涉及的实例源文件;□ 15小时本书配套教学视频;□ 13.7小时Excel公司管理专题视频讲座;□ 4.7小时Excel商务图表制作专题视频讲座;□ 14小时Excel数据处理、计算与分析专题视频讲座。读者对象

本书要求读者已经能熟练使用Excel 2007/2010/2013,并对Excel 2013的新增功能有一定的使用经验。在阅读本书前,读者至少已经掌握了以下的Excel操作技能:□ 格式化工作表;□ 命令单元格区域;□ 使用公式和函数;□ 创建图表;□ 管理工作簿;□ 管理工作表。本书作者

本书由伍远高主笔编写。其他参与编写的人员有陈晓建、陈振东、程凯、池建、崔久、崔莎、邓凤霞、邓伟杰、董建中、耿璐、韩红轲、胡超、黄格力、黄缙华、姜晓丽、李学军、刘娣、刘刚、刘宁、刘艳梅、刘志刚、司其军、滕川、王连心、沃怀凯、闫玉宝。

由于书稿内容涉及众多的计算机专业知识,且作者水平和学识有限,书中难免有疏漏之处,敬请读者朋友批评指正。编著者第1篇 Excel 2013应用程序开发简介

Microsoft Excel本身是一个流行的电子表格应用程序,但本书所谓的Excel应用程序是指以Excel为平台,在Excel环境中使用VBA为用户定制开发的应用程序,也就是通常所说的二次开发。通过二次开发,可根据用户的不同需求,定制出各种不同的应用环境。★ 第1章 Excel 2013开发平台概述★ 第2章 使用宏★ 第3章 Excel VBA的开发环境第1章 Excel 2013开发平台概述

Excel作为专业的电子表格软件,被各行各业大量应用于表格制作和数据统计分析。Excel内嵌VBA程序开发语言,从而为程序开发者提供了一个开发平台,可使有经验的用户对Excel进行定制。本章简单介绍使用Excel 2013开发应用程序的基础知识和开发过程,为后面的学习打下基础。1.1 Excel 2013新增功能

2012年12月,微软推出了Office 2013套装软件RTM版,与以前版本(Office 2010)相比,Office 2013的变动不大,仍然采用了Ribbon界面。本节简单介绍Excel的发展过程及Excel 2013的新增功能。1.1.1 Excel的前世今生

1993年,微软正式推出了Excel 5.0,该产品确立了微软在电子表格软件领域的重要地位。Excel 5.0是一款里程碑级的软件,其所蕴涵的设计思想和先进技术深深地影响着所有的后继版本。Excel 5.0运行于微软的视窗操作系统中,是16位的应用程序,运行在早期的Windows 3x操作系统中。

随着Windows 95操作系统的推出,微软在Excel 5.0的基础上不断推出新的Excel版本,例如,Excel 7.0、Excel 97、Excel 2000、Excel 2002和Excel 2003等。

2006年11月30日,微软正式推出Office 2007(包括Excel 2007等)。在Excel 2007中,取消了传统的菜单加工具栏的操作方式,采用新的面向结果的用户界面。在新界面中,Excel 2007提供了强大的工具和功能,可以通过应用主题和使用特定样式在工作表中快速设置数据格式。

2010年4月微软推出了Office 2010的RTM版本,并于5月开始提供正式版。Office 2010的新界面简洁明快,标识也改为了全橙色。Office 2010采用Ribbon新界面主题。Office 2010具备了全新的安全策略,在密码、权限、邮件线程等方面都有更好的控制。且Office的云共享功能包括与企业Sharepoint服务器的整合,让PowerPoint、Word、Excel等Office文件皆可通过Sharepoint平台,同时供多人编辑和浏览,提升文件协同作业的效率。

2012年12月微软推出了Office 2013的RTM版本。1.1.2 Excel 2013的特点

Excel历来是需要分析信息的人员经常使用的一种工具。Excel 2013成为功能强大的商业智能工具,可用于更安全地访问、分析及共享来自数据仓库和企业应用的信息。与以前版本相比,Excel 2013主要改进和增强了以下几方面的功能。□ 基本电子表格功能。Excel 2013可帮助人们更迅速地构建专业级别的电子表格,并且大大扩增了行列方面的处理能力,计算速度更快,改进了公式创建功能,并且增加了新的图库和样式模板。□ 商业智能分析功能。Excel 2013可以连接到企业数据库,并且保持电子表格和后台数据源之间的持久连接。这样不仅便于利用最新信息来更新Excel工作表,而且能够在Excel里深入分析更详细的信息,查出异常和趋势。□ 新的SmartArt模板。SmarArt是Excel 2007引入的一个很酷的功能,可以轻松制作出精美的业务流程图,而Excel 2013在现有类别下增加了大量新模板,还新添了数个新的类别。□ 增强的制图和打印输出。Excel 2013利用了新的制图引擎,让人们能够制作专业外观的图表和图形。这些改进加上大大改善的打印效果,可以让人们共享重要报表里面的分析结果。□ “页面版式”视图。通过该视图可以让用户轻松查看每页工作表怎样打印以及分页符在哪里。用户给工作表添加了一行或者一列后,Excel就会自动把文档的样式元素应用到新添的行或列上,而使用以前版本的Excel,必须手动才能完成。□ 更醒目的条件格式。在Excel中可设置条件格式,让符合条件的单元格以用户提前设定的格式进行显示,例如,大于某值的单元格显示为红色等。在Excel 2013中,这一功能得到了大大的加强。□ 更方便的公式输入。在复杂的Excel工作表里,有时定义的公式涉及同一工作簿里的几个工作表,或不同工作簿中的工作表。在一个工作表里要想观察其相同工作簿下的其他工作表,或不同工作簿的其他工作表,是件很麻烦的事。在Excel 2013中,这一问题得到了解决,将要关注的单元格放在监视窗口中即可。不管当前编辑位置在哪里,监视窗口将始终显示。□ 更真实的打印预览。

除此之外在Excel 2013中还新增了以下功能。□ 截屏工具。Office 2013的Excel、Word、PowerPoint等组件里增加了一个简单的截屏工具,支持多种截图模式。□ 背景移除工具。可以在Excel的图片工具下或者图片属性菜单里找到该工具,能够进行简单的抠图操作,还可以添加和去除水印。□ 保护模式。如果打开从网络上下载的Excel文档,Excel 2013会自动处于保护模式下,默认禁止编辑,若要修改工作簿,则必须单击功能区上方的启用编辑按钮。□ Office按钮选项。Office 2007左上角的圆形按钮及其下的菜单让人印象深刻,到了Office 2013里功能更丰富了,特别是文档操作方面,比如在文档中插入元数据、快速访问权限、保存文档到SharePoint位置,等等。在打印部分,由Excel 2007的很少几个选项,到Excel 2013几乎成了一个控制面板,基本可以完成所有的打印操作。1.1.3 初识Excel 2013的真面目

启动Excel 2013后,将出现如图1-1所示的界面。Excel 2013的窗口主要包括标题栏、功能区、表格操作区和状态栏等部分。图1-1 Excel 2013操作界面

与Excel 2010相比,Excel 2013的界面只是部分改变,但与Excel 2003及以前版本相比,Excel 2013的界面有了非常大的改变。Excel 2013采用全新的外观,新的用户界面用简单明了的单一机制取代了Excel早期版本中的菜单、工具栏和大部分任务窗格。

使用过Excel 2003及以前版本的读者可能不太习惯Excel 2013的操作界面,因为在常见的Windows系统中,不管是Office应用程序,还是其他应用软件,基本上都是菜单和工具栏的形式。但进一步熟悉和使用Excel 2013后,才能体会到这种命令组织方式的独特和方便之处,这种方式将众多的命令巧妙地组合在一起,并将常用的命令一目了然地出现在界面中。下面简单介绍Excel 2013界面中各组成部件的使用。

1. 【文件】选项卡

在Excel 2013中,用【文件】选项卡取代了Excel 2007中的【Office按钮】。【文件】选项卡取代了较早版本中的【文件】菜单,并增强了大部分功能,它位于Excel 2013界面的左上角,如图1-2所示。图1-2 【文件】选项卡

单击【文件】选项卡,将看到与Excel早期版本相同的【打开】、【保存】和【打印】等基本命令,还新增了【选项】、【账户】等命令,另外在【文件】的下拉菜单右侧,还显示出了当前文档的相关信息。【文件】的下拉菜单如图1-3所示。图1-3 【文件】下拉菜单

2. 标题栏

Excel 2013的标题栏与以前版本也不同。默认状态下,标题栏左侧显示“快速访问工具栏”,在标题栏中间显示当前编辑表格的文件名称。启动Excel时,将创建一个空白的工作簿文件,默认的文件名为【工作簿1】。若按下快捷键Ctrl+N将继续创建新的工作簿文件,Excel将分别以【工作簿2】、【工作簿3】等作为新文件的文件名。

3. 快速访问工具栏

该工具栏可能是Excel 2013中与以前版本的工具栏最相似的部分了。在该工具栏中可以放置常用的命令按钮,以方便快速调用对应的功能。

通常,“快速访问工具栏”在Excel工作簿界面的左上方,也可以在“Excel选项”对话框的【快速访问工具栏】页面中选中【在功能区下方显示快速访问工具栏】复选框,将其放置在功能区下方。在功能区右击任何命令按钮,从弹出的快捷菜单中选择【添加到快速访问工具栏】命令,可将该命令按钮添加到快速访问工具栏,也可右击【快速访问工具栏】中的命令按钮,在弹出的快捷菜单中选择【从快速访问工具栏删除】命令,将该命令按钮从快速访问工具栏中删除。

4. 功能区

在Excel 2013中,功能区是菜单和工具栏的主要替代控件。为了便于浏览,功能区包含多个围绕特定方案或对象进行组织的选项卡。每个选项卡上的控件进一步组织成多个组。功能区可比菜单和工具栏承载更加丰富的内容,包括按钮、图片库和对话框内容。

功能区的常规选项卡如图1-4所示。□ 选项卡:是面向任务设计的。□ 组:每个选项卡中的组都将一个任务分成多个子任务,如图1-4所示。□ 命令按钮:每个组中的命令按钮执行一个命令或显示一个命令菜单。图1-4 功能区

除了图1-4显示的选项卡外,还会在界面中看到对目前正在执行的任务类型有所帮助的另外两种选项卡。□ 上下文工具选项卡:使用户能够操作在页面上选择的对象,如表、图片或绘图。单击对象时,相关的上下文选项卡集以强调文字颜色出现在标准选项卡的旁边。如图1-5所示为选中图表时显示的选项卡。图1-5 上下文工具选项卡□ 程序选项卡:当切换到某些创作模式或视图时,程序选项卡会替换标准选项卡集,如图1-6所示是对图片进行删除背景操作时出现的选项卡集。

5. 对话框启动器图1-6 程序选项卡

在功能区的某些组中,还显示有一个小的图标,如图1-7所示。这个图标称为对话框启动器。单击对话框启动器将打开相关的对话框或任务窗格,其中提供与该组相关的更多选项。单击如图1-7所示的对话框启动器,并打开如图1-8所示的【设置单元格格式】对话框,在打开的对话框中,将根据对话框启动器所在的组自动调出相应的选项组。图1-7 对话框启动器图1-8 【设置单元格格式】对话框

6. 状态栏

Excel 2013的状态栏如图1-9所示。在状态栏中,可显示各种状态,也可进行很多快捷操作。例如,显示单元格中的统计数据、设置表格的视图方式、调整表格的显示比例等。图1-9 状态栏

右击状态栏,将弹出如图1-10所示的【自定义状态栏】菜单,单击对应的菜单项,可在状态栏中显示或隐藏对应的选项。图1-10 【自定义状态栏】菜单1.1.4 直观方便的功能区

当首次启动Excel 2013时,用户将会发现,Excel以前版本的菜单栏和工具栏都不见了,取而代之的是“功能区”这个全新的用户交互界面。本小节将详细介绍功能区的相关 内容。

1. 功能区的组成

功能区可以帮助用户快速找到完成某一任务所需的命令。命令被组织在逻辑组中,逻辑组集中在选项卡下。每个选项卡都与一种类型的活动(例如,为页面编写内容或设计布局)相关。为了减少混乱,某些选项卡只在需要时才显示。例如,仅在选择图片时,才显示【图片工具】选项卡。功能区有3个基本组成部分,如图1-4所示。□ 选项卡:默认情况下,功能区顶部有8个选项卡。每个选项卡代表在Excel中执行的一组核心任务。□ 组:每个选项卡都包含一些组,这些组将相关命令项显示在一起。□ 命令:命令是指按钮及用于输入信息的输入框或命令列表等。

2. 智能显示命令

功能区上的命令是最常用的命令。Excel 2013根据执行的操作显示一些可能用到的命令,而不是一直显示所有命令。例如,如果工作表中没有图表,则不会显示用于图表的命令。但在创建图表之后,就会出现【图表工具】标签,其中包含两个选项卡,分别是【设计】和【格式】。在这些选项卡上,可看到处理图表所需的命令,如图1-11所示。这说明功能区对当前操作做出了响应。

使用【设计】选项卡可以更改图表类型、移动图表位置、更改图表标题或其他图表元素;使用【格式】选项卡可以添加填充颜色或更改线型。在完成图表操作后,单击图表区域外部,【图表工具】标签会消失。要想让它们重新显示,需单击图表内部,这些选项卡就会重新显示。图1-11 根据需要显示命令

3. 最小化功能区

Excel 2013的功能区是不能被删除的,也不能用早期版本的工具栏和菜单替换功能区。但是,可以最小化功能区以增大屏幕中可用的空间。最小化功能区有多种方式。□ 单击【功能区最小化】按钮。

如图1-12所示,在功能区右下角有一个向上的尖形小图标,单击该图标可最小化功能区。图1-12 【功能区最小化】按钮

最小化后的功能区如图1-13所示,可看到最小化后将只显示几个选项卡名称,而不显示具体的功能区按钮了。这样可给表格操作留出更多的空间。图1-13 最小化的功能区◎技巧:要在功能区最小化的情况下使用功能区,首先需单击要使用的选项卡,在弹出对应的功能区内单击要使用的选项或命令即可。使用完对应的命令后,功能区将返回到最小化状态。□ 双击选项卡标签最小化功能区。

直接双击活动选项卡的标签也可最小化功能区。再次双击选项卡标签可还原功能区。◎技巧:按Ctrl+F1组合键可快速最小化或还原功能区。

4. 使用键盘操作功能区

Excel 2013为功能区的每个命令都提供了访问键,通过按键盘上的几个键就可快速使用相关命令。一般只需单击2~4个键就可以访问到大多数命令。使用键盘操作功能区的步骤如下:(1)按下并释放Alt键,在当前视图中每个可用功能的上方都将显示访问键提示。(2)按下要使用的功能上方的访问键上所显示的字母。(3)根据所按下的字母,可显示其他键提示。(4)继续按对应的访问键字母,直到按下了要使用的特定命令或选项所对应的字母为止。◎注意:在某些情况下,必须先按下包含该命令的组所对应的字母。

例如,使用键盘操作功能区来设置活动单元格的字体为楷体。具体操作步骤如下:(1)在Excel中按下并释放Alt键,功能区上方各选项卡中将显示出对应的访问键提示,如图1-14所示。图1-14 显示访问键提示(2)使用【开始】选项卡中的命令,按下键盘上的H键,则【开始】选项卡中各命令的访问键将显示出来,如图1-15所示。图1-15 【开始】选项卡的访问键提示(3)要选中字体下拉框,按下键盘上的FF键(按两次F键),则字体下拉框被选中,再按下键盘中的下方向光标键↓,找到字体为楷体后按Enter键,即可将活动单元格的字体设置为楷体,如图1-16所示。图1-16 选择字体◎技巧:为了和Excel以前版本兼容,Excel以前版本的快捷键仍然可用。

5. 不同分辨率下的功能区

在Excel 2013中,根据屏幕分辨率(或Excel应用程序窗口的大小)不同,功能区中各图标按钮的显示状态也不一样,具体情况如下。

如果屏幕设置为低分辨率,例如800×600像素,则功能区上会有一些组会改变命令的排列方式,有一些组仅显示组名称,而不显示该组中的命令。这时需要单击组按钮上的箭头才能显示命令。

例如,在【开始】选项卡上,【数字】组中有几个命令。在较高分辨率下,会看到【数字】组中的所有命令排为两行,如图1-17(a)所示。而在800×600的分辨率下,将会看到【数字】组中的命令按钮排列成三行了,如图1-17(b)所示。将Excel窗口缩小后的功能区如图1-17(c)所示,这时【数字】组中的命令不见了,单击【数字】组按钮上的箭头,将在下方显示出该组的命令。图1-17 不同分辨率下的功能区1.2 用Excel开发应用程序有啥好处

微软公司的Excel电子表格现在已成为最流行的软件包之一。大量的商务人员都在使用Excel来管理他们的商务数据,因此,大多数人员都接受过Excel的使用培训。

大多数用户使用Excel时,仅仅是将数据键入到工作表的单元格中,然后经过计算把结果显示在不同的单元格或图表中。工作表是一个数据输入和输出的用户界面,通过它来完成一些日常工作非常容易。其实,Excel内部为数据的录入提供了极其丰富和完备的功能,其中包括对单元格中数据的编辑、有效性检查和格式的设置等。同时,利用图表和单元格格式的设置以及各种绘图工具可以很好地控制数据的输出形式。

Excel不仅仅是一种电子表格,程序设计人员还可对其进行二次开发。微软公司在Excel中引入了VBA(Visual Basic for Applications,通常称为VBA,是一种应用程序自动化语言),使Excel成为一个引人注目的开发平台。用Excel开发的应用程序与用VB(Visual Basic,简称VB)、C++、Java和.NET等语言开发的应用程序一样,成了许多公司重要商业软件的核心组成部分。

使用Excel开发应用程序具有以下几方面的优势。□ 节省用户培训费用:Excel作为最基本的一种办公自动化软件,普及程度高,用户对其操作界面和操作方式都很熟悉,基于Excel平台开发的系统可让用户快速上手。□ 加快开发速度:在其他程序语言开发环境中,要设计类似于Excel的窗体界面,所需要的代码是难以想象的,而开发基于Excel的应用程序则要简单得多。□ 方便地控制Excel:Excel提供了完善的对象模型。几乎每种在Excel用户界面中能够完成的功能,都能通过使用Excel对象模型中的对象进行编程实现。□ 提高开发效率:Excel提供了应用系统基本模块。例如,文件处理、打印和文本编辑等功能,用其他程序设计语言开发应用程序时,这些基本模块的开发就要占用很多的时间,所以使用Excel开发应用程序能提高开发的效率。□ 简化应用程序:Excel内置大量函数,直接调用Excel的函数可简化程序,提高效率。□ 方便地处理大量数据:Excel作为电子表格软件,其本身就可以处理大量的数据,对于数据量非常大的系统,Excel还可连接到各种数据库中获取数据,然后在表格中进行分析处理。□ 快速创建动态的分析图表:使用Excel可方便、快速地创建图表,对工作表中的数据进行分析。使用VBA代码可创建和控制这些图表。1.3 Excel应用程序结构

使用Excel可开发各种应用程序,例如,简易财务系统、工资管理、固定资产管理、工程预算、客户管理等OA系统。在Excel中使用VBA创建这些应用程序时,一般没有一个固定的结构,但大多数情况下,都有一些通用的构成模块。本节将简单介绍常见的Excel应用程序的构成。1.3.1 Excel应用程序有哪几部分

一般情况下,二次开发的Excel应用程序都是以Excel工作簿的形式发布的。从用户角度看,与打开其他Excel工作簿的操作类似,不同之处在于,二次开发的Excel应用程序具有更多的智能性,能提高用户的操作效率。

而从开发者角度看,二次开发的Excel应用程序一般由用户窗体、工作表、模块和类模块等部分构成。□ 用户窗体:在Excel VBA应用程序中,用户窗体作为最常用的用户界面被大量使用。使用用户窗体可将用户与工作表中的数据进行隔离,防止数据被意外修改并隐藏工作表中的敏感数据,使被限制权限的用户只看到应该操作的数据。一般系统中,常见的用户窗体有登录窗体、数据录入窗体和图表显示窗体等。□ 工作表:工作表是Excel用户最熟悉的工作界面,用于保存和显示程序的数据,是程序的主体部分。在开发Excel应用程序时,一般先在工作表中制作出表格的格式,并设置好样式,再通过VBA代码获取表格中的数据,经过加工处理后将其填入相应的单元格,供用户进行查看和打印输出等操作。□ 模块:模块是保存VBA代码的地方,可保存程序的通用过程,供其他过程调用。例如,录制宏的代码就保存在模块中,开发人员大部分时间都是在模块中编写VBA代码。□ 类模块:类模块用来保存自定义对象的VBA代码。在Excel VBA中,除了可以使用系统提供的对象外,还可以通过自定义类来创建自定义的对象,自定义的类必须保存在类模块中。大多数应用程序都不使用类模块。1.3.2 面向对象编程是什么

VB是面向对象的编程语言,而Excel中的VBA是VB的一个子集,也支持面向对象的编程机制。

在面向对象的编程机制中,程序中的每个部件都是一个对象。如窗体、按钮、工作表、单元格等都是对象,开发人员通过编写代码操作这些对象,即可完成对Excel的控制。

在Excel VBA中,通过事件驱动提供开发人员与系统之间的接口,开发人员通过编写事件过程来处理产生该事件时希望系统完成的工作(例如,单击鼠标就打开一个窗口)。

在传统的或过程化的应用程序中,应用程序自身控制了执行哪一部分代码和按何种顺序执行代码。从第一行代码执行程序并按应用程序中预定的路径执行,必要时调用过程。在事件驱动的应用程序中,代码不是按照预定的路径执行,而是在响应不同的事件时执行不同的代码片段。事件可以由用户操作触发,也可以由操作系统或其他应用程序的消息触发,甚至由应用程序本身的消息触发。这些事件的顺序决定了代码执行的顺序,因此,应用程序每次运行时所经过的代码路径都是不同的。

因为事件的产生顺序是无法预测的,所以在代码中必须对执行时的各种状态作一定的假设。当作出某些假设时(例如,假设在运行时处理某一输入字段的过程之前,该输入字段必须包含确定的值),应该组织好应用程序的结构,以确保该假设始终有效(例如,在输入字段中有输入值之前,禁止使用启动该处理过程的命令按钮)。

在Excel中使用VBA开发应用程序,实质就是编写程序中各对象不同事件的代码。事件是对象识别的动作,例如,打开Excel工作簿、切换当前工作表等都将产生相关事件。VBA的对象有一个预定义的事件集,对每个事件都可编写一个事件处理过程。如果其中有一个事件发生,而且在关联的事件过程中存在代码,则VBA调用该代码。例如,在工作簿的Open事件中编写有代码,则打开Excel工作簿时将执行该事件中的代码。Excel定义的事件很多,常见的事件有:□ 鼠标单击事件(Click)。□ 工作簿打开事件(Open)。□ 工作表激活事件(Activate)。□ 单元格改变事件(Change)。

启动Excel应用程序后,工作簿、工作表或单元格等对象就准备接收事件。事件可由用户引发(例如键盘操作),可由系统引发(例如定时器事件),也可由代码间接引发(例如,当代码激活其他工作表产生的事件)。1.4 Excel应用程序开发流程

与使用其他程序设计语言开发应用程序相同,在进行Excel应用程序二次开发时,也可以使用成熟的程序开发方法,以提高其开发效率。开发人员必须掌握正确的开发手段,了解软件开发的主要过程,这样才能对软件项目有清醒的认识,才能达到事半功倍的效果。本节就对Excel应用程序开发过程中的一些方法进行简单地介绍。1.4.1 开发前要准备啥

在进行Excel应用程序开发时,首先要编写系统任务书,主要规定应用程序的开发目标、主要任务、功能、性能指标及开发人员、经费、进度等安排,以作为系统设计开发和检验的基本依据。

针对具体情况,对应用程序的细节进行具体分析,必要时还要进行实地调研,与客户进行沟通,然后编写出需求分析文稿。

需求分析的任务不是确定应用程序怎样做的问题,而是确定需要完成哪些工作的问题。需求分析阶段的主要任务包括以下几个方面。□ 功能需求:给出应用程序必须完成的所有功能。□ 环境需求:用户的计算机硬件环境、软件环境和Excel的版本等。□ 界面需求:应用程序的用户界面是直接面对用户的,所以界面设计是用户能否方便、快捷地操作应用程序的关键之一。在需求分析阶段,应提出界面的需求。□ 安全保密需求:对客户信息的保密要求应在本阶段开始计划。□ 用户技术层次:在需求分析阶段,了解用户的技术层次,可为应用程序的开发提供一些辅助信息。1.4.2 应用程序开发过程

有了系统任务书和需求分析报告后,开发人员就可以对Excel应用程序的实现进行系统分析,然后按照分析进行相应的程序设计和编写代码工作。

1. 系统设计

系统设计阶段是通过对用户需求进行调查分析,得出应用程序的功能、性能及数据要求,以确定Excel应用程序所需的工作表及表中的列数据、窗体等模块。

2. 设计用户交互界面

一个良好的应用程序必须有一个良好的界面。用户通过界面与应用程序进行交互。开发人员在设计界面时,一定要牢牢把握方便用户操作这一观点,并贯穿到设计界面中。

与以往版本不同的是,Excel 2013中取消了菜单和工具栏(以往版本设计的工具栏和菜单将放在【加载项】选项卡的【自定义工具栏】和【自定义菜单栏】组中)。在Excel 2013中进行界面设计的方式主要有以下3种。□ 在工作表中添加控件。□ 设计用户窗体。□ 设计自定义功能区。

3. 代码设计

将用户界面设计好以后,接下来就需要编写界面中各部分的事件代码(如用户窗体中的按钮、功能区中的按钮等)了。

在Excel中设计VBA应用程序时,界面设计和代码设计一般是交替进行的,即设计好一个界面后就编写相应的代码。有时也可以先录制并修改好宏代码,再与工作表或用户窗体中的按钮进行绑定。本书后面的章节都是介绍界面设计和代码设计知识的,这是应用程序的核心部分。1.4.3 测试应用程序是否达到要求

在创建了应用程序之后,必须对其进行测试,测试应用程序是否达到要求,这是非常重要的一个步骤。测试和调试应用程序所花费的时间可能与开发系统的时间同样多。

对于一个开发完成的应用程序,在设计测试数据时,应尽可能多地考虑到各种不同的情况,不但要使用正常的合乎逻辑的数据测试应用程序的功能性,还应使用一些可能导致应用程序出错的数据测试应用程序的健壮性。

在设计测试数据的同时,应编写出测试数据的结果,并与应用程序进行实测时得到的数据进行对比,如果结果相同,则通过测试;否则,应检查并修改应用程序。1.4.4 发布给最终用户使用

通过测试后的应用程序就可发布给最终用户使用了。在发布时需要注意以下3个问题。□ Excel版本:如果是在Excel 2013环境下开发的应用程序,并使用了Excel 2013的一些新功能(如自定义功能区),就需要用户的计算机中必须要安装Excel 2013。如果用户计算机中安装使用的是Excel 2013之前的版本,则需要将使用Excel 2013新增功能部分的代码进行修改,并发布为以往的版本。□ 动态链接库:如果应用程序中使用了ActiveX控件,则需要考虑是否要将包含该ActiveX控件的DLL文件(或OCX文件)包含在应用程序中予以发布。□ 辅助文件:在一个大型的应用程序中,不可能只包括一个Excel工作簿文件,有时可能还需要使用其他辅助文件(如图片文件、数据库文件、帮助文件等),需要将这些文件包括在发布文件中,并且最好将其发布到其他盘符中进行测试,以检查在VBA代码中是否使用了绝对路径来引用相关的文件。1.5 实战练习1. 简述Excel 2013的新增功能。2. Excel应用程序通常由哪几部分组成?3. 发布设计好的Excel应用程序时需要注意哪些方面?第2章 使用宏

创建和使用宏是Excel最强大的功能之一。宏是可用于自动执行任务的一项或一组操作。通过VBA编写的宏可控制Excel应用程序,对Excel的功能进行扩充。

要自动执行重复任务,可以在Excel中快速录制宏,也可以在VBE(Visual Basic Editor,是编写VBA代码的工具)中编写自己的宏脚本,或将所有或部分宏复制到新宏中来创建一个宏。在创建宏之后,用户可以将宏分配给对象(如工具栏按钮、图形或控件),以便能够通过单击该对象来运行宏。本章将介绍创建和管理宏的方法。2.1 宏简介

在使用Excel的过程中,用户可能经常需要在Excel中进行重复的操作,并且这些重复任务将占用很多的时间。这时,有没有想过可能有更好的办法?如果经常需要执行一些重复操作,那么有必要了解一下有关宏的知识。◎提示:用户在打开Excel工作簿时,可能看到过宏警告,因此,说到宏可能会联想到诸如病毒或编程等可怕的字眼。事实上,多数宏不仅无害,而且可以为用户节省大量的时间。宏的创建和使用非常简单。2.1.1 宏是什么

宏是通过一次单击就可以应用的命令集。它们几乎可以自动完成用户在Excel中进行的各种操作。通过VBA代码对宏进行编辑修改,使宏还可以执行许多高级的、普通用户不能完成的任务。

宏是一种程序代码,即使用户不是开发人员也可以使用它们,甚至不需要知道任何编程知识。在Excel中可以创建的多数宏都是用VBA语言编写的。VBA宏就是本书所要详细介绍的内容。2.1.2 宏有哪些优点

宏可以节省时间,并可以扩展日常使用的程序的功能。使用宏可以自动执行重复的文档制作任务,简化繁冗的操作,还可以创建解决方案(例如,自动创建用户要定期使用的文档)。精通VBA编程的开发人员可以使用宏创建包括模板、对话框在内的自定义外接程序,甚至可以存储信息以便重复使用。

例如,在一个具有几十个甚至上百个工作表的Excel工作簿中,要分别设置每个工作表的表头部分和数据部分的格式。如果在Excel中手工操作,假设每个工作表需要1分钟时间,则整个工作簿的格式设置也需要一两个小时才能完成,并且该项工作非常乏味。如果对其中的一个工作表设置格式,并将该操作录制为宏,然后编辑该宏,使之在整个工作簿中重复执行格式的设置,那么完成这项任务就不是几个小时了,只需几分钟就足够了。2.1.3 有哪些方法创建宏

在Excel中可使用两种方法来创建宏:一种方法是利用Excel操作环境中的宏录制器录制用户的操作;另一种方法是使用VB编辑器编写自己的宏代码。□ 利用宏录制器可记录用户在Excel中的操作动作,以便自动创建需要的宏。对于初学者,因为不熟悉VBA指令,使用该方法将非常方便。这也是初学者学习VBA指令的一种好方法。□ 使用VB编辑器可以打开已录制的宏,修改其中的命令,也可以在VB编辑器中直接输入命令创建宏。对于很多无法录制的命令(如创建新的窗体等),使用VB编辑器创建宏是唯一的方法。

在创建宏之后,可以将宏分配给对象(如按钮、图形、控件以及快捷键等),这样执行宏就像单击按钮,或按快捷键一样简单。正是由于这种操作方便的特性,使用宏可以方便地扩展Excel的功能。如果不需要再使用宏,可以将其删除。2.2 将你的操作录下来

可以通过录制宏和在VBE环境中编写代码这两种方式创建宏。Excel 2013及Excel以前版本的宏使用相同的VBA代码。但是,在录制宏时,Excel 2013与Excel以前版本有所不同。2.2.1 在Excel 2003中录制宏

录制宏是创建宏的最简单、最常用的方法。宏录制类似于“记忆”用户在Excel环境中执行的操作,其方法与在盒式磁带上录制音乐类似。当按下录音键时,所有声音都存储在磁带上,直到按下停止键。录制宏的过程与此基本相同。按下【录制】按钮时,所执行的任务、使用的窗口和工具等都作为宏代码录制下来。

Excel 2003及以前版本都使用菜单和工具栏方式执行相关操作。录制宏时通过单击主菜单【工具】|【宏】|【录制新宏】命令,即可将Excel中进行的操作用VBA代码记录下来。◎技巧:因为VBA中的对象、属性非常多,对于初学者来说,确实不易记忆。通过录制宏,然后分析Excel自动记录的VBA代码,是学习VBA的一个有效方法。

下面以设置工作表表头格式为例,介绍录制宏的方法,具体操作步骤如下:(1)启动Excel 2003,打开工作簿“销售管理.xls”,并选中单元格区域“A1:J1”,如图2-1所示。图2-1 选中单元格区域(2)单击主菜单【工具】|【宏】|【录制新宏】命令,打开如图2-2所示【录制新宏】对话框。在【宏名】文本框中输入名称“设置表头格式”,并设置宏的快捷键为Ctrl+t,然后选择好宏的保存位置。Excel自动在【说明】文本框中填充备注信息(默认情况下将由Excel生成包括文稿作者和录制时间等信息),用户可在该文本框中输入宏的备注信息。◎注意:宏的保存位置有3种:当前工作簿——宏只对当前工作簿有效;个人宏工作簿——宏对所有工作簿都无效;新工作簿——录制的宏保存在一个新建工作簿中,对该工作簿有效。(3)单击【确定】按钮,将显示如图2-3所示的【停止录制】工具栏。图2-2 【录制新宏】对话框图2-3 【停止录制】工具栏(4)接下来可以在Excel中进行操作,设置工作表的表格格式。单击主菜单【格式】|【单元格】命令,打开【单元格格式】对话框。(5)在该对话框中单击【对齐】选项卡,选中【水平对齐】列表框中【跨列居中】选项,如图2-4所示。(6)在该对话框中单击【字体】选项卡,在【字形】列表框中选择“加粗”,在【字号】列表框中选中20,如图2-5所示。(7)单击【确定】按钮,完成格式的设置。(8)单击【停止录制】工具栏中的【停止录制】按钮,完成宏的录制。工作表设置表头格式后如图2-6所示。图2-4 设置跨列居中图2-5 设置字体图2-6 设置表头后的格式(9)按快捷键Alt+F11打开VBE,可看到录制的宏代码,如图2-7所示。图2-7 录制宏生成的代码2.2.2 Excel 2013宏录制功能在哪里

和以前版本的Excel相比,Excel 2013采用了全新的面向结果的用户界面。以前版本中熟悉的菜单栏和工具栏消失了,被称为功能区(Ribbon)的面板取代。在功能区中,命令被组织在逻辑组中,逻辑组集中在选项卡下。每个选项卡都与一种类型的活动(例如,为页面编辑内容或设计布局)相关。

要在Excel 2013中录制宏,需使用【开发工具】功能区中的相关命令。在Excel 2013的默认环境中,【开发工具】选项卡是隐藏的,如果要编写宏、运行以前录制的宏或创建与Office程序一起使用的应用程序,需要将【开发工具】选项卡显示出来。具体操作步骤如下:(1)启动Excel 2013。(2)在Excel操作界面上单击左上角的【文件】选项卡,打开下拉菜单,如图2-8所示。图2-8 【文件】下拉菜单(3)单击下方的【选项】菜单项,打开【Excel选项】对话框,如图2-9所示。(4)在该对话框中选择左侧的【自定义功能区】。在右侧的【主选项卡】中勾选【开发工具】复选框。(5)单击【确定】按钮返回Excel 2013操作界面,可以看到【功能区】中新增加了一个【开发工具】选项卡,如图2-10所示。(6)单击该选项卡,将显示如图2-10所示的【开发工具】功能区。在该选项卡的【代码】组中,有录制宏及对宏的设置等相关命令按钮。图2-9 【Excel选项】对话框图2-10 【开发工具】选项卡(7)在Excel 2013的状态栏中也提供了一个【录制宏】按钮,在默认状态下,该按钮未显示出来。要显示该按钮,右击状态栏将显示如图2-11所示的快捷菜单。图2-11 【自定义状态栏】快捷菜单(8)单击【宏录制】命令,将在状态栏中显示如图2-12所示的【录制宏】按钮。在录制宏的过程中,该按钮将变为【停止录制宏】按钮。图2-12 状态栏2.2.3 在Excel 2013中录制宏

在Excel 2013中录制宏的操作与在Excel 2003中录制宏的操作类似,下面演示在Excel 2013中录制宏,以了解两个版本中录制宏的相同和不同之处。(1)启动Excel 2013,打开如图2-1所示的工作簿。(2)若Excel 2013的功能区中若没显示【开发工具】选项卡,需要使用2.2.2小节介绍的方法将【开发工具】选项卡显示出来。(3)在工作表中选中单元格区域“A1:J1”。(4)在【开发工具】选项卡的【代码】组中,单击【录制宏】按钮,如图2-13所示。(5)打开【录制宏】对话框,如图2-14所示。在【宏名】文本框中输入名称,并设置好快捷键及保存位置等信息,单击【确定】按钮开始录制宏。此时状态栏中的【录制宏】按钮变为了【停止录制宏】按钮。图2-13 【录制宏】按钮图2-14 【录制宏】对话框(6)在功能区中单击【开始】选项卡,在该选项卡的【对齐方式】组中,单击【合并居中】按钮,将单元格区域“A1:J1”合并居中。(7)在【开始】选项卡的【字体】组中,单击【加粗】按钮,在【字号】列表框中选中20。(8)在【开发工具】选项卡的【代码】组中,单击【停止录制】按钮,完成宏的录制操作。◎提示:单击状态栏中的【停止录制宏】命令按钮,也可完成宏的录制。(9)按快捷键Alt+F11打开VBE,可看到录制的宏代码,如图2-15所示。图2-15 录制宏的代码2.2.4 直接编写VB代码创建宏

使用宏录制器可在Excel中记录按顺序完成的操作。在实际使用时,经常需要在宏中循环执行某一部分操作,使用宏录制器来创建这类宏是不可能的。这时就需要使用VB编辑器。在该编辑器中使用VBA代码可完成各种复杂的操作。(1)启动Excel 2013,如果软件已经启动,则新建一个工作簿。(2)在【开发工具】选项卡的【代码】组中,单击Visual Basic按钮,打开如图2-16所示的VB编辑器窗口。图2-16 VB编辑器◎技巧:按键盘上的组合键Alt+F11也可打开VB编辑器。有关VBE编辑器的使用将在第3章中进行介绍。(3)在VBE编辑器中,单击主菜单【插入】|【模块】命令,向工程中增加一个名为“模块1”的模块。(4)单击主菜单【插入】|【过程】命令,打开【添加过程】对话框,在【名称】文本框中输入相应内容,并在【类型】和【范围】选项区域中选择相应的选项,如图2-17所示。(5)在【添加过程】对话框中单击【确定】按钮,将在【模块1】代码窗口中添加一个名为“欢迎”的过程结构,如图2-18所示。图2-17 【添加过程】对话框图2-18 添加的过程结构◎提示:有关过程的相关知识,参见本书第2部分中的介绍。(6)在图2-18所示的过程结构中输入以下代码:(7)关闭VB编辑器,返回到Excel操作环境中。按快捷键Ctrl+S保存工作簿,完成宏的创建。◎技巧:也可先通过宏录制器生成部分宏代码,再通过VB编辑器对生成的代码进行修改。2.3 管理宏

在Excel 2013功能区【开发工具】选项卡的【代码】组中,单击【宏】按钮,打开如图2-19所示对话框,通过该对话框可以对Excel中的宏进行管理。2.3.1 设置宏选项

用户在录制宏时,可为宏设置一个快捷键,在需要执行宏时可以快速调用。而用VB代码直接编写的宏则没有快捷方式,此时用户也可通过【宏选项】对话框设置其快捷键,具体操作步骤如下:(1)在功能区【开发工具】选项卡的【代码】组中,单击【宏】按钮,打开如图2-19所示的对话框。(2)在【宏名】列表框中选择需要设置选项的宏,单击对话框右侧的【选项】按钮,打开【宏选项】对话框,如图2-20所示。图2-19 【宏】对话框图2-20 【宏选项】对话框(3)在【宏选项】对话框中可以设置快捷键和宏的说明,设置完成后单击【确定】按钮即可。2.3.2 怎样清除不需要的宏

对于工作簿中不需要的宏,也可将其删除。删除宏的步骤如下:(1)在功能区【开发工具】选项卡的【代码】组中,单击【宏】按钮,打开如图2-19所示的对话框。(2)在【宏名】列表框中选择需要设置选项的宏,单击对话框右侧的【删除】按钮,将打开如图2-21所示的提示信息,单击【是】按钮完成宏的删除,单图2-21 提示信息击【否】按钮则不删除宏。◎提示:在Excel中按快捷键Alt+F11进入VBE,选中需要删除的宏代码,按Del键也可快速删除宏。2.3.3 修改不满足要求的宏

本章前面演示了在Excel 2003和Excel 2013中录制宏的方法,录制的宏可对当前工作表的选定单元格区域设置格式。如果要对当前工作簿中的每个工作表都执行这些操作,则需要对宏代码进行编辑,使录制的代码循环执行。下面介绍编辑宏代码的操作。(1)在Excel 2013中打开“销售管理(2013).xls”工作簿。(2)在功能区【开发工具】选项卡的【代码】组中,单击【宏】按钮,打开如图2-19所示的对话框。(3)在【宏名】列表框中选择“设置表头格式”,单击对话框右侧的【编辑】按钮,将打开如图2-22所示的VBE窗口。图2-22 宏代码(4)在VBE窗口中可看到“设置表头格式”的VBA代码如下:(5)从上面的宏代码中可以看出,按要求只需要设置所选单元格区域的字体、字号和粗体即可,但Excel在录制宏时记录了其他有关字体设置的状态,例如,删除线、阴影和下划线等。可以对上面的代码进行优化,删除多余的代码,最后得到如下所示的代码。◎提示:为了和未修改的代码进行对比,将宏“设置表头格式”的代码复制一份,并改名为“设置表头格式_修改”。(6)以上代码中删除了不需要的VBA代码,执行该宏只能对选中的单元格区域设置格式。如果需要该宏对当前工作簿中所有工作表的第1行进行设置,则还需添加代码。修改后的代码如下:

以上代码对工作簿中的每张工作表进行相同的操作,即查找第2列最右侧的数据列,得到第1行需要合并的单元格区域,接着选中第1行需要合并的区域,最后执行合并和设置字体等操作。◎提示:有关VBA各命令的意义,这里不做详细介绍,读者学习完本书后面的内容后,就可理解以上代码的含义。(7)执行以上宏,即可将当前工作簿中所有工作表的第1行都进行表头格式的设置。2.4 如何使用宏

创建一个宏之后,就可以在工作簿中反复调用宏进行重复的工作。在Excel 2013中,运行宏的方法有很多。本节将介绍几种常用的运行宏的方法。2.4.1 按键运行宏

在录制宏时,用户可以为每个宏指定一个快捷键。如果是在VBE环境中用VBA代码编写的宏,也可通过【宏选项】对话框为其指定一个快捷键。

快捷键一般由Ctrl键加上一个字母组成。通过快捷键运行宏是最方便的方法,具体操作步骤如下:(1)打开包含宏的工作簿。(2)做好执行宏之前的准备工作(如选择单元格区域等),按快捷键Ctrl+字母便可运行对应的宏。2.4.2 使用【宏】对话框运行宏

在【宏】对话框有一个【执行】按钮,通过该按钮可运行宏,具体的操作步骤如下:(1)在Excel 2013中打开包含宏的工作簿。(2)在工作表中拖动选中第1行的单元格区域。(3)在【开发工具】选项卡上的【代码】组中,单击【宏】按钮,打开【宏】对话框,如图2-23所示。图2-23 执行宏(4)在【宏】对话框的【宏名】列表框中,单击选择要运行的宏“设置表头格式”,则在对话框的下方将显示该宏的说明信息。(5)单击对话框右侧的【执行】按钮即可执行选中的宏。◎提示:在执行宏时,按Esc键可以中断宏的执行。2.4.3 单击工具栏按钮运行宏

这种方式只适合于Excel 2003及其以前版本。

在Excel 2003及其以前版本中,工具栏中汇集了常用命令按钮。用户还可对工具栏进行自定义,甚至将录制的宏添加到工具栏中,以方便用户快速执行宏。使用工具栏执行宏的操作方法如下:(1)在Excel 2003中打开工作簿。(2)单击主菜单【工具】|【自定义】命令,打开【自定义】对话框,如图2-24所示。(3)在对话框中单击【工具栏】选项卡,如图2-25所示。图2-24 【自定义】对话框图2-25 【工具栏】选项卡(4)在图2-25所示对话框中单击【新建】按钮,将打开【新建工具栏】对话框,如图2-26所示。(5)在【工具栏名称】对话框中输入“自定义工具栏”,单击【确定】按钮即可创建一个工具栏,如图2-27所示。同时在【自定义】对话框中将显示新增加工具栏的名称,如图2-28所示。◎提示:新创建的工具栏没有任何按钮,是一个空白工具栏。(6)在【自定义】对话框中单击【命令】选项卡,在【类别】列表框中查找并单击【宏】,如图2-29所示。(7)拖动【自定义】对话框中的【自定义按钮】到新创建的空白工具栏,如图2-30所示。图2-26 【新建工具栏】对话框图2-27 新创建的空白工具栏图2-28 工具栏列表图2-29 【命令】选项卡图2-30 拖动到自定义工具栏中(8)在新建的工具栏中可以看到新添加的按钮,右击该按钮,弹出快捷菜单,如图2-31所示。在快捷菜单的【命令】文本框中输入新建按钮的名称“设置表头格式”。◎注意:必须确保【自定义】对话框处于打开的状态,才能对工具栏中的按钮进行修改。(9)再次右击工具栏中的该按钮,在弹出的快捷菜单中单击【更改按钮图像】命令,在弹出的图像列表中选择一个图标,如图2-32所示。(10)再次右击工具栏中的该按钮,在弹出的快捷菜单中单击【指定宏】命令,将打开【指令宏】对话框,如图2-33所示。(11)在【宏名】列表框中选择“设置表头格式”,单击【确定】按钮,即可为工具栏中的按钮指定调用的宏。(12)单击【自定义】对话框中的【关闭】按钮,完成工具栏的自定义操作。最后得到的新建工具栏如图2-34所示。单击工具栏中的按钮即可运行指定的宏。图2-31 设置按钮提示文本图2-32 设置按钮图标图2-33 【指定宏】对话框图2-34 自定义工具栏◎技巧:以上操作是在Excel环境中进行的,在学完本书相关知识后,读者还可以通过编写VBA代码创建自定义工具栏,并为工具栏添加按钮、指定宏。

要删除自定义工具按钮,需要先打开【自定义】对话框,将工具栏中要删除的按钮拖到【自定义】对话框中,再松开鼠标即可。2.4.4 将宏放到菜单中(Excel 2003版)

这种方式只适合于Excel 2003及其以前版本。

与使用工具栏运行宏的方法类似,使用菜单栏运行宏的操作也需要通过【自定义】对话框来设置,具体操作步骤以如下:(1)在Excel 2003中打开工作簿。(2)单击主菜单【工具】|【自定义】命令,打开【自定义】对话框。(3)在该对话框的【类别】列表框中选择【新菜单】,如图2-35所示。(4)拖动【自定义】对话框中的“新菜单”到Excel的菜单栏,如图2-36所示。(5)再次拖动【自定义】对话框中的“新菜单”到Excel的菜单栏,在上步中创建的“新菜单”处暂停,将打开空的下拉菜单,然后将鼠标拖动到空白下拉菜单中,即可创建一个下拉菜单项,如图2-37所示。图2-35 【自定义】对话框中的【新菜单】图2-36 拖动“新菜单”到Excel菜单栏图2-37 拖动“新菜单”到下拉菜单中(6)确保【自定义】窗体处于打开状态,单击主菜单中的【新菜单】命令打开下拉菜单,在下拉菜单中右击【新菜单】选项,将弹出快捷菜单,如图2-38所示。图2-38 【新菜单】快捷菜单(7)在快捷菜单的【命名】文本框中输入菜单的名称“设置表头格式”,如图2-38所示。(8)与自定义工具栏按钮类似,再次右击下拉菜单,在弹出的快捷菜单中选择【指定宏】命令,为下拉菜单项指定执行的宏。◎技巧:要删除自定义菜单,先打开【自定义】对话框,将菜单栏中要删除的菜单项拖到【自定义】对话框中,再松开鼠标即可。2.4.5 在Excel 2013快速工具栏中添加宏按钮

这种方式适合在Excel 2013使用。

在Excel 2013中,没有了菜单和工具栏,只有快速工具栏与以往版本的工具栏相似。可以在快速工具栏中添加命令按钮,用来快速执行宏,具体操作如下:(1)在Excel 2013中打开工作簿。(2)单击【文件】选项卡,打开下拉菜单,单击下方的【选项】按钮,弹出【Excel选项】对话框。(3)在该对话框中单击左侧的【快速访问工具栏】,显示如图2-39所示的界面。在该对话框中,可对快速访问工具栏进行自定义。(4)在【从下列位置选择命令】下拉列表中,选择【宏】选项,下方的列表框中将显示当前的宏名。(5)选中一个宏名(如“设置表头格式”),单击【添加】按钮将其添加到快速访问工具栏中,如图2-40所示。图2-39 【Excel选项】对话框图2-40 添加按钮到快速访问工具栏(6)在右侧的列表框中选择刚添加的宏,单击下方的【修改】按钮,在弹出的对话框中,可以修改按钮的图标和显示的名称,如图2-41所示。(7)单击【确定】按钮返回【Excel选项】对话框,再单击【确定】按钮完成快速工具栏命令按钮的添加操作。此时快速工具栏上将添加一个名为【设置表头格式】的命令按钮,如图2-42所示。图2-41 【修改按钮】对话框图2-42 【设置表头格式】按钮(8)在快速访问工具栏上,单击该按钮即可执行相应的宏。2.4.6 在工作表中添加按钮运行宏

在Excel的工作表中可插入按钮,用户为插入的按钮指定宏,当单击按钮时就可运行宏。具体操作方法如下:(1)在Excel 2013中打开工作簿。(2)在功能区【开发工具】选项卡的【控件】组中单击【插入】按钮,弹出如图2-43所示的【表单控件】面板。图2-43 【表单控件】面板(3)在控件面板中单击【按钮】控件,在表格中单击(或拖动鼠标)插入一个按钮,如图2-44所示。(4)当松开鼠标时将会弹出如图2-45所示的【指定宏】对话框。在【宏名】列表框中选择宏“设置表头格式”,单击【确定】按钮即可为按钮指定宏。图2-44 在表格中插入按钮图2-45 【指定宏】对话框(5)确保工作表中插入的按钮处于选中状态(即按钮周围有8个控制点),单击该按钮上的文字,将其修改为“设置表头格式”。然后拖动按钮周围的控制点调整按钮的大小。(6)在工作表中单击按钮以外的地方,完成宏与按钮的关联设置。(7)拖动鼠标选择表头部分的单元格区域“A1:J1”,单击工作表中的【设置表头格式】按钮,将运行宏把表头部分设置为相应的格式,如图2-46所示。图2-46 单击【设置表头格式】按钮运行宏◎技巧:在Excel工作表中,对于插入的图形对象也可指定宏,其操作方法与给按钮指定宏类似,这里就不再重复了。2.4.7 打开工作簿时自动运行宏

在Excel应用程序中,有些宏需要在用户打开工作簿时就自动执行。例如,打开工作簿时显示应用程序的欢迎信息、显示用户登录窗体等。这类宏不需要用户操作就自动运行,在Excel中有两种方式来运行:□ 将宏名称设置为Auto_Open,每次打开包含此宏的工作簿时,该宏都会自动运行。□ 给工作簿对象的Open事件编写代码,Open事件是一个内置的工作簿事件,在每次打开该工作簿时都运行Open事件过程中的代码。

给工作簿对象的事件过程编写代码的内容将在本书第3部分中进行详细介绍,本小节介绍使用Auto_Open宏的方法自动运行宏。假设在用户打开工作簿时要显示一个欢迎信息,可按以下步骤进行操作:(1)在Excel 2013中打开一个工作簿(或新建一个工作簿)。(2)在功能区【开发工具】选项卡的【代码】组中,单击Visual Basic按钮进入VBE环境。(3)在VBE中单击主菜单【插入】|【模块】命令,将打开【模块1】代码窗口,如图2-47所示,在代码窗口中输入以下代码:(4)保存并退出当前Excel工作簿。(5)再次打开刚才的工作簿,将会显示如图2-48所示的【欢迎】对话框。图2-47 【模块1】代码窗口图2-48 【欢迎】对话框◎注意:必须将工作簿的宏安全性设置为【启用所有宏】,打开工作簿时才能自动运行Auto_Open宏代码。有关宏安全的内容将在本章后面介绍。◎技巧:与Auto_Open宏对应的还有一个名为Auto_Close的宏,用来在关闭工作簿之前完成一些清理操作。2.5 个人宏工作簿

在录制宏时,将打开如图2-49所示的【录制新宏】对话框,在该对话框的【保存在】列表框中可选择宏保存的位置。

录制的宏可保存至以下3处:□ 个人宏工作簿;□ 新工作簿;□ 当前工作簿。

如果希望在每次使用Excel时都能够使用宏,可选择【个人宏工作簿】列表项。图2-49 【录制新宏】对话框2.5.1 个人宏工作簿是什么

个人宏工作簿,是为宏而设计的一种特殊的具有自动隐藏特性的工作簿。在图2-49所示的对话框中选择“个人宏工作簿”时,如果个人宏工作簿还不存在,Excel会创建一个,并将宏保存在此工作簿中。如果该文件已经存在,则每当Excel启动时会自动将此文件打开并隐藏在活动工作簿后面。如果要让某个宏在多个工作簿都能使用,那么就应当创建个人宏工作簿,并将宏保存于其中。

Excel 2013的个人宏工作簿名称为PERSONAL.XLSB,Excel 2003及以前版本的个人宏工作簿名称为PERSONAL.XLS。

在Windows XP中,个人宏工作簿保存在“C:\Documents and Settings\用户名\ Application Data\Microsoft\Excel\XLSTART”文件夹中,以便在每次启动Excel时可以自动加载它。在Windows 7中,个人宏工作簿保存在“C:\Users\用户名\AppData\Roaming\ Microsoft\Excel\XLSTART”文件夹中。◎注意:如果当前计算机系统中存在个人宏工作簿,则每次Excel启动时会自动将此文件打开并隐藏。2.5.2 保存宏到个人宏工作簿

将宏保存到个人宏工作簿的操作很简单,常用的有以下两种方法:□ 在录制宏时,在【录制新宏】对话框中选择【保存在】列表框为“个人宏工作簿”。□ 在VBE环境中将宏代码复制到个人宏工作簿中。使用这种方法时,个人宏工作簿必须已经存在。

下面介绍第一种方法的操作步骤。(1)在Excel 2013中打开一个工作簿,选择一个要设置边框线的单元格区域。(2)在功能区【开发工具】选项卡的【代码】组中,单击【录制宏】按钮,打开【录制宏】对话框。(3)在该对话框的【宏名】文本框中输入名称,在【保存在】列表框中选择“个人宏工作簿”,如图2-50所示。(4)单击【确定】按钮,开始录制宏。将功能区切换到【开始】选项卡,单击【字体】组中的【边框线】按钮,为选中区域设置边框线。图2-50 【录制宏】对话框(5)将功能区切换到【开发工具】选项卡,单击【代码】组中的【停止录制】按钮,完成宏的录制。(6)在Excel环境中,按快捷键Alt+F11进入VBE环境,可以看到除了打开的工作簿以外,还有一个名为PERSONAL.XLSB的工作簿,单击打开其【模块1】代码窗口,可看到录制的宏代码,如图2-51所示。图2-51 个人宏工作簿代码2.5.3 管理个人宏工作簿

如果系统中已有个人宏工作簿,在每次打开Excel时,该工作簿都将自动打开。

1. 显示 / 隐藏个人宏工作簿

在正常情况下,个人宏工作簿处于隐藏状态,在Excel环境中看不到该工作簿,而在Excel VBE中可看到该工作簿中的代码。

其实,用户也可以在Excel环境中显示出个人宏工作簿。具体操作步骤如下:(1)在Excel 2013中,将功能区切换到【视图】选项卡,单击【窗口】组中的【取消隐藏】按钮,如图2-52所示。(2)在弹出的【取消隐藏】对话框中选中PERSONAL.XLSB,如图2-53所示。(3)单击【确定】按钮,个人宏工作簿即可显示在Excel环境中,如图2-54所示。图2-52 单击【取消隐藏】按钮图2-53 【取消隐藏】对话框图2-54 个人宏工作簿

如果要隐藏个人宏工作簿,确认PERSONAL.XLSB处于最前面的状态,可以在【视图】选项卡中,单击【窗口】组中的【隐藏】按钮即可。◎注意:若显示分辨率过小,【视图】选项卡中的【取消隐藏】按钮和【隐藏】按钮可能将只显示一个图标,而不显示文字。

2. 编辑个人宏工作簿中的宏

开发人员可对个人工作簿中的宏代码进行编辑,其操作方法与2.3.3小节介绍的方法类似。按快捷键Alt+F11进入VBE环境后,在【工程】子窗口中双击PERSONAL.XLSB,展开包含的模块,打开对应的代码窗口,即可对代码进行编辑操作。2.6 宏的安全性

宏是由VBA代码组成的,从Office软件支持宏开始,宏病毒也随之出现。许多病毒经过专门设计,可以利用VBA代码对系统和数据文件进行恶意操作。因此,宏的安全性越来越受到用户的重视。Excel 2013提供了更高更细致的宏安全性,能够在大部分情况下杜绝宏病毒对工作簿造成的危害。2.6.1 宏为啥不能执行

默认情况下,当打开包含有宏的工作簿时,在编辑栏上方将会显示安全警告,如图2-55所示。这时宏是被禁用的,如果要启用宏,单击右侧的【启用内容】,即可启用Excel工作簿中的宏。也可按以下步骤操作:(1)单击安全警告右侧的文字【宏已被禁用】,打开Excel 2013的信息视图,显示如图2-56所示。(2)单击【启用内容】按钮将显示相应的列表项,单击【高级选项】将显示如图2-57所示的【Microsoft Office安全选项】对话框。(3)选中【启用此会话的内容】单选按钮后,单击【确定】按钮关闭对话框,工作簿中的宏将被启用。图2-55 安全警告信息图2-56 Excel 2013信息视图图2-57 【Microsoft office安全选项】对话框

如果不能确定打开工作簿的宏是安全的,可以在出现图2-55所示的安全警告信息时,不做任何处理,则工作簿中的宏将不能被执行,从而保证系统和文档的安全。2.6.2 怎样修改宏安全级别

用户可以根据工作环境,对宏的安全性进行设置。设置宏安全性的步骤如下:(1)单击【文件】选项卡,在下拉菜单中单击下方的【选项】菜单命令,弹出【Excel选项】对话框。(2)单击左侧的【信任中心】,对话框显示如图2-58所示。图2-58 Excel选项【信任中心】选项卡(3)单击右下方的【信任中心设置】按钮,弹出【信任中心】对话框。(4)单击左侧的【宏设置】选项卡,对话框显示如图2-59所示。图2-59 【宏设置】选项卡◎注意:在【开发工具】选项卡的【代码】组中,单击【宏安全性】按钮也可打开如图2-59所示的【信任中心】对话框。(5)在【宏设置】选项区域中有以下4个选项,其作用分别为:□ 禁用所有宏,并且不通知:如果不信任宏,可使用此设置。文档中的所有宏以及有关宏的安全警报都被禁用。如果文档具有信任的未签名的宏,则可以将这些文档放在受信任位置。受信任位置中的文档可直接运行,不会由信任中心安全系统进行检查。□ 禁用所有宏,并发出通知:这是默认设置。如果想禁用宏,但又希望在存在宏的时候收到安全警报,则应使用此选项。这样,可以根据具体情况选择何时启用这些宏。□ 禁用无数字签署的所有宏:此设置与【禁用所有宏,并发出通知】选项相同,但下面这种情况除外——在宏已由受信任的发行者进行了数字签名时,如果信任发行者,则可以运行宏;如果还不信任发行者,将收到通知。这样,可以选择启用那些签名的宏或信任发行者。所有未签名的宏都被禁用,且不发出通知。□ 启用所有宏(不推荐,可能会运行有潜在危险的代码):可以暂时使用此设置,以便允许运行所有宏。因为此设置容易使计算机受到可能是恶意代码的攻击,所以不建议永久使用。

一般情况下,使用Excel 2013的默认设置即可。如果用户使用的工作簿都是自己(或工作组成员)制作的,即可选择最后一项【启用所有宏(不推荐,可能会运行有潜在危险的代码)】,这样在打开工作簿时将不会出现安全警告信息。2.7 实战练习1. 新建一个工作簿,录制一个设置格式的宏,设置字体为黑体、

16号、红色。然后查看录制宏的VBA代码。2. 将上题中录制的宏以按钮形式放置到Excel 2013的快速访问工具

栏。3. 设置宏的安全性为“启用所有宏”。第3章 Excel VBA的开发环境

通过在Excel中录制的宏,可反复执行一些重复操作,在一定程度上可提高用户的工作效率。

对于录制的宏,有时还需要对录制的代码进行编辑修改。更多的情况是,用户需要直接编写代码,或设计与用户交互的窗体。这些操作都需要在Excel VBA的开发环境——VBE中进行。本章将详细介绍VBE开发环境的使用。3.1 VBE简介

VBE是编写VBA代码的工具,开发人员可在该环境中对录制的宏代码进行修改,或直接编写代码、创建用户窗体等。在第2章中编辑宏时曾使用过VBE环境。3.1.1 VBE是什么

VBE是一个非常友好的开发环境,在VBE中编写的代码将成为Excel工作簿文件的一部分。例如,在对Excel文件进行保存操作时,VBA的组成部分(如模块、用户窗体等)同时也进行了保存。

VBE是一个单独的应用程序,拥有独立的操作窗口,可以与Excel(或其他的Office组件,如Word)无缝地结合。但VBE环境不能单独打开,要使用VBE,必须先运行Excel(或其他Office组件)。

在Excel中,使用VBE开发环境可以完成以下任务:□ 创建VBA过程;□ 创建用户窗体;□ 查看/修改对象属性;□ 调试VBA程序。3.1.2 怎么打开VBE

在Excel 2013中可以有多种方式打开VBE,常用的方法如下:□ 在功能区【开发工具】选项卡的【代码】组中,单击Visual Basic按钮可进入VBE环境。□ 在Excel中,按快捷键Alt+F11可进入VBE环境,这是最常用的方法。□ 在功能区【开发工具】选项卡的【代码】组中,单击【宏】按钮,打开【宏】对话框,选中一个宏,单击【编辑】按钮可进入VBE环境。□ 右击Excel工作表标签,弹出快捷菜单,选择【查看代码】命令可进入VBE环境。3.1.3 熟悉VBE操作界面

VBE是Office与VB两种环境的集合体,因此在界面方面继承了Office与VB的优点,VBE的默认界面如图3-1所示。下面分别介绍Excel 2013 VBE界面的各个构成部分。图3-1 VBE操作界面

1. 标题栏

标题栏是用来显示打开窗口的标题。标题栏分3部分显示对应内容,前面部分显示开发环境名称Microsoft Visual Basic Applications,中间部分显示窗体名称(如“销售管理.xls”),最后部分为控制VBE窗体的按钮(最小化、最大化和关闭按钮),如图3-2所示。图3-2 标题栏

2. 菜单栏

VBE的菜单栏与其他Windows应用程序的菜单栏相同。VBE菜单栏包含了绝大多数的命令,用户只需逐项选择菜单即可执行对应的命令。

菜单栏主要包含文件、编辑、视图、插入、格式、调试、运行、工具、外接程序、窗口以及帮助11个菜单项,每一个菜单项都含有若干个菜单命令或子菜单,通过单击菜单下的命令或子菜单就可以执行相应的操作,如图3-3所示。图3-3 菜单栏

菜单栏中各菜单项的功能和作用如下面所述。□ 文件:主要是对文件进行保存、导入、导出和退出操作。□ 编辑:主要是对应用程序代码进行撤销、复制、清除、查找、缩进、凸出等基本代码编辑操作,以及显示属性/方法列表、常数列表、快速列表等。□ 视图:主要是对VBE窗口进行隐藏/显示管理,如代码窗口、对象窗口、对象浏览器、立即窗口、本地窗口和监视窗口等。□ 插入:主要是对类模块、过程和文件等进行插入操作。□ 格式:主要是对工作表中添加的控件的位置和大小等进行调整操作。□ 调试:主要是对代码进行编译、调试和监视等操作。□ 运行:主要是对代码进行运行、中断、重新设置和设计模式操作。□ 工具:主要是对VBE选项和宏进行管理。□ 外接程序:主要是对外接程序进行管理。□ 窗口:主要是对各窗口的显示方式进行管理。□ 帮助:主要是链接VB帮助文件和打开Web上的MSDN链接。

3. 工具栏

VBE有6个工具栏(菜单条和快捷菜单也包含在工具栏中),默认情况下,【标准】工具栏显示在菜单栏的下方,其他工具栏都处于隐藏状态。与Excel 2003中的工具栏操作相似,用户可以对工具栏进行移动、停靠、显示和隐藏等操作。

单击主菜单【视图】|【工具栏】|【自定义】命令,将打开如图3-4所示的【自定义】对话框,在其中的【工具栏】选项卡中可以选择需要显示的工具栏,也可根据需要新建用户自己的工具栏。图3-4 【自定义】对话框

各工具栏的主要作用分别如下所述。□ 【标准】工具栏:主要显示常用的功能按钮,包括视图Microsoft Excel、插入用户窗体、保存、剪切、复制、查找、撤销、运行子过程/用户窗体、中断、工程资源管理器、设计模式、属性窗口、对象浏览器等。□ 【编辑】工具栏:主要用来对代码进行操作,如对程序代码进行缩进凸出、显示属性/方法列表、显示常数列表、显示快速列表、书签等操作。□ 【调试】工具栏:主要是对代码进行编译、调试、监视、切换断点、逐语句、逐过程等操作。□ 【用户窗体】工具栏:主要是对开发具体窗体控件进行操作,如移至顶层、移至底层、组、取消组、左对齐等。

4. 工程资源管理器

工程资源管理器用来管理VBA工程项目。VBE将每个工作簿作为一个工程,在Excel中打开的所有工作簿都集中在工程资源管理器中进行管理。除了工作簿中的工作表以外,还可以管理自定义窗体,以及增加代码模块等。本章将在3.4节详细介绍其使用方法。◎提示:如果VBE中没有显示工程资源管理器,按快捷键Ctrl+R可将其显示出来。

5. 代码窗口

在Excel工程中,每一个对象都有一个关联的代码窗口。在【工程资源管理器】中双击对象,即可打开该对象的代码窗口。有关代码窗口的使用方法,将在本章后面进行详细介绍。

6. 工具箱

工具箱只有在设计用户窗体时才会显示出来,使用工具箱中提供的控件可设计出与用户交互的界面。

7. 用户窗体

用户窗体是用户与系统交互的界面,有关用户窗体的设计将在本书第4部分进行详细介绍。

Excel应用程序不使用用户窗体也能完成大部分工作。

8. 属性窗口

属性窗口主要用来设置对象属性。属性窗口显示所选对象的属性,左边为属性名,右边为具体的属性值。属性的设置可直接输入,也可单击下拉列表框进行选择。

属性窗口除了可更改工程、各对象、模块的基本属性外,更多的用于对用户窗体中各对象属性的交互式设计。◎提示:如果在VBE中没有显示【属性】窗口,按快捷键F4可将其显示出来。

9. 立即窗口

立即窗口在程序的调试中非常有用,其主要作用如下:□ 在开发过程中,可以在代码中加入Debug.Print语句,这条语句将在立即窗口输出内容,用来跟踪程序的执行路径,以及变量的中间结果。□ 在调试程序时,如果程序处于中断模式,可以在立即窗口中查看对象和变量的状态。□ 在立即窗口中,使用Print语句,就可以看到运行的结果,在很多情况下比用Msgbox信息提示对话框方便多了。◎提示:如果VBE中没有显示【立即窗口】,按快捷键Ctrl+G可将其显示出来。

10. 本地窗口

本地窗口可自动显示出所有在当前过程中的变量声明及变量值。

若本地窗口为可见的,则每当从执行方式切换到中断模式或是操纵堆栈中的变量时,它就会自动地重新显示。可以通过往左或往右拖移边线,来重置列标头的大小。3.2 VBE常用子窗口的作用

VBE操作环境中包含有多个子窗口,例如,工程资源管理窗口、属性窗口、代码窗口、本地窗口、立即窗口等。本节将介绍这些子窗口的使用。3.2.1 查看工程文件

工程资源管理窗口如图3-5所示,该图中列出了一个名为“销售管理.xls”的工程。如果在Excel中打开了多个工作簿,则在工程资源管理窗口中将列出多个工程名称。图3-5 工程资源管理器

在工程资源管理器上方有3个按钮,各按钮的作用如下所述。□ 查看代码:用来显示当前选中模块的代码窗口。□ 查看对象:用来显示Excel对象文件夹中所选择的工作表,或者窗体文件夹里面的窗体。□ 切换文件夹:用来隐藏或显示工程窗口里的文件夹。

在图3-5中展开了工程“销售管理.xls”的各组成部分,可看到其中包括【Microsoft Excel对象】、【窗体】和【模块】节点。在VBA工程中可以包括以下对象:□ 工作表(图表):包括工作簿中的每个工作表和图表,可对每个对象分别编写代码。□ 模块:包括在Excel中录制的宏,以及用户编写的VBA代码。□ 类模块:包括用户自定义对象的代码。□ 窗体:包括该工程中设计的用户自定义窗体,以及为窗体和窗体控件编写的代码。3.2.2 怎样设置对象属性

属性窗口用来查看或设置对象的属性,可设置工程、工作表、窗口、模块、类模块等对象的属性值,在大多数情况下,主要用来设置用户窗体及窗体中使用的控件属性。

常见的属性窗口如图3-6所示。当前所选对象的名称显示在属性窗口的【对象】列表框中,单击右侧的下拉箭头,可查看对象的名称列表。在该列表框中选择某个对象名后,也就选中了该对象。图3-6 【属性】窗口

在【属性】窗口中,最大的区域就是设置对象各属性列的列表,该列表分两列,左侧为属性名(用户不能修改),右侧为属性可设置的值。

设置对象属性时,根据属性的不同,需要使用不同的设置方法。有的属性值需要手工输入;有的是在列表中进行选择;还有的需要打开一个对话框进行选择。

1. 手工输入属性值

大部分属性值都是通过手工输入,例如对象的名称、外形尺寸等,这类属性值的设置很简单。例如,要将新插入的用户窗体名称设置为frmMain,具体操作步骤如下:(1)单击主菜单【插入】|【用户窗体】命令,向工程中插入一个用户窗体。(2)在【工程】窗口中双击新插入的用户窗体,这时【属性】窗口将显示用户窗体的属性,拖动鼠标选中属性【(名称)】右侧的文字UserForm1,如图3-7所示。(3)接着输入新的名称frmMain,按Enter键后【属性】窗口的名称已经修改,如图3-8所示。图3-7 选择属性值图3-8 修改属性

2. 选择列表

有的属性取值具有一个规定的范围,在属性窗口中将提供一个列表供用户进行选择。例如,设置用户窗体的位置属性的操作步骤如下:(1)在属性窗口中找到需要设置的属性名StartUpPosition。(2)单击属性值右侧的下拉箭头,将显示出可供选择的属性值列表,如图3-9左图所示。(3)单击列表中需要设置的值“1 – 所有者中心”。

另外,如图3-9右图所示,列表框中可以设置窗体的背景色。图3-9 选择属性值

3. 打开对话框

对于设置属性为一个文件名之类的值时,需要打开一个对话框,让用户选择相应的文件。例如,设置窗体背景图片的操作步骤如下:(1)在属性窗口中找到需要设置的属性名Picture。(2)单击属性值右侧的按钮,将打开如图3-10所示的【加载图片】对话框。(3)在该对话框中选择合适的图片文件后,单击【打开】按钮,【属性】窗口如图3-11所示。在Picture属性后显示为(Bitmap),表示为该属性设置了一个图片文件。同时,窗体背景将显示该图片。图3-10 【加载图片】对话框图3-11 设置Picture属性3.2.3 在代码窗口中查看和编辑代码

在VBE中,每个模块都有自己的代码窗体,每个工作表、每个模块和每个窗体都分别有自己的代码窗口。代码窗口如图3-12所示。图3-12 代码窗口

在代码窗口的顶部,有两个下拉列表框。左侧为【对象列表】下拉列表框,在该列表框中将显示当前模块的对象名列表。右侧为【过程/事件】下拉列表框,可快速查看一个指定对象过程或事件过程的代码。

在代码窗口的左下方有两个按钮,其功能包括以下两个方面。□ 过程视图:在代码窗口中一次只显示一个过程的代码。如果要查看其他过程的代码,则需要通过【过程/事件】下拉列表框进行选择。□ 全模块视图:在代码窗口中显示所选模块的所有过程,使用右侧的垂直滚动条可以在代码中滚动。3.2.4 移动VBE子窗口

VBE环境由多个子窗口组成,这些子窗口可根据需要显示或隐藏,各子窗口可以停靠在主窗口的边上,也可浮动显示在窗口中,可根据用户的习惯进行定制。下面演示在VBE中拖动各子窗口的操作。(1)在Excel 2013打开一个工作簿,或新建一个工作簿。(2)按快捷键Alt+F11进入VBE开发环境,如图3-13所示。图3-13 VBE开发环境(3)单击各子窗口右上方的【关闭】按钮,可隐藏子窗口,如图3-14所示为关闭所有子窗体后的效果。(4)单击主菜单【视图】|【工程资源管理器】命令(如图3-15所示),可显示出【工程资源管理器】子窗口。图3-14 关闭各子窗体后的效果图3-15 【视图】下拉菜单(5)在【视图】下拉菜单中选择不同的命令,将常用子窗口显示出来。(6)拖动【属性】子窗口的标题栏向右移动,使【属性】子窗口处于浮动状态,如图3-16所示。(7)右击【属性】子窗口标签右侧的空白处,弹出如图3-17所示的快捷菜单。默认情况下【可连接的】菜单项处于选中状态,此时该子窗口靠近主窗口或其他子窗口时,将自动连接到靠近的窗口。(8)单击【可连接的】菜单项,取消其选中状态。此时,拖动【属性】子窗口调整其位置,该子窗口将不会连接到靠近的子窗口旁,而是隐藏在其他子窗口下方,如图3-18所示。图3-16 拖动【属性】子窗口图3-17 【属性】子窗口的快捷菜单图3-18 隐藏部分【属性】子窗口3.3 让VBE环境适合自己的习惯

通过上面的学习,读者已经对VBE环境有了较全面的认识。对于Excel开发人员来说,还应当根据自己的习惯,对VBE环境进行定制。

在VBE环境中单击主菜单【工具】|【选项】命令,打开【选项】对话框。该对话框包括4个选项卡,通过这些选项卡中的选项可对VBE环境进行定制。3.3.1 功能强大的【代码】窗口【选项】对话框中的【编辑器】选项卡如图3-19所示。通过该选项卡中的选项可定制【代码】窗口。下面分别介绍这些选项。□ 自动语法检测:用来设置在输入一行代码之后,是否自动检查语法。如果未选中该复选框,VBE将通过使用与其他代码不同的颜色来显示语法错误的代码,并且不弹出提示对话框。□ 要求变量声明:选中该选项,VBE将会在新插入的模块起始处增加以下语句。图3-19 【编辑器】选项卡

如果该语句出现在模块中,就必须定义模块中使用的每个变量。当遇到未定义的变量时,将出现错误提示。□ 自动列出成员:选中该项,在输入VBA代码时,VBE将自动列出对象的成员列表。如果没有选中该项,则需要单击【编辑】工具栏中的【属性/方法列表】按钮(或按Ctrl+J快捷键)来打开该成员列表。□ 自动显示快速信息:选中该项将显示所输入函数及其参数的信息。□ 自动显示数据提示:选中该项将显示出指针所在位置的变量值。该项只能在中断模式下使用。□ 自动缩进:选中该项,VBE将按照下方设置的Tab宽度自动缩进显示每行代码,所有接下来的代码都将使用该缩进量。□ Tab宽度:设置缩进量,范围为1~32个空格,默认值是4个空格。□ 编辑时可拖放文本:选中该项后,允许通过拖动操作来复制和移动代码窗口中的文本。也可从代码窗口拖放元素到立即窗口或监视窗口。□ 缺省为查看所有模块:设置新模块的默认状态,选中该项后,在代码窗口中可查看模块的所有过程。这不会改变当前已打开模块的视图方式。□ 过程分隔符:可以显示或隐藏代码窗口中,出现在每个过程尾端的分隔符条。3.3.2 设置代码的显示格式

通过【选项】对话框的【编辑器格式】选项卡,可设置代码的显示格式。【编辑器格式】选项卡如图3-20所示,可设置各种代码的显示颜色和字体大小等内容。具体设置步骤如下:(1)在【代码颜色】列表框中选择需要调整的代码类型,如语法错误文本。(2)在【前景色】、【背景色】和【标识色】的下拉列表框中选择“自动”选项。(3)在右侧的【字体】和【大小】列表框中分别设置代码的字体和字号。(4)根据需要,还可选择是否显示【边界标识条】。

在设置过程中,可通过【示例】文本框观察到设置的效果。图3-20 【编辑器格式】选项卡3.3.3 设置通用选项【选项】对话框的【通用】选项卡如图3-21所示,主要用来进行VBE的工程设置、错误处理和编译设置。一般情况下,不需要修改这些选项,直接使用默认值即可。图3-21 【通用】选项卡【通用】选项卡中各选项的意义如下所述。□ 显示网格:在窗体中显示网格。□ 网格单位:列出网格中单元的度量单位。□ 宽度:设置窗体中网格存储单位的宽度。□ 高度:设置窗体中网格存储单位的高度。□ 对齐控件到网格:在封闭网格上自动对超过控件边缘的部分定位。□ 显示工具提示:显示工具栏按钮的工具提示。□ 项目折叠收起时隐藏窗口:当【工程】资源管理器窗口中的工程折叠起来之后,会自动关闭工程、用户窗体、对象或模块窗口。□ 在丢失当前状态前通知:显示一个信息,指出对运行中的工程所要求的动作,以使所有模块级变量得以重置。□ 发生错误则中断:任何错误都会使工程切换到中断模式,不管错误处理程序是否为活动的,也不管代码是否在类模块中。□ 在类模块中中断:任何在对象类模块中失去句柄的错误会让工程进入中断模式。□ 遇到未处理的错误时中断:任何其他失去句柄的错误会让工程进入中断模式。□ 请求时编译:在执行前就已完全编译工程,或已编译所需的代码。□ 后台编译:利用运行时的空闲时间,在后台完成工程的编译(只有在已设置请求时编译才有效)。3.3.4 设置能停靠的子窗口【选项】对话框的【可连接的】选项卡如图3-22所示,其中的选项决定了VBE中各窗口的行为方式。

可连接可理解为可停靠,如在默认情况下,将【工程】资源管理器窗口拖到VBE窗口的边缘时,【工程】资源管理器窗口将自动停靠在VBE窗口边框上。如果在图3-22所示的对话框中没有选中对应窗口前的复选框,则该窗口将浮动在VBE窗口上。当有多个窗口浮动时,VBE操作界面将显示得很混乱。图3-22 【可连接的】选项卡3.4 VBE提供的帮助

VBE为开发人员提供了完善的帮助系统,可帮助用户学习VBA相关对象的属性、方法和事件的全面信息。本节将简单介绍帮助系统的使用方法。3.4.1 打开帮助主界面

在VBE环境中单击主菜单【帮助】|【Microsoft Visual Basic for Applications帮助】命令,可打开如图3-23所示的帮助主界面。◎提示:按F1键也可打开如图3-23所示的帮助主界面。

在帮助主界面中,主要包括以下几个部分。□ 工具栏:类似于IE浏览器的工具栏,工具栏中的各按钮如图3-24所示。□ 搜索栏:可输入关键字,在帮助系统中查找与关键字匹配的帮助信息。图3-23 帮助主界面□ 目录:显示Excel 2013中的所有帮助信息目录。□ 主窗口:显示帮助的具体内容。图3-24 工具栏中的各按钮3.4.2 通过帮助查看对象属性

要查看对象的属性,可在帮助窗口左侧的目录中依次单击展开对象名称,找到对象的属性列表即可查看到该属性的相关说明,如图3-25所示。◎提示:在帮助正文中,有的关键字可链接到其他帮助条目(如图3-25中的Range关键字),单击该链接可打开对应的帮助条目。图3-25 查看对象的属性3.4.3 在帮助中搜索

在帮助系统中,用户可输入关键字(或关键字的部分字母),单击【搜索】按钮,即可在帮助系统中搜索包含该关键字的相关内容,如图3-26所示。图3-26 搜索关键字

将鼠标移到要查看的条目上,鼠标指针将变为手形,单击鼠标即可打开相应条目的帮助信息。

如果帮助系统中与搜索关键字相匹配的条目很多,将显示分页序号,单击序号链接即可查看其他页的内容。3.5 实战练习

1. 打开Excel 2013,进入VBE开发环境,将【立即窗口】和【本地窗口】显示在VBE环境的下方。

2. 将VBE中的【立即窗口】和【本地窗口】拖动调整为浮动状态。

3. 通过VBE提供的帮助进一步学习如何使用VBE。

提示:在帮助界面的主窗口中选择【Visual Basic用户界面帮助】即可。第2篇 VBA基础知识

在使用VBA编写代码前,必须先了解VBA程序设计的基础知识。了解VBA程序的基本元素包括:语句的书写规范,VBA处理的数据类型,程序的结构、字符串和日期的处理等相关知识。★ 第4章 VBA基础★ 第5章 程序控制结构★ 第6章 使用数组★ 第7章 使用过程★ 第8章 管理模块★ 第9章 处理字符串和日期第4章 VBA基础

在用VBA开发应用程序之前,应该先对VBA的语法有个了解。本章将介绍VBA数据类型、常数、变量、运算符和表达式等相关基础知识,为进一步学习VBA编程打下基础。4.1 VBA简介

在Excel中使用VBA编程,可以开发出许多有价值的应用程序。作为初学者,首先需要了解什么是VBA,以及用VBA能做什么。4.1.1 VBA是什么

VBA是Visual Basic for Application的缩写,是一种应用程序自动化语言。所谓应用程序自动化,是指通过编写程序让常规应用程序(如Excel、Word等)自动完成工作,如在Excel里自动设置单元格的格式、多张工作表之间的自动计算等。

VBA是微软应用程序开发语言——VB的子集。所以如果有VB程序设计的经验,学习VBA将非常快;同样,如果掌握了VBA的应用,也会为以后学习VB打下坚实的基础。

VBA根据其嵌入软件的不同,增加了对相应软件中对象的控制功能。例如Excel的VBA,增加了控制Excel工作簿、工作表、区域、数据透视表等对象的属性、事件和方法。在Excel中使用VBA,可以更好地控制Excel,进一步发掘Excel的强大功能,提高Excel的自动化水平。可以用很短的时间在Excel环境中开发出一套完整的管理信息系统。4.1.2 在Excel中使用VBA的优势

以Excel为平台,用VBA来开发程序的优势有以下几点:□ 当使用Excel为平台时,利用Excel现有的功能(如文件管理、函数等),可以减少应用程序的代码量,从而大大缩短开发的周期。□ 在大部分用户的计算机中都安装有Excel软件,使Excel开发的应用程序发布很容易。只要用户计算机中有Excel,基本不需要其他的文件,只需将开发的工作簿文件复制给用户即可完成文件的发布。□ VBA的语言简单易学,初学者很容易上手。4.2 VBA语法简介

在Excel VBA中,每个Excel应用程序都由一个工程表示,每个工程包含当前工作簿的工作表、用户窗体、模块和类模块,可为这些对象和模块分别编写VBA代码,本节将介绍VBA代码最基础的内容。4.2.1 VBA代码是什么样的

在本书第2章中录制的宏都是由VBA代码构成的,进入VBE环境可以看到录制的宏代码。在Excel中录制的宏都是以VBA代码表示,所有的宏都是以关键词Sub开始,以关键词End Sub结束。其结构如下:

在关键词Sub之后是宏的名称,宏名称后是一对括号。在Sub和End Sub之间是每次执行宏时的VBA语句,其中以单引号(半角)开头的是注释内容,VBA将忽略该语句。◎提示:以Sub开始,至End Sub结束的这一部分代码在VBA中称为一个过程。有关Sub过程和Function过程的详细内容将在本书第7章中进行介绍。

例如,第2章中录制宏的VBA代码如下:

从以上代码中可以看出,VBA代码主要有以下几个要素:□ VBA代码由英文、中文、数字等字符构成。□ 每行为一个VBA语句。□ 有一些固定的单词(称为关键字)经常出现,例如Selection、With等。□ 几乎每行代码中都包括句点,用来连接VBA语言中不同的要素。例如ActiveWindow.WindowState。

下面将分别介绍这些语法要素。4.2.2 VBA代码可用的字符

VBA代码可由以下几类字符组成。□ 英文大小写字母:包括A~Z和a~z。VBA的代码不区分大小写,若字母作为字符串使用时,需注意大小写不同。□ 数字:包括阿拉伯数字0~9。□ 特殊符号:在VBA中具有特殊含义的字符,如+、–、*、/、>、<、=和各种标点符号。□ 汉字:对于中文版的Excel,在VBA代码中还可以使用汉字。

综上所述,在VBA代码中可以使用各种常见的符号。4.2.3 VBA的关键字

关键字,又称为保留字,是指VBA中具有特殊意义的保留字或符号。这些关键字具有固定的含义,用户不能更改其拼写方式,在对过程、变量命名时不允许使用关键字相同的拼写。

VBA中关键字很多,可分为数组、编译命令、控制流、变换、数据类型、日期与时间、目录和文件、错误、金融、输入与输出、数学、其他、操作符、字符串处理、变量与常数等多种类型。常用的关键字如表4-1所示。表4-1 VBA常用关键字◎提示:在VBA中,对关键字不区分大小写,无论用户是按大写、小写或大小写混合的方式输入关键字,当输入完一条语句按Enter键后,VBE将自动将关键字转换为首字母大写,其余字符小写的样式。4.2.4 什么是标识符

在VBA程序中,为了区分过程、常数、变量、对象等,需要为这些过程、常数、变量和对象分别设置不同的名称,这个名称就是标识符。

用户定义标识符时应按照以下规则来定义:□ 标识符只能由VBA支持的字符集组成。□ 标识符首字母必须为字母或下划线。□ 不能在标识符中使用空格、句点(.)、感叹号(!)或@、&、$,# 等字符。□ 标识符不能与关键字相同,可对关键字加上前缀或后缀使用。□ 标识符的长度不能超过255个字符。□ 标识符的名称应尽量有意义,以方便程序中查错。□ 中文Excel中,可使用中文作为标识符(这时,不要求首字符为字母),如设置过程名称为“设置表头格式”。4.3 VBA中有哪些数据类型

数据是程序的处理对象,在学习程序设计之前,有必要先了解数据的相关知识。VBA能处理字符、日期、数值等多种数据类型,并允许用户根据需要定义自己的数据类型。4.3.1 VBA数据类型有哪些

Excel单元格中可以保存处理多种类型的数据,包括数值、日期/时间、文本和货币等。在VBA中除了提供这些数据类型之外,还提供了字节、布尔和变体数据等类型。在VBA中共有11种基本数据类型,这些基本数据类型是组成用户自定义类型的基础。

1. 整型(Integer)

整型数据存储为16位(2个字节)的数值形式,其范围为–32768~32767之间。整型数据除了表示一般的整数外,还可以表示数组变量的下标。整型数据的运算速度较快,而且比其他数据类型占用的内存少。整型的类型声明字符是百分比符号(%),以下两条语句都声明了一个整型变量:

2. 长整型(Long)

长整型数据存储为32位(4个字节)有符号的数值形式,其范围从–2147483648~2147483647。Long的类型声明字符为和号(&)。

如果要在VBA程序中保存较大数值,可采用长整型来保存。

3. 单精度浮点型(Single)

整型和长整型都用来表示整数,在很多程序中都需要处理小数,这时就需要使用实数型,实数型分为单精度浮点型和双精度浮点型。单精度浮点型数据存储为32位(4个字节)浮点数值的形式,通常以指数形式(科学计数法)来表示,以“E”或“e”表示指数部分。它的范围在负数的时候是从–3.402823E38~–1.401298E-45,而在正数的时候是从1.401298E-45~3.402823E38。单精度浮点型的类型声明字符为感叹号(!)。

4. 双精度浮点型(Double)

双精度浮点型可表示更高精度、更大的数据,存储为64位(8个字节)浮点数值的形式,它的范围在负数的时候是从–1.79769313486231E308~–4.94065645841247E-324,而在正数的时候是从4.94065645841247E-324~1.79769313486232E308。Double的类型声明字符是井字符号(#)。

若程序中处理的数据范围很大,或小数点后的位数较多,就应该采用双精度浮点型。

5. 货币型(Currency)

由名称可知该种数据类型主要用来保存货币值。货币型数据存储为64位(8个字节)整型的数值形式,然后除以10000给出一个定点数,其小数点左边有15位数字,右边有4位数字。这种表示法的范围可以从–922337203685477.5808~922337203685477.5807。货币型的类型声明字符为at符号(@)。

货币型数据类型在货币计算与定点计算中很有用,在这种场合精度特别重要。浮点(单精度和双精度)数据比货币型的有效范围大得多,但有可能产生小的进位误差,而货币型采用更多的字节保存数据,能减少计算的误差。

6. 字节型(Byte)

字节型数据类型为数值型,用来保存0~255之间的整数,占用8位(1个字节)存储空间。字节型数据类型在存储二进制数据时很有用。

字符型表示的数值范围很有限(只能为0~255),所以,一般情况下都不使用这种类型保存数据。

7. 字符串(String)

字符串是一个字符序列,类似于Excel中的文本。在VBA中,字符串包括在双引号内(半角状态的双引号)。其中长度为0(双引号中不包括任何字符)的字符串称为空字符串。以下为字符串的表示形式:

其中最后一个为空字符串。

VBA中的字符串又分两种:变长与定长的字符串。□ 变长字符串的长度是不确定的,最多可包含大约20亿(2^31)个字符。□ 定长字符串的长度是确定的,可包含1到大约64K(2^16)个字符。

例如以下语句声明字符串:

其中变量str1为变长字符串,可保存多个字符,而变量str2表示定长字符串,该变量定义后将一直占用10个字符的位置。

8. 布尔型(Boolean)

布尔型数据很简单,只有两个值(True或False)。该类型适合存储简单的二元信息,例如,真/假、是/否等类似的信息。布尔型变量的值显示为True或False,保存为16位(2个字节)的数值形式。

当转换其他的数值类型为Boolean值时,0会转成False,而其他的值则变成True。当转换Boolean值为其他的数据类型时,False成为0,而True成为–1。

9. 日期型(Date)

在VBA中支持复杂的日期操作和运算。

日期型数据存储为64位(8个字节)浮点数值形式,其可以表示的日期范围为100年1月1日~9999年12月31日,而时间可以从0:00:00~23:59:59。任何可辨认的文本日期都可以赋值给Date变量。日期文字需以井字符号(#)括起来,例如,#January 1、1993# 或 #1 Jan 93#。

日期型变量会根据计算机中的短日期格式来显示。时间则根据计算机的时间格式(12小时制或24小时制)来显示。

当其他数值类型要转换为日期型时,小数点左边的值表示日期信息,而小数点右边的值则表示时间。午夜为0而中午为0.5。负整数表示1899年12月30日之前的日期。

10. 对象型(Object)

VBA是面向对象的程序设计语言,用户可以在程序中访问各种对象,例如,Excel的工作表、单元格等。这些对象有自己特定的对象名,这里所说的对象型可引用任何对象。

对象型数据存储为32位(4个字节)的地址形式,其为对象的引用(即引用指定对象)。必须使用Set语句给对象变量赋值,对象变量使用结束后,应为其赋值为Nothing。例如:

11. 变体型(Variant)

变体型是VBA中的一种特殊数据类型,所有没有被声明数据类型的变量都默认为变体型。变体型数据是所有没被显式声明(例如Dim、Private、Public或Static等语句——变量的声明将在本章后面进行介绍)为其他类型变量的数据类型。变体型没有类型声明字符。

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

在VBA中,可以使用Type语句定义自己的数据类型。用户自定义类型经常用来表示数据记录,记录一般由多个不同数据类型的元素组成。

定义自定义数据类型的语法格式如下:

其中,“数据类型名”就是要定义的数据类型的名字,“数据类型”为前面介绍的基本数据类型(也可使用用户已经定义的自定义类型)。例如:

有了以上的自定义类型,即可使用该类型的变量保存一行的数据。这样就可以非常方便地处理Excel工作表中的数据。

使用Type语句声明了一个用户自定义类型后,就可以在该声明范围内的任何位置声明该类型的变量。可以使用Dim、Private、Public、ReDim或Static来声明用户自定义类型的变量。◎注意:自定义数据类型的定义必须放在模块(模块和类模块)的声明部分。在使用记录类型之前,必须用Type语句进行定义。一般情况下,记录类型在模块中定义,其变量可以出现在VBA工程的任何地方。

例如:如图4-1所示的工作表中,每行包含产品名称、库存量、单价、订购量等数据。在VBA程序中为了方便地处理这些数据,可自定义数据类型Product,然后在程序中使用Dim声明一个变量的数据类型为Product,然后在程序中使用赋值语句将各列的值保存到声明的变量中。图4-1 商品信息表

具体的代码如下:4.3.3 使用枚举类型

枚举就是将变量的值逐一列举出来,属于该枚举型的变量只能取列举的某一个值。当一个变量只有几种可能的值时,可以定义为枚举类型。

在Excel VBA中预定义了很多枚举类型。例如在Excel中,对象的水平对齐方式共有8种,使用xlHAlign枚举类型来表示,其枚举名称、值和表示的意义如表4-2所示。表4-2 xlHAlign枚举类型

枚举类型提供了一种处理有关常数的方法。例如,可以定义一个枚举类型来表示小学六个年级的名称与一组整型常数的关系,在代码中就可使用年级的名称(如“一年级”),而不用使用数值来表示了。这样程序将具有更好的阅读特性。枚举类型的定义需放在模块或窗体的声明部分,其定义格式如下:

说明:

在默认情况下,枚举中的第1个常数为0,其后的常数比前面一个大1,例如:

在以上定义中,第1项的值为0,本例随意设置了一个值,使“一年级”可表示常数1,“六年级”表示常数6。

如果希望枚举型的第1项的值为常数1,则可按以下方式进行定义:

这时,“一年级”表示常数1,“二年级”表示常数2。

在代码窗口的声明部分定义了枚举类型后,就可以声明该枚举类型的变量,并使用它。例如定义了上面的Grade枚举类型后,即可在代码窗口中使用该类型,在定义为变量时将显示前面定义的枚举类型Grade,如图4-2所示。给枚举类型变量赋值时,在代码窗口中将自动列出枚举类型的成员,如图4-3所示。图4-2 定义枚举变量图4-3 使用枚举型4.4 常数是什么

VBA应用程序通过获取数据、处理数据和输出数据来完成用户的工作。在处理数据时,像3.14、255等仅表示它自身取值的数据叫常数。常数的值在程序执行之前就已经确定,执行过程中不能改变。

VBA中的常数包括直接常数、符号常数和系统常数3种。4.4.1 直接常数

直接常数是指在VBA程序中可以直接使用的量。根据表示的数据类型不同,直接常数分为数值常数(整型、长整型、单精度型、双精度型和货币型等)、字符串常数、日期/时间常数和布尔常数等多种类型。

1. 数值常数

数值常数是由数字、小数点和正负符号所构成的量。一个数值常数有时可能存在多种数据类型的解释。例如,3.14可解释为单精度型,也可为双精度型。VBA将使用占用内存少的那种类型,即单精度型。

为了标识直接常数的类型,可在直接常数的后面加上类型标识符,例如:

以上代码中,3.14#表示该常数值按双精度型存储,若3.14后面不带“#”号,则表示是单精度常数。

2. 字符串常数

字符串常数是由数字、英文字母、特殊符号和汉字等可见字符构成的,在书写时必须使用半角状态的双引号作定界符,例如:◎注意:字符串常数必须用双引号括起来,否则,VBA会将其认为是一个变量名。

3. 日期/时间常数

在Excel中,可以方便地处理日期/时间数据。日期/时间常数用来表示某一天或某一具体时间。在输入日期/时间常数时必须使用“#”作为定界符,并且输入的日期时间要有具体的意义。例如,#8/8/2008#是正确的,而#4/31/2008#是错误的,因为4月没有31日。

输入日期时,VBE自动将两个“#”号中的数据转换为正确的日期格式。例如,在VBE的代码中输入以下内容:

VBE都会自动将其按“月/日/年”的格式转换为正确的表示形式,显示如下:

若输入的值如下:

则将弹出如图4-4所示的错误提示信息。◎提示:日期值中的年份可省略世纪值,当省略世纪值时,其表示的年份与Windows操作系统中的设置相关。例如,图4-4 错误提示#8/13/08#可能表示2008年8月13日。

4. 布尔常数

布尔常数也叫逻辑常数。在VBE中布尔常数只有两个值:True(真)和False(假)。4.4.2 符号常数

符号常数是一种代替直接常数的标识符。如果在程序中需反复地使用某一个常数,可为该常数命名,在需要使用该常数的地方引用其常数名即可。

一般在VBA代码的上方定义符号常数,当程序中需要修改该常数的值时,只需要在程序开始处定义一次符号常数即可。

在程序运行过程中,不能对符号常数进行赋值和修改,即符号常数在程序运行前必须有确定的值。VBA中可使用Const关键字定义符号常数,其语法格式如下:

其中,Const为定义符号常数的关键字,符号常数表达式计算出来的值保存在常数名中。如果在声明常数时没有显式地使用As type子句,则该常数的数据类型是最适合其表达式的数据类型。

例如,以下代码定义符号常数:

在定义符号常数时,等号右边的表达式往往是数字或字符串,也可以是前面定义过的常数。例如:

以上代码使用前面定义的BOOKNAME符号常数,通过运算后得到新的符号常数BOOK。4.4.3 Excel定义好的常数

为了控制Excel中的各对象,Excel VBA预定义了许多常数,这些常数称为系统常数。提供对象库的其他应用程序(如Access、Excel、Project以及Word等)也提供常数列表,这些常数可与它们所属的对象、方法以及属性等一起使用。

在VBA中,系统常数名采用大小写混合的格式,其前缀表示定义常数的对象库名。在Excel中的系统常数名通常都是以小写的xl(如xlWindowType的成员包括xlWorkbook等几个)作为前缀,而VB中的系统常数名通常都是以小写的vb作为前缀。

例如,VBA中常用的Msgbox用来显示一个信息对话框,为了方便控制对话框,VBA提供了很多Msgbox常数,用vbOKOnly表示对话框只有【确定】按钮,比用数值0更直观易用。

要查询某个系统常数的具体名称及其确切值,可通过【帮助】菜单或使用【对象浏览器】窗口来查看。

通过【帮助】菜单查看常数值的方法如下:(1)在VBE中按F1键打开帮助系统。(2)在【搜索】文本框中输入关键字“常数”,单击【搜索】按钮,将显示关键字为“常数”的所有帮助条目,如图4-5所示。图4-5 在【帮助】菜单中查看常数(3)在查找到的信息中单击【Visual Basic常数】链接,可显示VBA常数的分类,如图4-6左图所示。单击分类【Color常数】链接即可查看具体的常数,如图4-6右图所示。图4-6 查看常数

还可通过【对象浏览器】窗口查找系统常数,具体步骤如下:(1)在VBE中按F2键打开【对象浏览器】窗口。(2)在该窗口上部第一个列表框中选择相应的库,在第二行的列表框中输入要查找的常数,单击【搜索】按钮,在下方【搜索结果】列表中将显示包含Msgbox的相关内容,在搜索结果中单击选择vbMsgBoxResult,将显示Msgbox的相关常数,如图4-7所示。图4-7 【对象浏览器】窗口4.5 不能不知的变量

变量用于保存程序运行过程中的临时值,根据其保存的数据,变量也具有不同的类型。和常数不同,在程序运行过程中,变量保存的值可以进行更改。4.5.1 声明变量的方法

声明变量就是将变量名及其类型在使用之前通知VBA,由VBA按照变量的数据类型分配存储空间。可使用Dim、Static、Private或Public关键字来声明变量。最常用的是使用Dim声明变量,其语法格式如下:

其中:□ Dim和As为声明变量的关键字。□ 数据类型为前面介绍的类型关键字,例如String、Date等。□ 中括号部分表示可以省略,即声明变量时也可不指定变量的类型。

可以在一个语句中声明几个变量。而为了指定数据类型,必须将每一个变量的数据类型包含进来。例如在下面的语句中,变量intX、intY与intZ被声明为Integer类型。

在VBA中变量的声明分隐式声明和显示声明两种。

1. 隐式声明

在使用一个变量之前不必先声明这个变量,这种变量使用方式称为隐式变量声明。使用隐式变量时,VBA会自动创建变量,并设置为Variant类型。在为其指定值之前,其值为Empty;当为它赋值后,会采用所赋值的类型作为变量的类型。

使用隐式声明的方法,看起来很方便。但是,当程序很大或很复杂时,这种未经声明的变量使用时往往会造成程序出错(如变量名拼写错误),而这种错误不能利用编译系统检查出来,大量的未声明变量的检查工作往往靠人工逐个检查,从而增加调试的难度。因此,建议在使用每个变量之前要先声明,这就是变量的显式声明方式。

2. 显式声明

为了避免隐式声明引起的麻烦,可以规定,只要遇到一个未声明的变量名,VBA就发出错误警告。要显式声明变量,可以在模块、类模块的声明段中加入以下语句:4.5.2 变量的作用域和生存期

在VBA应用程序中,将使用很多的变量,有些变量可在整个应用程序中使用,而另一些变量只能在某一个过程中使用,这就是变量的作用域。

有的变量在过程使用完毕后即自动消失,而有的变量再次进入过程时还可访问其值,这就是变量的生存期。

1. 变量的作用域

变量的作用域是指变量可以被程序使用的范围,变量的作用域共分为以下3种。□ 过程级别:称为局部变量。只能在过程中使用的变量,过程执行结束后,变量的值自动消失。这类变量使用Dim关键字进行定义。□ 模块级别:称为模块变量。在Excel VBA的某个模块顶端定义的变量,在该模块的各过程中都可访问模块级别变量。这类变量在模块的开始部分使用Dim或Private关键字进行定义。□ 全局级别:称为全局变量。在整个应用程序范围内(各模块、各过程)都可以使用的变量。这类变量在模块的开始部分使用Public关键字进行定义。

2. 变量的生存期

变量不仅有作用域,还有生存期。一般情况下,变量的生存期与其作用域相同,即变量在其作用域内有效,超出作用域后变量的值自动消失。

在过程中使用Static关键字声明的变量称为静态变量,这类变量在整个应用程序中有效,即应用程序未结束,则变量的值一直保存在内存中,且其内容不会改变。但静态变量只在定义的过程中才能访问,超过该过程时,静态变量将不能被访问。4.5.3 最常见的局部变量

局部变量也只有局部作用域,它在程序运行期间不是一直存在,而是只在定义的过程中存在,执行过程结束后,变量被撤销,其所占用的内存也被收回。

将定义变量的Dim语句放到过程中,可创建属于过程级别的局部变量。例如,以下代码创建了变量strName并且指定为String数据类型。

在过程中定义的变量strName只可以在此过程中被使用。

下面以实例演示局部变量的作用域。在模块中输入以下代码:

上面的代码定义了两个过程“过程1”和“过程2”,其中“过程1”中定义了一个局部变量s1,并调用MsgBox显示该变量的值,如图4-8左图所示。在“过程2”中直接使用MsgBox显示s1中的值,因为该过程中并未定义变量s1的值,所以显示的对话框中无任何信息,如图4-8右图所示。图4-8 测试局部变量4.5.4 当前模块可见的模块变量

可以使用Private语句声明私有的模块级别变量。模块变量只可使用于同一模块中的过程。在模块级别中使用Dim语句与使用Private语句是相同的。不过使用Private语句可以更容易地读取和解释代码。使用两个语句声明变量的语法格式完全相同。

要声明模块变量,可按以下步骤进行:(1)在VBE中双击模块名,打开模块的代码窗口。(2)在模块的【声明】部分,输入声明变量的代码,如图4-9所示。图4-9 声明模块变量(3)接着在该模块的下方输入以下两个过程,用来测试模块变量。◎注意:模块变量的初始化操作必须在过程中进行,不能在模块的【声明】部分进行。

运行过程“测试模块变量”,将首先初始化模块变量strName的值,然后用MsgBox显示模块变量strName的值。接着运行过程“显示模块变量的值”,在该过程中未对模块变量strName赋值,但因strName为模块变量,在“测试模块变量”过程中已经赋值,所以也可显示出相同的值来。

如果首先运行过程“显示模块变量的值”,MsgBox对话框将不会显示任何值。4.5.5 全程序可见的全局变量

使用Public语句声明公共模块级别变量。全局变量可用于工程中的任何过程。如果全局变量是声明于标准模块或是类模块中,则它也可以被任何引用到此全局变量所属工程的工程中使用。

全局变量在整个应用程序范围内都有效,一般用来定义一些全局参数,如应用程序名称、程序版本等。◎注意:一般情况下,要尽量少使用全局变量。过多地使用全局变量,可能会导致程序混乱。

下面演示全局变量的使用。(1)在VBE中双击模块“变量作用域”,在模块的声明部分使用以下代码声明全局变量:(2)在该模块中编写如下过程,初始化全局变量,如图4-10所示。(3)单击主菜单【插入】|【模块】命令,向工程中新增加一个模块,为模块设置名称为“全局变量”。(4)在“全局变量”模块中编写以下过程,显示全局变量的值,如图4-11所示。图4-10 声明全局变量图4-11 在其他模块中访问全局变量(5)分别执行以上两个模块中的过程,可查看全局变量在不同模块中的值。4.5.6 特殊的静态变量

将过程级变量(局部变量)声明为静态变量,可在过程退出时仍将该变量的值保留在内存中。在下次调用该过程时,又可访问上次退出时保留在内存中的值。

静态变量的声明方法是:在过程内部用Static关键字声明一个或多个变量,其用法和Dim语句完全一样。例如:

下面用实例来演示静态变量和局部变量生存期的状态。(1)在VBE环境,单击主菜单【插入】|【模块】命令,向工程中插入一个模块。(2)将模块名称改为“静态变量”。(3)在模块中输入以下程序代码:(4)执行过程“测试”,首先将显示如图4-12左图所示的结果,由图可看出局部变量和静态变量的值都为1。单击【确定】按钮将再次显示类似的对话框,单击多次【确定】按钮后,可看到局部变量的值仍然为1,而静态变量的值已变为了5,如图4-12右图所示。图4-12 局部变量和静态变量

在以上代码中编写了两个过程,过程“测试”中循环调用5次“静态变量测试”过程,在“静态变量测试”过程中将变量i1声明为局部变量,该过程执行时进行初始化,执行完后就自动释放。所以,无论该过程执行多少次,输出的结果都为1。

而变量i2声明为静态变量,只有第一次进入过程时才进行初始化操作,当退出该过程时并不释放i2变量,再次进入该过程后,i2变量为原来保存的值。所以每执行一次过程,变量i2的值就增加1。4.6 连接的桥梁——运算符和表达式

一个表达式由操作数和运算符共同组成。表达式中作为运算的数据称为操作数,操作数可以是常数、变量、函数或表达式;运算符是介于操作数间的运算符号,如 + 、–都是典型的运算符。在VBA中提供了4种基本的运算,即算术运算、比较运算、逻辑运算和连接运算。由运算符连接操作数可组成4种不同的表达式。4.6.1 VBA中的算术运算

由算术运算符连接组成的表达式称为算术表达式。表4-3列出了VBA中的算术运算符及其优先级。表4-3 算术运算符及其优先级

在表达式中,使用运算符对操作数进行计算时都有一定的顺序(如,在算术运算中要先算乘除后算加减)。优先级和结合性是运算符两个重要的特性,结合性又称为计算顺序,它决定组成表达式的各个操作数是否参与计算以及什么时候计算。例如:

以上表达式中,将先计算2*5,将得到的结果再与3相加,得到最终结果为13。

在表达式中,当有两个优先级相同的运算符时,则从左向右进行运算。如果要改变表达式的运算优先级,可以使用括号。例如:

以上表达式将先计算3+2的和,再与5相乘,得到最终结果为25。4.6.2 大小的比较

比较运算又称为关系运算,用来比较两个操作数,其运算结果为逻辑值,只能为True或False两种可能。表4-4列出了比较运算符的功能。比较运算符的优先级相同。表4-4 比较运算符的功能

例如,运行以下代码,将在【立即窗口】显示如图4-13所示的结果。

在使用比较运算符时,对于数值型的数据,其大小比较很好理解。而对于字符串的比较,在VBA中有特殊的规定。

比较字符串时,按字母的ASCII码进图4-13 立即窗口行比较。例如,字母A的ASCII码为65,而字母B的ASCII码为66,因此以下 语句:

输出的结果为False,即字母A小于字母B。

当比较不同类型的数据时,有可能产生错误,例如:

当VBA执行以上语句时,因数值2和字母A为不同类型,所以二者进行比较时将弹出如图4-14所示的错误提示信息。图4-14 错误提示4.6.3 多个条件的逻辑运算

逻辑运算是指表达式间的逻辑关系,其运算结果为逻辑值,只能为True和False两种值。表4-5列出了逻辑运算操作符及其优先级。表4-5 逻辑运算操作符及其优先级

如果以A和B代表任意两个操作数,而以T代表逻辑真True,以F代表逻辑假False,则各种逻辑运算符的运算结果如表4-6的真值表所示。表4-6 逻辑运算真值表4.6.4 把字符连接起来

字符串连接运算的作用是连接两个以上的字符串,使其成为一个单一字符串。例如:str1="Excel "+"VBA"(字符串Excel后面有一个空格),其结果相当于str1="Excel VBA"。

连接运算符只有两个,即“+”和“&”。其区别为:□ “+”运算符连接两个操作数都是字符串的情况。□ “&”运算符是将两个操作数强制为字符串连接起来。

连接运算符在MsgBox中使用得很多,例如:

以上代码将字符串和变量i1、i2的值连接起来,然后显示到对话框中。4.7 实战练习1. 新建一个Excel 2013工作簿,输入几个商品的信息(包括名称、

单价、数量等)。进入VBE,创建一个保存商品信息的数据类型,

并从工作表中获取一个商品的信息,然后通过MsgBox显示出

来。2. 在VBE中创建一个枚举类型,用来表示一周中的每天,然后在程

序中用MsgBox显示枚举类型的值。3. 在VBE中插入两个模块,在一个模块中声明一个字符串类型的全

局变量strTitle,用来保存应用程序的标题。然后在另外一个模块

中编写一个函数,设置strTitle的值,并将其显示出来。第5章 程序控制结构

与其他程序设计语言相同,VBA中的程序代码也可按一定的顺序执行。在程序中有时需要选择某一部分代码执行,有时需要重复执行某一段代码。VBA中提供了完善的程序结构控制代码来完成这些功能。5.1 VBA程序结构概述

在VBA的程序代码中,语句是构成程序的基本成分,是程序的主体部分。每个语句都以Enter键结束。

程序控制结构代码也是一些特殊的语句,这些语句用来控制程序语句的执行顺序。5.1.1 VBA语句的格式

默认情况下,在VBE中输入语句后,VBE将自动进行语法检查,如果发现语法错误,将打开一个提示对话框。

1. 自动格式化

输入VBA语句后,VBE将按一定的规则进行简单的格式化处理。例如,将关键字的首字母大写,在运算符前后加入空格,删除各部分多余的空格等。

开发人员在输入VBA关键字时,可以不区分大小写。例如输入MsgBox时,无论输入的是Msgbox、msgbox,还是MSGBOX,当输入完该函数的参数并按Enter键后,VBE自动将其变为MsgBox。

为了提高程序的可读性,在VBA代码中应加上适当的空格。当按Enter键完成语句的输入后,各关键字之间无论插入多少空格,VBE都将其自动调整为一个空格。例如,输入以下代码(在关键字“worksheets("sheet1")”与“range("a1")”之间插入了多个空格,在“=”与“0”之间无空格):

输入完语句并按Enter键后,VBE将自动格式化以上语句,得到如下代码:

在“=”前后各插入一个空格,其他关键字之间的空格被自动删除。◎注意:不能在关键字的中间加入空格。

2. 复合语句与语句断行

一般情况下,VBA程序中每个语句占一行。但在VBA中,也可以把几个语句放在一行中构成复合语句。各语句之间用冒号(:)分隔,例如:

与以下两行语句功能相同:

在VBE的代码窗口中,每行VBA代码可包含1023个字符。但是,为了使程序便于阅读,建议读者将一条长的语句打断为两行或多行。

VBA中使用空格后接着一个下划线——续行符,可将一行代码延伸成两行以上。

例如,以下语句:

可改写为以下格式:

通过用续行符(_)可创建长的逻辑行。一个逻辑行,最多可包含24个连续的续行字符,也就是最多可以包含25个物理行。这样,逻辑行的字符总量可达10230字符。如果超过了,必须将该行分为若干语句,或指定一些表达式为中间变量。5.1.2 程序的3种结构

结构化程序的概念首先是从以往编程过程中无限制地使用转移语句而提出的。使用VBA的GoTo转移语句可以使程序的控制流程强制性地转向程序的任一处。如果一个程序中多处出现这种转移情况,将会导致程序流程无序可寻,程序结构杂乱无章,这样的程序是令人难以理解和接受的,并且容易出错。尤其是在实际软件产品的开发中,更多的是追求软件的可读性和可修改性,像这种结构和风格的程序是不允许出现的。

为此提出了程序的3种基本结构,即程序的顺序、选择和循环3种控制流程,这就是结构化程序设计方法强调使用的3种基本结构。任何简单或复杂的算法都可以由这3种基本结构组合而成。所以,这3种结构就被称为程序设计的3种基本结构。也是结构化程序设计必须采用的结构。□ 顺序结构:就是按照语句的书写顺序从上到下、逐条语句地执行。执行时,排在前面的代码先执行,排在后面的代码后执行,执行过程中没有任何分支。这是最普遍的结构形式,也是后面两种结构的基础。□ 选择结构:又叫分支结构。是根据“条件”来决定选择执行哪一分支中的语句。包括二分支和多分支,分支的嵌套。□ 循环结构:循环结构的程序设计比分支结构复杂。循环结构的思想是利用计算机高速处理运算的特性,重复执行某一部分代码,以完成大量有规则的重复性运算。

结构化程序中的任意基本结构都具有唯一入口和唯一出口,并且程序不会出现死循环。在程序的静态形式与动态执行流程之间具有良好的对应关系。5.2 经常用到的VBA语句

顺序结构就是从头到尾依次按顺序逐条执行语句,不需要控制语句。本节将介绍VBA程序设计中常用的语句,如赋值、输入和输出语句等的用法。5.2.1 用Let语句给变量赋值

使用赋值语句可以更改变量的值。赋值,顾名思义,就是把一个值赋予某个量。可以这样理解:变量相当于装东西的容器,赋值的过程就是把东西放进容器的过程。赋值语句格式如下:

赋值语句首先对表达式进行运算,并将运算结果赋给左侧的变量或属性。

在VBA中可省略赋值关键字Let,变量名必须遵循标识符的命名约定。

只有当表达式是一种与变量兼容的数据类型时,该表达式的值才可以赋给变量或属性。不能将字符串表达式的值赋给数值变量,也不能将数值表达式的值赋给字符串变量。如果这样做,就会在编译时出现错误。

可以用字符串或数值表达式赋值给Variant变量,但反过来不一定正确。任何除Null之外的Variant都可以赋给字符串变量,但只有当Variant的值可以解释为某个数时才能赋给数值变量。可以使用IsNumeric函数来确认Variant是否可以转换为一个数。

使用赋值语句时需注意以下两点:□ 赋值号(=)和比较运算符中的(=)的含义是不同的。赋值号是将表达式的计算结果保存到左边的变量中。所以,赋值号左边必须为一个变量,而不能是表达式,例如:

VBA将以上语句解释为比较表达式,而不是赋值语句。□ 在进行赋值操作时,正常情况下表达式结果的类型与变量数据类型是相同的,不需要进行任何类型转换。如果类型不一致,一般将表达式结果转换为变量的类型。

有关赋值时进行类型转换的演示代码如下:

执行以上过程,在【立即窗口】列表框中显示的结果如图5-1所示。

由图5-1的执行结果可知道,将单精度类型的数据赋值给整型变量时,将只取值的整数部分;将单精度类型数据赋图5-1 赋值类型转换值给字符串变量时,表达式中的数据值将转换为字符串型;将数值型数据赋值给逻辑变量时,非0值将转换为True,0将转换为False。5.2.2 用Rem语句为程序添加说明

在程序中使用注释语句,可通过文字描述程序的算法、函数参数、函数返回值的意义等,方便不同开发人员阅读代码,提高程序的可读性,方便代码的维护。

在VBA中,注释以撇号(')开头,或者以Rem关键字开头,然后在其后写上注释内容。Rem语句的格式如下:

也可以使用如下语法:

在Rem关键字与“注释文本”之间必须要有一个以上的空格。

使用注释语句时需要注意以下几点:□ 注释语句是非执行语句,仅对程序的有关内容起注释作用。□ 注释语句可以使用任何字符。□ 注释语句不能放在续行符后面。□ 若使用撇号来添加注释文本,则在其他语句行后面使用时不必加冒号。

在VBE中,【编辑】工具栏提供了两个按钮:【设置注释块】和【解除注释块】,使用这两个命令按钮可将选中的代码快速设置为注释,或取消其前面的注释符号(撇号)。如图5-2所示。图5-2 设置注释块◎技巧:在调试程序时,可在不希望执行的代码前面添加注释符号。5.2.3 用InputBox接受用户输入数据

在VBA中,开发人员可调用以下两种类型的InputBox输入对话框:□ 一种是VB中常用的InputBox函数,在该输入对话框中显示提示信息,等待用户输入正文或者按下【确定】或【取消】按钮,并返回包含文本框的内容,该对话框返回值类型为字符串,如图5-3所示。□ 一种是使用Application对象的InputBox方法显示一个输入对话框,在该对话框中设置输入值的类型,如图5-4所示。图5-3 InputBox函数对话框图5-4 InputBox方法对话框

1. 显示InputBox函数对话框

使用VBA提供的InputBox函数,可产生一个输入对话框。该函数将打开一个对话框作为输入数据的界面,等待用户输入数据,并返回所输入的内容。其语法格式如下:

该函数有7个参数,其意义分别如下所述。□ Prompt:为对话框消息出现的字符串表达式。其最大长度为1024个字符。如果需要在对话框中显示多行数据,则可在各行之间用回车换行符来分隔,一般使用VBA的常数vbCrLf代表回车换行符。□ Title:为对话框标题栏中的字符串。如果省略该参数,则把应用程序名放入标题栏中。□ Default:为显示在文本框中的字符串。如果省略该参数,则文本框为空。□ Xpos,Ypos:这两个参数必须成对出现,用于指定对话框的左上角坐标位置。如果省略该参数,则对话框会在水平方向居中。□ Helpfile:设置对话框的帮助文件,该参数可省略。□ Context:设置对话框的帮助主题编号,该参数可省略。

例如,使用以下代码可接收用户输入的数据。

执行上面的代码,将显示如图5-5所示的对话框。

在文本框中输入用户姓名,单击【确定】按钮,程序将把用户输入的内容图5-5 InputBox函数输出到【立即窗口】的列表框中。

在使用InputBox函数时,应注意以下几点:□ 在默认情况下,InputBox函数的返回值是一个字符串类型,而不是变体类型。如果需要使用该函数输入数值,则需要使用Val函数(或其他的转换函数)将返回值转换为相应类型的数值。□ 在对话框中,如果用户单击【取消】按钮(或按Esc键),则表示不使用当前输入的值,函数将返回一个空字符串。根据这一特性,可以判断用户是否输入了数据到对话框中。□ 执行一次InputBox函数,只能返回一个值,如果需要输入多个值,则必须多次调用该函数。

2. 显示InputBox方法对话框

使用Application对象的InputBox方法,也可显示一个接收用户输入的对话框。此 对话框有一个【确定】按钮和一个【取消】按钮。如果单击【确定】按钮,则InputBox方法将返回对话框中输入的值。如果单击【取消】按钮,则InputBox方法返回逻辑值False。

与InputBox函数不同的是,该对话框可以指定输入数据的类型,具体的语法格式如下:

从以上语法格式中可以看出,大部分参数与InputBox函数相同,只是在最后多了一个Type参数,用来指定输入数据的类型。Type参数可设置为以下值之一或其中几个值的和。例如,对于一个可接受文本和数字的输入框,将Type设置为1+2。□ 0:公式;□ 1:数字;□ 2:文本(字符串);□ 4:逻辑值(True或False);□ 8:单元格引用,作为一个Range对象;□ 16:错误值,如 #N/A;□ 64:数值数组。

例如,下面的代码提示用户在工作表Sheet1中选取一个单元格。

运行以上代码,将显示如图5-6所示的对话框,用鼠标单击一个单元格,该单元格的引用地址将自动填入对话框的输入区域中。图5-6 使用InputBox方法显示对话框5.2.4 用MsgBox函数显示信息对话框

使用MsgBox函数可以打开一个对话框,在对话框中显示消息,等待用户单击按钮,并返回一个整型值,告诉用户单击哪一个按钮。

MsgBox函数的语法格式如下:

该函数有5个参数,除第1个参数外,其余参数都可省略。各参数的意义与Inputbox函数各参数的意义相同。不同的是多了一个buttons参数,用来指定在对话框中显示按钮的数目及形式、使用的提示图标样式、默认按钮以及消息框的强制响应等。其常数值如表5-1所示。表5-1 按钮常数值

表5-1中的数值(或常数)分为4类,其作用分别如下所述。□ 第1组值(0~5):用来决定对话框中按钮的类型与数量。按钮共有7种,即确认、取消、终止、重试、忽略、是、否。每个数值表示一种组合方式。□ 第2组值(16,32,48,64):用来决定对话框中显示的图标。共有4种,即暂停、疑问、警告、忽略。□ 第3组值(0,256,512,768):设置对话框的默认活动按钮。活动按钮中文字的周转有虚线,按Enter键可执行该按钮的单击事件代码。□ 第4组值(0,4096):决定消息框的强制响应性。

buttons参数可由上面4组数值组成,其组成原则是:从每一类中选择一个值,把这几个值累加在一起就是buttons参数的值(大部分时间里都只使用前3组数值的组合),不同的组合可得到不同的结果。

例如:设置buttons参数为16,得到的对话框如图5-7所示。设置buttons参数为50,得到的对话框如图5-8所示。图5-7 MsgBox效果一图5-8 MsgBox效果二

MsgBox函数除了显示提示信息之外,还可返回一个整数值,这个整数与所选择的按钮有关。MsgBox函数显示的对话框有7种按钮,返回值与这7种按钮相对应,分别为1~7之间的整数,如表5-2所示。表5-2 MsgBox函数的返回值

在VBE环境中输入MsgBox函数时,将自动列出常数值,选择了一个buttons常数后,输入加号将再次显示buttons的常数列表,如图5-9所示。图5-9 MsgBox的图标常数列表

例如,使用下面的代码获取用户的选择,再根据用户的选择决定是否退出系统。

执行以上代码,将显示如图5-10所示的对话框。单击【是】按钮,将执行Quit方法退出Excel。单击【否】按钮,将返回应用程序。◎提示:MsgBox函数也可写成语句的形图5-10 提示对话框式,这样,程序就不知道用户单击了对话框中的哪个按钮。这种形式常用来显示提示信息。5.3 智能的VBA:可选择执行语句

分支程序就是根据不同的条件进行判断,选择要执行的代码段。例如,在工资管理系统中调整员工工资时,若职称为工程师则上调100,工龄大于20年的上调50。这种情况就是分支结构,当满足条件时执行一部分代码,不满足条件时执行另一部分代码。

VBA中的条件判断语句有If语句和Select Case语句两种。5.3.1 单分支语句——If…Then

最常用的分支语句就是If…Then语句,用If…Then结构可有条件地执行一个或多个语句。该语句有以下两种语法形式:□ 单行结构条件语句;□ 块结构条件语句。

1. 单行结构条件语句

单行结构条件语句是最基本的条件语句,其语法为:

该语句的功能是:若逻辑表达式的值是True,则执行Then后的语句,执行完成后执行If语句的下一句;若逻辑表达式的值是False,则不执行Then后的语句,而执行If语句的下一条语句。其流程图如图5-11所示。图5-11 If…Then语句流程图◎技巧:“逻辑表达式”也可以是任何计算数值的表达式,VBA将这个值解释为True或False:为0的数值为False,而任何非零的数值都被看作True。

例如,以下代码用来调整职称为工程师的员工的工资。

执行以上语句,如果职称为工程师,则工资增加100,否则不进行任何操作。

2. 块结构条件语句

单行结构条件语句中,满足条件时只执行一条语句,若有多行语句需要执行,则需使用块结构条件语句。其语法如下:

块结构条件语句的作用与单行结构条件语句的功能相同。要注意的是,If…Then的单行格式不用End If语句,而块语句则必须在条件语句的结束处有End If语句。

例如,以下代码用来调整职称为工程师的员工的工资、岗位津贴的值。5.3.2 二分支语句——If … Then … Else

If…Then语句中,当逻辑表达式的值为False时,不执行任何语句,若要求在逻辑表达式的值为False时需要执行另一段代码,可使用If … Then … Else语句,其语法格式如下:

在以上语句结构中,VBA首先判断逻辑表达式的值,若其值为True,则执行语句序列1,执行完毕后再执行End If后的语句;若逻辑表达式的值为False,则执行语句序列2。其流程图如图5-12所示。图5-12 If…Then…Else语句流程图

例如,以下代码根据工作表员工中的E列的值,在Q列中填入对应的性别。

执行以上代码,员工工作表中的Q列将自动填入“男”或“女”,如图5-13所示。图5-13 使用If … Then … Else语句5.3.3 多分支语句——If … Then … ElseIf

在很多程序中,可能需要判断多个条件,再根据不同的条件执行不同的语句。这时可以使用If…Then…ElseIf语句来选择多个条件语句中的一部分进行执行。其语法格式如下:

在以上结构中,VBA首先判断逻辑表达式1的值。如果为False,再判断逻辑表达式2的值,依此类推,当找到一个为True的条件,就会执行相应的语句块。执行完指定的语句块后,再执行End If后面的代码。其流程图如图5-14所示。图5-14 If … Then … ElseIf语句

例如,以下代码演示If…Then…ElseIf语句的用法:

执行以上代码,首先将显示如图5-15所示的输入对话框,用户输入一个数值后,单击【确定】按钮,即可根据输入的不同数值在工作表Sheet1的单元格A1中填入对应的职称。图5-15 输入框5.3.4 多分支语句——Select Case

在If … Then分支语句中,总是可以添加更多的ElseIf块来构造多分支语句。但是,当每个ElseIf都将相同的表达式比作不同的数值时,这个结构编写起来很乏味,也不易阅读。在这种情况下,可以用多分支选择结构Select Case语句。

Select Case语句的功能与If…Then…Else语句类似,但对多重选择的情况,Select Case语句使代码更加易读。

Select Case在结构的上方处理一个测试表达式并只计算一次。然后,VBA将表达式的值与结构中的每个Case的值进行比较。如果相等,就执行与该Case相关联的语句块,执行完毕再跳转到End Select语句后执行。其语法格式如下:

其中测试表达式可以是数值型或字符型的表达式,通常是一个数值型或字符型的变量。表达式列表可以是一个或几个值的列表。如果在一个列表中有多个值,就用逗号将值隔开。每一个语句序列中含有0个或多个语句。如果不止一个Case与测试表达式相匹配,则只对第一个匹配的Case执行与之相关联的语句块;如果在表达式列表中没有一个值与测试表达式相匹配,则VBA执行Case Else子句(此项是可选的)中的语句。其流程图如图5-16所示。图5-16 Select Case语句流程图

表达式列表可以按以下几种情况进行书写。□ 表达式:这种方式用来表达一些具体的取值。例如,Case 1,3,5。□ 表达式A To表达式B:这种方式用来表示一个数据范围。例如,Case 1 To 10。□ Is比较运算符表达式。例如,Case Is<60 表示所有小于60的值。□ 以上3种情况的混合。例如,Case 0 To 60,80,Is>90。◎注意:Select Case结构每次都要在开始处计算表达式的值。If…Then…Else结构为每个ElseIf语句计算不同的表达式。只有在If语句和每一个ElseIf语句计算的表达式相同时,才能用Select Case结构替换If…Then…Else结构。

例如,使用Select Case语句改写5.3.3小节的If … Then … ElseIf语句的多分支实例,具体的代码如下:5.4 让VBA重复工作

在顺序结构的程序中,每一个语句只能执行一次。在分支结构的程序中,根据逻辑表达式的值选择某一分支执行,所选分支的语句也只执行一次。然而在处理实际问题的过程中,经常要利用同一种方法对不同的数据进行重复处理,这些相同的操作可以通过重复执行同一程序段来实现。这种重复执行具有特定功能程序段的程序就称为循环程序。

在VBA中,通过循环控制语句来实现循环结构。5.4.1 循环程序的例子

在5.3.2小节中的例子根据Excel工作表中“尊称”列的值,自动在“性别”列填充相应的性别。该例的代码只能对指定的行进行操作,若需要对当前工作表的所有行进行处理,则可使用循环程序来进行处理。将该例的代码修改为如下形式:

执行以上代码,工员工作表中性别列中的每一行都将填写相应的性别数据,如图5-17所示。图5-17 循环处理◎提示:有关循环语句的相关语法,将在本节后面进行介绍。5.4.2 For…Next循环语句

在上面的代码中,使用了For…Next语句来循环处理工作表中的每一行数据。

For…Next语句通过指定次数来重复执行循环体。For循环的语法格式如下:

For循环使用一个计数器变量,每执行一次循环,计数器变量的值就会按设置的步长值增加或者减少。在For循环中可以使用Exit For语句随时退出该循环。

步长值可正可负,如果步长值为正,则初始值必须小于等于终值,才执行循环体;否则退出循环。如果步长值为负,则初始值必须大于等于终值,这样才能执行循环体。如果没有关键字Step,则步长值默认为1。For…Next循环结构的流程图如图5-18所示。图5-18 For …Next流程图

For循环一般都可计算出循环体的执行次数,计算公式如下:

这里的中括号表示对运算结果取整,即取得除法运算商的整数部分。

例如,上例中的循环语句如下:

可计算出该循环的执行次数为:[(11–3)/1]+1=9次。

若将上例代码改写为如下形式:

其循环次数为:[(11–3)/2]+1=5次。

在工作表员工中删除“性别”列中的数据,执行以上代码后,将在工作表的奇数行中填入性别数据,如图5-19所示。由图可以看出,循环共执行了5次,分别在3、5、7、9、11各行填充了数据。图5-19 隔行填充数据5.4.3 Do…Loop循环语句

用Do循环重复执行一语句块,且重复次数不定。Do…Loop语句有4种演变形式,但每种都需要计算条件表达式的值,以决定是否继续执行。在Do循环中可以使用Exit Do语句中途退出该循环。

1. 先测试循环条件的Do…Loop语句

先测试循环条件的Do…Loop语句语法形式如下:

当VBA执行这个Do循环时,首先判断逻辑表达式,如果为False(或0),则跳过所有语句,执行Loop的下一条语句,如果为True(或非零),则执行循环体,当执行到Loop语句后,又跳回到Do While语句再次判断条件。在循环体中如果包含有Exit Do语句,当执行到该语句时,则马上跳出循环,执行Loop的下一条语句。其流程图如图5-20所示。图5-20 Do While … Loop流程图

这种形式的循环体可能执行0次或多次。只要条件表达式为True或非零,循环就会重复执行多次。如果逻辑表达式最初就为False,则不会执行循环语句。

2. 后测试循环条件的Do … Loop语句

Do…Loop语句的另一种演变形式是先执行循环体中的语句,然后再进行条件判断。这种形式的循环体至少被执行一次,其语法格式如下:

其流程图如图5-21所示。

3. 先测试结束条件的Do … Loop语句

先测试结束条件的Do…Loop语句的语法形式如下:图5-21 Do … Loop While流程图

这种形式与Do While…Loop类似,不同的是:当逻辑表达式的值为False时才执行循环体;否则退出循环。这种形式的循环体可能执行0次或多次。

4. 后测试结束条件的Do … Loop语句

后测试结束条件的Do…Loop语句的语法形式如下:

这种形式与Do…Loop While类似,不同的是:当逻辑表达式的值为False时才执行循环体;否则退出循环。这种形式的循环体至少能被执行一次。

使用Do…Loop循环修改5.4.2小节的For循环,具体代码如下:

在For循环中,执行到Next语句时将自动修改循环变量的值。而Do循环没有自动修改循环变量的功能,所以需要在循环体中添加语句,用来修改循环变量的值。若没有修改循环变量的语句,Do循环将是一个死循环,一直不能退出循环。5.4.4 For Each…Next循环语句

For Each…Next循环与For…Next循环类似,但它是针对数组或对象集合中的每一个元素重复一组语句,而不是重复语句一定的次数。如果不知道一个集合有多少元素,For Each…Next循环非常有用。For Each…Next循环的语法如下:

使用For Each…Next时,根据对象集合的不同,有不同的限制。□ 对于集合:对象元素变量只能是Variant变量,或一般的对象(Object)变量,或对象浏览器中列出的对象。□ 对于数组:对象元素变量只能是Variant变量。

For Each…Next不能与用户自定义类型的数组一起使用,因为Variant不可能包含用户自定义类型。◎提示:For Each循环一般使用在对象模型中,相关的实例会在本书后面章节中列出。5.4.5 循环嵌套:循环内的循环

前面学习的都是单层控制结构。其实,可以把一个控制结构放入另一个控制结构之内(例如在For…Next循环中的If…Then块)。

循环嵌套就是在一个循环中还有一个循环,内部循环在外部循环体中。在外部循环的每次执行过程中都会触发内部循环,直到内部循环执行结束。外部循环执行了多少次,内部循环就完成多少次。

按照一般的习惯,为了使判定结构和循环结构更具可读性,总是用缩排方式书写判定结构或循环的正文部分。

例如,使用循环嵌套编写冒泡排序法程序,具体代码如下:

执行以上代码,首先使用单循环生成100个随机整数,接着使用循环嵌套对数据进行排序,得到如图5-22所示的排序结果。图5-22 排序结果

本例中的外循环共循环99次(即一共输出9行),当i等于100时循环终止。外循环的每轮循环都会执行内循环,在外循环的每轮循环中,内循环的循环次数都不相同。因为外循环的每轮循环都会使i增加1,而内循环的循环变量j的值也会被重新赋值为i+1,而内循环的结束条件是100,且内循环的每轮循环中j只增加1,所以外循环每循环一次,内循环的循环次数就减少1次,即在外循环的第1轮循环,内循环的循环次数为99;在外循环的第2轮循环,内循环的循环次数为98;在外循环的第3轮循环,内循环的循环次数为97……◎提示:在嵌套结构里的循环结构中使用Exit语句时,退出的只是包含该语句的当前循环结构,而不是整个嵌套结构。5.5 实战练习

1. 在VBE中编写一个函数,计算从1累加到100的和,用MsgBox显示计算结果。

2. 在VBE中编写一个函数,计算从1~100中偶数的和,用MsgBox显示计算结果。

3. 在VBE中编写一个函数,首先通过InputBox接收用户输入的一个华氏温度,然后通过以下公式进行转换,计算出摄氏温度值,用MsgBox将计算结果显示出来。

华氏温度转换为摄氏温度的公式:

4. 要将100元的大钞换成1元、5元和10元的小钞,若每种钞票数目大于0,共有多少种换法?在VBE中编写一个函数,输出各种换法。第6章 使用数组

前面各章中使用的数据都是基本数据类型,可以通过简单的变量名来访问其保存的值。除了基本数据类型外,VBA还提供了数组类型,利用数组可以方便地组织和使用数据。例如,可用数组保存工作表中各单元格的数据。

本章将介绍数组的定义和使用方法。6.1 初识数组

数组是有序的数据集合,在其他高级程序设计语言中,数组中的所有元素都属于同一个数据类型,而在VBA中,数组中的元素可以是不同类型的数据,也可以是相同类型的数据。6.1.1 用数组处理表格数据的优势

使用数组时,可以用同一名称引用多个值,并使用一个称作索引或下标的数字将它们区分开来。数组可以缩短和简化代码,使程序员能够创建高效处理多个元素的循环。

Excel工作表中的单元格由行和列组成,在Excel 2003及以前版本中,每行最多可有255列,每张工作表最多有65 536行。而Excel 2013中,工作表中单元格的数量得到了很大的扩展,每行最多可有16 384列,每张工作表最多有1 048 576行。

在VBA中,当使用变量来保存单元格中的数据时,要保存一行的数据,则需要定义多个变量,例如,用V1保存单元格A1的值,用V2保存单元格B1中的值,……在程序中,若需要分别访问这些变量中的值,则需要分别编写代码。例如,将Excel工作表中第1行各单元格的数据进行累加,可使用以下代码:

如果要对255(或16 384)列单元格进行累加,则需要编写255(或16 384)行代码。显然,这样的程序代码不是开发人员希望使用的。

这时,如果使用数组来保存单元格中的值,则可以使V(1)、V(2)、…、V(n)来表示,也可使用V(1)保存单元格A1的值,用V(2)保存单元格B1中的值,依次类推。

这样,在程序中要累加各单元格中的值时,可使用以下的循环语句:

以上代码中,为了兼容Excel 2003及以前版本,只设置累加255列单元格的和。

由以上代码可以看出,只需要3行语句即可对255列(甚至更多)的数据进行累加。由此可以看出,使用数组可方便地对循环语句进行处理,简化程序代码。6.1.2 数组的维数

在6.1.1小节示例中的数组V,在括号中使用了一个索引,因此称为“一维”。使用多个索引或下标的数组称为“多维”。◎提示:“维”是一个方向,可以在此方向上改变数组元素的规范。保存月内每日总销量的数组有一个维(当月日期)。保存每个部门的月内每日总销量的数组有两个维(部门编号和当月日期)。数组的维数称为数组的“秩”。

可以通过为数组的每一维提供“索引”或“下标”来指定数组元素。在每一维中,元素都按照从小到大的索引顺序连续排列。

1. 一维数组

很多数组只有一维。例如,统计各年龄的人数时,可定义一个数组,每个数组元素表示一个年龄段的人数(如iAgeCnt(10)中保存着年龄为10岁的人数)。因此,这类数组只使用一个索引。下面的代码声明一个变量来保存一个“一维数组”,其中包含从0岁~120岁之间每个年龄段的人数。

以上代码定义的一维数组如图6-1所示。图6-1 一维数组

使用iAgeCnt(0)可以访问数组中的第1个元素,使用iAgeCnt(10)可访问数组中的第11个元素。

2. 二维数组

某些数组有两个维,最典型的就是Excel的工作表结构,由行和列构成。二维数组也称为“矩形数组”。

下面的代码声明一个变量来保存一个“二维数组”。

以上代码定义的二维数组如图6-2所示。图6-2 二维数组

使用aData(0,0)可访问数组中第1行第1列的元素(第1个元素),使用aData(2,2)可访问数组中的第3行第3列的元素。

3. 三维数组

有些数组有三个维,如Excel工作簿就是一个三维空间(每张工作表为一个二维数组结构,多张工作表就构成一个三维数组),这类数组使用三个索引。

例如,使用以下代码声明一个“三维数组”,第一个索引表示工作簿中的某张工作表,第二个索引表示指定工作表中的行,第三个索引表示指定工作表中的列。

以上代码定义的三维数组如图6-3所示。图6-3 三维数组

使用aData(0,0,0)可访问数组中第1页(第1个工作表)中第1行第1列的元素(第1个元素),使用aData(2,2,,2)可访问数组中第3页(第3个工作表)的第3行第3列的元素。

4. 多维数组

多于三维的数组为多维数组。尽管VBA数组最大可以达到60维,但是超过三维的数组是非常难于理解的,所以常用的也就是一维、二维和三维数组。◎注意:增加一个数组的维数时,该数组所需的总存储空间会急剧增大,因此应慎用多维数组。6.2 声明数组

可以使用Dim语句,用声明任何其他变量的方法来声明数组变量。在变量名后面加上一对或几对圆括号,以指示该变量将存储数组而不是“标量”(包含单个值的变量)。6.2.1 一维数组的声明方法

数组的声明方式和其他的变量是一样的,可以使用Dim、Static、Private或Public语句来声明。声明标量变量(非数组)与数组变量的不同在于必须为数组指定大小。若数组的大小被指定时,则它是个固定大小数组。若程序运行时数组的大小可以被改变,则它是个动态数组。

声明一维数组的语法格式如下:

与其他程序设计语言定义数组的格式不同,在VBA中定义数组时,下界的值可为任意整型值(可为负数)。

在声明数组时,也可以只给出数组下标的上界(即可以使用的最大下标值),而省略下标的下界,这时默认值为0,即数组的下标从0开始至定义的上界,例如:

定义了一个名为aData的数组,共有11个元素,分别为aData(0)、aData(1)、…、aData(10)。

使用以下代码可指定数组的下界:

以上代码定义了一个数组aData,具有21个元素,分别为aData(–10)、aData(–9)、aData(–8)、…、aData(0)、…、aData(9)、aData(10)。

在定义数组时,需要注意以下几点:□ 数组的名称必须符合标识符的规则,并尽可能为数组定义有一定意义的名称。□ 在同一过程中,数组名不能与变量名相同;否则会出错。□ 在VBA中定义数组时,要求其下标必须为常数,不能是变量或表达式。例如,以下代码在执行时将会报错,如图6-4所示。图6-4 用变量定义数组6.2.2 多维数组的声明方法

定义多维数组的语法格式如下:

使用以上格式可声明二维数组、三维数组和多维数组等。

例如,使用以下代码可声明一个二维数组,用来保存Excel工作表中的值。

以上代码定义的二维数组可保存Excel工作表中的10行数据,每行可保存255列(共2550个单元格的值)。为了使数组元素保存不同类型的值,在声明数组时,不能定义数组的数据类型。

定义多维数组的格式与二维数组类似,每一维都使用逗号隔开即可。需要注意的是,定义大数据量的数组将占用很大的内存空间,特别是定义多维数组时要考虑这一点。例如:

定义了一个数组,具有65 536个元素,相当于定义65 536个变量。

定义了一个二维数组,具有6 553 600(65 536×100)个元素,而

定义了一个三维数组,具有655 360 000(65 536×100×100)个元素。

由此可见,数组每增加一维,数组元素就会成几何级数的增加。若定义的数组维数过多,可导致程序很快将内存用完。6.2.3 设置数组默认下界

在默认情况下,在程序中声明数组时,如果不指定数组维数的下界,则VBA使用默认下界0。

例如:

以上代码将定义11个元素,从aData(0)开始,至aData(10)为止。

如果希望下标从1开始,可以通过Option Base语句来设置。该语句必须在模块级别中使用,其语法格式如下:

由于下界的默认设置是0,因此无需使用Option Base语句。如果使用该语句,则必须写在模块的所有过程之前。一个模块中只能出现一次Option Base,且必须位于带维数的数组声明之前。

Option Base语句只影响位于包含该语句的模块中的数组下界。

例如,以下代码用来查看各数组下标的下界为1。6.3 初始化数组

数组具有多个元素,可保存多个数据。与单个变量的初始化不同,对数据进行初始化时,一般要进行批量赋值。数组初始化可有多种方法,本节介绍几种常用的数组初始化 方法。6.3.1 使用循环语句初始化数组

使用循环语句初始化数组是最常用的一种方法。利用循环语句能反复执行的特点,可快速对数组进行初始化。

例如:

以上代码对数组a中每个元素赋初值为0。6.3.2 使用Array函数初始化数组

Array函数可返回一个包含数组的Variant。其语法格式如下:

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

使用Array函数创建的数组的下界由Option Base语句指定的下界所决定。◎注意:没有作为数组声明的Variant也可以表示数组。除了长度固定的字符串以及用户定义类型之外,Variant变量可以表示任何类型的数组。尽管一个包含数组的Variant和一个元素为Variant类型的数组在概念上有所不同,但对数组元素的访问方式是相同的。

使用Array函数初始化数组的示例代码如下:6.3.3 用数组值初始化数组

在VBA中,还可以直接将一个数组的值赋值给另一个数组,以达到初始化数组的目的。例如,以下的代码:

使用这种方式初始化数组时,需要注意以下几点:□ 赋值号两边的数据类型必须一致。□ 如果赋值号左边是一个动态数组,则赋值时系统自动将动态数组ReDim成右边相同大小的数组。□ 如果赋值号左边是一个大小固定的数组,则数组赋值出错。6.4 数组大小能变吗

在很多情况下,数组的长度事先是无法预测的,而且有时可能需要在程序中改变数组的长度以适应新的情况,因此出现了动态数组。6.4.1 动态数组的声明方法

动态数组是指在程序运行时,数组元素大小可以改变的数组,当程序没有运行时,动态数组不占据内存,因此可以把这部分内存用于其他操作。

大小不可改变的数组称为静态数组。定义静态数组时,其下标的下界和上界只能由常量来进行设置,而动态数组可使用变量来设置下标。

定义动态数组一般分两个步骤:(1)在用户窗体、模块或过程中使用Dim或Public声明一个没有下标的数组(不能省略括号)。(2)在过程中用ReDim语句重定义该数组的大小。

ReDim语句的作用是重新指出数组的大小。它是在程序执行到ReDim语句时才分配存储空间。其语法格式如下:

说明:□ 下标可以是常量,也可以是具有确定值的变量。□ 语句中各参量的含义与用Dim定义数组的语句相同。□ ReDim语句只能用于动态数组,它可以改变每一维的大小,但不能改变维数。□ 当程序编译时,ReDim语句中的所有数组均被说明为动态数组。在程序运行中,当执行到ReDim语句时,就把新的上下界重新分配给数组,数组元素的值将被初始化,所有的数值元素的值被置为0,字符串元素被置为空字符串。□ ReDim语句可以同Dim语句一样定义数组。在同一程序中,ReDim语句还可以多次使用。在用ReDim语句重新定义数组之前,可以使用Erase语句将原来的数组删除。

在默认情况下,使用ReDim语句重定义数组的维数和大小时,数组中原来保存的值将全部消失。若要保存数组中原有的值,则需要使用Preserve关键字,这样,当改变原有数组最后一维的大小时,可以保持数组中已有的数据。◎注意:如果使用了Preserve关键字,就只能重定义数组最后一维的大小,并不能改变维数的数目。

例如:以下代码由用户输入一个数值,设置数组下标的上界,然后要求用户输入每个元素的值,并将用户输入的值输出到【立即窗口】的列表框中。

以上代码在模块的声明部分定义了一个动态数组Darray,然后在“动态数组”过程中使用变量i重定义该动态数据的大小(i的值由用户输入)。

执行以上代码,将首先打开如图6-5所示的对话框,让用户设置数组的上界。按用户输入的值对数组进行重设大小后,接着打开输入对话框,要求用户输入每一个元素的值。最后在【立即窗口】的列表框中输出数组中每个元素的值,如图6-6所示。图6-5 输入数组的上界图6-6 输出数组中的数据6.4.2 清除数组

对于静态数组,定义数组后,其大小不能改变。若需要清除数组的内容或对数组重新定义,可以使用Erase语句来实现。

Erase语句重新初始化大小固定的数组的元素,以及释放动态数组的存储空间。其语法格式如下:

所需的arraylist参数是一个或多个用逗号隔开的需要清除的数组变量。◎注意:在Erase语句中,只给出要刷新的数组名,不带括号和下标。

Erase根据是固定大小(常规的)数组还是动态数组,来采取完全不同的行为。Erase无需为固定大小的数组恢复内存。

Erase释放动态数组所使用的内存。在下次引用该动态数组之前,程序必须使用ReDim语句来重新定义该数组变量的维数。

例如,以下代码演示Erase语句的功能。

运行以上程序,首先定义数组aData,为该数组赋初值,并输出数组各元素的值。接着执行Erase语句清除数组aData中的值,再输出数组元素的值。最后将显示如图6-7所示的对话框。图6-7 程序运行结果6.5 操作数组的函数

定义数组后,在程序中可以与使用其他变量相同的操作来使用数组元素。数组是一种特殊的数据结构,因此,VBA提供了操作数组的函数。6.5.1 怎么判断变量是数组

使用IsArray函数可检查指定的变量是否为一个数组,如果指定的变量是一个数组,返回值为True;否则返回False。该函数的语法格式如下:

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

对于包含数组的variant表达式来说,IsArray尤为有用。

例如:6.5.2 查询数组的下标范围

使用LBound函数和UBound函数可获得数组下标的下界和上界。其语法格式为:

其中“维数”为1表示第一维,2表示第二维,依此类推。如果省略该参数,表示返回第一维的下标下界或上界。

例如,使用以下代码定义数组:

运行以上代码,将显示如图6-8所示的对话框,分别显示出数组各维的范围。图6-8 数组下标范围6.6 数组使用实例

本章前面的内容介绍了使用数组各方面的内容,本节以实例的形式演示数组的使用方法。6.6.1 对数组中的数据排序

在Excel中可以方便地对单元格区域中的数据进行排序。本例使用VBA程序首先让用户输入10个数据,然后使用冒泡排序法对这10个数据进行排序。

在VBE模块中编写以下代码:

运行上面的代码,弹出如图6-9所示的对话框,提示用户输入数据。循环程序要求用户输入10个数据。最后在【立即窗口】输出排序的结果,如图6-10所示。图6-9 【输入数组】对话框图6-10 排序结果6.6.2 生成彩票号码

本例结合数组和随机函数的知识,生成指定数量的彩票幸运号码。本例生成的彩票号码每注由7位数构成,首先让用户输入产生的注数,再使用循环语句生成指定注数的号码。

在模块中编写以下代码:

运行上面的宏,将弹出如图6-11所示的对话框,提示用户输入数据。输入生成幸运号码的数量后,单击【确定】按钮将在【立即窗口】列表框中输出生成的幸运号码,如图6-12所示。图6-11 输入数据图6-12 生成幸运号码6.6.3 用数组填充单元格区域

在Excel中要处理大量数据时,可使用循环从各单元格中读入数据,经过加工处理后再写回单元格区域中。这种方式比在数组中处理数据的速度要慢。因此,如果有大量的数据需要处理时,可先将数据保存到数组中,经过加工处理后,再将数组的数据填充到单元格区域中。

在Excel中,工作表是一个二维结构,由行和列组成。这种特性与二维数组类似,因此可以很方便地将工作表单元格区域与二维数组进行相互转换。通过以下语句可将单元格区域赋值给一个二维数组。

反过来,也可将二维数组中的值快速地赋值给一个单元格区域,如以下语句将二维数组myarr中的值赋值给单元格区域Rng。

本例在模块中编写以下代码,用数组来处理工作表中单元格的数据。

为了运行上面的代码,在Excel工作表中增加一个【填充数据】按钮,单击该按钮,弹出如图6-13所示的对话框,分别输入数组的行数和列数。图6-13 输入行数和列数

运行程序VBA代码生成一个二维数组,最后填充到工作表中,如图6-14所示。图6-14 填充数据6.7 实战练习

1. 在VBE中编写一个函数,随机生成20个100以内的数,将这20个数保存到工作表Sheet1的第1行中。然后将这些数据按从小到大的顺序排序,将排序的结果保存到工作表Sheet1的第2行中。

2. 在VBE中编写一个函数,求一个5×5数阵中的马鞍数,输出它的位置。所谓马鞍数,是指在行上最小而在列上最大的数。例如以下数阵:

  5 6 7 8 9

  4 5 6 7 8

  3 4 5 2 1

  2 3 4 9 0

  1 2 5 4 8

则1行1列上的数就是马鞍数。

3. 如121、12321、1234321等数称为回文数。在VBE中编写函数,让用户输入一个数字字符串,判断输入的数字是否为回文数。第7章 使用过程

过程是一个VBA语句块,包含在声明语句(Function、Sub、Get和Set)和匹配的End声明中。7.1 初识VBA过程

VBA中的所有可执行语句都必须位于某个过程内。可以将整个应用程序编写为单个大的过程,但如果将它分解为多个较小的过程,代码就更容易阅读。7.1.1 分解过程“结构化编程”是一种强调程序模块化和应用程序内的分层结构的方法。在VBA中,实现结构化编程的最直接方法是合理地使用过程将应用程序分解为离散的逻辑单元。调试各个单独的单元比调试整个程序更容易。还可以在其他程序中使用为某个程序开发的过程,而通常只需少量修改甚至不需修改。

对于复杂的程序,可将其分解为多个小过程,以方便程序的调试。将大过程分解为独立小过程的步骤如下:(1)标识代码中一个或多个独立的部分。(2)对于每个独立的部分,将源代码移出大过程,并用Sub和End Sub语句将其括 起来。(3)在大过程中已移除代码部分的地方,添加一个调用Sub过程的语句。◎提示:如果新过程需要将值返回大过程,则可以定义Function过程。7.1.2 VBA有哪几种过程类型

VBA中的过程可分为以下3类。□ VBA子过程:用于执行代码后不返回值的情况。它们以关键字Sub开头,并以关键字End Sub结束。在Excel中录制的宏就是这种过程。□ Function函数过程:用于执行代码后返回计算结果的情况。它们以关键字Function开头,以关键字End Function结束。使用Function函数过程可创建Excel的扩展函数。□ Property过程:用于自定义对象。使用属性过程可设置和获取对象属性的值,或者设置对另外一个对象的引用。该类过程将在本书第27章进行详细介绍。

最常用的是Function函数过程和Sub子过程,它们的区别如下:□ Sub过程不能返回值,而Function函数可以返回一个值,因此可以像Excel内部函数一样在表达式中使用Function函数。□ Sub过程可作为Excel中的宏来调用,而Function函数不会出现在“选择宏”对话框中,如果要在工作表中调用Function函数,则可以像使用Excel内部函数一样使用该函数。□ 在VBA中,Sub过程可作为独立的基本语句调用,而Function函数通常作为表达式的一部分。◎注意:Function函数也可以像Sub一样作为独立的语句调用,只是没办法接收函数的返回值,因此也就失去了函数的意义了。7.2 定义Sub过程

在使用模块之前,需要先对其进行定义。在Excel中录制宏时,录制的宏代码将自动创建一个Sub过程。除此之外,在VBE开发环境中还可以使用以下两种方式定义过程:□ 使用窗体创建过程的结构,然后在过程中编写相应的代码。□ 在模块中直接输入代码来定义过程。7.2.1 用对话框创建Sub过程

VBA开发环境中提供了一个【添加过程】对话框,通过该对话框可方便地向当前模块中添加过程。具体操作步骤如下:(1)在Excel中按快捷键Alt+F11进入VBE。(2)单击主菜单【插入】|【过程】命令,将打开如图7-1所示的【添加过程】对话框。图7-1 【添加过程】对话框◎提示:使用图7-1所示对话框可以插入一个新的Sub过程、Function过程或属性过程。还可以设置Public或Private的有效范围,并使过程中所有的区域变量成为过程变量。(3)在【名称】文本框中输入过程的名称,在【类型】选项中选择【子程序】单选按钮。(4)在【范围】选项中选中【公共的】单选按钮,设置过程为全局的(即在工程的各模块中都可以调用该过程),将在过程前面添加Public关键字。

还可根据需要选中下方的【把所有局部变量声明为静态变量】复选框,如果选中该复选框,将在过程名前面添加Static关键字。(5)设置好以上参数后,单击【确定】按钮,VBA将自动生成过程的结构代码,如图7-2所示。图7-2 过程结构代码7.2.2 用VBA代码创建Sub过程

大多数开发人员更习惯于通过手工输入的方式来创建Sub过程。这样更利于了解创建Sub过程中各元素的作用。Sub过程的结构如下:

过程由Sub和End Sub及之间的VBA代码构成。其中在Sub前面可加上限制过程作用域的关键字,主要有以下几个。□ Private:表示只有在包含其声明模块中的其他过程可以访问该Sub过程。□ Public:表示所有模块的所有其他过程都可访问这个Sub过程。如果在Sub前面省略关键字,则表示其为Public。□ Friend:只能在类模块中使用。表示该Sub过程在整个工程中都是可见的,但对对象实例的控制者是不可见的。□ Static:表示在调用之后保留Sub过程的局部变量的值。Static属性对在Sub之外声明的变量不会产生影响,即使过程中也使用了这些变量。◎注意:每一个过程都必须有一个名称,通过过程名称来调用该过程。过程名称的命名应符合标识符的命名规则。

End Sub语句标志着Sub过程的结束。为了能正确运行,每个Sub过程必须有一个End Sub语句,当程序执行到该语句时就结束该过程的运行。另外,在过程中可以使用一个或多个Exit Sub语句直接退出

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载