Excel精英培训网

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

[已解决]恳请各位帮忙解决一下这个问题。。不胜感激!

[复制链接]
发表于 2017-2-14 11:19 | 显示全部楼层 |阅读模式
如左表所显示,A列、B列、F列为关键字进行统计,并分开统计单位不同的数据,在最终显示的总数中显示出来,如“结果”显示的那样。。谢谢!
数据有6000多条,麻烦各位高手用VBA帮忙解决一下,小弟不胜感激!

最佳答案
2017-2-15 16:21
代码可以简化一点。
  1. Sub test1()
  2.     Dim A, B
  3.     Set d1 = CreateObject("scripting.dictionary")
  4.     Set d2 = CreateObject("scripting.dictionary")
  5.     Set dd = CreateObject("scripting.dictionary")
  6.     A = Sheets(1).Range("a1").CurrentRegion

  7.    
  8.     For i = 2 To UBound(A)   '相同的产生单位归类
  9.         x2 = A(i, 1)     '产生单位为key
  10.         d2(x2) = d2(x2) & "," & i
  11.     Next
  12.    
  13.     With Sheets(2)
  14.         .Cells.Clear: .[H1] = "汇总"
  15.         .[a1].Resize(1, 7) = Split("危废产生单位,危废代码,危废名称,数量,单位,接收单位,地区", ",")
  16.         For Each x2 In d2.keys      '对于相同的产生单位,汇总转换
  17.             xrr = Split(d2(x2), ",")
  18.             ReDim B(1 To UBound(xrr), 1 To UBound(A, 2))
  19.             n = 0: dd.RemoveAll
  20.             For k = 1 To UBound(xrr)
  21.                 i = Val(xrr(k))
  22.                 x1 = A(i, 1) & A(i, 2) & A(i, 3) & A(i, 6)   '产生单位+代码+名称+接收单位为key
  23.                 If Not d1.exists(x1) Then
  24.                     n = n + 1
  25.                     d1(x1) = n
  26.                     For j = 1 To UBound(A, 2)
  27.                         If j <> 4 Then B(n, j) = A(i, j)
  28.                     Next
  29.                 End If
  30.                 B(d1(x1), 4) = B(d1(x1), 4) + A(i, 4)
  31.                 sz = A(i, 4): dw = A(i, 5) '数值、单位
  32.                 xx = x2 & dw    '产生单位+计量单位为key
  33.                 dd(xx) = CStr(Val(dd(xx)) + sz) & dw
  34.             Next
  35.     '输出
  36.             r = .[a65536].End(3).Row + 1
  37.             .Cells(r, 1).Resize(n, UBound(B, 2)) = B
  38.             .Cells(r, "H").Resize(n).Merge   '合并H列单元格
  39.             .Cells(r, "H") = Join(dd.items, "+")
  40.         Next
  41.         .Activate
  42.     End With
  43. End Sub
复制代码
数据源.jpg
目标结果.png

麻烦给帮忙解决一下。。谢谢!.rar

4.75 KB, 下载次数: 9

发表于 2017-2-14 11:37 | 显示全部楼层
QQ截图20170214113509.jpg


最好先通过现成工具汇总,比如数据透视表。
再看最终需求,确定下一步。
回复

使用道具 举报

 楼主| 发表于 2017-2-14 11:46 | 显示全部楼层
爱疯 发表于 2017-2-14 11:37
最好先通过现成工具汇总,比如数据透视表。
再看最终需求,确定下一步。

谢谢“爱疯”的回复!其实我也试过这个,但是显示的信息还是达不到我想要的结果,,所以就想通过其他的办法达到。麻烦帮忙看看可不可以通过vba实现。谢谢!
回复

使用道具 举报

