前面的《Excel VBA:办公自动化》和大家分享了VBA常用的基础知识,就有同学留言问我:猴子老师,能不能出一个项目实战案例,可以把前面的知识都应用起来。
这位同学,你说的这个项目实战案例,今天它来了。
1.案例
某电力公司的财务人员,每个月需要根据当月的每一条明细数据,生成一个费用分摊证明票证。(案例数据可以在文末下载)
用大白话讲就是:提取「基础数据」中的「站名」「站号」和「电费金额」,然后分别对应写入「票证模板」中的「原单据号码及案由」和「全部金额」。其中,「站名」和「站号」二者合并写入一个单元格且各占一行。
2.分析思路
职场里遇到类似这样的业务需求,该怎么办呢?
首先,我们对上述需求使用多维度拆解分析方法来拆解:
第一步,需要知道「基础数据」中有多少行数据,以便于我们循环读取;
第二步,循环读取「基础数据」中的每一条数据时,需要将指定内容填入「票证模板」中。
从上面的分析中,我们进一步明确了思路,也就是从一个表格中提取指定内容,然后将该内容写入另一个表格的指定位置。
下面我们将这个案例的VBA代码展示出来,然后对每一句拆解分析。
3.程序读取第一部分
程序使用了「强制申明」,并且定义了5个变量,即:因为后文使用了「For循环结构」,因此设置了变量「totalrow」用来存储计算「基础数据」中的总行数。
变量「i」用来循环每一行数据,变量「zhanhao」 「zhanming」 「summoney」用来储存从「基础数据」中提取的需要写入「票证模板」中需要的内容。
4.程序执行变量「totalrow」这一句
程序读取「totalrow = Application.WorksheetFunction.CountA(Sheets("1-基础数据").Columns("d:d"))」可以看到这里是「赋值语句」。
老规矩先看右边「Application.WorksheetFunction.CountA(Sheets("1-基础数据").Columns("d:d"))」。
虽然这句话我们之前没有见过,但是并不妨碍我们去拆解这句话,先从字面意思理解:
「Application」英文单词是“应用、程序”; 「WorksheetFunction」为组合单词,拆分为Worksheet(表格)和Function(函数),组合起来就是“工作表函数”的意思; 「CountA」也是组合词,拆分为Count(计数)和A,组合起来就是“计数”的意思; 「Sheets("1-基础数据")」前半部分是「Sheets」表示“表格”的意思,而后面加上了「("1-基础数据")」可以推测这一小段表示的“1-基础数据工作表1-基础数据”; 「Columns("d:d")」前半部分是「Columns」表示“列”的意思,而后面加上了「("d:d")」可以推测这一小段表示的“D列”。
然后,我们将这些意思联合起来,用大白话说就是:程序调用工作表的计数函数,首先,计算表格1-基础数据中D列非空单元格个数,然后将计算的这个值「赋值」给左边的变量「totalrow」。
5.进入For循环体
程序读取「For i = 2 To totalrow」语句
程序读取接下来的三行:
首先,是「zhanhao = Sheets("1-基础数据").Range("B"& i).Value」。这句话仍然是个「赋值」语句,老规矩先看右边。
「Sheets("1-基础数据").Range("B" & i).Value」也是一个比较长的语句,我们一句句拆解来看:
「「Sheets("1-基础数据")」表示是“工作表1-基础数据”;
「Range("B" & i)」中又涉及到一些新面孔,「Range」英文意思就是“范围、领域”的意思;而其中的「&」之前有介绍过表示的是“连接”的意思,因此这部分表达的就是“B1-Bn这个范围”;「Value」」英文意思是“值”。
因此,整句话连接起来,我们可以大胆推测就是:将工作表B1-Bn某个单元格的值提取出来,然后赋值给「zhanhao」这个变量。
其次,「zhanming = Sheets("1-基础数据").Range("C"& i).Value」也按照这个思路推测就是:将工作表C1-Cn某个单元格的值提取出来,然后赋值给「zhanming」这个变量。
最后,「Sheets("2-票证模板").Range("E8").Value= "站名:" & zhanhao & Chr(10) &"发票号码:" & zhanming」这句话和之前都是一样的。
但是需要注意「赋值」语句的右边「"站名:" & zhanhao & Chr(10)& "发票号码:" & zhanming」中的「Chr(10)」表示“换行”的意思,即:当几个内容中间添加换行符之后,实际Excel中会出现换行的效果。
接下来,程序读取下面的两行:
这两句话,我仅对最后的「Format(summoney, "#,##0.0")」的做一下解读:「Format」表示“格式”的意思,也就是说这句话就是为了规整数据的写入格式的。
由于此处提取写的是电费金额,我们都知道财务的金额是需要千字符的,因此此处借用「Format」来达到财务千字符的效果。
6.复盘
看到这里,有同学可能就有疑问了:猴子老师,不是说复习之前的知识吗?怎么尽出现一些生面孔?
不用说,又一个经典的天台式微笑上扬我的嘴角。
就拿最后这个千字符来说,我们压根就不会写,往回翻看,我们之前是不是分享过「还自己写代码?VBA录制宏了解下」。利用这个方法,我们录制一下:
看到这里,有同学可能又有疑问了:猴子老师,你确定这俩是一回事?
同学,殊途同归,All Roads lead toRoman,达到效果就可以。
好了,今天这个复盘就到这里了。
在复盘中,可以看到,整个案例涉及到很多我们从未见过的知识点。之所以这样做,因为不论我们多么博学多识,总会出现一些我们从未学过的知识点。
因此,这里仅是向大家展示一个思路,当我们遇到一些我们从见过的内容,我们要综合运用各种储备对其有一个大概的判断,做到学习灵活应对。
推荐:人人都需要的数据分析思维