学会VBA,菜鸟也高飞!(txt+pdf+epub+mobi电子书下载)


发布时间:2020-06-11 02:52:09

点击下载

作者:林书明,邓志伟

出版社:电子工业出版社

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

学会VBA,菜鸟也高飞!

学会VBA,菜鸟也高飞!试读:

有点儿不一样的VBA入门书

学生时代,我们一定有过这样的记忆:某本教材,很难,即使有教授在课堂上讲解,理解起来也并不容易;如果自学,那么更是难上加难!对于这类教材,我们往往看着封面上的作者名字,两眼投射出仰慕的光芒,心里默默地为自己的智商着急……

这其实“不赖他们”,善意地揣摩作者的心理,我想,一些“专家”的书之所以难,也许是为了节省纸张,降低图书的定价,为读者减轻经济负担,他们的初衷是好的。可是,很多人会发现,很多时候,仅仅为了弄懂一本教材,不得不再去购买一些辅导材料,结果知识获得的总体成本并不低。

一些“专家”写的书读起来很难,我想可能有以下几个原因。(1)很多专家认为的基本“常识”,我们常常“不识”。(2)很多专家认为我们“应该了解”的基本术语,我们往往“不解”。(3)很多专家往往是学习的“天才”,我们往往“不才”。(4)当然,还有个别的“假专家”,写一本书东拼西凑,根本不值得评价。

也许因为他们太“专家”了,所以总是“想不起来”解释他们认为“简单”的东西。对于计算机类的书籍,上来就说“变量”、“赋值”、“面向对象”、“事件”、“编译”、“类”等“行话”,作为从未接触过编程的人,自信心是很受打击的。

很多计算机编程入门的书籍都存在一个问题,那就是为了讲明白一个基础的问题,却不自觉地使用了绝不是那么基础的术语,这往往会给初学者造成很多困惑,虽然有些时候这是不可避免的,但是作为书籍的作者应该尽最大可能避免这种情况的发生。

也许因为他们太“专家”了,所以说话总是很精炼,惜字如金,经常认为别人会和他们一样聪明,能随时跟得上他们的思路,书籍内容进展得很快,常常忽略了一些过渡的东西,让我们只能眼巴巴地看着“知识的彼岸”,却很难“渡”过去。

针对以上一些问题,作为技术类型的图书作者,到了必须有所改变的时候了。为此,我愿意做一些尝试,即使不那么成功。

我猜想购得本书的读者恐怕大多数人已经离开了学校,走上了工作岗位,遇到问题很难再有老师的帮助,因此,书籍的设计要以读者能“轻松”阅读为目的,尽量帮读者顺利前进。

本书的读者定位是没有任何编程语言基础,却有志于学习VBA提高自己的工作效率的Excel“表哥表姐们”,即使你是文科生也能顺利阅读本书。

本书是一本VBA编程入门的书籍,有些概念可能会在书中反复地讲解,目的是让你在不断的重复中把书中的知识变成自己掌握的实实在在的技能。我个人的观点是,VBA既然是一种编程语言,一种比外语简单得多并能和Excel对话的语言,那么适当的重复是必需的,学习一种语言,只有在适当的重复中才能变得熟练,甚至形成自己的“语感”,从而最终为己所用。

阅读本书不需要任何编程概念和基础,从最基础的内容讲起,让你觉得不是在学习编程,而是在驯化一个叫Excel的小动物。

本书可以说有一点“另类”,在本书中,为了方便掌握Excel VBA的精髓,我大量地使用了比喻和类比,把Excel比喻成具有魔力的小怪兽,把VBA比喻成控制小怪兽的魔法,而我们就是那个无所不能的魔法师。我们的任务就是学会VBA这种魔咒,控制Excel这个小怪兽,为我们自己和他人做一些有益的事情!

我希望本书像一本关于Excel的“如来神掌”,依靠它,能在一定程度上解放我们自己,解救办公室的“表哥表姐们”于水火之中。

一些从未接触过编程的朋友经常有这样的疑问:“我数学不好,能学会VBA编程吗?”告诉大家,对于我们这些不是把编程作为职业的商务人士来说,用VBA编写程序一般不会用到高深的数学知识,VBA编程所涉及的大多数商业情景,恐怕有小学数学知识加上自己已有的业务知识就足够了。

此外,相对于学习某种外语,VBA作为一种普及型的计算机语言简直简单得不得了。虽然使用英语单词,但它没有复杂的语法现象,没有模棱两可的双关语,不用背诵成千上万的词汇。但简单却不意味着能力低下,我们决不能小看VBA的能力,学习一些Excel VBA的知识,能够显著地提高我们进行数据分析和处理相关工作的效率,收益将是巨大的。

由于本书是一本Excel VBA入门书,因此不太可能面面俱到,本书的重点是让读者能够在相对轻松的心情下,顺利掌握Excel VBA的基本理念,并能够根据本书所介绍的知识解决自己工作中遇到的一些基本问题,帮助自己更有效率地完成工作。本书所介绍的知识,我认为是属于VBA中“投资回报率”最高的部分,如果读完本书后你觉得不过瘾,则可继续阅读Excel VBA的进阶知识,但是我相信,学完该书介绍的VBA知识,定能让你在学习VBA进阶知识时感觉更轻松。

虽然本书只是一本VBA入门书,但是紧密结合实战是本书的一大特点,相信书中介绍的解决问题的思路和编程技巧会给你带来很大的启发。读完本书,你会觉得,VBA既简单有趣又超级实用,每个人都能掌握VBA,即使你是从来没有接触过编程的文科生!

怎么样?诱惑到你了吗?现在就有一个轻松学习VBA 的机会摆在你的面前,还等什么,快快开始我们的学习VBA之旅吧!

提示:书中的VBA代码请到www.broadview.com.cn\21506网站或我的新浪微博@MrExcel处下载。最后,祝大家学习愉快!林书明2013年6月第1章VBA是什么

