1/11学习VBA的条件与方法切入正题前先谈谈VBA的概念!第1章正确认识VBAVBA是VB的一个分支,不过VB已经淘汰多年,不再升级,而VBA却一再地升级。鉴于VBA的强大和易学性,VBA已集成在很多应用程序中,包括CAD、CoreDraw、WPS(免费中不提供)、PowerPoint、FrontPage、Word、OutLook、Excel等等软件之中。不过只有ExcelVBA才被大家发扬光大,这一方面是基于Excel的用户群体大,工厂对表格设计的需求大,另一完方面也是ExcelVBA的完善性所致。同样版本VBA在不同软件中的表现是不同的,例如WORD2010中的VBA就比Excel2010中的VBA差。对于WORDVBA,我的了解并不多,只做过一次菜单.大概两个月前,ET论坛有一个人找我帮他有偿设计一个多菜菜单模板,当时只说了价格,没有说明是WORD还是Excel,我用就ExcelVBA做了下面的这个模板给他,让他自己按实际需求修改一下名字就完成了。对方当时就说是这个效果,不过要用WORD做。我想同样版本的VBA在菜单不可能有什么差异,就马上改用WORD帮他设计。经过几多周折才做到,不过WORD中有很多属性都不支持,明明帮助中说有这个属性,但复制帮助中的代码就不能实现同等效果。这其实也从侧面反应了WORDVBA用户太少,那么BUG反馈就少,修正错误的机会也少了,从而使WORD的VBA一直不好用。这就是恶性循环。Excel的用户多,很多问题都得到了及时的纠正,所以Excel的VBA也最完善。2/11VB停留在6.0版后就永远地停止开发了,不再更新,而Excel2003的VBA版本是6.05,Excel2007和Excel2010的VBA版本是7.0,Excel2013的VBA版本是7.01。说明微软一直在重视VBA应用。要获得您所用ExcelVBA的版本请先按下图设置,将“信任对VBA工程对象模型的访问”打勾。操作方法是使用“Alt+T+O”组合键打开Excel选项,然后找到“信任对VBA工程对象模型的访问”复选框,将它打勾。关闭对话框回到工作表界面,再按“Alt+F11”组合键打开VBE窗口(即VBA代码编辑界面),单击“插入”→“模块”,然后代码窗口中录入以下代码:Sub测试VBA版本()MsgBoxApplication.VBE.VersionEndSub录入完代码后,光标定位于代码中任意位置,按“F5”键执行代码,也可以按工具栏中的执“运行”按钮()执行代码。代码执行的结果就是当前VBA的开发版本号。以上仅是说明了VBA一直在进步、在发展,那么ExcelVBA应该如何理认识、理解它呢?可以这样看:ExcelVBA就是Excel的功能之一,它们是从属关系,和条件格式、透视表、图表一样附属在Excel中,用于实现某个方面的功能。所以ExcelVBA不能看做一个软件,它3/11只是Excel软件的附属功能之一。只不过由于VBA实在过于强大,大家通常不会将它与条件格式、图表等功能平等对待。对于Excel而言,ExcelVBA可以实现VBA以外的所有功能的集合。例如条件格式、图表、排序、筛选、透视表、样式、自定义单元格格式、函数与公式、合并计算、分类汇总、数据有效性、规划求解等等一切功能。当然,尽管VBA能做任何事,但是实际工作中我们仅用VBA来做三类事:一是非VBA无法完成的事,例如对选区进行背景着色,单击任意单元格,该单元格所在行、列自动着色,效果请参考动画:二是虽然Excel自带的多个功能组合可以完成,或者可以手工实现,但是利用VBA可可以百倍、千倍提升效率的事。例如B2:Z10000区域中是成绩表,要求选中其中所在小于60分的成绩,Excel没有任何工具可以实现这个功能(筛选只能单列有效,查找只支持“等于60”这种条件,不支持“小于60”这种条件……),所以这类事需要交给VBA来实现,1秒钟就完成。例如Excel百宝箱中的“高级定位”就支持这个功能,可以采用大于、等于、小于、不等于等运算符,而且支持双条件定位。具体请看动画:再如A列中有1000个产品的名称,要求将这1000个产品对应的图片导入到单元格的批注中鼠标指向产品名称时就显示该图片……如果手工完成此项工作,至少需要2小时,而采用VBA则能在两三秒钟内完成。效果如下:4/11Excel百宝箱中有这个功能,参看动画:在本人《ExcelVBA程序开发自学宝典(第2版)》图书中也有这个工具(包括前面的高级定位工具)的源代码,和设计思路分析。三是Excel的某些功能做得不如人意,无法满足工作需求,我们可以采用VBA来改进它。例如A列是姓名,B列是工号,要求输入工号重复时弹出警告提示……说到这里大家一定马上想到“有效性”。诚然,有效性可以实现这个功能,但是有效性极易遭到破坏,当复制其它区域的工号到B列中,设置好的有效性就不再生效了,而改用VBA实现则可以突破这个屏障。Excel百宝箱中也有这个功能,请参阅操作动画,从而更全面的了解VBA所具备的功能:除了以上三类操作,其它功能VBA虽然都可以实现,但是不宜采用VBA来做,而是尽量调用现成的菜单或者按钮,毕竟不需要重写代码。简单而言,对于制表而言,VBA什么都能做,但我们只用VBA处理两类事:一是高难度问题,二是提升工作效率,让重复性的、需要大量时间的工作瞬间完成。明白VBA做实现什么很重要,我们才能对它有清晰地定位,不致于盲目地推崇VBA,也不致于说“懂函数就够了”或者“透视表才是Excel的精华”……接下来要讲的是一个大家很想了解的又从来没有一个权威机构说明过的一个概念:VBA与宏是什么关系?首先声明,我并是VBA界的权威,我只是说说我自己的理解,同时方便大家记忆:宏是VBA的前身,VBA的初级阶段,它不属于编程。而VBA则是编程的范畴了。假设某人只能录制宏、调用代码,那么我们称之为“使用宏”,而某人录制宏后可以修改宏代码或者纯手工编写代码,那么此时他在“使用VBA”。这样说应该比较容易理解吧?第2章学VBA的条件一直以来,对于学习VBA需要具备什么条件,有太多的说法。包括:会英语、懂VB、C+、有编程基础、计算机专业之类。一看这条件就吓退了很多人,我本人每一条都不符合:5/11初中毕业,不懂任何程序语言,初中学的英语单词还会写的就10多个吧,包括OK、YES、NO、ByeBye、Good、loveYou之类……我个人对于学VBA的条件的看法是:懂得Excel的基作操作,包括条件格式、自定义单元格格式、排序、筛选、插入图片/图表、数据有效性、新建工作表、页面设置,会简单的函数、设置Excel选项。因为ExcelVBA编程,其实就是操作工作表、单元格、字符串、图片、图表等等,VBA主要就5个知识点:对象、属性、方法、事件和操作语句(防错语句、条件语句、循环语句、With语句、输入输出语句等),而熟悉Excel基础操作的用户,相当于已经会了对象、属性和方法,事件的知识点较少,两三天就会了,剩下的就只有打作语句了(防错语句、条件语句、循环语句、With语句、输入输出语句等)。换言之,还还没有学一分钟VBA,但是VBA的60%内容你都已经会了。想想VBA是不是世上最容易学的编程语言呢?或者有人说会我会条件格式、自定义单元格格式、排序、筛选等等,但我仍然不懂得编程,放心,只要你懂这些,听了我的后面的课后一小时内你就足以将它们转换成程序,即懂得基础操作就懂得了于少60%的VBA,你需要做的就是如何将基础知识转换成VBA代码,以及学习剩下的40%内容。可以假设一下,A完全不懂Excel,但他懂英语,B完全不懂Excel,但是他懂C+或者C#,C完全不懂C+、VB、C#和英语,但他对Excel的基础操作很熟练,那么我可以断言,三个人中C学VBA最快,而且快很多很多。因为ExcelVBA的优势在于可以通过录制宏产生代码,而懂得了Excel的基础操作后,60%以上的代码就已经学会了,想要什么就录什么,例如不懂得VBA中“有效性”对应的代码怎么写,那么花10秒钟录一下就有代码了,对代码按F1就明白代码的含义了。而对于A和B两人而言,连Excel有中没有“有效性”都不知道,更不知道Excel有录制宏这个东西,也找不到对应的菜单,完全白纸一张,必须从零开始。在后面有专门一节课讲述录制宏,不会的同学也不用着急,本节课仅仅聊下天而已,不涉及编程操作。在我的《ExcelVBA程序开发自学宝典(第2版)》书中有一个序“VBA是什么.txt”,更详细地讲到了这些观点,我先上传一下,大家可以课后看看。第3章学习VBA的方法前面讲述了VBA的条件,让大家有信心学习VBA——其实学习VBA的条件就懂Excel的基础操作,基本上进本群的人都会。不过除了基础之外,想要学好VBA,还得具备耐心、兴趣和逻辑性。耐心:当代码出错时,往往需要在几十行代码中查找哪一句造成的,需要极强的耐心,想速成者多半不可能有啥成就。兴趣:和耐心差不多,因为你对它有足够的兴趣,那么自然就有耐心了,遇到问题时不会退缩,甚至每解决一个问题还会兴奋,那么学习起来自然就高效多了。代码出错是很常见的事,对VBA兴趣够浓者,不会因为初学时代码常出错而放弃。逻辑性:编程就是逻辑性的最佳体现,你的逻辑性是不是够好,直接决定了你是否宜合编程。虽然逻辑一般也可以编程,但是要写出兼容性好、纠错性、效率高的代码是就太有挑战性了。6/11很简单的一个了解你自己是否有逻辑性的方法(其实上看你平常做事的习惯):当你向他人提问时,是否有过问过对方一个问题后,对方看不明白,你再对问题追加条件,对方仍然不明白(或者对方回答了你后),你再继续追加条件,多次反复后才将一个原本一次就足以描述清楚的问题表述完整。再如你做事时是否“先这样吧”、“船到桥头自然直”、“到时再说”,如果有这种习惯,那么很难编出优秀的程序。编程时,我们要处处做最坏的打算,假设用户是一个白痴,一切最坏的情况都可能发生,那么作为程序员必须在代码中加足够多的IF语句,假设遇到什么条件该如何处理,假设遇到另一个情况又以如何处理,如果还有第三种情况,需要如何防范……一切意外处理好后才是正常的操作代码。下图是《Excel2010VBA编程与实践》书中案例7第15页“如何开发完善的程序”的源代码:要求是弹出输入框,在里面输入一数值,然对它开平方,将运算结果保存在活动单元格中。要求很简单,但是使用了六个IF语句判断各种意外情况,不同的意外给出不同的处理方式或者提示自己信息,让用户明白错在哪里,应如何修正……事实上完全按照要求编代码仅用一句就足够:Sub输入一个数值然后获取其平方根()ActiveCell.Value=Sqr(InputBox(请输入数值:,待开方之数值,0))EndSub执行代码能获得上图中同等效果,但是用户一旦不按照程序员预想的方式操作就会麻烦接连不断……所以,想学好VBA,必须有这种良好的习惯:每一步皆有依据,每一个操作都预先做最坏的打算,做好防错工作,让操作员操作失误时能得到人性化的提示或者指引。而不是走一步看一看,等用户反馈问题后再去处理。现在言归正传,讲述应该如何学习VBA。7/111.端正心态。你是在学习一门编程技术,而不是仅止于解决当前工作中的某个疑难。必须有这种心态才可能学好VBA。心态不同,接收知识时关注度和耐心就都不同,遇到问题时处理问题的极积性也不同。2.不要迷恋视频教学视频教学是针对操作性强的技术,包括条件格式、图表、透视表看,没什么理论可言,看他人操作几次就学会了。而编程则刚刚相反,理论远远胜过操作,懂得理论才可能编程,否则你只能解决当前问题罢了,而编程是处理一类问题,而不仅限于当前问题。条件格式、