分享

如何正确学习VBA,才能省心省力又高效?

 L罗乐 2016-10-08

一、什么是VBA?

    VBA是多种应用程序通用的扩展性语言,附加在其主体程序中,为强化其主体程序之功能而存在。VBA能在AutoCAD、CorelDRAW、Excel、Word、PowerPoint、FrontPage、WPS等应用程序中使用,其中Excel VBA是指应用于Excel中、可扩展Excel功能的VBA编程语言,这是本书的重点。不过VBA不管附在何种应用程序中,其语法总保持一致,不同的只是应用程序的对象、属性和方法而已。所以学会了Excel VBA后,再学Word VBA或者PowerPoint VBA将得心应手、事半功倍。

    Excel为VBA提供了专用的界面,即VBE窗口(Visual Basic Editor),在工作表界面按下【Alt+F11】组合键即可打开该窗口。该窗口中包括了菜单栏、工具栏、工作簿与工作表对象、代码窗口等,所有与VBA编程相关的操作皆在此完成,而调用VBA代码则既可在工作表中完成,也可在VBE界面执行。如果代码具有自动执行功能,那么符合条件时代码会自动启动,不需要人工干预。如下图为VBE界面,其中工作表、工作簿名称将随每个用户的实际环境变化而变化,不会完全统一。

    Excel VBA的价值是强化Excel的功能,所以它只适合做与Excel相关的事,只能开发出Excel插件。如果需要开发进销存、ERP、网页系统等,请选用其他软件。

以下解析VBA的优缺点:
      VBA是微软用于取代宏的编程语言,其功能复杂、强大,能实现制表相关的一切功能。在学习VBA之前,有必要了解VBA的优缺点。


1、优点:
     相对于Excel的诸多其他功能,VBA无疑是最强大的。VBA能实现其他一切工具所能实现的功能,但是VBA能完成的工作,其他工具却不一定能实现。此处所指的“其他工具”是指排序、筛选、条件格式、数据有效性、函数、图表、透视表等常规功能。当使用VBA后,可以通过VBA自动化实现录入数据以外的任何功能,而且准确、高效。例如在A1:A10000区域插入10000张图片,且将图片全部调整为所在单元格的大小,其位置刚好与单元格上边距与左边距一致,若手工实现此功能至少需要几个小时,而用VBA则可以在几秒内完成。再如将1000个工作簿中的所有工作表合并到一个工作簿中,手工操作同样需要1小时以上,且由于工作量大、步骤较多,操作过程很难确保不会遗漏某个数据,而采用VBA实现同等功能仅需按下快捷键,数秒后即可自动完成,快捷而准确。相对于其他程序语言,Excel VBA属于最简单的编程工具,超过60%的代码可由录制宏产生,不需要每个对象名称、属性和方法都花费精力去记忆。以Delphi为例,学好Delphi需要花费多于VBA三倍的精力。


2、缺点:
     Excel VBA属于Excel的功能之一,在Excel 的众多功能中,涉及理论知识最多的就是VBA,它较函数、图表、透视表等工具更复杂,需要更长的学习时间,这也是众多用户对VBA望而生畏的原因。好在Excel支持录制宏,60%以上的知识点都可以跳过,大大节约了工作量。

以下是VBE界面:
 
###分隔线### www. ##

二、学习VBA的条件

    一直以来,对于学习VBA需要具备什么条件,有太多的说法。包括:会英语、懂VB、C 、有编程基础、计算机专业之类。一看这条件就吓退了很多人,我本人每一条都不符合:不懂任何程序语言,也不是计算机专业,学的英语单词在高中已还给老师.....

我个人对于学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有录制宏这个东西,也找不到对应的菜单,完全白纸一张,必须从零开始。


    在后面有专门一节课讲述录制宏,不会的同学也不用着急,本节课仅仅聊下天而已,不涉及编程操作。

###分隔线### www. ##




三、学习VBA的方法

    前面讲述了学习VBA的条件,让大家有信心去学习VBA——其实学习VBA的条件就是懂Excel的基础操作,基本上进本群的人都会(群号:162631782)。不过除了基础之外,想要学好VBA,还得具备耐心、兴趣和逻辑性(掌握数列的规律)。


    耐心:当代码出错时,往往需要在几十行代码中查找哪一句造成的,需要极强的耐心,想速成者多半不可能有啥成就,作者在日常VBA编程中也经常调试出错的代码,同一段代码有时调试近一天时间,甚至几天。代码出错是很常见的事,对VBA兴趣够浓者,不会因为初学时代码常出错而放弃,反而出错后调试代码也可以是一种乐趣,作者经常以调试代码为乐,因为把出错的代码找出错误的原因,只会让你知识更上一层楼。


    兴趣:和耐心差不多,因为你对它有足够的兴趣,那么自然就有耐心了,遇到问题时不会退缩,甚至每解决一个问题还会兴奋,那么学习起来自然就高效多了,所以常说兴趣是最好的老师。


    逻辑性:编程就是逻辑性的最佳体现,你的逻辑性是不是够好,直接决定了你是否适宜编程。虽然逻辑一般也可以编程,但是要写出兼容性好、纠错性、效率高的代码是就太有挑战性了。
