VBA 汇总统计

Option Explicit


Sub sum_Click()
  Call loop_cells
End Sub


Sub loop_cells()
   Dim mysheet As Worksheet
   Set mysheet = ActiveWorkbook.Sheets(1)
 
   Dim r As Long
    
' 站点
   Dim cell_zd As String
' 雨量
   Dim cell_yl As Single
' 数据年月
   Dim cell_ny As String
   '
   Dim k_zd_ny As String
   
   
   Dim dict
   Set dict = CreateObject("Scripting.Dictionary")
   
   Dim dict_zhandian
   Set dict_zhandian = CreateObject("Scripting.Dictionary")
   
       
   For r = 2 To mysheet.UsedRange.Rows.Count
     cell_zd = mysheet.Cells(r, 1).Value
     cell_ny = CStr(mysheet.Cells(r, 2).Value) & "年" + CStr(mysheet.Cells(r, 3).Value) & "月"
     cell_yl = mysheet.Cells(r, 5).Value
     
     k_zd_ny = cell_zd + "_" + cell_ny
     
     If Not dict_zhandian.exists(cell_zd) Then
       dict_zhandian.Add (cell_zd), cell_yl
       dict.Add (k_zd_ny), cell_yl
     Else
       dict_zhandian.Item(cell_zd) = cell_yl + dict_zhandian.Item(cell_zd)
       dict.Item(k_zd_ny) = cell_yl + dict.Item(k_zd_ny)
     End If
   
   Next
      
  
   
   Dim st As Worksheet
   Set st = ActiveWorkbook.Sheets(2)
   st.Cells.ClearContents
      
   Dim k, v, k1, v1
   k = dict_zhandian.Keys
   v = dict_zhandian.Items
   k1 = dict.Keys
   v1 = dict.Items
   
   
   st.Cells(1, 1).Value = "站点名"
   st.Cells(1, 2).Value = "年降水(" + CStr(mysheet.Cells(3, 2).Value) + ")"
   
   
   Dim nMonth As Integer
   
   For nMonth = 1 To 12
    st.Cells(1, 2 + nMonth).Value = CStr(nMonth) & "月"
   Next
      
   Dim i As Integer
   For i = 0 To dict_zhandian.Count - 1
   
     st.Cells(i + 2, 1).Value = k(i)
     t.Cells(i + 2, 2).Value = v(i)
     
     For nMonth = 1 To 12
       st.Cells(i + 2, 2 + nMonth).Value = dict.Item(k(i) + "_" + CStr(mysheet.Cells(3, 2).Value) + "年" + CStr(nMonth) + "月")
     Next
     
          
   Next
   
   st.Activate
End Sub
 






下载地址: 下载
### Excel VBA 汇总教程及相关综合应用 #### 使用 ListView 控件进行数据分析与展示 在 Excel VBA 中,`ListView` 是一种强大的控件,用于以列表形式显示复杂的数据结构。通过 `ListView` 可以实现多列数据的可视化以及交互操作[^1]。例如,在财务报表或学生成绩管理场景中,可以利用此控件动态加载和筛选大量记录。 以下是创建基本 `ListView` 的代码示例: ```vba Private Sub InitializeListView() Dim lv As Object Set lv = Me.ListView1 ' 假设已添加名为 ListView1 的控件 With lv .View = xlDetails .ColumnHeaders.Clear ' 添加列头 .ColumnHeaders.Add Text:="ID", Width:=80 .ColumnHeaders.Add Text:="Name", Width:=120 .ColumnHeaders.Add Text:="Score", Width:=80 ' 插入一些测试项 .ListItems.Add Text:="1" .ListItems(.ListItems.Count).SubItems(1) = "Alice" .ListItems(.ListItems.Count).SubItems(2) = "95.5" .ListItems.Add Text:="2" .ListItems(.ListItems.Count).SubItems(1) = "Bob" .ListItems(.ListItems.Count).SubItems(2) = "87.3" End With End Sub ``` --- #### 自动化汇总多个 Excel 文件中的数据 对于批量处理多个文件的需求,可以通过编写宏命令完成自动化任务。具体流程包括读取目标路径下的所有 `.xlsx` 文件,并将其内容逐一导入到新的工作簿中[^2]。 下面是一个完整的代码片段: ```vba Sub ConsolidateDataFromFiles() Dim wbTarget As Workbook, wsSource As Worksheet, wsDest As Worksheet Dim folderPath As String, fileName As String, lastRow As Long Application.ScreenUpdating = False ' 设置源文件夹位置 folderPath = ThisWorkbook.Path & "\数据文件夹\" If Dir(folderPath, vbDirectory) = "" Then MsgBox "未找到指定文件夹!", vbExclamation Exit Sub End If ' 创建新工作簿存储结果 Set wbTarget = Workbooks.Add Set wsDest = wbTarget.Sheets(1) wsDest.Name = "汇总表" ' 初始化标题行 wsDest.Cells(1, 1).Value = "序号" wsDest.Cells(1, 2).Value = "姓名" wsDest.Cells(1, 3).Value = "分数" lastRow = 2 ' 遍历文件夹内的每一个文件 fileName = Dir(folderPath & "*.xls*") Do While fileName <> "" On Error Resume Next Set wsSource = Workbooks.Open(folderPath & fileName).Sheets(1) If Err.Number = 0 Then For i = 2 To wsSource.Cells(wsSource.Rows.Count, 1).End(xlUp).Row wsDest.Cells(lastRow, 1).Value = wsSource.Cells(i, 1).Value wsDest.Cells(lastRow, 2).Value = wsSource.Cells(i, 2).Value wsDest.Cells(lastRow, 3).Value = wsSource.Cells(i, 3).Value lastRow = lastRow + 1 Next i ActiveWorkbook.Close SaveChanges:=False Else Debug.Print "无法打开:" & fileName End If On Error GoTo 0 fileName = Dir Loop wbTarget.SaveAs Filename:=ThisWorkbook.Path & "\已完成.xlsx" Application.ScreenUpdating = True MsgBox "数据汇总成功!" End Sub ``` --- #### 学生平均分计算案例 当需要统计一组学生的平均成绩时,可借助内置函数简化逻辑。以下是一段典型的应用实例[^3]: ```vba Sub CalculateAverageScores() Dim ws As Worksheet Set ws = ThisWorkbook.Sheets("Sheet1") Dim lastRow As Long lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row For i = 2 To lastRow ws.Cells(i, 5).Value = Format(Application.WorksheetFunction.Average(ws.Range(ws.Cells(i, 2), ws.Cells(i, 4))), "0.00") Next i End Sub ``` 上述脚本会针对每名学生分别求其第二至第四列数值的均值,并保留两位小数位输出于第五列。 --- #### 数据汇总后的图表制作 为了更直观地呈现分析成果,还可以进一步扩展功能——基于生成的结果绘制图形报告[^4]。比如采用间接引用的方式获取外部单元格的内容作为绘图依据: ```vba Range("B2").Formula = "=INDIRECT(A1&""!D6"")" ``` 随后调用 Chart 对象构建柱状图或其他类型的视觉表达样式即可。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值