发表于 2017-2-14 12:31 | 显示全部楼层
Sub test()
    Dim A, B, d, i, j
    Set d = CreateObject("scripting.dictionary")
    A = Range("a1").CurrentRegion

    '统计
    For i = 2 To UBound(A)
        If Not d.exists(A(i, 1)) Then Set d(A(i, 1)) = CreateObject("scripting.dictionary")
        d(A(i, 1))(A(i, 5)) = d(A(i, 1))(A(i, 5)) + A(i, 4)
    Next i

    '转换
    ReDim B(1 To d.Count, 1 To 2)
    For i = 2 To UBound(A)
        If A(i - 1, 1) <> A(i, 1) Then
            j = j + 1
            B(j, 1) = A(i, 1)
            B(j, 2) = Dic2Str(d(A(i, 1)).KEYS, d(A(i, 1)).items)
        End If
    Next i

    '输出
    Sheets(2).Select
    Cells.Clear
    Range("A1").Resize(UBound(B), UBound(B, 2)) = B
End Sub

'字典数据转字符串
Function Dic2Str(k, t) As String
    Dim i
    For i = 0 To UBound(t)
        Dic2Str = Dic2Str & "+" & t(i) & k(i)
    Next i
    Dic2Str = Mid(Dic2Str, 2)
End Function



麻烦给帮忙解决一下2.rar (12.09 KB, 下载次数: 3)
回复

使用道具 举报

 楼主| 发表于 2017-2-14 16:53 | 显示全部楼层
爱疯 发表于 2017-2-14 12:31
Sub test()
    Dim A, B, d, i, j
    Set d = CreateObject("scripting.dictionary")

非常感谢爱疯版主的帮忙!!谢谢!!虽然不能完全达到我想要的那个输出结果,但是起码也好多了。。谢谢!!
回复

使用道具 举报

发表于 2017-2-14 17:13 | 显示全部楼层
刚发现,这一个帖记录了3次最佳答案,先取消。

另外,也没完全按1楼效果实现,如果有朋友回复更接近的效果,再评吧。
回复

使用道具 举报

发表于 2017-2-15 16:02 | 显示全部楼层
试试的我这个。
  1. Sub test()
  2.     Set d1 = CreateObject("scripting.dictionary")
  3.     Set d2 = CreateObject("scripting.dictionary")
  4.     A = Sheets(1).Range("a1").CurrentRegion
  5.     B = A: n = 1

  6.     '统计并转换
  7.     For i = 2 To UBound(A)
  8.         x1 = A(i, 1) & A(i, 2) & A(i, 3) & A(i, 6)   '产生单位+代码+名称+接收单位为key
  9.         x2 = A(i, 1)     '产生单位为key
  10.         If Not d1.exists(x1) Then
  11.             n = n + 1
  12.             d1(x1) = n
  13.             For j = 1 To UBound(A, 2)
  14.                 If j <> 4 Then B(n, j) = A(i, j) Else B(n, j) = 0
  15.             Next
  16.         End If
  17.         B(d1(x1), 4) = B(d1(x1), 4) + A(i, 4)
  18.         d2(x2) = d2(x2) & "," & A(i, 4) & "-" & A(i, 5)   ',30-个,28-支,0.8-吨。。。。。
  19.     Next i
  20.    
  21.     Set dd = CreateObject("scripting.dictionary")   '计算分计量单位的汇总值
  22.     For Each x2 In d2.keys
  23.         xrr = Split(d2(x2), ",")
  24.         For i = 1 To UBound(xrr)
  25.             x = xrr(i): sz = Val(x): dw = Split(x, "-")(1)   '数值、单位
  26.             xx = x2 & dw: dd(xx) = CStr(Val(dd(xx)) + sz) & dw
  27.         Next
  28.         d2(x2) = Join(dd.items, "+")
  29.         dd.RemoveAll
  30.     Next

  31.     '输出
  32.     With Sheets(2)
  33.         .Select
  34.         .Cells.Clear
  35.         .Range("A1").Resize(n, UBound(B, 2)) = B
  36.         .Range("A2").Resize(n - 1, UBound(B, 2)).Sort key1:=.[a2]    '按产生单位排序
  37.         B = .Range("A1").Resize(n, UBound(B, 2))
  38.         
  39.         .[H1] = "汇总"
  40.         s = 2
  41.         For i = 3 To n
  42.             If B(i, 1) <> B(i - 1, 1) Or i = n Then
  43.                 e = IIf(i = n, n, i - 1)
  44.                 .Cells(s, "H").Resize(e - s + 1).Merge   '合并H列单元格
  45.                 .Cells(s, "H") = d2(B(s, 1))
  46.                 s = i
  47.             End If
  48.         Next
  49.     End With
  50. End Sub