很简单的一个了解你自己是否有逻辑性的方法(其实上看你平常做事的习惯):当你向他人提问时,是否有过问过对方一个问题后,对方看不明白,你再对问题追加条件,对方仍然不明白(或者对方回答了你后),你再继续追加条件,多次反复后才将一个原本一次就足以描述清楚的问题表述完整。再如你做事时是否“先这样吧”、“船到桥头自然直”、“到时再说”,如果有这种习惯,那么很难编出优秀的程序。

    编程时,我们要处处做最坏的打算,假设用户是一个白痴,一切最坏的情况都可能发生,那么作为程序员必须在代码中加足够多的IF语句,假设遇到什么条件该如何处理,假设遇到另一个情况又以如何处理,如果还有第三种情况,需要如何防范……一切意外处理好后才是正常的操作代码。



  1. Sub 输入一个数值然后获取平方根()    

  2.     Dim Value

  3.     If TypeName(ActiveSheet) = 'Chart' Then MsgBox '不要选择图表': Exit Sub

  4.     If ActiveSheet.ProtectContents Then MsgBox '工作表已保护': Exit Sub

  5.     Value = InputBox('请输入数值:', '待开方之数值', 0)

  6.     If Len(Value) = 0 Then Exit Sub

  7.     If VBA.IsNumeric(Value) Then

  8.         On Error Resume Next

  9.         Debug.Print ActiveCell.CurrentArray

  10.         If Err = 0 Then MsgBox '请不要选择数组区域': Exit Sub

  11.         If Not Value < 0 Then ActiveCell.Value = Sqr(Value) Else MsgBox '不能小于0'

  12.     Else

  13.         MsgBox '不能输入文本', 64, '提示'

  14.     End If

  15. End Sub

复制代码

以上代码要求是弹出输入框,在里面输入一数值,然对它开平方,将运算结果保存在活动单元格中。要求很简单,但是使用了六个IF语句判断各种意外情况,不同的意外给出不同的处理方式或者提示自己信息,让用户明白错在哪里,应如何修正……
事实上完全按照要求编代码仅用以下一句就足够:

  1. Sub 输入一个数值然后获取其平方根()

  2. ActiveCell.Value = Sqr(InputBox('请输入数值:', '待开方之数值', 0))

  3. End Sub

复制代码

执行代码能获得跟最顶上的那段代码同等效果,但是用户一旦不按照程序员预想的方式操作就会麻烦接连不断……
所以,想学好VBA,必须有这种良好的习惯:每一步皆有依据,每一个操作都预先做最坏的打算,做好防错工作,让操作员操作失误时能得到人性化的提示或者指引。而不是走一步看一看,等用户反馈问题后再去处理。



  注意: 运行代码前,我们必须先启用宏才能正常运行代码步骤如下:
打开“Excel选项”对话框,并进入信任中心,将其设置选项由“禁用所有宏,并发出通知”修改为“启用所有宏”,如下图:
 


   如果不启用宏,那是无法运行代码的,切记!
   关闭对话框回到工作表界面,再按“Alt F11”组合键打开VBE窗口(即VBA代码编辑界面),单击“插入”→“模块”,然后代码窗口中录入左手边的代码,录入完代码后,光标定位于代码中任意位置,按“F5”键执行代码,也可以按工具栏中的执“运行”按钮执行代码

###分隔线### www. ##

现在言归正传,讲述应该如何学习VBA。

1、端正心态
    你是在学习一门编程技术,而不是仅止于解决当前工作中的某个疑难。必须有这种心态才可能学好VBA。心态不同,接收知识时关注度和耐心就都不同,遇到问题时处理问题的极积性也不同。



2、学会看帮助
      很多人只接受他人现场指点或者视频教学,而拒绝查帮助,事实上帮助是世上最权威、最全面、最方便的教材。帮助中有一切对象、属性、方法、事件的写法与用法解释,部分还提供案例。
     当你询问他人时,他人往往根据自己的理解告诉你方向,但是他的理解可能不一定正确、也不一定全面,而自带的帮助更有利于完善于的知识体系。例如工作表函数Trim是干啥用的?你问10个人,可能八九人都告诉你是删除空格的,而事实上这个答案是错的。如果你有查帮助的习惯,那么你接受的知识将是正确的:“除了单词之间的单个空格外,清除文本中所有的空格。”(当然帮助是也有错误,但极少,比想网友们随口说一句出错的机率小多了)
    在下一节课中将讲述如何获得帮助,会有很多查询帮助的小技巧。本节课你明白帮助的重性即可。简单地讲,一个不会查看帮助的人,学好编程的几率一定小于10%。条件格式、图表、透视表之类例外,那些知识不需要帮助,试几次就会了。