有人说,职场中人必须掌握两种能力:一是和人沟通的能力;二是和计算机沟通的能力。和人沟通的能力靠语言(自然语言),和计算机沟通的能力也要靠“语言”(计算机编程语言),本书的目的就是教大家学会一种能和计算机沟通的语言,更确切地说,是教大家学会一种能和计算机中的Excel软件沟通的语言,这种语言不叫英语,不叫法语,而是叫做VBA语言。

类似人类的语言,能和计算机沟通的语言也有很多种。人类的语言分为汉语、英语、法语等,计算机语言分为Java语言、C语言等。对于经常和Excel打交道的商务办公人员来说,没有必要去学习前面提到的那些相对复杂的语言,我们只需学习其中一种最能提升个人生产力的计算机编程语言就行,它就是VBA。

VBA?我们不要被这三个英文字母吓到,其实它是众多计算机编程语言中最容易掌握的语言之一,VBA的全称是Visual Basic for Application,大意是“专门为自动化各种应用程序(比如Office中的Excel、Word、Access等)而设计的可视化基础编程语言”。事实上,VBA语言非常简单,我们甚至可以把VBA理解为Very Basic语言!本书就是告诉大家如何用VBA语言使Excel各种操作自动化,让Excel为我们服务。

这里所说的“用VBA语言使Excel各种操作自动化”就是所谓的“编程”,或者叫做“编写计算机程序”,通俗地说,就是“用计算机能听得懂的‘书面’语言和它说话”,即:用一种计算机能看懂的语言,命令计算机帮助我们做一些它所擅长的、通常是单调而重复的事情。

Excel VBA能够在以下商业情景中发挥作用。

● 需要定期地做某种规律性很强的数据处理操作。

● 需要把分布于多个工作簿中具有相同结构的数据合并到一个工作表中进行汇总分析。

● 需要用到一个Excel内置函数没有提供的功能。

● 需要自动完成几个连续的Excel数据处理动作。

● 需要定期地生成某种格式固定的Excel报告。

● 需要从繁杂无趣的工作中解放出来,能够有更多的时间陪家人和孩子。

…………1.1 Excel的身体结构

我们每天都在操作Excel,比如对Excel执行排序、筛选等操作,制作数据图表等,只是这些操作大多是在Excel界面上“手动”操作完成的。通过本书的学习,我们就可以用VBA“自动地”操作Excel,让Excel按照我们的意愿“自动地”为我们工作。

俗话说:人有人言,兽有兽语。计算机也有它自己能够理解的语言,对于Excel来说,它能理解的语言就是VBA。从这个角度来讲,我们可以把Excel比做一个小怪兽,而我们则像一个魔法师,阅读本书,就像正在学习一种能够操控Excel这个小怪兽的魔法语言,这种魔法语言就是VBA!

其实,Excel这个小怪兽并不“怪”,只是有一些“超能力”而已,比如,我们可以让它“三头六臂”——我们可以在一个Excel应用程序里建立三个工作簿文件(好比“三头”),每个工作簿文件里各建立两个工作表(每个工作表相当于一个手臂,三个工作簿文件一共六个“手臂”)。如果学会了VBA这种“兽语”,我们就可以脱离Excel界面实现前面的任务,只需用VBA语言告诉Excel完成这些动作就行了。

要想用VBA指挥Excel,我们必须先要了解Excel的“身体结构”,这对于我们并不困难,因为我们天天和Excel打交道,对Excel的“身体组成”再熟悉不过了。不过,为了学习VBA,还是非常有必要系统地介绍一下Excel各部分的名称,重点是了解Excel各部分组成的英文叫法。

当打开Excel应用程序(Application)后,我们可以通过“文件”→“新建”菜单建立一个或几个Excel工作簿文件,这些工作簿文件统称为Workbooks(英语单词Workbook的复数形式),如图1-1所示。图1-1 同一个Excel程序中建立了多个工作簿文件

下面我们分别介绍各部分在VBA语言中的表达方法。1.Workbook(工作簿)

一个工作簿就是一个Excel文件。我们知道,在一个Excel应用程序中可以打开多个工作簿文件,图1-1中在一个Excel应用程序中打开了三个Excel工作簿文件。Excel VBA中,在一个Excel应用程序中打开的所有工作簿文件统称为Workbooks(英语单词Workbook的复数形式,标准中文名称为“工作簿集合”)。在图1-1中,Excel窗口中最左面的“工作簿1.xlsx”,用VBA语言表示就是: Workbooks("工作簿1.xlsx")

翻译成人类的自然语言就是:许多工作簿(即“工作簿集合”)里面的某个具体的工作簿(“工作簿1.xlsx”)。

同理,图1-1中“工作簿2.xlsx”用VBA语言表示就是: Workbooks("工作簿2.xlsx")2.Worksheet(工作表)

每个工作簿可以包含一个或多个工作表。同一个Workbook中的所有Worksheet统称为Worksheets(英语单词Worksheet的复数形式,标准中文名称为“工作表集合”)。在图1-1中,工作簿文件“工作簿1.xlsx”中名称为“Sheet1”的工作表,用VBA表示就是: Workbooks("工作簿1.xlsx").Worksheets("Sheet1")

上面这句VBA语句翻译成人类的自然语言就是:在许多工作簿中名称为“工作簿1.xlsx”的工作簿中的许多工作表中名称为“Sheet1”的工作表。

类似地,名称为“工作簿2.xlsx”的工作簿中的名称为“Sheet1”的工作表,用VBA可以表示为: Workbooks("工作簿2.xlsx").Worksheets("Sheet1")3.Cells(单元格集合)

Cells表示Worksheet上的所有单元格。当我们用VBA表示某个特定的单元格时,比如位于第1行第2列的单元格可以表示为Cells(1,2)。在图1-1中,“工作簿1.xlsx”中名称为“Sheet1”工作表中左上角的(A1)单元格用VBA表示为: Workbooks("工作簿1.xlsx").Worksheets("Sheet1").Cells(1,1)

