Excel精英培训网

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

[已解决]双条件分批汇总

[复制链接]
发表于 2014-12-16 22:34 | 显示全部楼层 |阅读模式
双条件分批汇总。
最佳答案
2014-12-17 06:13
  1. Sub Macro1()
  2. Dim arr, brr, crr, d, w(), i&, j%, s%, n&, n2&
  3. Set d = CreateObject("scripting.dictionary")
  4. Sheet2.Activate
  5. arr = Range("a3").CurrentRegion
  6. brr = Sheet1.Range("a3").CurrentRegion
  7. ReDim crr(1 To 10000, 1 To UBound(arr, 2))
  8. ReDim w(1 To (UBound(arr, 2) - 4) \ 2, 1 To 2)
  9. s = 1
  10. w(s, 1) = 0: w(s, 2) = 5
  11. For j = 7 To UBound(arr, 2) Step 2
  12.     s = s + 1
  13.     w(s, 1) = Val(arr(1, j)) - 0.5
  14.     w(s, 2) = j
  15. Next
  16. For i = 2 To UBound(brr)
  17.     zf = brr(i, 3) & "," & brr(i, 4)
  18.     If Not d.exists(zf) Then
  19.         n = n + 1
  20.         d(zf) = n
  21.         crr(n, 1) = brr(i, 3)
  22.         crr(n, 2) = brr(i, 4)
  23.     End If
  24.     n2 = d(zf)
  25.     crr(n2, 3) = crr(n2, 3) + brr(i, 7)
  26.     crr(n2, 4) = crr(n2, 4) + brr(i, 8)
  27.     l = Application.Lookup(brr(i, 9), w)
  28.     crr(n2, l) = crr(n2, l) + brr(i, 7)
  29.     crr(n2, l + 1) = crr(n2, l + 1) + brr(i, 8)
  30. Next
  31. Range("a11").Resize(n, UBound(crr, 2)) = crr
  32. For j = 3 To UBound(crr, 2)
  33.     Cells(11 + n, j) = Application.Sum(Cells(11, j).Resize(n))
  34. Next
  35. End Sub
复制代码

双条件分批汇总.rar

105.38 KB, 下载次数: 17

发表于 2014-12-17 05:26 | 显示全部楼层
E17=SUMPRODUCT((收款明细!$C$4:$C$23=$A17)*(收款明细!$I$4:$I$23>INT((COLUMN()-7)/2)*15+15)*(收款明细!$I$4:$I$23<INT((COLUMN()-7)/2)*15+31),(收款明细!$G$4:$G$23))
F17=SUMPRODUCT((收款明细!$C$4:$C$23=$A17)*(收款明细!$I$4:$I$23>INT((COLUMN()-7)/2)*15+15)*(收款明细!$I$4:$I$23<INT((COLUMN()-7)/2)*15+31),(收款明细!$H$4:$H$23))

复制E17:F17,粘贴到E17:E19区域。
回复

使用道具 举报

发表于 2014-12-17 06:13 | 显示全部楼层    本楼为最佳答案   
  1. Sub Macro1()
  2. Dim arr, brr, crr, d, w(), i&, j%, s%, n&, n2&
  3. Set d = CreateObject("scripting.dictionary")
  4. Sheet2.Activate
  5. arr = Range("a3").CurrentRegion
  6. brr = Sheet1.Range("a3").CurrentRegion
  7. ReDim crr(1 To 10000, 1 To UBound(arr, 2))
  8. ReDim w(1 To (UBound(arr, 2) - 4) \ 2, 1 To 2)
  9. s = 1
  10. w(s, 1) = 0: w(s, 2) = 5
  11. For j = 7 To UBound(arr, 2) Step 2
  12.     s = s + 1
  13.     w(s, 1) = Val(arr(1, j)) - 0.5
  14.     w(s, 2) = j
  15. Next
  16. For i = 2 To UBound(brr)
  17.     zf = brr(i, 3) & "," & brr(i, 4)
  18.     If Not d.exists(zf) Then
  19.         n = n + 1
  20.         d(zf) = n
  21.         crr(n, 1) = brr(i, 3)
  22.         crr(n, 2) = brr(i, 4)
  23.     End If
  24.     n2 = d(zf)
  25.     crr(n2, 3) = crr(n2, 3) + brr(i, 7)
  26.     crr(n2, 4) = crr(n2, 4) + brr(i, 8)
  27.     l = Application.Lookup(brr(i, 9), w)
  28.     crr(n2, l) = crr(n2, l) + brr(i, 7)
  29.     crr(n2, l + 1) = crr(n2, l + 1) + brr(i, 8)
  30. Next
  31. Range("a11").Resize(n, UBound(crr, 2)) = crr
  32. For j = 3 To UBound(crr, 2)
  33.     Cells(11 + n, j) = Application.Sum(Cells(11, j).Resize(n))
  34. Next
  35. End Sub
