ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 865|回复: 13

[已解决] 深夜薅不动头发了,前来求助,数据汇总

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-3-15 02:15 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
问题都在案例里,希望高手解答,万分感谢!


案例.zip (69.25 KB, 下载次数: 17)

或帮看看一下代码怎么简写,学习一下(我这屎山代码
  1. Sub 数据刷新_账目统计()
  2.     Dim i As Long
  3.     Dim wa As Worksheet, ws As Worksheet
  4.     Dim arr As Variant

  5.     Set wa = Sheets("账目统计")
  6.     Set ws = Sheets("月流水库")
  7.     arr = ws.Range("A1:G2401").Value
  8.     wa.Range("C3:N9") = ""
  9.     '1月汇总
  10.     sum = 0: sum2 = 0: sum3 = 0: sum4 = 0: sum5 = 0
  11.     For i = 2 To 2401
  12.         If Month(arr(i, 3)) = wa.Range("C2") And arr(i, 4) = wa.Range("B4") And arr(i, 5) = "结算进账" Then
  13.             sum = sum + arr(i, 6): End If
  14.         If Month(arr(i, 3)) = wa.Range("C2") And arr(i, 4) = wa.Range("B5") And arr(i, 5) = "结算进账" Then
  15.             sum2 = sum2 + arr(i, 6): End If
  16.         If Month(arr(i, 3)) = wa.Range("C2") And arr(i, 4) = wa.Range("B6") And arr(i, 5) = "结算进账" Then
  17.             sum3 = sum3 + arr(i, 6): End If
  18.         If Month(arr(i, 3)) = wa.Range("C2") And arr(i, 4) = wa.Range("B7") And arr(i, 5) = "结算进账" Then
  19.             sum4 = sum4 + arr(i, 6): End If
  20.         If Month(arr(i, 3)) = wa.Range("C2") And arr(i, 4) = wa.Range("B8") And arr(i, 5) = "结算进账" Then
  21.             sum5 = sum5 + arr(i, 6): End If
  22.     Next:
  23.     wa.Range("C4").Value = sum
  24.     wa.Range("C5").Value = sum2
  25.     wa.Range("C6").Value = sum3
  26.     wa.Range("C7").Value = sum4
  27.     wa.Range("C8").Value = sum5
  28.     '2月汇总
  29.     sum = 0: sum2 = 0: sum3 = 0: sum4 = 0: sum5 = 0
  30.     For i = 2 To 2401
  31.         If Month(arr(i, 3)) = wa.Range("D2") And arr(i, 4) = wa.Range("B4") And arr(i, 5) = "结算进账" Then
  32.             sum = sum + arr(i, 6): End If
  33.         If Month(arr(i, 3)) = wa.Range("D2") And arr(i, 4) = wa.Range("B5") And arr(i, 5) = "结算进账" Then
  34.             sum2 = sum2 + arr(i, 6): End If
  35.         If Month(arr(i, 3)) = wa.Range("D2") And arr(i, 4) = wa.Range("B6") And arr(i, 5) = "结算进账" Then
  36.             sum3 = sum3 + arr(i, 6): End If
  37.         If Month(arr(i, 3)) = wa.Range("D2") And arr(i, 4) = wa.Range("B7") And arr(i, 5) = "结算进账" Then
  38.             sum4 = sum4 + arr(i, 6): End If
  39.         If Month(arr(i, 3)) = wa.Range("D2") And arr(i, 4) = wa.Range("B8") And arr(i, 5) = "结算进账" Then
  40.             sum5 = sum5 + arr(i, 6): End If
  41.     Next:
  42.     wa.Range("D4").Value = sum
  43.     wa.Range("D5").Value = sum2
  44.     wa.Range("D6").Value = sum3
  45.     wa.Range("D7").Value = sum4
  46.     wa.Range("D8").Value = sum5
  47.     '3月汇总
  48.     sum = 0: sum2 = 0: sum3 = 0: sum4 = 0: sum5 = 0
  49.     For i = 2 To 2401
  50.         If Month(arr(i, 3)) = wa.Range("E2") And arr(i, 4) = wa.Range("B4") And arr(i, 5) = "结算进账" Then
  51.             sum = sum + arr(i, 6): End If
  52.         If Month(arr(i, 3)) = wa.Range("E2") And arr(i, 4) = wa.Range("B5") And arr(i, 5) = "结算进账" Then
  53.             sum2 = sum2 + arr(i, 6): End If
  54.         If Month(arr(i, 3)) = wa.Range("E2") And arr(i, 4) = wa.Range("B6") And arr(i, 5) = "结算进账" Then
  55.             sum3 = sum3 + arr(i, 6): End If
  56.         If Month(arr(i, 3)) = wa.Range("E2") And arr(i, 4) = wa.Range("B7") And arr(i, 5) = "结算进账" Then
  57.             sum4 = sum4 + arr(i, 6): End If
  58.         If Month(arr(i, 3)) = wa.Range("E2") And arr(i, 4) = wa.Range("B8") And arr(i, 5) = "结算进账" Then
  59.             sum5 = sum5 + arr(i, 6): End If
  60.     Next:
  61.     wa.Range("E4").Value = sum
  62.     wa.Range("E5").Value = sum2
  63.     wa.Range("E6").Value = sum3
  64.     wa.Range("E7").Value = sum4
  65.     wa.Range("E8").Value = sum5
  66.     '4月汇总
  67.     sum = 0: sum2 = 0: sum3 = 0: sum4 = 0: sum5 = 0
  68.     For i = 2 To 2401
  69.         If Month(arr(i, 3)) = wa.Range("F2") And arr(i, 4) = wa.Range("B4") And arr(i, 5) = "结算进账" Then
  70.             sum = sum + arr(i, 6): End If
  71.         If Month(arr(i, 3)) = wa.Range("F2") And arr(i, 4) = wa.Range("B5") And arr(i, 5) = "结算进账" Then
  72.             sum2 = sum2 + arr(i, 6): End If
  73.         If Month(arr(i, 3)) = wa.Range("F2") And arr(i, 4) = wa.Range("B6") And arr(i, 5) = "结算进账" Then
  74.             sum3 = sum3 + arr(i, 6): End If
  75.         If Month(arr(i, 3)) = wa.Range("F2") And arr(i, 4) = wa.Range("B7") And arr(i, 5) = "结算进账" Then
  76.             sum4 = sum4 + arr(i, 6): End If
  77.         If Month(arr(i, 3)) = wa.Range("F2") And arr(i, 4) = wa.Range("B8") And arr(i, 5) = "结算进账" Then
  78.             sum5 = sum5 + arr(i, 6): End If
  79.     Next:
  80.     wa.Range("F4").Value = sum
  81.     wa.Range("F5").Value = sum2
  82.     wa.Range("F6").Value = sum3
  83.     wa.Range("F7").Value = sum4
  84.     wa.Range("F8").Value = sum5
  85.     '5月汇总
  86.     sum = 0: sum2 = 0: sum3 = 0: sum4 = 0: sum5 = 0
  87.     For i = 2 To 2401
  88.         If Month(arr(i, 3)) = wa.Range("G2") And arr(i, 4) = wa.Range("B4") And arr(i, 5) = "结算进账" Then
  89.             sum = sum + arr(i, 6): End If
  90.         If Month(arr(i, 3)) = wa.Range("G2") And arr(i, 4) = wa.Range("B5") And arr(i, 5) = "结算进账" Then
  91.             sum2 = sum2 + arr(i, 6): End If
  92.         If Month(arr(i, 3)) = wa.Range("G2") And arr(i, 4) = wa.Range("B6") And arr(i, 5) = "结算进账" Then
  93.             sum3 = sum3 + arr(i, 6): End If
  94.         If Month(arr(i, 3)) = wa.Range("G2") And arr(i, 4) = wa.Range("B7") And arr(i, 5) = "结算进账" Then
  95.             sum4 = sum4 + arr(i, 6): End If
  96.         If Month(arr(i, 3)) = wa.Range("G2") And arr(i, 4) = wa.Range("B8") And arr(i, 5) = "结算进账" Then
  97.             sum5 = sum5 + arr(i, 6): End If
  98.     Next:
  99.     wa.Range("G4").Value = sum
  100.     wa.Range("G5").Value = sum2
  101.     wa.Range("G6").Value = sum3
  102.     wa.Range("G7").Value = sum4
  103.     wa.Range("G8").Value = sum5
  104.     '6月汇总
  105.     sum = 0: sum2 = 0: sum3 = 0: sum4 = 0: sum5 = 0
  106.     For i = 2 To 2401
  107.         If Month(arr(i, 3)) = wa.Range("H2") And arr(i, 4) = wa.Range("B4") And arr(i, 5) = "结算进账" Then
  108.             sum = sum + arr(i, 6): End If
  109.         If Month(arr(i, 3)) = wa.Range("H2") And arr(i, 4) = wa.Range("B5") And arr(i, 5) = "结算进账" Then
  110.             sum2 = sum2 + arr(i, 6): End If
  111.         If Month(arr(i, 3)) = wa.Range("H2") And arr(i, 4) = wa.Range("B6") And arr(i, 5) = "结算进账" Then
  112.             sum3 = sum3 + arr(i, 6): End If
  113.         If Month(arr(i, 3)) = wa.Range("H2") And arr(i, 4) = wa.Range("B7") And arr(i, 5) = "结算进账" Then
  114.             sum4 = sum4 + arr(i, 6): End If
  115.         If Month(arr(i, 3)) = wa.Range("H2") And arr(i, 4) = wa.Range("B8") And arr(i, 5) = "结算进账" Then
  116.             sum5 = sum5 + arr(i, 6): End If
  117.     Next:
  118.     wa.Range("H4").Value = sum
  119.     wa.Range("H5").Value = sum2
  120.     wa.Range("H6").Value = sum3
  121.     wa.Range("H7").Value = sum4
  122.     wa.Range("H8").Value = sum5
  123.     '7月汇总
  124.     sum = 0: sum2 = 0: sum3 = 0: sum4 = 0: sum5 = 0
  125.     For i = 2 To 2401
  126.         If Month(arr(i, 3)) = wa.Range("I2") And arr(i, 4) = wa.Range("B4") And arr(i, 5) = "结算进账" Then
  127.             sum = sum + arr(i, 6): End If
  128.         If Month(arr(i, 3)) = wa.Range("I2") And arr(i, 4) = wa.Range("B5") And arr(i, 5) = "结算进账" Then
  129.             sum2 = sum2 + arr(i, 6): End If
  130.         If Month(arr(i, 3)) = wa.Range("I2") And arr(i, 4) = wa.Range("B6") And arr(i, 5) = "结算进账" Then
  131.             sum3 = sum3 + arr(i, 6): End If
  132.         If Month(arr(i, 3)) = wa.Range("I2") And arr(i, 4) = wa.Range("B7") And arr(i, 5) = "结算进账" Then
  133.             sum4 = sum4 + arr(i, 6): End If
  134.         If Month(arr(i, 3)) = wa.Range("I2") And arr(i, 4) = wa.Range("B8") And arr(i, 5) = "结算进账" Then
  135.             sum5 = sum5 + arr(i, 6): End If
  136.     Next:
  137.     wa.Range("I4").Value = sum
  138.     wa.Range("I5").Value = sum2
  139.     wa.Range("I6").Value = sum3
  140.     wa.Range("I7").Value = sum4
  141.     wa.Range("I8").Value = sum5
  142.     '8月汇总
  143.     sum = 0: sum2 = 0: sum3 = 0: sum4 = 0: sum5 = 0
  144.     For i = 2 To 2401
  145.         If Month(arr(i, 3)) = wa.Range("J2") And arr(i, 4) = wa.Range("B4") And arr(i, 5) = "结算进账" Then
  146.             sum = sum + arr(i, 6): End If
  147.         If Month(arr(i, 3)) = wa.Range("J2") And arr(i, 4) = wa.Range("B5") And arr(i, 5) = "结算进账" Then
  148.             sum2 = sum2 + arr(i, 6): End If
  149.         If Month(arr(i, 3)) = wa.Range("J2") And arr(i, 4) = wa.Range("B6") And arr(i, 5) = "结算进账" Then
  150.             sum3 = sum3 + arr(i, 6): End If
  151.         If Month(arr(i, 3)) = wa.Range("J2") And arr(i, 4) = wa.Range("B7") And arr(i, 5) = "结算进账" Then
  152.             sum4 = sum4 + arr(i, 6): End If
  153.         If Month(arr(i, 3)) = wa.Range("J2") And arr(i, 4) = wa.Range("B8") And arr(i, 5) = "结算进账" Then
  154.             sum5 = sum5 + arr(i, 6): End If
  155.     Next:
  156.     wa.Range("J4").Value = sum
  157.     wa.Range("J5").Value = sum2
  158.     wa.Range("J6").Value = sum3
  159.     wa.Range("J7").Value = sum4
  160.     wa.Range("J8").Value = sum5
  161.     '后面还有4个月的,发不出来了 高手给看看
  162. End Sub

复制代码


TA的精华主题

TA的得分主题

发表于 2024-3-15 07:37 | 显示全部楼层
建议字典处理汇总

案例.rar

51.2 KB, 下载次数: 14

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-3-15 07:46 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
Sub 按钮47_Click()
    Set d = CreateObject("scripting.dictionary")
    arr = Sheets("月流水库").UsedRange
    Application.ScreenUpdating = False
    Application.Calculation = xlManual
    For j = 2 To UBound(arr)
        m = Month(arr(j, 3))
        d(m & arr(j, 4)) = d(m & arr(j, 4)) + arr(j, 6)
        d(m & arr(j, 5)) = d(m & arr(j, 5)) + arr(j, 6)
    Next j
    For j = 3 To Cells(Rows.Count, 2).End(3).Row
        For i = 3 To 14
            If Len(Cells(j, 2)) > 0 Then
                k = Cells(2, i) & Cells(j, 2)
                If d.exists(k) Then
                    Cells(j, i) = d(k)
                End If
            End If
        Next
    Next j
    Application.Calculation = xlAutomatic
    Application.ScreenUpdating = True
End Sub

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-3-15 07:47 | 显示全部楼层
案例1.zip (55.32 KB, 下载次数: 26)

TA的精华主题

TA的得分主题

发表于 2024-3-15 07:57 | 显示全部楼层
附件供参考。。。

案例.7z

57.05 KB, 下载次数: 22

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-3-15 07:58 | 显示全部楼层
用字典+数组,速度会快很多,代码会少很多。
  1. Sub ykcbf()   '//2024.3.15
  2.     Dim arr, d
  3.     Application.ScreenUpdating = False
  4.     Set d = CreateObject("Scripting.Dictionary")
  5.     With Sheets("月流水库")
  6.         r = .Cells(.Rows.Count, "a").End(xlUp).Row
  7.         arr = .[a1].Resize(r, 6)
  8.     End With
  9.     On Error Resume Next
  10.     For j = 4 To 5
  11.         For i = 2 To UBound(arr)
  12.             If arr(i, 3) <> Empty Then
  13.                 s = arr(i, j) & "|" & Month(arr(i, 3))
  14.                 d(s) = d(s) + arr(i, 6)
  15.             End If
  16.         Next
  17.     Next
  18.     With Sheets("账目统计")
  19.         r = .Cells(.Rows.Count, "b").End(xlUp).Row
  20.         For i = 4 To r
  21.             For j = 3 To 14
  22.                 If .Cells(i, 2) <> Empty Then
  23.                     s = .Cells(i, 2) & "|" & .Cells(2, j)
  24.                     If d.Exists(s) Then
  25.                         .Cells(i, j) = d(s)
  26.                     End If
  27.                 End If
  28.             Next
  29.         Next
  30.     End With
  31.     Set d = Nothing
  32.     Application.ScreenUpdating = True
  33.     MsgBox "OK!"
  34. End Sub

复制代码


评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-3-15 08:28 | 显示全部楼层
  1. Sub test0()
  2.   
  3.   Dim data, results, Dict As Object
  4.   Dim i As Long, j As Long
  5.   Dim posRow As Long, posCol As Long
  6.   
  7.   Set Dict = CreateObject("Scripting.Dictionary")
  8.   
  9.   Worksheets("账目统计").Activate
  10.   With Range("B2")
  11.     With Range(.End(xlToRight), .End(xlDown))
  12.       Intersect(.Offset(0, 0), .Offset(1, 1)).ClearContents
  13.       results = .Value
  14.     End With
  15.   End With
  16.   
  17.   For i = 3 To UBound(results)
  18.     If Len(results(i, 1)) Then Dict.Add results(i, 1), i
  19.   Next
  20.   
  21.   data = Worksheets("月流水库").Range("A1").CurrentRegion.Value
  22.   For i = 2 To UBound(data)
  23.     If Dict.Exists(data(i, 4)) Then
  24.       posRow = Dict(data(i, 4))
  25.       posCol = Month(data(i, 3)) + 1
  26.       results(posRow, posCol) = results(posRow, posCol) + Val(data(i, 6))
  27.       results(posRow, UBound(results, 2)) = results(posRow, UBound(results, 2)) + Val(data(i, 6))
  28.       results(2, posCol) = results(2, posCol) + Val(data(i, 6))
  29.       results(2, UBound(results, 2)) = results(2, UBound(results, 2)) + Val(data(i, 6))
  30.     End If
  31.   Next

  32.   Range("B2").Resize(UBound(results), UBound(results, 2)).Value = results
  33.   
  34.   Set Dict = Nothing
  35.   Beep
  36. End Sub
复制代码

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-3-15 10:12 | 显示全部楼层
用PQ实现,能即时更新,做了动态链接,你明细项目变化 也不怕。

捕获.PNG

案例.rar

59.51 KB, 下载次数: 9

TA的精华主题

TA的得分主题

发表于 2024-3-15 10:16 | 显示全部楼层
liulang0808 发表于 2024-3-15 07:46
Sub 按钮47_Click()
    Set d = CreateObject("scripting.dictionary")
    arr = Sheets("月流水库").U ...

我也学过VBA,自学的,对这个字典还有什么空间思维,我就是学不会看不懂

点评

多用多用,对照看看就好了  发表于 2024-3-15 12:19

TA的精华主题

TA的得分主题

发表于 2024-3-15 11:25 | 显示全部楼层
公式法,用到了辅助列和公式SUMIFS

案例.rar

53.52 KB, 下载次数: 3

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-18 05:49 , Processed in 0.049624 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表