“分析”这种能力,堪称人类智慧之光。专利分析领域有很多大神,还有许多高明的工具和技巧。不过君对分析是七窍通了六窍——一窍不通,所以分析绝对不是这篇文章的重点。这系列的文章,只想聊几个Excel宏VBA的小程序(其实并不限于处理专利数据,只是图个方便图个开心罢了),篇幅短小,而且比较快更。
假如,某食品企业,每个部门按期提交发明创造。企业统计人员把发明创造的提交日、年份、发明名称、奖励系数汇总到一张表里。
如果现在需要分段统计各个部门的奖励系数的总数,怎么办呢?有的小伙伴可能手动用SUM函数求和来搞定,或者可能用“合并计算”搞定咯。
不过,虽然手动操作的技巧简单易学,但当多个数据文件需要一系列的复杂手动操作时,手动操作就存在一些Bug:每换一套数据,就要重新手动操作一遍,并且,如果处理数据的人员更换,这一系列复杂手动操作的可移植性和准确性都比较堪忧。人力因素在处理数据的过程中难以抽离,大家很容易变成“表哥”和“表姐”。相比于人工手动操作,宏VBA程序因为在运行过程中剔除了人工的因素,所以可移植性和准确性都较高。而且,编写一段程序,相当于对不同的待处理数据固定了相同的“标准”。这个“统计各个部门发明奖励系数总数”的简单小例子,着重传达一种程序思维。
◉ 第一步:打开宏程序编辑界面
根据Excel版本的不同,可以在 “视图” 中录制一个空的宏,停止录制后进行编辑。也可以在Excel选项的自定义功能区中勾选 “开发工具” 访问宏功能。
◉ 第二步:定义Sub过程及变量我们把完成“按部门加合发明奖励系数”的这个过程定义为bigtitle,当然,用其他的名字也可以。随后,我们要定义四个整型变量:
i 代表数据区域的行的变量
j 代表上一段相同部门底端的行
k 代表下一段相同部门底端的行
t 代表在一段相同部门的数据范围内变化的行
随后我们再定义两个字符串变量:str1代表第i行的部门名称,str2代表第i+1行的部门名称。
写为:
Sub bigtitle()
Dim i, j, k, t As Integer
Dim str1, str2 As String
*程序主体*
End Sub
① 第一层循环,i从表的第2行循环赋值至第24行,在i的每次赋值过程中,表中第i列、第3列的部门信息被赋值给str1,同时第i+1行、第3列的部门信息被赋值给str2。
写为:
For i=2 To 24str1 = Sheet2.Cells(i,3)
str2 = Sheet2.Cells(i+1,3)
*条件语句*
Next
② 条件语句,当str1不等于str2时,说明i所在的行已经到了该相同部门的最后一行,从i+1行起,就进入了下一个部门。这时,我们把这个i值赋给k,作为该段相同部门底端的行的标记,同时,把原k值赋给j,用于标记上一段相同部门底端的行。在判断str1和str2是否相同时,我们使用字符串对比函数StrComp。
写为:
If StrComp(str1, str2, 1) <> 0 Thenj = k
k = i
*第二层循环*
End If
③ 第二层循环,当j和k确定后,从第j+1行到第k行,部门名称相同,即同一部门。此时设置t变量,其循环范围从第j+1行到第k行,将在此范围内的所有第5列的奖励系数都加总到第k行的第6列。这里需要注意的是,应当设置k的初始值为1。
写为:
For t = j+1 To kSheet2.Cells(k, 6) = Sheet2.Cells(k, 6) + Sheet2.Cells(t, 5)Next这样,运行宏之后,就可以得到各个部门的总奖励系数:
全体Sub过程如下,由两层循环和一层条件判断构成,给大家做个参考。
这样,当数据量变大时,只需要修改第一层循环中“For i=2 To 24”的24至最后一条数据所在行的行数,然后重新运行宏,即可完成大量数据分段加合的工作。
下期预告: Excel宏VBA小技巧系列之整合排序