宏这种东西,说话的场合不同、上下文不同,指代的东西就不一样。
但对office软件这种场景来说,宏这个概念简单而清晰:它就是一个VBA写的小程序。
——当然,仅限于office软件。玩C/C++的说的宏是另外一回事,你不需要知道。
VBA是一种编程语言,它是Visual Basic for Applications的缩写;其中basic是一种古老的脚本语言,visual basic是微软的basic升级版,这个升级使得它可以很方便的写图形应用。最后,微软把Visual Basic集成到了office应用(applications)里面,这就是VBA。
我们知道,你在屏幕上的任何操作都会唤起一段程序。
比如,复制文件实际上执行的就是copy这个命令对应的动作;一般来说copy可以接受两个参数,第一个参数是待复制文件,第二个参数是复制位置以及新的文件名。
换句话说,copy是一个接口(或者叫函数、方法、过程等等,不同系统叫法各异,但总体来说都是一回事);我们可以调用它,给它指定源文件和目标文件两个参数,这就完成了文件复制动作。
类似的,当你点了word左上角那个软盘的图标时,实际上就调用了word的save方法;save的默认参数就是当前文件名——当然,如果尚未指定文件名、或者点了“另存为”的话,实质上就是不带参数的调用了document.save,于是就会弹出一个对话框,询问你文件名了。
同样的,你在软件里的一切操作,归根结底都是这么个方法调用(或者叫接口调用、函数调用、功能调用,都行)。
那么,很容易想到,如果我们把用户做的每个动作唤起的那个函数以及参数都记录下来,是不是就可以复制他上一次的操作了?
比如,选择一段文字,把行间距调到10、字体大小调成宋体5号字,再调一调缩进风格……如果把对应的函数调用记下来,存成一个宏——那么,下次再选中一段文字,是不是点一下这个宏就可以自动完成以上工作了?
因此,很多软件,从Photoshop到office,都支持了动作录制——这样用户用起来就方便太多了,对吧。
既然已经允许录制动作了,那么何不更进一步呢?
比如,允许用户把自己录制的动作分发给另一个用户……
——老张!把目录风格改成上次的样子怎么弄?在线等,挺急的……
——哎呀你个小白,我给你说不清楚。这样吧,我录个宏,你导入它,执行一下就完了!
是不是方便多了?
还能更方便一些吗?
当然可以。
既然这些动作说白了就是函数调用、既然已经允许用宏记录连续执行的一堆函数调用了——那么,何不引入顺序分支循环这样的程序流程控制语句,把它搞成一门真正的语言呢?
没错。可以这样做。这就是VBA。
我曾经做过这样一个工具:用户产生一堆数据存进excel,然后需要一些很复杂的整理统计工作,最后产生几个图表——数据量不确定,页面数量也不确定,怎么办呢?
可以让用户逐个切换一堆sheet、然后选中所有数据并点宏。这个办法可以解决问题,但是一旦漏点多点统计结果就出错了——当然这比自己整理要方便一些,也更不容易出错;可显然太麻烦太不安全了……
简单。通过程序自动切换每个sheet、然后自动调用宏完成计算——整体只需点一次按钮就够了。
不仅如此,我还可以用宏自动批量导入数据(于是用户不需要自己一个个sheet指定文件慢慢导入了)、用usedrange自动取得数据行列数、然后自动用循环完成统计并生成统计页面、再在上面插入饼图、折线图……
我们的工具一次运行经常会产生几十页的数据;在过去,这些数据需要一个熟手忙活一整天、动不动还会出错;但有了我这个工具,一切就可以在几秒内自动完成——只要把数据放到同一个目录,然后点宏,在弹出框中选择正确目录,程序会自动完成剩下的所有工作。
还能更给力点吗?
可以。
我做的另一个小工具,给做测试的同事用的。他只需填写用例名称、用例步骤等信息,一点按钮,程序就会自动生成用例;再一点,自动执行所有用例;执行结束,用例执行结果、输出的所有信息就会被分门别类的收集起来,在excel中展示——甚至可以折叠细节、只看汇总;也可以随时点开查看每一个细节……
一个功能还算强大的专业工具就诞生了。
甚至于,还有人用它写游戏、写音乐播放器、写一切你想都想不到的东西——只要会编程,这些都挺简单的。
既然宏的功能如此强大,那么自然就会有人滥用它。
其实也很简单——无论原理还是实现,都简单的要命——office里面有个东西叫“模板”,其中的normal.dot模板是默认给所有文档用的,里面的宏可以在你新建文档时自动套用……
为了方便用户,微软做了个约定:如果你把宏叫autorun(或者auto?具体记不清了,大致就这意思),那么它就会在文档打开时第一时间运行。
这样用来干正事自然很方便,比如你的工作就是写格式文档,那么用个宏,自动把标题啥的都帮你填好、设置好格式,你只需打字就好了——多方便啊。
但有些心术不正的人就盘算了:既然如此,那么我也可以在用户新建文档时自动给他插个autorun宏进去啊……然后这个宏会在打开文档后自动执行,再把自己插进normal.dot里面去——那么,如果有人拷贝了这个文件,在自己的计算机上打开……是不是就传染给它了?
继续,更简单的,既然用户打开文档就能触发这个autorun宏,那么我自动判断一下,日期等于13号就把他的文件内容删了并立即存盘、关闭,看他哭不哭!
更狠一点的,遍历他的磁盘,删除一切可以删除的文件……
你看,就这么简单——所以我一直说,写病毒和技术无关,编程入门、心眼足够脏,足够了。
总之,这种损人不利己的宏病毒让微软大伤脑筋、也让office用户谈虎色变。
因此,当时就流行一种“因噎废食解决法”,就是删除normal.dot等几个模板文件、禁用宏,这样宏病毒就流行不起来了。
当然,现在office不再不声不响的运行宏、还会提示你是否启用宏、如果启用会遭受风险,等等——那些哗众取宠的脏心眼垃圾拿这个没办法,宏病毒渐渐就销声匿迹了。
宏一般是指macro。计算机里的话,macro一般指一种集合,该集合会包含需要重复执行的一系列操作。所以有时候,宏也指该重复操作的脚本。
其实类似的东西,不要太纠结它的名称,搁VB的场合,也可以叫sub(子程序),搁很多场合,又可以叫函数,搁OO的场合得叫方法……
它叫什么不重要,你今天叫云天河,明天也可以叫云阿三。