Excel精英培训网

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

[已解决]多列多条件汇总

[复制链接]
发表于 2014-11-9 13:40 | 显示全部楼层 |阅读模式
有二个问题:

一,标题能不能自动生成?
二,能否实现按前四个标题字段排序?

最佳答案
2014-11-9 14:11
Sub 多列多条件汇总()
    Range("A:F").ClearContents
    Application.ScreenUpdating = False
    Dim dc As Object, arr, i&, j%, s&, k, w
    Set dc = CreateObject("scripting.dictionary")
    arr = Sheet1.Range("a2:f" & Sheet1.Range("a65536").End(3).Row)
    ReDim brr(1 To UBound(arr), 1 To 6)
    For i = 1 To UBound(arr)
        k = arr(i, 1) & "," & arr(i, 2) & "," & arr(i, 3) & "," & arr(i, 4)
        w = dc(k)
        If w = "" Then
            s = s + 1
            For j = 1 To 6
                brr(s, j) = arr(i, j)
            Next
            dc(k) = s
            w = s
        Else
            For j = 5 To 6
                brr(w, j) = brr(w, j) + arr(i, j)
            Next
        End If
    Next
    [a1:f1] = Sheet1.[a1:f1].Value
    [a2].Resize(s, 6) = brr   
    Range("a1").CurrentRegion.Sort Key1:=Range("D1"), Order1:=xlAscending, Header:=xlYes
    Range("a1").CurrentRegion.Sort Key1:=Range("A1"), Order1:=xlAscending, _
                                   Key2:=Range("B1"), Order2:=xlAscending, _
                                   Key3:=Range("C1"), Order3:=xlAscending, _
                                   Header:=xlYes

    Application.ScreenUpdating = True
End Sub


先按d排序再依次按a,b,c,相当于依次按a,b,c,d来排

多列多条件汇总.rar

15.58 KB, 下载次数: 50

发表于 2014-11-9 13:59 | 显示全部楼层
lz,可否把需要解决的问题描述清楚,估计没人能看懂你需要什么。
回复

使用道具 举报

 楼主| 发表于 2014-11-9 14:03 | 显示全部楼层
本帖最后由 张雄友 于 2014-11-9 14:06 编辑
hyfire2008 发表于 2014-11-9 13:59
lz,可否把需要解决的问题描述清楚,估计没人能看懂你需要什么。

有二个问题:

一,标题能不能自动生成?
二,能否实现按前四个标题字段排序?

附件效果看了没有?就是不是按源表出现的先后顺序,而是相同的排列在一起,像数据透视那样。
回复

使用道具 举报

发表于 2014-11-9 14:11 | 显示全部楼层    本楼为最佳答案   
Sub 多列多条件汇总()
    Range("A:F").ClearContents
    Application.ScreenUpdating = False
    Dim dc As Object, arr, i&, j%, s&, k, w
    Set dc = CreateObject("scripting.dictionary")
    arr = Sheet1.Range("a2:f" & Sheet1.Range("a65536").End(3).Row)
    ReDim brr(1 To UBound(arr), 1 To 6)
    For i = 1 To UBound(arr)
        k = arr(i, 1) & "," & arr(i, 2) & "," & arr(i, 3) & "," & arr(i, 4)
        w = dc(k)
        If w = "" Then
            s = s + 1
            For j = 1 To 6
                brr(s, j) = arr(i, j)
            Next
            dc(k) = s
            w = s
        Else
            For j = 5 To 6
                brr(w, j) = brr(w, j) + arr(i, j)
            Next
        End If
    Next
    [a1:f1] = Sheet1.[a1:f1].Value
    [a2].Resize(s, 6) = brr   
    Range("a1").CurrentRegion.Sort Key1:=Range("D1"), Order1:=xlAscending, Header:=xlYes
    Range("a1").CurrentRegion.Sort Key1:=Range("A1"), Order1:=xlAscending, _
                                   Key2:=Range("B1"), Order2:=xlAscending, _
                                   Key3:=Range("C1"), Order3:=xlAscending, _
                                   Header:=xlYes

    Application.ScreenUpdating = True
End Sub


先按d排序再依次按a,b,c,相当于依次按a,b,c,d来排
回复

使用道具 举报

