vba是什么,如何编写和运行VBA代码?

 生活杂谈     |      2020-02-08 17:32
  HI,大家好,我是星光,今天咱们来继续学习VBA。在上一章咱们讲了为什么要学习VBA~VBA还值不值得学~学了还有没有用~零基础学VBA编程01:VBA还能不能学?学了还有没有用?
  这一章咱们再来简单回答几个小问题:什么是VBA?如何编写和运行VBA代码?
  什么是VBA
  先来看第一个问题,什么是VBA?
  你学了一段时间VBA,有一天有个异性朋友问……
  “小胖,你最近在学什么呀?”
  “VBA!”
  “VBA是什么呀?”“VBA就是……反正很厉害,它可以减少很多重复性的工作,可以很轻松就让Excel简易化自动化智能化,你听我说,它还可以做人机交互界面,完成Excel自身功能无法完成的高度复杂的任务,还能够一键生成Word和PPT,你说厉害不厉害?”
  “听不太懂哎——它和VAR是什么关系?没关系?那和BRA呢?也没关系?那V是什么?B是什么?A又是什么?”“……”你很茫然,于是想起了那个叫百度的混蛋,默默搜索了一番。
  什么是VBA?VBA是Visual Basic For Application的简称,是VB语言的一个分支,是一种建立在Office应用程序中的开发工具,是……——然而知道这概念也啥实际用处,因为你的异性朋友依然听不懂你在说什么。
  “还是听不太懂哎,对了,VBA是不是宏?”
  “宏?”
  “就是病毒!”
  “病毒?不不不,有的不是病毒,有的……”
  “那就是病毒咯!”
  你无语,只好继续百度。
  什么是宏?宏来源于英文单词“marco”,是一种批量处理的称谓,暗示着将小命令或动作转化为一系列指令,是软件提供的一种特殊功能,也就是说宏并非Office软件所独有,因此从广义上来说,VBA确实是一种宏,但宏却未必是VBA……
  宏是不是病毒?这就好比问人是不是好人?人当然有好人也有坏人,好人也可能做坏事,坏人也可能做好事,人是不是好人,得看在某个时间里TA做了什么事,这就不是薛定谔的猫……
  “VBA是一种非常简单实用的编程语言,它可以做坏事,也可以做好事……”你尝试着解释。“编程?那小胖你就是程序猿咯?”她看了看你的发际线,“嗯,看起来确实有一点儿像。”“不……不是……你误会了!程序猿是一个职业的称呼,并不是会一点编程就是程序猿,还需要穿格子衫,还……”
  “听不懂哎。”她看着你的发际线。
  “……”
  ……
  且不管你的发际线到底怎么样,咱们还是大体了解了VBA是什么,那么——如何编写VBA呢?
  谈到编写VBA,就不得不说一下VBE……
  什么是VBE
  大部分编程语言都有自己的集成开发环境IDE(Integrated Development Environment),它为用户提供了代码编写功能、分析功能、调试功能等,比如语法高亮、语句自动补全、参考资料……
  VBA也不例外,VBA的代码编辑器依托于Office软件,又被称为VBE(Visual Basic Editor)窗口——换句话说,VBE窗口也就是咱们以后编写VBA程序的地方。长相有点儿寒酸,如下图所示。

