ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: kezhiye

[求助] 如何正确汇总出第三级数据

[复制链接]

TA的精华主题

TA的得分主题

发表于 2017-3-6 11:26 | 显示全部楼层
kezhiye 发表于 2017-3-6 11:04
明细是分一的合并,实际工作薄中,不止分1,而是有分1到分12,明细表是分1到分12的合并(只是合并不是汇 ...

那么汇总数据是从“明细”提取呢,还是从“分一”、“分二”等表提取呢?

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-3-6 12:27 | 显示全部楼层
  我感觉主要是以下这段代码要进行修改,因为只有三级代码的是时候,也就是代码列的位数最高只有10位的时候,汇总结果是正确的,只是在增加一级以后(也就是最高位数增加三位)才出现第三级有的有汇总数有的没有汇总数。估计是以下代码的循环只判断一级(即四位数)、二级(即七位数)、和大于二级这三种情况,所以会出现三级下面如果没有四级的则能够得出三级的汇总数(如张三李四的三级有汇总数),而三级下面有四级的则得不出三级的汇总数(如王五郑七的三级没有汇总数)。如果将现在的三级循环判断再增加成一级循环判断,即增加第三级(10位数的),由原来的判断一级、二级和大于二级改成判断一级、二级、三级和大于三级,问题应该就能解决了。

K2 = 0: K3 = 0
    For d = i To 2 Step -1
    sh.Range("Y" & d).Value = Left(sh.Range("A" & d) * 1000000, 9)
      If sh.Range("Y" & d) Mod 100 > 0 Then
          K3 = IIf(K3 = 0, d, K3)
       ElseIf sh.Range("Y" & d) Mod 100000 > 0 Then
           If K3 > 0 Then
           sh.Range(sh.Cells(d, 6), sh.Cells(d, 10)).FormulaR1C1 = "=sum(r[1]c:r[" & K3 - d & "]c)"
            sh.Range("A" & d & ":M" & d).Interior.ColorIndex = 40 '35
            End If
            K3 = 0: K2 = IIf(K2 = 0, d, K2)
        Else
            If K2 > 0 Then
         sh.Range(sh.Cells(d, 6), sh.Cells(d, 10)).FormulaR1C1 = "=sumproduct((left(r[1]c25:r" & K2 & "c25,4)=left(rc25,4))*(right(r[1]c25:r" & K2 & "c25,2)=""00"")*r[1]c:r" & K2 & "c)"
         sh.Range("A" & d & ":M" & d).Interior.ColorIndex = 4 '35
            End If
            K2 = 0
        End If
       sh.Range("F" & d & ":L" & d).Value = sh.Range("F" & d & ":L" & d).Value
     Next
     
      For k = 2 To i
         cc4 = sh.Cells(k, 4): cc5 = sh.Cells(k, 5): cc6 = sh.Cells(k, 6): cc7 = sh.Cells(k, 7)
         cc11 = sh.Cells(k, 11): cc12 = sh.Cells(k, 12)
        sh.Cells(k, 10) = IIf(sh.Cells(k, 3) = "借", Val(cc5 + cc6 - cc7), Val(cc5 + cc7 - cc6))
        sh.Cells(k, 13) = IIf(sh.Cells(k, 3) = "借", Val(cc4 + cc11 - cc12), Val(cc4 + cc12 - cc11))
        Next k
      

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-3-6 12:40 | 显示全部楼层
sh.Range("Y" & d).Value = Left(sh.Range("A" & d) * 1000000, 9)
      If sh.Range("Y" & d) Mod 100 > 0 Then
          K3 = IIf(K3 = 0, d, K3)
       ElseIf sh.Range("Y" & d) Mod 100000 > 0 Then

这四行,我除了第一行能明白,后面三行都搞不懂,而这好象正是判断二级和三级的地方,如果把这里增加一级判断,改成判断二级、三级和四级,估计问题就解决了

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-3-6 12:46 | 显示全部楼层
代码是有规律的,一级代码就是4位数,二级代码就7位数,三级代码就是10位数,四级代码就是13位数,这个是固定。有一级的不一定有二级,但有四级的则一定是有一二三级的。有二级的不一定有三级,有三级的则一定有一二级的。也就是有高级的不一定有低级,有低级则一定有它的高级。

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-3-6 14:29 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
一楼附件增加了问题描述,重新上传,看能不能让问题更容易明白。请师傅们继续帮忙看看

TA的精华主题

TA的得分主题

发表于 2017-3-6 16:10 | 显示全部楼层
本帖最后由 wj2368 于 2017-3-6 16:17 编辑

短信收到,不知道是不是你要的结果。
捕获.PNG

如何正确汇总出第三级数据.rar

203.34 KB, 下载次数: 2

TA的精华主题

TA的得分主题

发表于 2017-3-6 16:16 | 显示全部楼层
kezhiye 发表于 2017-3-6 14:29
一楼附件增加了问题描述,重新上传,看能不能让问题更容易明白。请师傅们继续帮忙看看

短信收到,看是不是你要的结果
捕获.PNG

如何正确汇总出第三级数据.rar

204.88 KB, 下载次数: 3

TA的精华主题

TA的得分主题

发表于 2017-3-6 16:18 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2017-3-6 16:21 | 显示全部楼层
  1. Sub test()
  2.   Dim r%, i%
  3.   Dim arr, brr, hj(1 To 10)
  4.   Dim d As Object
  5.   Dim flg As Boolean
  6.   Set d = CreateObject("scripting.dictionary")
  7.   With Worksheets("代码科目")
  8.     r = .Cells(.Rows.Count, 1).End(xlUp).Row
  9.     arr = .Range("a2:g" & r)
  10.     For i = 1 To UBound(arr)
  11.       If Not d.exists(arr(i, 1)) Then
  12.         ReDim brr(1 To 13)
  13.         brr(1) = arr(i, 1)
  14.         brr(2) = arr(i, 2)
  15.         brr(3) = arr(i, 3)
  16.         brr(4) = arr(i, 6)
  17.         brr(5) = arr(i, 7)
  18.         d(arr(i, 1)) = brr
  19.       End If
  20.     Next
  21.   End With
  22.   With Worksheets("明细")
  23.     r = .Cells(.Rows.Count, 1).End(xlUp).Row
  24.     arr = .Range("a2:l" & r)
  25.     For i = 1 To UBound(arr)
  26.       If d.exists(arr(i, 2)) Then
  27.         brr = d(arr(i, 2))
  28.         brr(6) = brr(6) + arr(i, 10)
  29.         brr(7) = brr(7) + arr(i, 12)
  30.         brr(11) = brr(11) + arr(i, 9)
  31.         brr(12) = brr(12) + arr(i, 11)
  32.         d(arr(i, 2)) = brr
  33.       End If
  34.     Next
  35.   End With
  36.   With Worksheets("分1")
  37.     r = .Cells(.Rows.Count, 1).End(xlUp).Row
  38.     arr = .Range("a2:l" & r)
  39.     For i = 1 To UBound(arr)
  40.       If d.exists(arr(i, 2)) Then
  41.         brr = d(arr(i, 2))
  42.         brr(8) = brr(8) + arr(i, 10)
  43.         brr(9) = brr(9) + arr(i, 12)
  44.         d(arr(i, 2)) = brr
  45.       End If
  46.     Next
  47.   End With
  48.   arr = Application.Transpose(Application.Transpose(d.items))
  49.   For i = UBound(arr) - 1 To 1 Step -1
  50.     bm = arr(i, 1)
  51.     j = i + 1
  52.     Do While arr(j, 1) Like bm & "*"
  53.       If arr(j, 1) Like bm & "???" Then
  54.         For k = 1 To 10
  55.           hj(k) = hj(k) + arr(j, k + 3)
  56.         Next
  57.         flg = True
  58.       End If
  59.       j = j + 1
  60.       If j > UBound(arr) Then
  61.         Exit Do
  62.       End If
  63.     Loop
  64.     If flg Then
  65.       For k = 1 To 10
  66.         arr(i, k + 3) = hj(k)
  67.       Next
  68.       flg = flase
  69.       Erase hj
  70.     End If
  71.   Next
  72.   With Worksheets("汇总")
  73.     .UsedRange.Offset(1, 0).Clear
  74.     .Columns(1).NumberFormatLocal = "@"
  75.     .Range("a2").Resize(UBound(arr), UBound(arr, 2)) = arr
  76.   End With
  77. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2017-3-6 16:23 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-5-5 03:01 , Processed in 0.035772 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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