第1课学习VBA的条件与方法Word文档格式.docx
- 文档编号:21144567
- 上传时间:2023-01-27
- 格式:DOCX
- 页数:13
- 大小:388.96KB
第1课学习VBA的条件与方法Word文档格式.docx
《第1课学习VBA的条件与方法Word文档格式.docx》由会员分享,可在线阅读,更多相关《第1课学习VBA的条件与方法Word文档格式.docx(13页珍藏版)》请在冰豆网上搜索。
关闭对话框回到工作表界面,再按“Alt+F11”组合键打开VBE窗口(即VBA代码编辑界面),单击“插入”→“模块”,然后代码窗口中录入以下代码:
Sub测试VBA版本()
MsgBoxApplication.VBE.Version
EndSub
录入完代码后,光标定位于代码中任意位置,按“F5”键执行代码,也可以按工具栏中的执“运行”按钮(
)执行代码。
代码执行的结果就是当前VBA的开发版本号。
以上仅是说明了VBA一直在进步、在发展,那么ExcelVBA应该如何理认识、理解它呢?
可以这样看:
ExcelVBA就是Excel的功能之一,它们是从属关系,和条件格式、透视表、图表一样附属在Excel中,用于实现某个方面的功能。
所以ExcelVBA不能看做一个软件,它只是Excel软件的附属功能之一。
只不过由于VBA实在过于强大,大家通常不会将它与条件格式、图表等功能平等对待。
对于Excel而言,ExcelVBA可以实现VBA以外的所有功能的集合。
例如条件格式、图表、排序、筛选、透视表、样式、自定义单元格格式、函数与公式、合并计算、分类汇总、数据有效性、规划求解等等一切功能。
当然,尽管VBA能做任何事,但是实际工作中我们仅用VBA来做三类事:
一是非VBA无法完成的事,例如对选区进行背景着色,单击任意单元格,该单元格所在行、列自动着色,效果请参考动画:
二是虽然Excel自带的多个功能组合可以完成,或者可以手工实现,但是利用VBA可可以百倍、千倍提升效率的事。
例如B2:
Z10000区域中是成绩表,要求选中其中所在小于60分的成绩,Excel没有任何工具可以实现这个功能(筛选只能单列有效,查找只支持“等于60”这种条件,不支持“小于60”这种条件……),所以这类事需要交给VBA来实现,1秒钟就完成。
例如Excel百宝箱中的“高级定位”就支持这个功能,可以采用大于、等于、小于、不等于等运算符,而且支持双条件定位。
具体请看动画:
再如A列中有1000个产品的名称,要求将这1000个产品对应的图片导入到单元格的批注中鼠标指向产品名称时就显示该图片……如果手工完成此项工作,至少需要2小时,而采用VBA则能在两三秒钟内完成。
效果如下:
Excel百宝箱中有这个功能,参看动画:
在本人《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+、有编程基础、计算机专业之类。
一看这条件就吓退了很多人,我本人每一条都不符合:
初中毕业,不懂任何程序语言,初中学的英语单词还会写的就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兴趣够浓者,不会因为初学时代码常出错而放弃。
逻辑性:
编程就是逻辑性的最佳体现,你的逻辑性是不是够好,直接决定了你是否宜合编程。
虽然逻辑一般也可以编程,但是要写出兼容性好、纠错性、效率高的代码是就太有挑战性了。
很简单的一个了解你自己是否有逻辑性的方法(其实上看你平常做事的习惯):
当你向他人提问时,是否有过问过对方一个问题后,对方看不明白,你再对问题追加条件,对方仍然不明白(或者对方回答了你后),你再继续追加条件,多次反复后才将一个原本一次就足以描述清楚的问题表述完整。
再如你做事时是否“先这样吧”、“船到桥头自然直”、“到时再说”,如果有这种习惯,那么很难编出优秀的程序。
编程时,我们要处处做最坏的打算,假设用户是一个白痴,一切最坏的情况都可能发生,那么作为程序员必须在代码中加足够多的IF语句,假设遇到什么条件该如何处理,假设遇到另一个情况又以如何处理,如果还有第三种情况,需要如何防范……一切意外处理好后才是正常的操作代码。
下图是《Excel2010VBA编程与实践》书中案例7第15页“如何开发完善的程序”的源代码:
要求是弹出输入框,在里面输入一数值,然对它开平方,将运算结果保存在活动单元格中。
要求很简单,但是使用了六个IF语句判断各种意外情况,不同的意外给出不同的处理方式或者提示自己信息,让用户明白错在哪里,应如何修正……
事实上完全按照要求编代码仅用一句就足够:
Sub输入一个数值然后获取其平方根()
ActiveCell.Value=Sqr(InputBox("
请输入数值:
"
"
待开方之数值"
0))
执行代码能获得上图中同等效果,但是用户一旦不按照程序员预想的方式操作就会麻烦接连不断……
所以,想学好VBA,必须有这种良好的习惯:
每一步皆有依据,每一个操作都预先做最坏的打算,做好防错工作,让操作员操作失误时能得到人性化的提示或者指引。
而不是走一步看一看,等用户反馈问题后再去处理。
现在言归正传,讲述应该如何学习VBA。
1.端正心态。
你是在学习一门编程技术,而不是仅止于解决当前工作中的某个疑难。
必须有这种心态才可能学好VBA。
心态不同,接收知识时关注度和耐心就都不同,遇到问题时处理问题的极积性也不同。
2.不要迷恋视频教学
视频教学是针对操作性强的技术,包括条件格式、图表、透视表看,没什么理论可言,看他人操作几次就学会了。
而编程则刚刚相反,理论远远胜过操作,懂得理论才可能编程,否则你只能解决当前问题罢了,而编程是处理一类问题,而不仅限于当前问题。
条件格式、透视表之类,看我操作几次就能学会,但是如果你只看我编程处理问题的过程,而不从最基本的变量、数据类型、什么是方法、事件等开始,那么看100次仍然不可能学好编程。
编程,重点全在文字理论上,前期50%工作都是理论,后期才涉及操作,所以想仅仅通过看视频学好VBA,而不想看文字者,最终学会VBA的几率一定小于10%。
可以这样说:
只要认真看文字说明(包括书、F1帮助、XX等等)不看任何一集视频,是可以学会VBA的,至于是否能学好,还取决于其它一些条件,包括前面所讲的耐心、兴趣、逻辑性等等。
但是只看视频教材,不看任何文字教材,就算把世上一切视频看完,仍然不太可能学会编程。
基于三个原因:
(1)视频对于编程理论的表现力差,它更偏重于操作性强的问题,纯理论的部分通常都不录。
所以等于看视频学习,直接跳过了最重要的、最基础的层面,直接进入了中级,那么基础不好的前提下是不可能有最终成就的。
(2)视频的内容少,通常文字一页的内容,视频要很久才能体现完整,所以往往看了几十集视频后,发现讲的内容很少。
(3)现实中,视频往往都是出书的作者录制的,包括ET、EH和EP论坛,而录制视频的最终目的就决定的视频的质量(书都出售,而视频是赠送),所以看完视频后仍然不可能学会编程。
所以,在初期学VBA时,切不可拒绝文字理论,只喜欢视频。
3.要学会看帮助。
很多人只接受他人现场指点或者视频教学,而拒绝查帮助,事实上帮助是世上最权威、最全面、最方便的教材。
帮助中有一切对象、属性、方法、事件的写法与用法解释,部分还提供案例。
当你询问他人时,他人往往根据自己的理解告诉你方向,但是他的理解可能不一定正确、也不一定全面,而自带的帮助更有利于完善于的知识体系。
例如工作表函数Trim是干啥用的?
你问10个人,可能八九人都告诉你是删除空格的,而事实上这个答案是错的。
如果你有查帮助的习惯,那么你接受的知识将是正确的:
“除了单词之间的单个空格外,清除文本中所有的空格。
”(当然帮助是也有错误,但极少,比想网友们随口说一句出错的机率小多了)
在下一节课中将讲述如何获得帮助,会有很多查询帮助的小技巧。
本节课你明白帮助的重性即可。
简单地讲,一个不会查看帮助的人,学好编程的几率一定小于10%。
条件格式、图表、透视表之类例外,那些知识不需要帮助,试几次就会了。
4.懂得录制宏。
录制宏很多人都会,但是把录制宏的功能发挥好的人却不多。
经常有人说录制的宏没用,明明录制时是好的,重新调用时就不行了。
或者刚录完可以用,复制到新工作表中就不能用了……这是对录制宏的认识上有偏差。
“录制宏的目的不是使用宏”,这一点必须记住,相当的重要。
录制宏的目的是通过录制宏取得被录制对象的名称,包括操作对象、方法、属性的写法、参数、语法等等,然后根据宏代码做相应的修改。
也就是说,录制宏能帮助我们记忆对象、方法和属性,我们要学的是如何修改它,完善它,而不是直接使用宏,或者直接编写一段代码。
例如:
将“成绩”表中的成绩筛选出大于90分的,然后复制,选择性粘贴到“优秀”工作表中,那么你只需要录制宏就产生了区域引用的写法,以及筛选、复制、粘贴以及工作表引用等等代码,这里面包含了对象、方法和属性,一个都不需要记,全自动产生,把编程的工作量降低到了40%以下。
我本人虽然VBA编程有接近7年了,写了5本关于VBA的书,但是排序、筛选、有效性、条件格式等应该如何写代码一个都不记得。
这并不夸张,因为一次都没有写过,完全没有必要自己写。
当工作中需要编写这些代码时,录一下就自动产生代码了,实在不值得花任何时间去记忆。
而Excel可以录制的内容太多太多了,只要能录的就不要去记,把时间放在其它地方。
具体在哪里地方呢?
(1)几个主要对象的名字,例如应用程序对象Application、工作簿对象Workbook、工作簿集合Wworkbooks、工作表对象workSheet、工作表对象集合、单元格对象Range、单元格对象集合Cells、图形对象Shape、工作表函数对象WorksheetFunction。
记得以上几个名字后,这些对象的属性、方法、事件就全出来了。
例如要理解Range对象有哪些方法、有哪些属性?
在代码窗口中输入Range.即可(后面有一个小圆点),VBA自动产生所有方法名称和属性名称,至于这些名称的含义是什么,F1里面全都有详细的解释。
也就是说记Range对象名称,仅仅一个单词,相当于记住了它上面介对象和方法(必要时录制宏也行)。
当然,当你记住了Range这个单词,那么打开VBA有帮助,输入关键字“Range对象成员”,那么与Range相关的一切方法、属性、事件都出来的,有详细的解释。
也就是说:
只记关键字,四两拨千斤,以一敌万。
而不是全面背诵。
(2)记几个常用语句的写法,包括:
条件语句IFThen…Else
循环语句:
ForNext、ForEach…Next、DoLoop
纠错语句:
Onerrorresumenext、OnErrorGotoLine、Err.Clear
输入语句:
Application.Inputbox
输出语句:
Msgbox、Debug.Print
关闭屏幕新语句:
Application.ScreenUpdating
关闭事件语句:
Application.EnableEvents
关闭提示框语句:
Application.DisplayAlerts
取多区域的合集与交集:
Intersect、Union
(3)常用的几个函数:
Dir函数、Evaluate函数、Split函数、Shell函数、InStr函数、Replace函数
也就是说,学VBA时,需要记的就二三十个单词而已。
对于数据类型名称及其范围,打印出来放在桌上或者钱包中,或者拍成图片放在手机时,在手机中随时都可以查阅,而不需要花时间记长整型怎么写?
有效范围是什么?
简写代码是哪一个?
内容参考下图:
5.做笔记
笔记对于编程而言太重要了。
收集已经编好的代码,代码中需要有详细的注释、编程思路,并分类保存。
例如窗体类、事件类、文件类、查找类、自定义函数类….
以后遇到相近的需求时复制代码出来,并做小小改动即可,从而既节约时间,又避免出错/以及避免耗力记忆代码。
当你有好的笔记后,一旦学会了某个知识点(例如生成自定义菜单),那么一生都不用再管它了,不值得为它花一分钟去记,因为下次复制出来就可以用,改一下菜单名字罢了。
从而事半功倍。
其次是,做笔记之前一定要测试好代码,确保其兼容性、准确性,并有完善的注释,就和操作系统的Ghost备份一样,一旦做好了备份,以后重装系统就三五分钟,而且总是保留你的一切操作习惯,远比全新安装系统更好。
6.多交流
在处理相同问题时,往往不同人有不同的思路,可能当前的代码自认很完善了,但与他人交流后发现天外有天。
他人不一定比你厉害,但是可能站的立场不同,看问题的方式不同,可以提供全新的思路。
另外附加一点,各位如果有买编程方面的书,一定要选择能与作者交流的书,不管是邮件、论坛、QQ群、FaceBook皆可。
因为作者的某些思路你可能看不懂,需要勾通,还可能书中有笔误,需要向作者反馈,双方都可有促进作用。
Over
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 学习 VBA 条件 方法
![提示](https://static.bdocx.com/images/bang_tan.gif)