Private Sub CommandButton1_Click()On Error Resume Next ' 如果出现错误,不中断代码,而是继续正常运行Range("f2:i" & Rows.Count).Clear ' 清除f至i列第二行以下的所有单元格格式和内容' 声明变量Dim dic As Object, dic1 As Object, dic2 As ObjectDim lastrow As Long, i As Long' 创建三个字典对象Set dic = CreateObject("scripting.dictionary")Set dic1 = CreateObject("scripting.dictionary")Set dic2 = CreateObject("scripting.dictionary")' 获取A列最后一行有数据行的行号lastrow = Range("a" & Rows.Count).End(xlUp).Row' 遍历第二行至第lastrow行,分别设置dic、dic1、dic2的关键字-条目对For i = 2 To lastrowDim key As Stringkey = CStr(Cells(i, 1).Value) ' 获取A列的值作为字典键' 统计每个车间出现的次数If dic.Exists(key) Thendic(key) = dic(key) + 1Elsedic.Add key, 1End If' 统计每个车间的总工资If dic1.Exists(key) Thendic1(key) = dic1(key) + Cells(i, 4).ValueElsedic1.Add key, Cells(i, 4).ValueEnd If' 计算每个车间的平均工资dic2(key) = dic1(key) / dic(key)Next' 将结果输出到工作表Range("f2").Resize(dic.Count, 1) = WorksheetFunction.Transpose(dic.keys) ' 获取字典的关键字(车间名称)Range("g2").Resize(dic.Count, 1) = WorksheetFunction.Transpose(dic.items) ' 各车间出现次数(人数)Range("h2").Resize(dic2.Count, 1) = WorksheetFunction.Transpose(dic2.items) ' 各车间的平均工资Range("i2").Resize(dic1.Count, 1) = WorksheetFunction.Transpose(dic1.items) ' 各车间的总工资' 设置表头Range("f1:i1") = Array("车间名称", "人数", "平均工资", "总工资")' 格式化结果区域With Range("f1").CurrentRegion.Borders.LineStyle = xlContinuous ' 设置边框.HorizontalAlignment = xlCenter ' 字体水平居中.VerticalAlignment = xlCenter ' 字体垂直居中.Font.Bold = True ' 设置表头加粗End With' 释放字典对象Set dic = NothingSet dic1 = NothingSet dic2 = Nothing
End Sub
功能概述
本VBA程序利用字典对象实现了对Excel工作表中车间数据的多维度统计,能够同时计算:
- 各车间出现次数(人数统计)
- 各车间工资总额
- 各车间平均工资
代码实现要点
-
字典对象创建:使用
CreateObject("scripting.dictionary")
创建三个字典分别存储不同统计指标 -
数据处理逻辑:
- 遍历数据行(从第2行到最后一行)
- 以车间名称为键,累计出现次数和工资总额
- 实时计算平均工资(总工资/人数)
-
结果输出:
- F列输出车间名称
- G列输出各车间人数
- H列输出平均工资
- I列输出总工资
使用说明
代码放置位置
- 按
Alt+F11
打开VBA编辑器 - 在对应工作表的代码窗口中粘贴代码
- 或关联到ActiveX命令按钮
运行条件
- 确保Excel已启用宏
- 数据格式要求:
- A列:车间名称
- D列:工资数据
执行方式
点击工作表中的命令按钮即可自动完成统计,结果将规范输出到F-I列,并自动格式化(居中、加边框等)
技术优势
- 使用字典对象提高数据处理效率
- 单次遍历完成多项统计计算
- 结果自动格式化,提升可读性
- 错误处理机制保证程序稳定性
此方案特别适用于需要快速汇总分析分类数据的场景,通过简单修改可适配多种统计需求。