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