实例需求:在每个章节中统计关键字(“√”, “×”, “〇”, “空缺”)的个数,B列中的章节编号作为章节划分的标识,例如1.1.1 ~ 1.1.5为第1.1章节,对应工作表的12 ~ 16行,其中黄色列为需要统计的数据区域,即E12:AA16
,统计结果填写在AB:AE
列中每个章节的标题行内,如下图所示。
解决此问题的几个要点。
- 识别每个章节所在行
- 确定每个章节的数据区域
- 统计包含关键词的单元格个数
- 将统计结果写入指定单元格
示例代码如下。
Sub Demo()
Dim objDic As Object
Dim rngData As Range
Set objDic = CreateObject("scripting.dictionary")
Set rngData = Range([B9], Cells(Rows.Count, 2).End(xlUp))
For Each rngcel In rngData
ch = Split(rngcel.Value, ".")
If VBA.IsNumeric(ch(0)) Then
If objDic.exists(ch(0)) Then
Set objDic(ch(0)) = Union(objDic(ch(0)), rngcel)
Else
Set objDic(ch(0)) = rngcel
End If
End If
Next rngcel
skey = Array("√", "×", "〇", "空缺")
For Each strKey In objDic.keys
Set rngCh = objDic(strKey).Offset(0, 3).Resize(, 23)
iRow = objDic(strKey).Cells(1).Row - 1
For j = 0 To UBound(skey)
Cells(iRow, 28 + j).Value = Application.CountIf(rngCh, skey(j))
Next j
Next strKey
End Sub
【代码解析】
第4行代码创建字典对象。
第5行代码定位B列数据区域。
第6~15行代码循环遍历B列单元格。
第7行代码调用split
函数拆分单元格,分隔符为半角句号。
第8行代码判断拆分后的数组第一元素(即章节号中第一个分隔符之前的数字,以下检查章号)是否为数字,如果不是数字,说明该行是章节标题行。
第9行代码判断字典中是否已经存在该章号。
- 如果已经存在,那么第10行代码调用
union
函数将当前单元格与字典中保存的Range对象进行合并。 - 如果不存在,第12行代码将当前单元格保存在字典中。
第16行代码指定关键字数组。
第17~23行代码循环遍历关键字数组。
第18行代码定位每个章节的数据区域。
第19行代码获取章节的标题行。
第20~22行代码循环统计每个关键字。
第21行代码调用工作表函数CountIf
统计在指定的单元格区域内包含关键词的单元格个数。
第25行代码释放对象变量占用的系统资源。
–
https://club.excelhome.net/thread-1651481-1-1.html