1.3 使用VBA强化Excel功能
让操作自动化,VBA无疑是首选。当你熟练使用VBA后,可以让代码全自动执行,除了录入数据之外的所有工作都可以通过VBA自动完成。确切地说,VBA是办公效率之源,能让制表文员完全从繁重的工作中解脱出来。
1.3.1 追根溯源:什么是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界面执行。如果代码具有自动执行功能,那么符合条件时代码会自动启动,不需要人工干预。图1.14为VBE界面,其中工作表、工作簿名称将随每个用户的实际环境变化而变化,不会完全统一。
图1.14 VBE界面
Excel VBA的价值是强化Excel的功能,所以它只适合做与Excel相关的事,只能开发出Excel插件。如果需要开发进销存、ERP、网页系统等,请选用其他软件。
1.3.2 知己知彼:解析VBA的优缺点
VBA是微软用于取代宏的编程语言,其功能复杂、强大,能实现制表相关的一切功能。在学习VBA之前,有必要了解VBA的优缺点。
↘ 优点
相对于Excel的诸多其他功能,VBA无疑是最强大的。VBA能实现其他一切工具所能实现的功能,但是VBA能完成的工作,其他工具却不一定能实现。此处所指的“其他工具”是指排序、筛选、条件格式、数据有效性、函数、图表、透视表等常规功能。
当使用VBA后,可以通过VBA自动化实现录入数据以外的任何功能,而且准确、高效。例如在A1:A10000区域插入10000张图片,且将图片全部调整为所在单元格的大小,其位置刚好与单元格上边距与左边距一致,若手工实现此功能至少需要几个小时,而用VBA则可以在几秒内完成。再如将1000个工作簿中的所有工作表合并到一个工作簿中,手工操作同样需要1小时以上,且由于工作量大、步骤较多,操作过程很难确保不会遗漏某个数据,而采用VBA实现同等功能仅需按下快捷键,数秒后即可自动完成,快捷而准确。
相对于其他程序语言,Excel VBA属于最简单的编程工具,超过60%的代码可由录制宏产生,不需要每个对象名称、属性和方法都花费精力去记忆。以Delphi为例,学好Delphi需要花费多于VBA三倍的精力。
↘ 缺点
Excel VBA属于Excel的功能之一,在Excel的众多功能中,涉及理论知识最多的就是VBA,它较函数、图表、透视表等工具更复杂,需要更长的学习时间,这也是众多用户对VBA望而生畏的原因。
好在Excel支持录制宏,60%以上的知识点都可以跳过,大大节约了工作量。
1.3.3 窥斑见豹:从一个案例初识VBA
前面一再强调VBA的优点,这里以一个具体的案例来展示VBA在工作中的应用。
图1.15是某公司的产值表,表中需要计算的是每个员工生产的所有产品的数量乘以单价得到的产值。要完成需求有三个难点:每个员工生产的产品种类的数量不一致、产品数量和单价栏中包括单位名称并且单位不一致、存放结果的单元格需要合并,因此无法填充公式。
图1.15 产值计算表
笔者看到该表的设计者在计算产值表时按图1.15中F列所示方式设计公式,不到5000行数据每天需要花费3~5小时才能完成,而且计算结果的准确度也没有保障。
笔者为此写了一个自定义函数,只用了三句代码,3秒即可完成5000行资料的产值计算。按以下步骤操作可以见证此奇迹。
1 可以打开随书光盘中“..\第一章\1-4产值计算表.xlsm”文件。
2 选择F列第2行到工作表最后一个非空行的整个区域(本案例文是F2:F166区域),然后在编辑栏中录入以下公式:
=cal(D2,E2)
3 按下组合键【Ctrl+Enter】,选区中将自动填充所有公式,整个工作3秒内完成。计算结果如图1.16所示。
图1.16 使用自定义函数计算产值
本例中使用了VBA开发的自定义函数Cal,它能像所有Excel自带的工作表函数一样在任意单元格调用。自定义函数Cal的源代码如下:
Function Cal(rng1 As Range, rng2 As Range) '放置位置:模块中
For i = 1 To Application.ThisCell.MergeArea.Rows.Count
Cal = Cal + Val(rng1.Offset(i -1)) * Val(rng2.Offset(i -1))
Next
End Function
简单的三句代码,但具有神奇的效果,用户可以在3秒内完成以往3~5小时的工作量,这就是VBA的魅力。
其实VBA的神奇不止于此,还可以按下快捷键就完成工作。笔者对上面的产值表还编写了另一段代码,且为代码指定了快捷键【Ctrl+Shift+q】,读者可以删除F列的公式后再测试【Ctrl+Shift+q】快捷键,你将会发现它较自定义函数更快、更方便。
具体代码在随书光盘的案例文件中,本节仅展示VBA的便捷性与强大功能,在后面的章节会逐步介绍编程相关的基本理论和思路,学完本书后,此案例的代码将信手拈来。
本例案例文件请参考:..\ 第1章\ 1-4产值计算表.xlsm