Excel最常见的应用就是对大批量数据进行统计汇总,特别是一些规则复杂、要求特殊的统计汇总需求,往往需要编写VBA程序来解决。而使用VBA实现数据汇总的基础,就是对循环结构的灵活运用。所以在本节中,我们将为大家介绍两个重要的VBA汇总基本功——累加与计数。
所谓“累加”,就是计算多个数值的总和;计数则是计算这些数值的个数。Excel提供的“SUM”和“COUNT”两个表格公式,就分别对应这两个功能。现在我们就结合案例3-6来了解一下使用循环结构实现这两个功能的基本原理。
案例3-6: 在图3.9左侧所示的工作表中,存有某商铺部分客户的信息及其消费积分。请编写VBA程序统计出客户人数及他们所有积分之和,并显示在F3和F4单元格中。预期输出结果如图3.9右图所示。
图3.9 案例3-6原始数据与预期输出结果
没有编程经验的读者可以先思考一下:不使用计算机,自己心算总积分的过程是怎样的?大多数人会先看第一个数字(第3行 C 列),然后将“90”这个数字记在心里或写在纸上。接下来看第4行数字,然后把117与90相加得到数字207。再向下看第5行数字,把75与207相加得到282……
把这个过程用程序语言呈现出来就是:
① 准备一个变量,相当于“心”或“纸”,用于记录数字(由于此时尚未开始记录任何数字,所以让该变量的数值为0);
② 做一个循环,从第3行依次扫描到第9行;
③ 每扫描一行,就将该行C列的数字与刚才的变量相加,并用这个结果更新变量数值。
④ 反复执行直到循环结束。此时该变量存放的数值就是所有数字的累加结果。
同样,如果在上述循环中准备另外一个变量,每次循环都使其增加1,那么循环结束后变量的数值就代表循环的总次数,在本案例中就是总人数。
这两个变量就是本节要说的“累加器”和“计数器”。具体代码如下:
这段代码一共使用了三个变量:i 用于控制循环,代表每次处理的数据所在的行号;points代表总积分;members则代表总人数。按照上面的分析,points应作为累加器,而members则应采用计数器模式。
在开始循环之前,首先将points和members两个变量都预置为0;接下来循环扫描第3行到第9行的数据,每找到一行数据就让members增加1,并让points增加该行C列的数值。当循环结束时,两个变量的最终数值就是想要的结果,并通过最后两行代码分别写入F3和F4单元格中。
这个案例虽然十分简单,但体现了累加器和计数器的核心思想,而累加器和计数器则是编写复杂统计汇总程序时最重要的基础结构。可以说,大多数汇总程序归根到底无非就是对这个结构的各种变形和重叠。所以请读者务必将上述案例看懂,并且能够做到完全独立地写出这段代码。
关于这段代码,其实可以不写“points=0 : members=0”一句,因为VBA会把一个变量的初始值默认为0。不过,明确地为变量指定一个初始值,也属于VBA编程的最佳实践之一。因为明确指定初始值可以提高代码可读性,并且避免很多潜在的错误,比如在代码很长的情况下,开发人员很可能记不清变量在开始累加之前是否被其他语句修改过,致使其初始值已经不是0。
此外,这些变量的初始值也并不一定都为0。比如有时我们需要的不是累加而是累乘,那么就需要把points的初始值设置为1而非0。