复制代码
回复

使用道具 举报

发表于 2014-12-17 06:24 | 显示全部楼层
………………

双条件分批汇总.zip

9.2 KB, 下载次数: 31

评分

参与人数 1 +6 收起 理由
张雄友 + 6 5楼怎么表达?

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2014-12-17 06:33 | 显示全部楼层
dsmch 发表于 2014-12-17 06:24
………………

有一个问题想问您:早上好。

      If Myname <> "ThisWorkbook.Name.xls" And Myname <> "关白.xls" Then '排除几个簿

用以下这种表达: If InStr("关白 ,ThisWorkbook.Name,", Myname & ",") = 0 Then

怎么不行的?怎么才对?




点评

抱歉,和我的代码无关,没看懂  发表于 2014-12-17 21:16
回复

使用道具 举报

发表于 2014-12-17 09:10 | 显示全部楼层
应该是
If InStr("关白.xls" & ThisWorkbook.Name , Myname & ",") = 0 Then
回复

使用道具 举报

发表于 2014-12-17 13:48 | 显示全部楼层
Sub test()
    Dim dic As Object
    Dim arr, Rarr(1 To 100000, 1 To 18)
    Dim str$, i&, k&, c&, k1&
    arr = Sheet1.Range("a3").CurrentRegion
    Set dic = CreateObject("Scripting.Dictionary")
    For i = 2 To UBound(arr)
        c = 2 * (arr(i, 9) \ 15) + 5
        str = arr(i, 3) & "-" & arr(i, 4)
        If dic.exists(str) Then
            k1 = dic(str)
            Rarr(k1, 3) = Rarr(k1, 3) + arr(i, 7)
            Rarr(k1, 4) = Rarr(k1, 4) + arr(i, 8)
            Rarr(k1, c) = Rarr(k1, c) + arr(i, 7)
            Rarr(k1, c + 1) = Rarr(k1, c + 1) + arr(i, 8)
        Else
            k = k + 1
            dic.Add str, k
            Rarr(k, 1) = arr(i, 3)
            Rarr(k, 2) = arr(i, 4)
            Rarr(k, 3) = arr(i, 7)
            Rarr(k, 4) = arr(i, 8)
            Rarr(k, c) = arr(i, 7)
            Rarr(k, c + 1) = arr(i, 8)
        End If
    Next
    Range("a17").Resize(k, 18) = Rarr
End Sub

点评

楼主的数据正好是15天一统计,如果没有规律,显然代码要重写了  发表于 2014-12-17 14:38
回复

使用道具 举报

 楼主| 发表于 2014-12-17 17:57 | 显示全部楼层
本帖最后由 张雄友 于 2014-12-17 17:58 编辑
dsmch 发表于 2014-12-17 06:24
………………

如果没有规律,代码是否适用?就是不是:15天一统计的情况下。

点评

代码已考虑,自己修改一下测试一下结果  发表于 2014-12-17 21:13
修改一下天数,起始必须相连,测法一下公式和相关代码  发表于 2014-12-17 20:43
回复

使用道具 举报

发表于 2014-12-18 20:33 | 显示全部楼层
SHEET1C1公式:
=SUMPRODUCT((SHEET2!A$1:A$9&SHEET2!B$1:B$9=A1&B1)*SHEET2!C$1:C$9)


回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-25 05:41 , Processed in 0.718339 second(s), 15 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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