有网友给出如下图所示的Excel工作表,要求写出统计相关数据的Excel公式。
这个问题如果用Excel内置函数求解,可能非常繁琐,但用VBA编写一个自定义函数来求解相对比较简单。算法的基本思路是:给定B列中的一个单元格(一个名字),在A列中逐一访问各个单元格,若A列对应单元格包含n个姓名且给定的B列单元格值(名字)在A列这个单元格中,则计数值加1;假设有如下图所示的Excel工作表。
按Alt+F11组合键进入到VBA代码窗口,点击【插入\模块】菜单项,进入到VBA通用模块窗口,然后输入如下图所示的VBA自定义函数xcount。
这里编写了一个自定义函数xcount,该函数包含3个参数,第1个参数xrng表示要查找的姓名所在的单元格地址,第2个参数yrng表示要查找的范围地址,第3个参数n表示包含n个姓名。程序中通过一个For each-Next循环遍历查找范围内的每个单元格x,然后对单元格x的值用split函数进行分割,分割符为中文逗号;UBOUND函数返回的是数组的上限(下限从0开始),所以包含的姓名个数要在上限基础上加1。当分割后的姓名个数且好等于n时,再判断这个数组中是否包含了要查找的姓名值,若是,则计数变量num值加1。事实上,这个查找统计算法非常简单。
代码输入完毕后,返回到Excel工作表窗口,然后在C2单元格中输入公式【=xcount(B2,$A$2:$A$9,1)】,按回车后确认输入,即可得到统计结果。然后在D2单元格中输入公式【=xcount(B2,$A$2:$A$9,2)】,在E2单元格中输入公式【=xcount(B2,$A$2:$A$9,3)】,以及在F2单元格中输入公式【=xcount(B2,$A$2:$A$9,4)】同样按回车键后确认输入。这里因为查找的范围相同,所以A2到A9的单元格范围地址用了绝对引用地址$A$2:$A$9。第1行公式输入完毕后,用公式复制方式向下填充,即可得到最终的统计结果,如下图示:
下面是VBA宏的文本代码(可复制):
Function xcount(xrng As Range, yrng As Range, n As Integer) Dim name As String, num As Integer Dim arr As Variant, i As Integer '统计xrng的值在yrng出现,且有n个人名的单元格个数 If n <= 0 Then xcount = -1 Exit Function End If name = xrng.Value num = 0 For Each x In yrng arr = Split(x.Value, ",") If UBound(arr) + 1 = n Then For i = 0 To UBound(arr) If arr(i) = name Then num = num + 1 Next End If Next xcount = numEnd Function我是鉴水鱼老师,关注我,持续分享更多的Excel知识与操作技巧。