发表于 2014-11-9 14:12 | 显示全部楼层
  1. Sub 多列多条件汇总()
  2. Range("a2:f65536").ClearContents
  3. Application.ScreenUpdating = False
  4. Dim dc As Object, arr, i&, j%, s&, w, k%, tmp
  5. Set dc = CreateObject("scripting.dictionary")
  6. arr = Sheet1.Range("a1:f" & Sheet1.Range("a65536").End(3).Row)
  7. ReDim brr(UBound(arr) - 1, 1 To 6)
  8. For i = 1 To UBound(arr, 2)
  9.     brr(0, i) = arr(1, i)
  10. Next
  11. For i = 2 To UBound(arr)
  12.     w = dc(arr(i, 1) & "," & arr(i, 2) & "," & arr(i, 3) & "," & arr(i, 4))
  13.     If w = "" Then
  14.        s = s + 1
  15.        For j = 1 To 6
  16.            brr(s, j) = arr(i, j)
  17.        Next
  18.        dc(arr(i, 1) & "," & arr(i, 2) & "," & arr(i, 3) & "," & arr(i, 4)) = s
  19.        w = s
  20.     Else
  21.        For j = 5 To 6
  22.            brr(w, j) = brr(w, j) + arr(i, j)
  23.        Next
  24.     End If
  25. Next
  26. ReDim tmp(1 To UBound(brr, 2))
  27. For i = 1 To s
  28.     For j = 1 To s - i + 1
  29.         If brr(j, 1) & "|" & brr(j, 2) & "|" & brr(j, 3) & "|" & brr(j, 4) > brr(j + 1, 1) & "|" & brr(j + 1, 2) & "|" & brr(j + 1, 3) & "|" & brr(j + 1, 4) Then
  30.             For k = 1 To UBound(brr, 2)
  31.                 tmp(k) = brr(j, k)
  32.                 brr(j, k) = brr(j + 1, k)
  33.                 brr(j + 1, k) = tmp(k)
  34.             Next
  35.         End If
  36.     Next
  37. Next
  38. [a1].Resize(s + 1, 6) = brr
  39. Application.ScreenUpdating = True
  40. End Sub
复制代码
中文的排序好像效果不怎么好。。。我测试了下,"上海"<"北京"

评分

参与人数 1 +6 收起 理由
张雄友 + 6 很给力!

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2014-11-9 14:22 | 显示全部楼层
爱疯 发表于 2014-11-9 14:11
Sub 多列多条件汇总()
    Range("A:F").ClearContents
    Application.ScreenUpdating = False

03版最多可以按3个条件排序,如果有5,6,,,个条件不是行不通了?
回复

使用道具 举报

 楼主| 发表于 2014-11-9 14:23 | 显示全部楼层
xdragon 发表于 2014-11-9 14:12
中文的排序好像效果不怎么好。。。我测试了下,"上海"

是的,就是不能达到数据透视那样的顺序效果。
回复

使用道具 举报

发表于 2014-11-9 14:35 | 显示全部楼层
张雄友 发表于 2014-11-9 14:22
03版最多可以按3个条件排序,如果有5,6,,,个条件不是行不通了?

多余3个,比如希望按a,b,c,d,e,f来排,那么执行或操作时就依次按f,e,d,c,b,a,一次排1个或多个,直到倒着排完。
07以后可直接添加很多个




Excel2003中,超过3个关键字的排序
http://www.excelpx.com/thread-123688-1-1.html
回复

使用道具 举报

 楼主| 发表于 2014-11-9 15:10 | 显示全部楼层
爱疯 发表于 2014-11-9 14:35
多余3个,比如希望按a,b,c,d,e,f来排,那么执行或操作时就依次按f,e,d,c,b,a,一次排1个或多个,直到倒着 ...

哦,您的代码简化过,直接这样就明白了。

   Range("A1").CurrentRegion.Sort Key1:=Range("D1"), Order1:=xlAscending, Header:=xlYes
    Range("A1").CurrentRegion.Sort Key1:=Range("C1"), Order1:=xlAscending, Header:=xlYes
    Range("A1").CurrentRegion.Sort Key1:=Range("B1"), Order2:=xlAscending, Header:=xlYes
    Range("A1").CurrentRegion.Sort Key1:=Range("A1"), Order3:=xlAscending, Header:=xlYes


回复

使用道具 举报

 楼主| 发表于 2014-11-9 15:15 | 显示全部楼层
爱疯 发表于 2014-11-9 14:11
Sub 多列多条件汇总()
    Range("A:F").ClearContents
    Application.ScreenUpdating = False

先按d排序再依次按a,b,c,相当于依次按a,b,c,d来排。


像我这种水平不是一下子能理解的。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-19 23:29 , Processed in 0.413591 second(s), 11 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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