实例需求:在每个章节中统计关键字(“√”, “×”, “〇”, “空缺”)的个数,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



















