Excel VBA 使用字典对象实现数据统计

在日常办公中,我们经常需要对Excel中的数据进行分类汇总统计。今天我将分享一个实用的VBA解决方案,利用字典对象实现对车间数据的多维度统计,包括人数统计、工资总额和平均工资计算。这种方法不仅高效,而且代码结构清晰,易于理解和修改。

功能概述

本VBA程序实现了以下功能:

  • 统计各车间出现次数(人数)
  • 计算各车间工资总额
  • 计算各车间平均工资
  • 自动格式化输出结果

完整代码

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 Object
    Dim 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 lastrow
        Dim key As String
        key = CStr(Cells(i, 1).Value) ' 获取A列的值作为字典键
        
        ' 统计每个车间出现的次数
        If dic.Exists(key) Then
            dic(key) = dic(key) + 1
        Else
            dic.Add key, 1
        End If
        
        ' 统计每个车间的总工资
        If dic1.Exists(key) Then
            dic1(key) = dic1(key) + Cells(i, 4).Value
        Else
            dic1.Add key, Cells(i, 4).Value
        End 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 = Nothing
    Set dic1 = Nothing
    Set dic2 = Nothing
End Sub

代码解析

1. 初始化与清理

On Error Resume Next
Range("f2:i" & Rows.Count).Clear
  • On Error Resume Next:错误处理语句,防止程序因意外错误中断
  • Range.Clear:清除F-I列原有数据,为输出新结果做准备

2. 字典对象创建

Dim dic As Object, dic1 As Object, dic2 As Object
Set dic = CreateObject("scripting.dictionary")
Set dic1 = CreateObject("scripting.dictionary")
Set dic2 = CreateObject("scripting.dictionary")

创建三个字典对象:

  • dic:存储各车间人数
  • dic1:存储各车间工资总额
  • dic2:存储各车间平均工资

3. 数据遍历与统计

For i = 2 To lastrow
    key = CStr(Cells(i, 1).Value)
    
    ' 统计人数
    If dic.Exists(key) Then
        dic(key) = dic(key) + 1
    Else
        dic.Add key, 1
    End If
    
    ' 统计工资总额
    If dic1.Exists(key) Then
        dic1(key) = dic1(key) + Cells(i, 4).Value
    Else
        dic1.Add key, Cells(i, 4).Value
    End If
    
    ' 计算平均工资
    dic2(key) = dic1(key) / dic(key)
Next

通过一次遍历完成三项统计,效率极高。

4. 结果输出与格式化

' 输出结果
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

使用说明

准备工作

  1. 确保Excel文件格式正确:
    • A列:车间名称
    • D列:工资数据
  2. 启用宏功能

代码部署

  1. Alt+F11打开VBA编辑器
  2. 将代码粘贴到对应工作表的代码窗口
  3. 或关联到ActiveX命令按钮

执行方法

点击工作表中的命令按钮即可自动完成统计,结果将输出到F-I列。

技术优势

  1. 高效处理:使用字典对象,单次遍历完成多项统计
  2. 代码简洁:逻辑清晰,易于维护和修改
  3. 自动格式化:结果表格自动美化
  4. 健壮性:内置错误处理机制

扩展应用

此方案可轻松适配其他统计需求,只需修改:

  1. 键值获取位置(如改为B列作为分类依据)
  2. 统计数值列(如改为E列作为计算依据)
  3. 输出位置和表头

总结

通过这个案例,我们学习了如何利用VBA字典对象实现高效的数据分类统计。这种方法特别适合处理大量数据,相比传统公式更加灵活高效。希望本文对您的日常工作有所帮助!

提示:实际使用时,可根据需要添加更多错误处理和数据验证代码,使程序更加健壮。


欢迎在评论区留言交流!如果觉得有用,请点赞收藏支持~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

課代表

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值