复制代码

麻烦给帮忙解决一下。。谢谢!.rar

12.9 KB, 下载次数: 8

回复

使用道具 举报

发表于 2017-2-15 16:21 | 显示全部楼层    本楼为最佳答案   
代码可以简化一点。
  1. Sub test1()
  2.     Dim A, B
  3.     Set d1 = CreateObject("scripting.dictionary")
  4.     Set d2 = CreateObject("scripting.dictionary")
  5.     Set dd = CreateObject("scripting.dictionary")
  6.     A = Sheets(1).Range("a1").CurrentRegion

  7.    
  8.     For i = 2 To UBound(A)   '相同的产生单位归类
  9.         x2 = A(i, 1)     '产生单位为key
  10.         d2(x2) = d2(x2) & "," & i
  11.     Next
  12.    
  13.     With Sheets(2)
  14.         .Cells.Clear: .[H1] = "汇总"
  15.         .[a1].Resize(1, 7) = Split("危废产生单位,危废代码,危废名称,数量,单位,接收单位,地区", ",")
  16.         For Each x2 In d2.keys      '对于相同的产生单位,汇总转换
  17.             xrr = Split(d2(x2), ",")
  18.             ReDim B(1 To UBound(xrr), 1 To UBound(A, 2))
  19.             n = 0: dd.RemoveAll
  20.             For k = 1 To UBound(xrr)
  21.                 i = Val(xrr(k))
  22.                 x1 = A(i, 1) & A(i, 2) & A(i, 3) & A(i, 6)   '产生单位+代码+名称+接收单位为key
  23.                 If Not d1.exists(x1) Then
  24.                     n = n + 1
  25.                     d1(x1) = n
  26.                     For j = 1 To UBound(A, 2)
  27.                         If j <> 4 Then B(n, j) = A(i, j)
  28.                     Next
  29.                 End If
  30.                 B(d1(x1), 4) = B(d1(x1), 4) + A(i, 4)
  31.                 sz = A(i, 4): dw = A(i, 5) '数值、单位
  32.                 xx = x2 & dw    '产生单位+计量单位为key
  33.                 dd(xx) = CStr(Val(dd(xx)) + sz) & dw
  34.             Next
  35.     '输出
  36.             r = .[a65536].End(3).Row + 1
  37.             .Cells(r, 1).Resize(n, UBound(B, 2)) = B
  38.             .Cells(r, "H").Resize(n).Merge   '合并H列单元格
  39.             .Cells(r, "H") = Join(dd.items, "+")
  40.         Next
  41.         .Activate
  42.     End With
  43. End Sub
复制代码
回复

使用道具 举报

发表于 2017-2-15 20:29 | 显示全部楼层
本帖最后由 today0427 于 2017-2-15 23:27 编辑

鉴于数据源比较规范,我用sql语句也来一个,因为你最后合计的时候按单位合计,而单位为吨的名称都不一样,所以无法完全达到你的要求,最后效果也只能如此了。
QQ图片20170215232630.png

QQ图片20170215203607.png

麻烦给帮忙解决一下。。谢谢!.rar

18.82 KB, 下载次数: 10

评分

参与人数 1 +30 金币 +30 收起 理由
心正意诚身修 + 30 + 30 堵路媽好棒。

查看全部评分

回复

使用道具 举报

发表于 2017-2-16 09:50 | 显示全部楼层
today的做法充分体现了sql的优势,值得学习。
考虑到要分公司统计数量,这样更加好一点。
QQ截图20170216094903.png
QQ截图20170216094920.png

评分

参与人数 1 +30 金币 +30 收起 理由
心正意诚身修 + 30 + 30 你別誇她。她會驕傲的。

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-27 07:23 , Processed in 0.489703 second(s), 19 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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