连续数据统计问题也是Excel中常见的一类统计问题,例如:网店销售报表数据。这类统计问题一般也不能通过简单的调用2、3个Excel系统函数来搞定,但是用VBA编写一个自定义函数来实现则相对比较便捷。事实上这个问题可以转换为一个字符串中统计子串出现次数问题。假设有如下图所示的Excel工作表(数据模拟):
图1
VBA程序的基本思路是:将一行中A列到AE列的每个单元格的数据连接起来形成一个字符串,其中将单元格不为0的数据用字符1表示,单元格值为0则用字符0表示,那么一行数据就形成了一个由0和1组成的字符串,如上图中的第2行数据就转换成了:1111110100010001111110000011111,这样当要统计连续3天为0时,只需统计“000”在这个字符串中出现的次数就可以了,其它统计5天、7天同理。
按ALT+F11组合键进入到VBA编辑窗口,点击【插入\模块】菜单项,进入到通用模块编写窗口,然后输入如下图所示的VBA宏代码:
图2
自定义函数tCount包含2个参数,参数rng表示选定的单元格区域,参数n表示0的个数。程序中首先将一行由rng传递过来的单元格数据转换成由0与1构成的字符串tmpStr,接下来,通过遍历这个字符串,调用系统的Instr函数,统计由n个0组成的子字符串在字符串tmpStr中出现的次数,最后由函数名返回统计结果。
代码编写完成后,返回到Excel工作表窗口,在图1所示的工作表AF2单元格中输入公式【=tCount(A2:AE2,3)】,按回车后确认输入,即得连续3天为0的次数,在AG2单元格中输入公式【=tCount(A2:AE2,5)】,按回车后确认输入,即得连续5天为0的次数,在AH2单元格中输入公式【=tCount(A2:AE2,7)】,按回车后确认输入,即得连续7天为0的次数,然后用公式复制方式向下填充,即可得到各行统计结果,如下图示:
图3
VBA宏代码非常简短,调用自定义函数也非常方便。下面给出相应的代码文本(可复制)。
Function tCount(rng As Range, n As Integer) Dim tmpStr As String, x As Variant, c As String c = Replace(Space(n), " ", "0") '构造由n个0组成的字符串 For Each x In rng '将行数据转换成由0与1构成的字符串 If x.Value <> 0 Then tmpStr = tmpStr & "1" Else tmpStr = tmpStr & "0" End If Next '统计由n个0组成的子串在tmpStr中出现的次数 n = 0 k = InStr(1, tmpStr, c) Do While k <> 0 n = n + 1 k = InStr(k + Len(c), tmpStr, c) Loop tCount = nEnd Function我是,关注我,持续分享更多的Excel知识与操作技巧。