vba是什么
  进入VBE窗口常用方式有以下几种。
  ▎第1种方式是快捷键<ALT+F11>。
  ▎第2种方式是右键单击任意工作表标签,在弹出的快捷菜单中选中【查看代码】命令。
  ▎第3种方式是在【开发工具】选项卡中进行操作。
  ……我们知道Excel有功能区,功能区内有选项卡,每个选项卡对应不同的功能分类。比如【开始】选项卡集中了用户最常使用的功能;【插入】选项卡集中了透视表、图形和图表等功能;【页面布局】是打印;【公式】是函数公式……【开发工具】选项卡则属于VBA的地盘。
  不过在默认状态下,Excel功能区并不显示【开发工具】选项卡。这是由于VBA属于Excel的高级功能,既然是高级功能自然要享受一番特殊的待遇——不要说什么人人平等这样骗人的鬼话,毕竟Excel它不是人——这待遇就是关起来不能主动见人。
  在【文件】选项卡中单击【选项】命令,打开【Excel选项】对话框。在该对话框中,单击【自定义功能区】选项卡,在右侧列表框中选中【开发工具】复选框,单击【确定】按钮关闭【Excel选项】对话框,即可在功能区中显示【开发工具】选项卡。
  在【开发工具】选项卡中单击【Visual Basic】或者【查看代码】按钮即可进入VBE。
  ……
  打个响指,一起来详细认识下VBE吧,毕竟以后咱们就靠它编写VBA代码了,无论如何总得混个面熟先。
  认识VBE
  VBE有菜单栏、工具栏和功能窗口三部分组成。
  菜单栏的选项卡比较多,现在说了你也记不住,就等用到时咱们再说。这里先重点说下功能窗口。
  功能窗口又分为【工程资源管理器窗口】、【属性窗口】、【代码窗口】、【立即窗口】、【本地窗口】等五大窗口。
  不同的窗口功能和作用如下。
  1、工程资源管理器窗口
  工程资源管理器窗口,顾名思义,也就是管理工程资源的地方;这里的工程指的是工作簿中模块的集合。它呈现树形结构,包含4类对象:Excel对象(工作表和工作簿)、模块对象、窗体对象和类模块对象。
  一个新建工作簿的工程资源管理器窗口默认只有工作表对象和ThisWorkbook对象;但我们需要重点了解的是模块对象,绝大多数的VBA过程都是在模块对象中编辑和保存的。
  依次单击【菜单】→【插入】→【模块】,即可生成一个模块和模块对应的【代码窗口】。在【代码窗口】中我们可以新建或编辑VBA过程。
  2、属性窗口
  属性窗口用来查看和设置对象的属性,比如设置窗体颜色、大小、设置工作表对象的显示状态为深度隐藏等。
  3、代码窗口
  代码窗口用来显示和编辑VBA代码。【工程资源管理器】中每个对象都拥有自己的代码窗口,双击某个对象,即可在VBE中打开该对象的代码窗口。
  代码窗口分为上下两个部分,上部为对象列表框和过程/事件列表框,下部为代码编辑区。
  4、立即窗口
  立即窗口常用于代码调试,在该窗口输入代码,按回车键即可看到代码执行后的结果。除了在立即窗口中直接输入代码外,也可以在VBA代码中使用Debug.Print命令将指定内容输入到立即窗口中,这在代码调试过程中较为常用。
  不过需要注意的是,立即窗口和代码窗口不同。当Excel程序关闭后,系统会自动清除立即窗口中的内容。
  5、本地窗口
  本地窗口将自动显示出当前过程中所有的变量声明和变量值,而且会随着代码运行的过程自动更新显示,这是我们调试代码最主要的依据。
  ……
  小贴士:
  在Excel中,以上窗口并非全部默认显示。单击VBE菜单栏上的【视图】选项卡,会打开一个选项菜单,熊迪们可以根据需要选择显示相应的功能窗口,通常建议至少选择显示【工程资源管理器窗口】、【代码窗口】和【本地窗口】。
  了解完了VBE代码编辑窗口,下一个问题是,如何编写VBA代码?
  如何编写VBA代码
  看我手——歪,图,思锐……编写VBA代码的方式常用的有三种。
  第一种方式:复制粘贴
  别笑,严肃点,俺是认真的。要知道搜罗优秀代码、复制粘贴化为己用是编写程序的基本能力,是程序员不可或缺的左膀右臂,不管你是新手还是高手,天下代码早晚都不过一个抄字——不过咱们得知道哪些能抄?哪些不能抄?哪些抄了之后必须要修改。
  第2种方式:自己写
  自己写的意思就是打开VBE,在模块等对象的代码窗口内自己编写VBA代码(这是一句废话)。复制粘贴固然属于天下无双的神技,但并不适合细节迥异的具体问题处理,所以至少你得知道代码的逻辑是否正确;结构是否合理;局部的代码应该如何修改——而有些时候,修改别人的代码,还不如自己重新编写来的爽快。
  第3种方式:录制宏
  录制宏的意思是让勤快又善良的Excel帮咱们自动写代码。对于VBA初学者来说,最烦恼的事情莫过于Excel的对象太多了,每个对象的属性和方法又太多了,层层叠叠,头大的让人记不住——其实完全没必要记住,想要知道某个对象的属性和方法?根据需求录制一段宏,查看下Excel自动生成的代码就一目了然了。
  比如说,你想要知道如何使用VBA代码设置单元格边框线以及标题行文字加粗并居中显示,可以使用以下操作。
  步骤1:在【开发工具】选项卡下单击【录制宏】命令,打开【录制宏】对话框。根据需要在【录制宏】对话框的【宏名】文本框中输入宏的名称,当然也可以保持默认值不变,然后单击【确定】按钮
  步骤2:设置A1:D10单元格区域的边框线为所有边框线,将A1:D1标题行的字体加粗并居中显示。最后在【开发工具】选项卡下单击【停止录制】命令,结束录制宏。
  步骤3:按<ALT+F11>快捷键打开VBE窗口,在模块中即可看到Excel自动生成的VBA代码。
  以上代码看似繁杂混乱,但如果您已有一定的VBA编程基础,还是不难从中分辨出哪些代码是设置边框线,哪些代码是设置字体加粗和居中显示的;而我们只需要复制相关代码,稍加修改即可直接使用。
  当然,录制宏的作用不止如此。
  有一些朋友,出于各种原因无意深入学习VBA,却又希望借助VBA提升工作效率,甚至实现数据处理自动化——当然也是可以的,这就是民间流传的录制宏+函数公式的组合。
  借助录制宏,我们可以使函数公式自动输入,进而实现数据处理的自动化。
  我举一个简单的小栗子。
  如下图所示,有两张表,一张表是数据源,一张表是查询表。咱们需要制作一个数据查询的模版;在查询表的B列,计算A列人员对应的考试成绩——你会怎么处理呢?
  步骤1:在【开发工具】选项卡下单击【录制宏】,打开【录制宏】对话框,在【宏名】文本框中输入内容:我的查询,并【确定】。
  步骤2:在B2单元格输入以下函数公式:
  =IFERROR(VLOOKUP(A2,成绩表!A:B,2,0),"")
  向下复制填充到B2:B5000单元格区域;然后复制B2:B5000单元格区域,使用选择性粘贴为数值的方式,将公式计算结果粘贴为数值,最后停止录制宏。
  如此一来,Excel就自个生成了一段代码,这段代码的作用是自动使用VLOOKUP函数查询A2:A5000单元格范围内的人名在成绩表中的考试成绩。
  于是新的问题来了——如何运行这段VBA代码?
  如何运行VBA代码
  以运行上述名为“我的查询”的录制宏为例,说下四种常见的优势各异的运行VBA代码的方式。
  第1种方式:快捷键
  在【开发工具】选项卡下,单击【宏】按钮,打开【宏】对话框。在该对话框中选中宏名“我的查询”。
  在右侧单击【选项】按钮,打开【宏选项】对话框;设置快捷键为Ctrl+q,最后单击【确定】按钮,依次关闭对话框。
  设置完成后,只需按下快捷键<Ctrl+q>,系统就会自动运行相应宏。
  想象一下吧小同志,你背靠皮椅,小眼微眯,手指轻动,一个函数都不漏痕迹,只是按下快捷键<Ctrl+q>,Excel就会自动为你获取数据查询结果,是不是骚秀气满满抑或霸巴适气侧漏?
  不过需要注意的是,这里设置的宏快捷键会覆盖Excel默认的快捷键。比如将宏的快捷键设置为<Ctrl+F>,<Ctrl+F>也就不再执行原来的打开【查找与替换】对话框功能了。
  第2种方式:插入按钮
  快捷键的方式虽好,久而不用却难免会忘,此外它也不适合广泛用于制作通用模版。此时我们可以设置一个按钮,通过它来执行指定的宏。
  在【开发工具】选项卡下依次单击【插入】→【按钮(窗体控件)】按钮。在工作表中绘制一个大小随心的按钮,松开鼠标左键后,系统会自动弹出一个【指定宏】对话框,选中所需宏名,比如本例“我的查询”,单击【确定】按钮,即可将该按钮关联给宏“我的查询”。
  设置完成后,单击该按钮,即可执行相应的宏代码。
  ▎小贴士
  <1>:右键单击按钮,在弹出的快捷菜单中单击【编辑文字】,可以修改按钮的名称,比如修改为“朕要工作了!”
  <2>:除了插入按钮外,也可以插入图形或图片等对象,实现类似关联运行宏代码的效果。
  第3种方式:功能区宏按钮
  如果一个工作簿的宏命令比较多,以至于你一时间找不到相关按钮的位置,就可以使用这种方式来运行宏了。
  在【开发工具】选项卡下单击【宏】按钮,在弹出的【宏】对话框中选择【我的查询】选项,单击【执行】按钮即可运行该宏。
  第4种方式:在VBE中运行宏
  在代码开发过程中,经常需要多次运行和调式VBA代码,此时就需要在VBE中直接运行宏。
  单击“我的查询”过程代码的任意位置进入编辑状态,然后单击工具栏上的【运行子过程/用户窗体】按钮,或者按快捷键<F5>,即可运行该过程代码。
  ……
  上面咱们聊了运行宏的4种方式,但是有个姓慕容的姑娘说过,爱情不是你想来,想来它就来,宏也不是你想运行……它就一定能运行。
  有时候你打开一个工作簿,单击按钮,会弹出如下提示框。
  出现该提示框的原因通常有两种,一种是该按钮没有指定宏(或者曾经指定过宏,但相关宏被删除/更名了),另一种是该工作簿所有的宏确实被禁用了——这就要聊到宏的安全性问题。
  设置宏的安全性
  咱们在前面什么是VBA里讲过,在很多人眼中宏是病毒的代名词,这是由于宏在给Office用户带来极大便利的同时,也带来了潜在的风险。它可以轻而易举的控制或运行电脑中的应用程序,生成计算机病毒或恶意功能。
  Excel通常默认不允许运行工作簿中的宏,并提供了【宏安全性设置】功能。
  在【开发工具】选项卡下单击【宏安全性】按钮,可以打开【信任中心】对话框。在宏设置下,可以看到如下图所示的四个选项。
  一般来说,推荐使用【禁用所有宏,并发出通知】选项。
  启用该选项后,打开保存在非受信任位置的包含宏的工作簿时,在Excel功能区下方会显示【安全警告】消息栏,告知用户工作簿中的宏已经被禁用,是否【启用内容】。
  当用户在消息栏中选择【启用内容】后,该文件会自动成为受信任的文档,再次打开该文件,系统不再显示【安全警告】消息栏。
  当用户没有选择【启用内容】,而是直接进行了其它Excel窗口的操作,【安全警告】的消息框会自动消失,并默认用户不选择启用宏。此时如果你又想启用宏了——不好意思,爱情不是你想来想来他就来,麻烦你关闭重启Excel工作簿再和【安全警告】的消息框打个招呼吧~
  如何保存带宏的文件
  最后一个问题:当我们编写了一段宏代码,运行测试成功后,就需要将文件保存——那么如何保存包含宏代码的Excel文件?这问题问的似乎有点儿傻气,但以我常年扎根底层的沧桑而忧郁的双眸来看,还是很有必要说一下地——
  ……在Excel基础入门教程的篇章里咱们曾经讲过,Excel的文件格式类型有很多种,最常用的是xlsx,但这种格式的文件并不支持保存宏代码,它会自动抹除VBE或其它位置的宏。
  只有古老的03版Excel、二进制工作簿(xlsb)和以字母“m”结尾的文件格式(xlsm,xltm,xlam)才可以用于保存宏代码的文件,其中最常使用的是xlsm格式。
  ——因此,敲黑板,在你学习VBA的过程中,请务必先将工作簿另存为xlsm格式。
  为什么这么说?
  我有个叫随风小妞的前女朋友,经常不记得将Excel文件另存为xlsm格式,而是直接使用xlsx格式编写代码。每当代码临近完成调试,却有不小机率不幸死机,于是代码全军覆没尸骨无存。你想想,你想想他当场哭的梨花带雨的模样,岂是一个惨字了得?
  希望你不要重蹈他的覆辙,更不要哭的梨花带雨我见不怜……
  致安,愿你不再因Excel而烦恼,我是星光,咱们下期再见。
  图文制作:看见星光
  原载公众号:Excel星球