Excel 是一个非常复杂的软件,经过几十年的发展,功能越来越多。
我们总是会遇到各种问题,就好像面对一个个被打乱的魔方,无从下手。
各种教程提到的眼花缭乱的操作,就好像魔方高手三下两下拨弄好,然后拷问我们:简单吧,这都不会?
但是教程无法解释的是:为什么要这样操作。无法真正理解原理,即使当时掌握了, 下次又会忘记。
是不是哪里出了问题?
我们需要的不是眼花缭乱的操作,而是基本原理和套路。就像解魔方一样,知道基本原理,经过思考,能推导出步骤,最终解决问题。
Excel 就有这样一本秘籍,学会之后能够以不变应万变,解决几乎遇到的所有问题,这本秘籍就是(VBA)编程。
下面我们就开始进入编程的世界。
计算机
在谈到编程之前,我们需要先了解计算机 体系。
计算机由硬件和软件构成,从智能手机到超级计算机大同小异。硬件由 CPU、内存、主板等构成,如果打开一台电脑主机可以看到类似下图的构造:
电脑主机构造
软件/程序大体可以分为操作系统与应用软件。Windows iOS Android 都是操作系统,应用软件基于操作系统运行,比如 Excel、QQ。
软件最终会被翻译成硬件能执行的指令,CPU 按照指令进行计算。
简而言之:软件是由开发者编写的指令,是开发者逻辑的体现,计算机只是遵从指令运行。
编写程序会用到不同的编程语言,常见的有 C 语言、Java、python、JavaScript 等,还有我们要学的 VB。
为什么会有这么多编程语言呢?
因为这些语言想要解决的问题不同,有的想要极致的性能、有的想要快速开发的效率。没有十全十美的编程语言,只有结合你所面临的问题和现状,挑选最合适的编程语言。
而解决 Excel 问题最合适的莫过于 VB。
乘法表
代码,或者源代码,是开发者用编程语言写下的文字,就好像一张建筑施工图。
有的代码需要编译打包,生成一个可以运行的文件,比如我们下载的某软件安装程序,运行这个文件相当于运行代码。
VB 代码不需要这些步骤就可以在 Excel 内运行,因为 Excel 会把 VB 代码翻译成计算机指令执行。
下面我们看一段打印乘法表的 VBA 代码:
Sub MultiTable() Dim i As Integer Dim j As Integer Dim sheet As Worksheet Set sheet = Work(1) For i = 1 To 9 For j = 1 To i (i, j) = i & "*" & j & "=" & (i * j) Next j Next i End Sub
打开 Excel,按下 Alt + F11,或者鼠标右击工作表,选择“查看代码”,就可以打开 VBE。
输入上面的代码,点击工具栏的绿色箭头执行代码,再回到 Excel 可以看到执行结果。
运行代码
可以看到上面的 VBA 代码由以下元素组成:
- 英语单词和字母,只是很少量的单词
- 数字
- 英文符号,包括标点符号、数学计算符号
当前常见的编程语言都是类似的规则。
解析
我来一行一行的解释上面的代码:
Sub MultiTable() End Sub
第一行和最后一行定义了一个过程。过程是 VBA 的一个概念,可以理解为给中间这几段代码起了个名称。类似我们在 Excel 中选定一块区域,给区域命名。
Dim i As Integer Dim j As Integer
第二行和第三行定义了两个类型为整数的变量,分别叫做 i 和 j。变量 是所有编程语言都有的概念,也是最基础的概念。
变量可以理解为一个纸盒子,盒子里面可以存放数据。不同类型的变量就像不同形状的盒子,有方的、圆的,可以存放不同的数据。
往盒子里存放数据的过程,称为赋值。当用到变量的的时候,相当于从盒子里取出数据,称为取值。
Dim sheet As Worksheet Set sheet = Work(1)
第四行和第五行定义了一个类型为 Worksheet 工作表的变量,并把这个变量赋值为 Excel 第一张工作表,也就是 Sheet1。
VB 和大多数编程语言类型,使用 = 符号表示赋值。就像在单元格里输入 =xxx 一样。
For i = 1 To 9 ' 内部代码 1 Next i
第六行和倒数第二行的意思是:
把 i 赋值为 1,执行内部代码。
把 i 赋值为 2,执行内部代码。
直到把 i 赋值为 9,执行内部代码。
这个过程称为循环,所有的程序结构都可以分为顺序、分支、循环这三种,后面再详细讲。
所以内部代码一共执行了 9 次。
For j = 1 To i ' 内部代码 2 Next j
第七行和倒数第三行的意思是和上面变量 i 的循环类似,不过这次不是 1 到 9,而是 1 到 i。所以:
i 等于 1 时,j 的循环范围是 1 到 1,执行 1 次内部代码。
i 等于 2 时,j 的循环范围是 1 到 2,执行 2 次内部代码。
i 等于 9 时,j 的循环范围是 1 到 9,执行 9 次内部代码。
大家可以把 1 To i 改成 1 To 9,再查看运行结果。
(i, j) = i & "*" & j & "=" & (i * j)
第八行的意思是:把 sheet 选中第 i 行第 j 列单元格的内容赋值为 i * j = 相乘结果。
英文双引号括起来的部分称为字符串,或者称为文本。字符串可以包含中文,后面会详细讲。
VB 用 & 拼接字符串。
所以当 i 是 4,j 是 3 的时候,拼接结果就是 3*4=12。
大家可以把 i & "*" 改成 i & "乘以" 试试。
上面的代码连起来就是:
当 i 是 1 时,j 从 1 到 1,第八行的代码执行一次:将第 1 行第 1 列单元格的内容设置为 1*1=1。
当 i 是 2 时,j 从 1 到 2,第八行的代码执行两次:将第 2 行第 1 列单元格的内容设置为 2*1=2,将第 2 行第 2 列单元格的内容设置为 2*2=4。
直到 i 是 9,第 9 行的 9 个单元格都会被设置相应的内容。
代码的诞生
再来思考一个问题,上面的代码是怎么来的?或者说编程工作是怎么开始的?
通常按照以下步骤:
- 梳理需求:解决什么问题?实现什么效果?意外情况怎么处理?
- 思考,将需求转换为严谨的思路:程序由哪些模块组成,每个模块需要做什么?出了错误怎么处理?
- 将思路转换为代码。
- 调试代码、测试代码,确保没有 BUG,再交付。
梳理需求是至关重要的,通常需求由其他人:产品经理、领导,或者自己提出。如果你理解错了需求,那么后面的工作注定要失败的。
程序是开发者逻辑思路的体现,所以如果你的逻辑不清晰或者有漏洞,那么代码大概率是有 BUG 的。
切忌跳过前两步,直接开始写代码。前两步才是重中之重。
我对乘法表的需求是:
- 从 1 到 9 打印乘法表(而不是从 9 到 1)
- 第一行打印 1*1,第二行打印 1*1 1*2 ...
由于需求比较简单,所以第二步的思考就是:一个模块,按照需求运行就可以。
前两步完成之后,编写代码就相对简单了,按照 VB 的语法规则写出代码。
在整个过程中,编程语言只是一种工具,即使换一种编程语言,也是同样的流程。
虽然编程语言只是工具,但是为了更好的完成工作,我们需要学习、了解这个工具。
总结
乘法表的代码是不难理解的,但是很多同学不理解 For Next 为什么要这么写。
因为 VB 是这么规定的,这称为编程语言的语法。编程语言一般使用几十个固定的英文单词,组成固定的语法,实现特定的逻辑,比如循环。
程序是给计算机执行的,所以编程语言需要固定而精确的表达,不像人类的语言那样随意和丰富,否则计算机是理解不了的。
后面的文章会详细讲解 VB 的基本语法,并结合示例实现更强大的功能。
最重要的是:一定要多思考,多练习。编程并不是魔法,而是像很多技能一样有着明确的学习路径。
无他,唯手熟尔。