上面这句VBA语句翻译成人类的自然语言就是:在许多工作簿中名称为“工作簿1.xlsx”的工作簿中的许多工作表中名称为“Sheet1”的工作表的许多单元格中的第1行第1列单元格。

更正式一点的翻译是:在工作簿集合中名称为“工作簿1.xlsx”的工作簿中的工作表集合中名称为“Sheet1”的工作表的单元格集合中的第1行第1列单元格。翻译成自然语言很绕口,显然,还是用VBA表达更加清晰明确。4.Range(单元格区域)

Range是指Worksheet上的一个或多个单元格构成的单元格区域。在图1-1中,“工作簿1.xlsx”中的名称为“Sheet1”工作表中左上角的(A1)单元格用VBA可以表示为: Workbooks("工作簿1.xlsx").Worksheets("Sheet1").Range("A1")

上面这句VBA语句翻译成人类的自然语言就是:在许多工作簿中名称为“工作簿1.xlsx”的工作簿中的许多工作表中名称为“Sheet1”的工作表中单元格区域“A1”。

类似地,该工作表中的A1:D100单元格区域,用VBA可以表示为: Workbooks("工作簿1.xlsx").Worksheets("Sheet1").Range("A1:D100")5.ThisWorkbook(当前工作簿)

每个工作簿文件里都可以包含VBA代码。在Excel VBA中,单词ThisWorkbook表示当前VBA代码所在的工作簿。对于代码: Workbooks("工作簿1.xlsx").Worksheets("Sheet1").Range("A1:D100")

如果该VBA代码恰巧写在了工作簿文件“工作簿1.xlsx”中,那么就不用那么啰嗦了,此代码可以改写为: ThisWorkbook.Worksheets("Sheet1").Range("A1:D100")

到现在为止,我们已经了解了Excel“身体结构”最基本部分的VBA表达方式,下面的章节将继续介绍如何用VBA操纵Excel“身体结构”的各个部分,像“耍皮影戏中的影人”一样,用VBA指挥Excel为我们服务。

曾经有个著名的问题,叫做“幸福是什么?”关于这个问题,有一个有趣的答案:幸福就是“猫吃鱼,狗吃肉,奥特曼专打小怪兽”。如果把Excel比做小怪兽,那么,我们天天在和Excel小怪兽打交道,其实天天都在“幸福着”。也许你不愿意把自己比做奥特曼,但是,作为一个经常和数据打交道的办公室工作人员,如果你再不了解一点儿VBA,那么也许你真的会OUT了。

好了,让我们继续学习。1.2 放下包袱轻松学习

了解一些Excel“身体结构”的词汇后,我们就可以进一步理解VBA工作原理了。比如,我们有这样一个任务:在当前工作簿中名称为“Sheet1”的工作表的第1行第1列单元格里填写一段文字“我在这里!”,我们可以这样用VBA语句告诉Excel: ThisWorkbook.Worksheets("Sheet1").Cells(1,1).Value="我在这里!"

或者 ThisWorkbook.Worksheets("Sheet1").Range("A1").Value="我在这里!"

再举一个例子,把工作簿中名称为“Sheet3”的工作表移动到名称为“Sheet1”的工作表之前,我们可以这样用VBA语言告诉Excel: ThisWorkbook.Worksheets("Sheet3").Move Before:=ThisWorkbook.Worksheets("Sheet1")

怎么样?感觉如何?大概你已经从VBA语句的表面意思看出来它要做什么了吧。如果没有完全理解,也没有关系,在这里只是让大家从感性上对VBA有一些认识。在本书接下来的章节里,将系统地讲解VBA,最终让我们像“魔法师”一样,用VBA这种强大的“咒语”来驯服Excel这个“小怪兽”。

用VBA操作Excel,其实有点儿像操纵木偶戏里的木偶,比如,移动一个工作表的位置(假设移动名称为“Sheet1”的工作表),我们需要选中该工作表,然后按着鼠标左键,把工作表拖动到希望放置的位置。如果用VBA来完成这件事,需要我们用VBA告诉Excel要移动的工作表名称,以及想要“移动到”的目标位置。也就是这句VBA代码: ThisWorkbook.Worksheets("Sheet3").Move Before:=ThisWorkbook.Worksheets("Sheet1")

与操纵木偶不同的是,我们一旦把完成各种操作的VBA语句记录下来形成一段“程序”,下次再次执行同样的操作时,告诉Excel再次执行这段已经编写好的程序即可,从此解脱了手工操作,不必重新写一遍同样的VBA代码了。

Excel是一个小怪兽,它的行动很敏捷,但头脑却很简单,只会一步步呆板地执行你吩咐给它的每行命令,从来不会主动思考,更不会揣摩你的心思。对于我们用VBA吩咐给它的需要多个步骤才能完成的某个具体任务,必须告诉它完成这个任务的每一个具体步骤,绝不可以模棱两可;否则,它很可能会理解错误或者干脆拒绝执行。然而,一旦你用VBA正确地告诉它完成某个任务的步骤,它就可以迅速地执行你的命令,具体有多迅速,那要看你的计算机硬件配置如何。1.3 通俗计算机工作原理

我们学习VBA的目的是“驯服”Excel,因此必须了解与所要“驯服”的对象相关的一些基本情况,以便于我们更深入地理解VBA和有效地用VBA操纵Excel。

首先,我们从计算机工作原理谈起。

在启动Excel程序之前,Excel程序以可执行文件的形式存储在计算机硬盘里,这时候它什么也做不了,只是计算机硬盘里的二进制代码而已,就像密封在魔瓶里的小怪兽,等待着拔开魔瓶盖子的那个人。

那么,谁是那个打开魔瓶盖子的人呢?这个人就是作为Excel使用者的我们!我们双击Excel图标启动Excel,就相当于打开魔瓶盖子,Excel小怪兽从计算机硬盘加载到计算机内存中,小怪兽获得了自由,而计算机内存就是Excel小怪兽施展本领的地方。