3、懂得录制宏
    录制宏很多人都会,但是把录制宏的功能发挥好的人却不多。经常有人说录制的宏没用,明明录制时是好的,重新调用时就不行了。或者刚录完可以用,复制到新工作表中就不能用了……这是对录制宏的认识上有偏差。
    “录制宏的目的不是使用宏”,这一点必须记住,相当的重要。录制宏的目的是通过录制宏取得被录制对象的名称,包括操作对象、方法、属性的写法、参数、语法等等,然后根据宏代码做相应的修改。
    也就是说,录制宏能帮助我们记忆对象、方法和属性,我们要学的是如何修改它,完善它,而不是直接使用宏,或者直接编写一段代码。
    例如:将“成绩”表中的成绩筛选出大于90分的,然后复制,选择性粘贴到“优秀”工作表中,那么你只需要录制宏就产生了区域引用的写法,以及筛选、复制、粘贴以及工作表引用等等代码,这里面包含了对象、方法和属性,一个都不需要记,全自动产生,把编程的工作量降低到了40%以下。
     特别是排序、筛选、有效性、条件格式等应该如何写代码,因为可以录制的,所以完全没有必要自己写。当工作中需要编写这些代码时,录一下就自动产生代码了,实在不值得花任何时间去记忆。而Excel 可以录制的内容太多太多了,只要能录的就不要去记,把时间放在其它地方。具体在哪里地方呢?
    (1)几个主要对象的名字,例如应用程序对象Application、工作簿对象Workbook、工作簿集合Wworkbooks、工作表对象workSheet、工作表对象集合、单元格对象Range、单元格对象集合Cells、图形对象Shape、工作表函数对象WorksheetFunction。
     记得以上几个名字后,这些对象的属性、方法、事件就全出来了。例如要理解Range对象有哪些方法、有哪些属性?在代码窗口中输入Range.即可(后面有一个小圆点),VBA自动产生所有方法名称和属性名称,至于这些名称的含义是什么,F1里面全都有详细的解释。也就是说记Range对象名称,仅仅一个单词,相当于记住了它上面介对象和方法(必要时录制宏也行)。

 

   当然,当你记住了Range这个单词,那么打开VBA有帮助,输入关键字“Range对象成员”,那么与Range相关的一切方法、属性、事件都出来的,有详细的解释。 如有下图---》
 
###分隔线### www. ##

也就是说:只记关键字,四两拨千斤,以一敌万。而不是全面背诵。
(2)记几个常用语句的写法,包括:
条件语句IF Then…Else
循环语句:For Next、For Each…Next、Do Loop
纠错语句:On error resume next、On Error Goto Line、Err.Clear
输入语句:Application.Inputbox
输出语句:Msgbox、Debug.Print
关闭屏幕新语句:Application.ScreenUpdating
关闭事件语句:Application.EnableEvents
关闭提示框语句:Application.DisplayAlerts
取多区域的合集与交集:Intersect、Union
(3)常用的几个函数:
Dir 函数、Evaluate函数、Split函数、Shell 函数、InStr函数、Replace函数
也就是说,学VBA时,需要记的 就二三十个单词而已。

    对于数据类型名称及其范围,打印出来放在桌上或者钱包中,或者拍成图片放在手机时,在手机中随时都可以查阅,而不需要花时间记长整型怎么写?有效范围是什么?简写代码是哪一个?内容参考下图:

###分隔线### www. ##

4、做好笔记

    笔记对于编程而言太重要了。

    收集已经编好的代码,代码中需要有详细的注释、编程思路,并分类保存。

    例如窗体类、事件类、文件类、查找类、自定义函数类….

    以后遇到相近的需求时复制代码出来,并做小小改动即可,从而既节约时间,又避免出错/以及避免耗力记忆代码。

    当你有好的笔记后,一旦学会了某个知识点(例如生成自定义菜单),那么一生都不用再管它了,不值得为它花一分钟去记,因为下次复制出来就可以用,改一下菜单名字罢了。从而事半功倍。

    其次是,做笔记之前一定要测试好代码,确保其兼容性、准确性,并有完善的注释,就和操作系统的Ghost备份一样,一旦做好了备份,以后重装系统就三五分钟,而且总是保留你的一切操作习惯,远比全新安装系统更好。
    (本人除了把理论知识和学习方法记在word里面,大多数的代码都保存在VBA代码盒子里,要使用相关代码的时候,只需要搜索一下,或者点击一下即可得到代码,再通过修改一下代码或者把多段不同功能的代码组合一下便是新的程序功能了,前提得有较牢固的基础,所以本人一直以来都强调基础的重要性!)


   附上一个VBA代码盒子的演示:

http://www./bbs/forum.php?mod=redirect&goto=findpost&ptid=512&pid=1565&fromuid=3     
###分隔线### www. ##

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多