Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 6080|回复: 10

[已解决]如何按照字典序号的级次对数据进行分级汇总

[复制链接]
发表于 2014-6-25 10:24 | 显示全部楼层 |阅读模式
本帖最后由 爱疯 于 2014-6-25 11:24 编辑

序号1的数据=序号1.1 的数据+1.2的数据+1.3 的数据
序号1.1的数据 = 1.1.1的数据+1.1.2的数据+1.1.3的数据

如此类推依次汇总
那位高手能提示一下!不胜感谢!
最佳答案
2014-6-26 09:29
7楼的代码有点小错误,小改一下:
  1. Option Explicit

  2. Private Sub CommandButton1_Click()
  3.     Dim d As Object
  4.     Dim arr, brr
  5.     Dim i%, str$, j%, max%
  6.     Set d = CreateObject("scripting.dictionary")
  7.     arr = Range("a1").CurrentRegion.Value
  8.     For i = 1 To UBound(arr)
  9.         d(CStr(arr(i, 1))) = 0
  10.     Next
  11.     For i = UBound(arr) To 1 Step -1
  12.         max = UBound(Split(arr(i, 1), "."))
  13.         If max > 0 Then
  14.             str = ""
  15.             For j = 0 To max - 1
  16.                 str = str & Split(arr(i, 1), ".")(j) & "."
  17.             Next
  18.             str = Left(str, Len(str) - 1)
  19.             If d(CStr(arr(i, 1))) = 0 Then d(CStr(arr(i, 1))) = arr(i, 3)
  20.             d(str) = d(str) + d(CStr(arr(i, 1)))
  21.         End If
  22.     Next
  23.     brr = d.items
  24.     [c1].Resize(d.Count) = WorksheetFunction.Transpose(brr)
  25. End Sub
复制代码

Book2.zip

12.64 KB, 下载次数: 191

excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2014-6-25 10:31 | 显示全部楼层
回复

使用道具 举报

发表于 2014-6-25 10:42 | 显示全部楼层
D9、D10、D11 单元格各复制以下公式,
三键回车( 公式复制后,点一下公式编辑栏的任意位置,先按住 shift、ctrl 两个键,然后敲enter键。)
D9=SUM(IF(LEN(A$10:A$41)=1,$C$10:$C$41))
D10=SUM(IF((LEN(A$10:A$41)=3)*(LEFT(A$10:A$41)="1"),$C$10:$C$41))
D11=SUM(IF((LEN(A$10:A$41)=5)*(LEFT(A$10:A$41)="1"),$C$10:$C$41))
回复

使用道具 举报

发表于 2014-6-25 11:13 | 显示全部楼层
sheet2
单击A列列标>数据>分列>向导第3步选文本>完成
然后在
d1输入 =IF(A2=A1&".1",,C1) 双击填充柄 (ps:这步的目的是将有子项的行都变0,如果你的原始数据所有需要计算和值的单元格都空着,那么这步实际可以省略)
e1输入 =IF(D1,D1,SUMIF(A2:A$32,A1&".*",D2))

回复

使用道具 举报

发表于 2014-6-25 11:24 | 显示全部楼层
SHEET2工作表的C1单元格复制以下公式,
三键回车、下拉。
=IF(LEN(A1)-LEN(SUBSTITUTE(A1,".",""))=0,SUM(IF((LEN(A$1:A$32)=3)*(LEFT(A$1:A$32)=A1),$C$1:$C$32)),IF(LEN(A1)-LEN(SUBSTITUTE(A1,".",""))=1,SUMIF(A$1:A$32,"="&(A1&"*"),$C$1:$C$32),""))
回复

使用道具 举报

发表于 2014-6-25 11:27 | 显示全部楼层
公式更新
SHEET2工作表的C1单元格公式,
=IF(LEN(A1)-LEN(SUBSTITUTE(A1,".",""))=0,SUM(IF((LEN(A$1:A$32)=3)*(LEFT(A$1:A$32)=A1),$C$1:$C$32)),IF(LEN(A1)-LEN(SUBSTITUTE(A1,".",""))=1,SUMIF(A$1:A$32,"="&(A1&"*"),$C$1:$C$32),A1))
回复

使用道具 举报

发表于 2014-6-25 12:28 | 显示全部楼层
使用VBA字典:
  1. Option Explicit

  2. Private Sub CommandButton1_Click()
  3.     Dim d As Object
  4.     Dim arr, brr
  5.     Dim i%, str$, j%, max%
  6.     Set d = CreateObject("scripting.dictionary")
  7.     arr = Range("a1").CurrentRegion.Value
  8.     For i = 1 To UBound(arr)
  9.         d(CStr(arr(i, 1))) = 0
  10.     Next
  11.     For i = UBound(arr) To 1 Step -1
  12.         max = UBound(Split(arr(i, 1), "."))
  13.         If max > 0 Then
  14.             str = ""
  15.             For j = 0 To max - 1
  16.                 str = str & Split(arr(i, 1), ".")(j) & "."
  17.             Next
  18.             str = Left(str, Len(str) - 1)
  19.             d(str) = d(str) + arr(i, 3) + d(CStr(arr(i, 1)))
  20.             If d(CStr(arr(i, 1))) = 0 Then d(CStr(arr(i, 1))) = arr(i, 3)
  21.         End If
  22.     Next
  23.     brr = d.items
  24.     [c1].Resize(d.Count) = WorksheetFunction.Transpose(brr)
  25. End Sub
复制代码
回复

使用道具 举报

 楼主| 发表于 2014-6-25 17:59 | 显示全部楼层
非常感谢各位的支持!!
回复

使用道具 举报

发表于 2014-6-26 04:53 | 显示全部楼层
eefnet@163.com 发表于 2014-6-25 17:59
非常感谢各位的支持!!

现在楼主的sheet1里的数据是现成的,
这样在sheet2里直接调用sheet1里的数据就可以了。
C1=VLOOKUP(A1,Sheet1!$A$10:$C$41,3,0)
如果不是,
请提供原始的数据。
回复

使用道具 举报

发表于 2014-6-26 09:29 | 显示全部楼层    本楼为最佳答案   
7楼的代码有点小错误,小改一下:
  1. Option Explicit

  2. Private Sub CommandButton1_Click()
  3.     Dim d As Object
  4.     Dim arr, brr
  5.     Dim i%, str$, j%, max%
  6.     Set d = CreateObject("scripting.dictionary")
  7.     arr = Range("a1").CurrentRegion.Value
  8.     For i = 1 To UBound(arr)
  9.         d(CStr(arr(i, 1))) = 0
  10.     Next
  11.     For i = UBound(arr) To 1 Step -1
  12.         max = UBound(Split(arr(i, 1), "."))
  13.         If max > 0 Then
  14.             str = ""
  15.             For j = 0 To max - 1
  16.                 str = str & Split(arr(i, 1), ".")(j) & "."
  17.             Next
  18.             str = Left(str, Len(str) - 1)
  19.             If d(CStr(arr(i, 1))) = 0 Then d(CStr(arr(i, 1))) = arr(i, 3)
  20.             d(str) = d(str) + d(CStr(arr(i, 1)))
  21.         End If
  22.     Next
  23.     brr = d.items
  24.     [c1].Resize(d.Count) = WorksheetFunction.Transpose(brr)
  25. End Sub
复制代码
回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-5-2 19:57 , Processed in 0.173003 second(s), 10 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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