可以这样比喻:Excel程序启动之前存在于计算机硬盘中时,它是扁平的、僵硬的、毫无生命的二进制代码,但是,当Excel程序启动并加载到计算机内存以后,它就变成了立体的、鲜活的、有生命的Excel程序。

内存是计算机的重要组成部分,我们可以把它想象成工作台边上的一排排立体货架,程序从计算机硬盘加载到内存的过程就相当于把货物从“紧锁的”库房(计算机硬盘)中取出,摆放到工作台边的一排排货架(内存)上,以方便计算机中央处理器(又称为CPU)随时加工取用。

为了更清楚地说明问题,我们用Excel工作表模拟计算机的内存结构。假设图1-2所示的工作表就是计算机内存,工作表中的每个单元格相当于计算机内存中的一个存储位置,我们发现计算机内存中已经加载了如下数据:图1-2 用工作表模拟计算机内存

内存B2位置(B2单元格)存储了一个数值12;

内存B3位置(B3单元格)存储了一个数值5;

内存B5位置(B5单元格)存储了一个字符"Jack";

内存B6位置(B6单元格)存储了一个字符串"Lin";

内存B10:H19位置存储了一个Excel工作簿WorkBook(1)。

还有很多已经加载到计算机内存中的其他各种内容。

像车间工作台旁边的货架一样,计算机内存中的每个存储位置都有一个位置坐标(或者称作“存储地址”),比如位置B2就是数值12存储的地址;位置B5就是字符串"Jack"存储的地址。

简单地了解了计算机内存后,我们再来了解另一个重要的计算机部件的功用,那就是:计算机中央处理器,也叫CPU。

当我们双击Excel图标启动Excel时,是谁把Excel加载到计算机内存中的一个个存储位置上的呢?具体做这件事的人是我们吗?不是,我们只是双击了一下Excel图标,给计算机发出了一个启动Excel程序的命令而已,具体做这件事的是计算机中央处理器(CPU)。

计算机中央处理器是计算机中最勤劳的部件,计算机的绝大部分工作都由它来完成,比如,把Excel程序从计算机硬盘加载到计算机内存中;执行VBA程序等。

关于计算机工作原理,我并不是这方面的专家,但是,简单了解一点计算机工作原理,能帮助我们更好地学习和理解VBA。在下一章里我们将开始设计第一个Excel VBA程序,准备好了吗?Let's go!第2章第一个VBA程序

上一章我们了解了Excel的“身体结构”和简单的计算机的工作原理,现在让我们亲手编写一个Excel VBA小程序,体会一下编程的乐趣吧。2.1 设计第一个VBA程序

我们先编写一小段VBA程序,吩咐Excel完成一个小小的任务,以便对VBA编程有一个初步的概念。这个VBA编程任务就是让Excel帮我们计算两个数值的乘积,以下是完成该任务的详细步骤。注意:在下面的演示中,我们只需对VBA编程有个概念即可,不必追究细节,所有细节在后面都会详细介绍,所以,请放松心情。

注意:如果你从来没有在Excel中使用过VBA,那么在第一次使用VBA之前需要对Excel做一些设置。以Excel 2010为例,需要单击“文件”→“选项”→“自定义功能区”,在“Excel选项”对话框右侧的自定义功能区“主选项卡”下方勾选“开发工具”选项,然后单击右下角的“确定”按钮关闭对话框(见图2-1)。图2-1 把“开发工具”选项卡加到Excel界面上

上述设置完毕,返回Excel界面后,你会发现在Excel界面上出现一个“开发工具”选项卡(见图2-2)。本书要介绍的大部分内容都在这个选项卡里面。图2-2 现在Excel界面上已经有了“开发工具”选项卡

单击“开发工具”选项卡中“代码”功能组中的“Visual Basic”按钮(见图2-2),便进入我们期盼已久的VBA开发环境(VBA Development Enviroment,VDE),也就是我们和Excel“对话”的地方。

图2-3所示就是Excel程序的VBA开发环境,所有与VBA代码相关的事项都在这里完成。我们右键单击该VBA开发环境界面左侧上部窗口的任意位置,在弹出的快捷菜单中选择“插入”→“模块”,进入VBA代码窗口。图2-3 Excel VBA开发环境

VBA开发环境把我们刚刚插入的模块名称默认为“模块1”,我们暂且使用该默认名称。接下来,我们把下面的VBA代码输入到VBA开发环境右侧的代码窗口中。 Sub myExample() Let myNum_a=12 Let myNum_b=5 Let MyResult=myNum_a*myNum_b MsgBox "myNum_a乘以myNum_b的计算结果为:" & myResult End Sub

虽然我们还没有正式学习VBA,但也许已经看出来了,该程序的作用是计算两个数值的乘积。下面简单地介绍一下每句代码的含义,目前我们可以不求甚解,因为所有的细节会随着我们学习的进展而更加明朗。 '告诉Excel,我的这段代码的名称叫myExample Sub myExample() '让myNum_a等于12,或者说把数值12赋值给变量myNum_a Let myNum_a=12 '让myNum_b等于5,或者说把数值5赋值给变量myNum_b Let myNum_b=5 '让MyResult等于myNum_a乘以myNum_b,或者说 '把myNum_a和myNum_b的乘积赋值给变量MyResult Let MyResult=myNum_a*myNum_b '让VBA用一个消息框(msgBox)的形式告诉我们myResult的结果 MsgBox "myNum_a乘以myNum_b的计算结果为:"& myResult End Sub

上面代码中,所有VBA语句前面的Let(表示“让”)一词可以省略,比如代码“Let myNum_a=12”可以直接写成“myNum_a=12”。我们由此知道,这里的“=”号的意思不是“相等”,而是“让…等于…”,用VBA术语表达就是“给…赋值”的意思。

在VBA术语中,程序语句“Let myNum_a=12”中等号(“=”)前面的myNum_a 称作“变量”,myNum_a=12的意思就是把数值12赋值给变量myNum_a。

所谓变量,就是“可以变化的量”,通俗地解释,“变量”就是一个盛放具体内容(数字、字符或者其他内容)的“盒子”。当我们把12赋值给变量myNum_a后,变量盒子myNum_a里面装的就是数值12,随后我们就可以用这个变量盒子里面的内容进行各种运算。

我们前面提到过,程序语句中的Let一词可以省略,那么前面的程序可以写成如下格式,程序所完成的功能不变。 '告诉Excel,我的这段代码的名称叫myExample Sub myExample() '给数值12取名为myNum_a myNum_a=12 '给数值5取名为myNum_b myNum_b=5 '给myNum_a和myNum_b的乘积取名为MyResult MyResult=myNum_a*myNum_b '用一个消息对话框(MsgBox)的形式告诉我们myResult的结果 MsgBox "myNum_a乘以myNum_b的计算结果为:" & myResult End Sub

在前面的VBA程序中,为了便于理解程序,我们给每一句代码都加上了汉语注释,注释语句的特点是在每行注释语句的前面有一个英文的上撇号('),VBA看到前面带有上撇号的语句时会自动忽略,就好像该语句不存在一样。

因此,对于VBA来说,上面的程序VBA只看到这些,那些注释语句是被VBA完全忽略的。 Sub myExample() myNum_a=12 myNum_b=5 myResult=myNum_a*myNum_b MsgBox"myNum_a乘以myNum_b的计算结果为:"&myResult End Sub

下面让我们看看计算机如何执行VBA代码,让Excel执行我们吩咐它做的事情。在Excel VBA开发环境中输入上述代码后,将光标放置在VBA代码的任意一行,然后单击VBA编程环境菜单栏下方的“运行”按钮(一个向右的三角箭头,见图2-4),我们立即得到该VBA代码的运行结果。图2-4 单击“运行”按钮执行VBA代码

该代码的运行结果如图2-5所示,在Excel界面上出现了一个消息框,该消息框是VBA程序执行到如下语句生成的。图2-5 我们的第一个VBA程序的计算结果 MsgBox "myNum_a乘以myNum_b的计算结果为:"&myResult

MsgBox是VBA中的一个功能,它的作用是以消息框的形式显示它后面的内容。MsgBox的后半部分代码“"myNum_a乘以myNum_b的计算结果为:" & myResult”表示让MsgBox显示由&符号连接的两部分内容,&符号前面是一个“字符串”,&符号后边是一个“变量”。在显示结果时,VBA会显示变量myResult所代表的内容。

我们设计好VBA程序,还要保存该程序,以便下次重复使用。我们知道,VBA是Visual Basic for Application的缩写,意思是专门为各种应用程序(Application)而适当简化的Visual Basic语言。该语言的特点就是,它必须“寄生”在某种应用程序内(比如Excel、Access、Word 等)。我们的VBA程序写在Excel文件中,因此保存含有VBA程序的Excel文件就能保存VBA程序。

但是,微软出于对软件安全的考虑,要求在保存含有VBA代码的Excel文件时必须使用专门的文件后缀“.xlsm”以示区分。当我们单击“文件”→“保存”保存这个含有VBA代码的工作簿文件时,Excel会弹出图2-6所示的对话框。该对话框提示我们,该工作簿文件中含有VBA代码,必须保存成含有VBA宏的工作簿文件格式(扩展名为.xslm)。图2-6 含有VBA代码的工作簿必须保存为特定的文件格式

我们按照提示单击“否”按钮,Excel弹出“另存为”对话框,从“保存类型”下拉列表框中选择“Excel启用宏的工作簿(*.xlsm)”选项,然后单击“保存”按钮,保存工作簿(见图2-7)。图2-7 保存含有VBA代码的工作簿2.2 打开含有VBA的程序

含有VBA代码的Excel文件保存完毕后,再次打开时,Excel出于安全的考虑,防止病毒作恶,默认是禁止运行VBA代码的。如果我们打开含有VBA代码的工作簿,在默认情况下则会弹出一个安全警告框(见图2-8),单击“启用宏”按钮。图2-8 打开含有VBA代码的工作簿文件

在默认情况下弹出的这个安全警告框可以在Excel选项里设置为不显示,设置方法是:选择“文件→信任中心”命令,如图2-9所示,打开“信任中心”对话框。图2-9 Excel选项“信任中心”对话框

在“信任中心”对话框的左侧,选择“受信任位置”,在对话框右下角单击“添加新位置”按钮,在打开的“Microsoft Office受信任位置”对话框中选择受信任的文件夹,如果该文件夹下的子文件夹也受信任,则需要勾选“同时信任此位置的子文件夹”复选框,然后单击“确定”按钮关闭所有的对话框,如图2-10所示。现在,在打开该文件夹下含有宏或VBA的Excel文件时,都不会弹出安全警告框了。图2-10 Excel“信任中心”的设置

了解了一些关于VBA安全方面的设置后,我们再次执行刚才编写的VBA程序。单击“开发工具”→“代码”功能组中的“Visual Basic”按钮,进入VBA开发环境(对应的快捷键是“Alt+F11”),因为我们的程序在“模块1”中,双击“模块1”,就看到了所编写的VBA程序。

把鼠标光标放置在VBA程序代码的任意一行,然后单击VBA编程环境菜单栏下方的“运行”按钮(一个向右的三角箭头,见图2-11),或者直接按下快捷键F5执行该程序,我们立即得到该VBA代码的运行结果。图2-11 运行已经编写好的VBA程序2.3 VBA代码放置的位置

前面完整地介绍了第一个VBA程序的设计过程。我们注意到,所编写的VBA代码是放在Excel VBA开发环境中的模块(Module)内的(见图2-12)。事实上,根据需要,我们的VBA代码不仅仅可以放在模块代码区里,还可以放在相应的工作簿代码区和工作表代码区里。图2-12 Excel VBA代码的“模块指挥中心”

如果把我们放置VBA代码的地方比作“指挥中心”,那么Excel VBA的指挥中心可以分为不同的级别,分别是“模块指挥中心”、“工作簿指挥中心”和“工作表指挥中心”等。只有从指挥中心发出的VBA指令才能被Excel理解和执行。在通常情况下,我们驯服Excel小怪兽的VBA代码放在“模块指挥中心”里。我们前面介绍过的VBA代码就放在了Excel VBA开发环境的“模块指挥中心”内。

进入Excel不同级别指挥中心的方法是:单击“开发工具”→“代码”功能组中的“Visual Basic”按钮进入VBA开发环境(对应的快捷键是“Alt+F11”),在左侧单击“VBAProject”下的“Microsoft Excel对象”,展开Microsoft Excel对象列表,我们会看到当前工作簿下的所有Excel对象(各个工作簿和工作表的名称)。双击每一个Excel对象,便会进入与该Excel对象相对应的VBA代码模块。这时,再单击VBA开发环境(VDE)菜单栏上的“窗口”→“水平平铺”选项,所有打开的Excel对象的代码模块都会显示在VBA开发环境界面上。调整每一个对象的代码模块窗口位置后,得到如图2-13所示的界面。图2-13 Excel中可以放置VBA代码的位置

我们知道,可以在一个Excel应用程序中同时打开两个或两个以上Excel文件。如果我们在Excel应用程序中打开两个Excel文件,然后按下快捷键“Alt+F11”进入VBA开发环境,将会得到如图2-14所示的VBA开发环境界面。每一个Excel文件都有自己的“模块指挥中心”、“工作簿指挥中心”、“工作表指挥中心”等。图2-14 当同一个Excel应用程序下打开或创建了两个Excel工作簿时

我们知道了VBA代码可以放在不同的位置,那么VBA代码放置的位置不同,对代码编写又有什么影响呢?看了以下的解释,你就清楚了。

我们知道,一个Excel应用程序可以同时打开多个Excel工作簿文件,每个Excel工作簿文件可以包含多个工作表,每个工作表又包含多个单元格。我们把Excel应用程序比喻成一个培训机构,并假设:该培训机构(Excel应用程序)有2所培训学校(Excel应用程序打开了2个Workbook文件),每所培训学校有3间教室(每个Workbook有3个Worksheet),每间教室有9张桌子(每个Worksheet有9个单元格),如图2-15所示。图2-15 同一个Excel应用程序下打开了多个工作簿文件的类比

现在,我们假设培训机构的CEO在视察下属学校时,不小心把自己的钱包落在第2分校第2间教室的第2行第3列的课桌上了。这时,CEO打算派随行秘书帮他把钱包找回来,如果CEO用VBA语言告诉随行秘书钱包的位置,则根据CEO当时所处的地点的不同,可以有以下几种VBA语言的表达方式。(1)如果CEO现在就在丢钱包所在的教室(VBA代码写在第2个工作簿的第2个工作表的VBA代码空间内),他可以这样用VBA语言对随行秘书表达钱包所在的位置: Sub whereIsMyMoney() MsgBox Cells(2,3).value End Sub

因为CEO现在就在丢钱包所在的教室,所以不用指定钱包所在教室(工作表)的名称,只需说明钱包所在的课桌位置即可,并且不会引起随行秘书的理解错误。(2)如果CEO现在已经出了丢钱包的教室,去了同一学校的另外一间教室(VBA代码写在第2个工作簿的第2个工作表“以外”的工作表的VBA代码空间内),他可以这样用VBA语言对随行秘书表达钱包所在的位置: Sub whereIsMyMoney() MsgBox WorkSheets(2).Cells(2,3).value End Sub

虽然CEO已经不在丢钱包的教室,但是还没有离开丢钱包的教室所属的分校,因此,即使不说明钱包所在分校(工作簿文件)的名称,也不会引起随行秘书的理解错误。(3)如果CEO现在已经出了教室,在第2分校的校长办公室里(VBA代码写在第2个工作簿的ThisWorkbook代码空间里,或者放在第2个工作簿的VBA模块里),他可以这样用VBA语言对随行秘书表达钱包所在的位置: Sub whereIsMyMoney() MsgBox WorkSheets(2).Cells(2,3).value End Sub

虽然CEO已经不在丢钱包的教室,但是还没有离开丢钱包的教室所属的分校,因此,即使不说明钱包所在分校(工作簿文件)的名称,也不会引起随行秘书的理解错误。(4)如果CEO已经离开了第2分校(VBA代码写在第1个工作簿的任意VBA代码空间内),那么他必须这样用VBA语言对随行秘书表达钱包所在的位置: Sub whereIsMyMoney() MsgBox WorkBooks(2).WorkSheets(2).Cells(2,3).value End Sub

现在CEO已经离开了丢钱包的教室所属的分校,因此,必须说明钱包所在分校(工作簿文件)的名称,这样才能清楚地表达钱包所在的位置,避免随行秘书的理解错误。

我们举这个例子要说明的是,根据VBA代码存在的位置不同(模块代码空间、工作簿代码空间、工作表代码空间等),在不引起Excel VBA语言歧义的情况下,可以适当地简化代码的书写。2.4 其实你早就在“编程”

事实上,如果你使用过Excel公式和函数,那么其实你已经在“编程”了。下面再举一个例子来加深我们对Excel VBA执行过程的理解。

也许你已经注意到,在Excel工作表的编辑栏左侧有一个文本框,这个文本框叫做“名称栏”,我们可以在这里给Excel单元格或者单元格区域取一个有意义的名称,然后就可以用该名称代表原来冷冰冰的单元格地址的引用了。

我们选中B5单元格,在名称栏里输入“myFirstName”,然后回车,这时就给B5单元格取了一个名称叫做myFirstName;用同样方法,选中B6单元格,给B6单元格取一个名称为myLastName;接着选中D5单元格,取名为myFullName;最后在D5单元格中输入公式“=myFirstName&" "&myLastName”。

此时我们会立即看到,在D5单元格得到了公式“=myFirstName&"" &myLastName”的计算结果:“Jack Lin”,如图2-16所示。图2-16 给单元格取一个名称

如果我们把myFirstName单元格(也就是B5单元格)中的字符串换成“书明”,把myLastName单元格(也就是B6单元格)中的字符串换成“林”,那么在myFullName单元格(也就是D5单元格)中会立即得到字符串“书明林”。

如果用VBA表示,把myFirstName和myLastName单元格中的字符串分别换成“书明”和“林”这个动作,则可以用如下VBA语句表示(VBA,代码中的Let可以省略): Let myFirstName="书明" Let myLastName="林"

上面的VBA语句表示的含义是:让myFirstName等于字符串“书明”;让myLastName等于字符串“林”。

myFullName单元格中的公式“=myFirstName&" "&myLastName”,写成VBA语句就是: Let myFullName=myFirstName&" "&myLastName

上面的VBA语句的含义是:让myFullName等于myFirstName&" "&myLastName。

现在,我们用VBA把两个字符串连接的计算结果用一个消息框的形式显示出来,对应的VBA语句就是: MsgBox "myfull name is" & myFullName

MsgBox是VBA中的一个“功能”,它的作用是以消息框的形式显示它后面的内容。VBA代码“"my full name is " & myFullName”表示:MsgBox显示的内容是由&符号连接的两部分内容,&符号前面是一个字符串,&符号后边是一个变量myFullName。在显示结果时,变量myFullName会显示为该变量所代表的内容。

我们把上面的所有VBA代码写在一起,并给这段代码取一个名称,就是一个完整的可以被Excel理解并执行的VBA程序。 Sub myFullName() Let myFirstName = "Jack" Let myLastName = "Lin" Let myFullName = myFirstName & " " & myLastName MsgBox "my full name is" & myFullName End Sub

我们前面提到过,VBA赋值语句中的Let一词(VBA术语,称作关键字)可以省略,因此上面的代码可以写成(省略了Let关键字): Sub myFullName() myFirstName = "Jack" myLastName = "Lin" myFullName = myFirstName & " " & myLastName MsgBox "my full name is" & myFullName End Sub

按下快捷键“Alt+F11”进入VBA开发环境,在左侧单击鼠标右键,选择“插入”→“模块”,在模块中输入如图2-17所示的VBA代码。将鼠标光标置于程序中任意一行,然后单击VBA开发环境界面上方的运行按钮(或者按下快捷键F5)执行程序。图2-17 运行VBA程序

在上面这段VBA程序中,开头和结尾的两行语句是VBA程序的固定格式,是VBA程序的开始和结束标志,必须有且不能改变的。程序名称部分可以自己命名,即一个VBA程序至少是如下形式,我们暂且称之为“VBA程序模板”。 Sub程序的名称() '自己编写的VBA程序语句放在这里 End Sub

在VBA中,像myFirstName、myLastName、myFullName这种我们自己命名的能够“盛放数值或者字符串的名字”,在VBA术语中称作“变量”。当VBA程序执行时,每个变量对应着计算机内存中的一个位置,它们的功用相当于在Excel工作表中给某个单元格取的名称。在VBA中,“变量”可以理解为“在计算机内存中,能够存储字符串或者数值的一个具体位置的名字”。

VBA程序中的每条语句都相当于给计算机发出的一条操作命令,比如,计算机执行下面的VBA程序: Sub myFullName() myFirstName="Jack" myLastName="Lin" myFullName=myFirstName&""&myLastName MsgBox"myfull name is" & myFullName End Sub

其VBA代码的执行过程可以描述如下。myFirstName = "Jack"。在计算机内存中创建第一个名称为“myFirstName”的内存位置,并在这个内存位置存储字符串“Jack”。myLastName = "Lin"。在计算机内存中创建第二个名称为“myLastName”的内存位置,并在这个内存位置存储字符串“Lin”。myFullName = myFirstName & " " & myLastName。在计算机内存中创建第三个名称为“myFullName”的内存位置,并在这个内存位置存储“myFirstName & " " & myLastName”的计算结果。MsgBox "my full name is " & myFullName。使用VBA的内置功能MsgBox,把存储在myFullName内存位置处的内容(即代码“myFirstName & " " & myLastName”的计算结果)以消息框的形式显示出来。

我们看看该VBA程序的运行结果。将鼠标光标置于程序中任意一行,单击VBA开发环境界面上方的运行按钮(或者按下快捷键F5)执行程序,我们将得到如图2-18所示的运行结果。图2-18 VBA程序myFullName的运行结果

如此看来,VBA程序的执行过程和我们写Excel公式的过程相当类似。但是,因为VBA具有判断和循环能力,所以要比Excel公式强大得多。VBA更强大的功能我们会在本书以后的章节里陆续介绍。第3章VBA中的等号

到现在为止,我们已经接触了几个VBA小程序,对VBA有了一些初步的了解。下面我们再来回顾一下VBA中的一个重要内容,那就是VBA代码中的等号(=)的含义。

也许你会觉得有点可笑:等号还要解释?我从小学一年级就知道这个东西的存在了,不就是表示“相等”吗?其实,我在接触程序设计以前也是这样认为的,直到有一天,一种叫做Basic的语言彻底颠覆了我的观点。

如果你从未听说过Basic语言,那么恭喜你,你还不够老,在那个年代,程序设计入门通常使用一种叫做Basic的语言,Basic语言可以说是VBA的“爷爷”,在这种语言里,等号(=)不仅仅表示相等,而且还表示“使…等于…”。VBA作为Basic语言的“孙子”,它从爷爷那里继承了等号的所有含义。

在VBA语言中,等号(=)有两种含义,下面分别道来。3.1 VBA中等号的第一种含义

VBA中等号的第一种含义相当于汉语中的“使动词”,表示“使…等于…”或者“让…等于…”,也就是VBA术语通常所说的“给…赋值”,即把右边的数值赋值给(存储在)左边的变量名称所代表的计算机内存位置(即计算机“内存货架”中的某个位置)。比如,在下面的VBA程序中,第2行代码b=123表示的意思是“使(让)变量b等于123”,或者说“把数值123赋值给变量b”。我们介绍过,VBA语句b=123也可以写成Let b=123,功能不变。试着运行这个小程序,体会这一点。 Sub testVBA01() b=123 MsgBox b Let b=456 MsgBox b End Sub

我常常把VBA中的变量比喻成一个“盒子”,该盒子只能装进去1个物品,在给变量赋值的语句中,等号的含义就相当于“把等号右边的数值‘装入’左边的变量‘盒子’中”。因为变量盒子只能盛放一个物体,所以,如果在装入之前,变量盒子里面已经有物体存在,用等号给变量赋值时,则会把变量中原来的物体给“顶”出去。

在下面的VBA程序中,当程序执行到第3行代码时,显示消息框“myNum =123”;当程序执行到第5行代码时,显示消息框“myNum =456”。也就是说,当程序执行到第4行代码myNum = 456时,456把myNum变量盒子中的123给“顶”了出去,此时myNum中的数值变成了456。 Sub testVBA02() myNum=123 MsgBox "myNum="&myNum myNum=456 MsgBox "myNum="&myNum End Sub

在VBA程序中,我们经常看到a=a+1这种表达方式,比如下面的VBA程序。 Sub testVBA3() A=10 MsgBox "A="&A A=A+1 MsgBox "A="&A End Sub

为了方便解释,我们在每行VBA代码前面加上了一个表示行号的标签,改写如下。需要说明的是,在VBA中,我们可以在每行代码前面加一个以英文冒号结束的标签,该标签并不影响VBA代码的运行。 Sub testVBA3() L01: A = 10 L02: MsgBox "A= "&A L03: A = A + 1 L04: MsgBox "A= "&A End Sub

L01代码,A=10这行代码也可以写成Let A=10,功能相同,表示把数值10赋值给变量盒子A,此时A中的内容是10。所以当执行到L02代码时,MsgBox "A= "&A显示的内容是“A=10”。

执行到L03代码A=A+1时,表示把A+1计算得到的数值赋值给A。我们已经知道,此前(在这行代码之前)A中的数值是10,A+1的计算结果就是11,所以代码A=A+1的意思就是把11再赋值给A。执行完这行代码后,A中的结果是11,L04代码MsgBox "A= "&A也验证了这一点。此时,消息框中显示的结果是“A=11”。

在VBA赋值语句中,代码的执行是自右向左的,VBA代码A = A + 1的意义相当于(A) ← (A + 1)。

简单地讲,所谓赋值就是把等号右边的值“赋予”等号左边的变量的意思。透彻、清晰地了解VBA中等号的第一种含义在学习VBA编程中非常重要,这对我们构建程序思维、培养“像VBA那样去思考”的思维习惯非常重要。3.2 VBA中等号的第二种含义

VBA中等号的第二种含义就是一般意义上的等号,用于判断等号两边的内容是否相等,这一点和Excel公式中的等号含义一致,一般用在VBA表示判断的语句中。比如,在下面的VBA程序中(其中用到了VBA中的If…条件判断结构,现在看不懂也不要紧,后面章节还会详细介绍)。 Sub myCode() hisName="MrExcel" If hisName ="MrExcel" then MsgBox "这个人确实是MrExcel" Else MsgBox "这个人不是MrExcel" End if End Sub

第2行代码hisName="MrExcel"中的等号相当于“使…等于…”或者“让…等于…”,即VBA中等号的第一种含义,“让”变量hisName等于字符串“MrExcel”(Let hisName="MrExcel"),或者说,把字符串“MrExcel”赋值给计算机内存中的变量hisName。

第3行代码中的等号位于VBA判断语句中(If hisName ="MrExcel" then),所以其含义就是通常意义上的“比较”。该行代码的含义是:如果变量hisName中的内容等于字符串“MrExcel”,则显示消息框“这个人确实是MrExcel”;否则,显示“这个人不是MrExcel”。

正确地区分VBA中等号的两种不同含义,对于编写正确的VBA代码和正确地理解别人编写的VBA程序是非常重要的。第4章VBA编程再探索

现在,我们已经完成了第一个Excel VBA程序,对VBA的工作过程有了一个整体的概念。为了进一步加深对Excel VBA各种概念的理解,下面我们对VBA编程所涉及的一些基本概念进行“再探索”。

我们前面提到,VBA中的变量就像一个“盒子”,我们可以在盒子里面盛放数字、字符或者其他类型的东西。这里需要特别注意的是,在VBA中,变量盒子每次只能盛放一件东西!

比如,我们在变量盒子myNum_a里面放进去数字12后,如果忽然改变了主意,又想用变量盒子myNum_a盛放数字12000,那么可以用下面的VBA语句来完成这个任务。

Let myNum_a=12000语句可以简写成myNum_a=12000

当计算机执行这条VBA语句的时候,变量盒子myNum_a中原来的内容12就被新的内容12000给“消灭掉”了,现在变量盒子里的内容是12000。如果不刻意将变量盒子myNum_a中原来的内容12保存到另外一个变量盒子(另外一个内存位置)中,那么它就会化为灰烬,不知所踪。

为了更深入地理解VBA中变量的概念,我们再次使用Excel中的“名称”技术来模拟VBA程序的执行过程。我们仔细观察下面一段VBA程序,在这段程序中,开头和结尾两行代码:“Sub程序名称()”和“End Sub”是每段VBA程序都必须具备的固定格式,表示程序的开始和结束。在下面这段程序中,我们给VBA程序取的名称是myExample。 Sub myExample() myNum_a = 12 myNum_b = 5 myResult = myNum_a * myNum_b MsgBox "myNum_a乘以myNum_b的计算结果为:" & myResult End Sub

我们提到过,VBA程序开头和结尾两行代码“Sub程序名称()”和“End Sub”是VBA程序开始和结束的标志,好比中国古代的魔法师施法时要在开头和结尾念一遍“天灵灵,地灵灵……”一样,表示要开始“做法”了。

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

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载