Excel精英培训网

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

[已解决]谢谢爱疯老师。另类的分类汇总

[复制链接]
发表于 2013-3-8 10:43 | 显示全部楼层 |阅读模式
本帖最后由 lhj323323 于 2013-3-8 15:13 编辑

老师
现有一个另类的分类汇总,我搞不定,只解决了头一种情况,后面两种情况结果均有误,请帮我看看,谢谢了,

分类汇总.rar (33.48 KB, 下载次数: 18)
excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2013-3-8 11:03 | 显示全部楼层
回复

使用道具 举报

 楼主| 发表于 2013-3-8 11:05 | 显示全部楼层
爱疯 发表于 2013-3-8 11:03
这题也适合用数据透视表解决

爱疯老师,我还是想通过VB来解决,毕竟,每天都要做这个步骤。
回复

使用道具 举报

发表于 2013-3-8 11:17 | 显示全部楼层
{:091:}这明显是在整自己。弄合并单元格的一律不好处理。建议用字段表示缺口和收盘种类,而不是各自行合并显示。。
回复

使用道具 举报

发表于 2013-3-8 13:08 | 显示全部楼层
Option Explicit
Sub test()
    Dim A(), B(), d, i%, j%, x$
    A = Sheet2.Range("a1").CurrentRegion    '数据源
    B = Sheet1.[C1:H17].Value     '输出区域
    Set d = CreateObject("scripting.dictionary")
    'D列
    For i = 2 To UBound(A)
        d(A(i, 1)) = d(A(i, 1)) + 1
    Next i
    For i = 2 To UBound(B)
        B(i, 2) = d(B(i, 1))
    Next i
    d.RemoveAll
    'F列(多条件)
    For i = 2 To UBound(A)
        d(A(i, 1) & A(i, 2)) = d(A(i, 1) & A(i, 2)) + 1
    Next i
    For i = 2 To UBound(B)
        If B(i, 1) = "" Then B(i, 1) = B(i - 1, 1) '修改了C列合并单元格
        If B(i, 3) = "" And B(i, 1) = B(i - 1, 1) Then B(i, 3) = B(i - 1, 3) '修改了E列合并单元格
        B(i, 4) = d(B(i, 1) & B(i, 3))
    Next i
    d.RemoveAll
    'H列 (多条件)
    For i = 2 To UBound(A)
        d(A(i, 1) & A(i, 2) & A(i, 3)) = d(A(i, 1) & A(i, 2) & A(i, 3)) + 1
    Next i
    For i = 2 To UBound(B)
        If B(i, 5) = "" And B(i, 3) = B(i - 1, 3) And B(i, 1) = B(i - 1, 1) Then B(i, 5) = B(i - 1, 5)
        B(i, 6) = d(B(i, 1) & B(i, 3) & B(i, 5))
    Next i
    d.RemoveAll
    Sheet1.Range("c1").Resize(UBound(B), UBound(B, 2)) = B
End Sub

如果待统计的远不止CEF三列,我这么做就不好了。
在制作含有计算的表格时,应先考虑怎样利于计算,再考虑如何查看方便。
回复

使用道具 举报

发表于 2013-3-8 13:23 | 显示全部楼层    本楼为最佳答案   
Sub test()
    Dim A(), B(), d, i%, j%
    A = Sheet2.Range("a1").CurrentRegion    '数据源
    B = Sheet1.[C1:H17].Value     '输出区域
    Set d = CreateObject("scripting.dictionary")
    '建字典
    For i = 2 To UBound(A)
        d(A(i, 1)) = d(A(i, 1)) + 1
        d(A(i, 1) & A(i, 2)) = d(A(i, 1) & A(i, 2)) + 1
        d(A(i, 1) & A(i, 2) & A(i, 3)) = d(A(i, 1) & A(i, 2) & A(i, 3)) + 1
    Next i
    For i = 2 To UBound(B)
        '1)D列
        B(i, 2) = d(B(i, 1))
        '2)F列(多条件)
        If B(i, 1) = "" Then B(i, 1) = B(i - 1, 1)
        If B(i, 3) = "" And B(i, 1) = B(i - 1, 1) Then B(i, 3) = B(i - 1, 3)
        B(i, 4) = d(B(i, 1) & B(i, 3))
        '3)H列 (多条件)
        If B(i, 5) = "" And B(i, 3) = B(i - 1, 3) And B(i, 1) = B(i - 1, 1) Then B(i, 5) = B(i - 1, 5)
        B(i, 6) = d(B(i, 1) & B(i, 3) & B(i, 5))
    Next i
    Sheet1.Range("c1").Resize(UBound(B), UBound(B, 2)) = B
End Sub
分类汇总3.rar (40.77 KB, 下载次数: 26)
回复

使用道具 举报

发表于 2013-3-8 13:26 | 显示全部楼层
可能统计表有啥变化,我这种方法就得改了。你多试下吧
回复

使用道具 举报

 楼主| 发表于 2013-3-8 15:10 | 显示全部楼层
爱疯 发表于 2013-3-8 13:23
Sub test()
    Dim A(), B(), d, i%, j%
    A = Sheet2.Range("a1").CurrentRegion    '数据源

太好了,谢谢爱疯老师,
我还找了个办法,不知有没有用:

Arr2(d(arr(i, 1)), IIf(arr(i, 2) = "女", 3, IIf(arr(i, 2) = "老年", 7, IIf(arr(i, 2) = "中年", 11, 14))) + IIf(arr(i, 3) = "少年", 1, 0) + IIf(arr(i, 3) = "平走", 2, 0) + IIf(arr(i, 3) = "停牌", 0, 0)) = Arr2(d(arr(i, 1)), IIf(arr(i, 2) = "补缺口", 3, IIf(arr(i, 2) = "不补缺口", 7, IIf(arr(i, 2) = "平开", 11, 14))) + IIf(arr(i, 3) = "低走", 1, 0) + IIf(arr(i, 3) = "平走", 2, 0) + IIf(arr(i, 3) = "停牌", 0, 0)) + 1

这样的语句,不过就得把今天早上求助贴中的结果表格式给改一改。
再次谢谢您!
回复

使用道具 举报

 楼主| 发表于 2013-3-8 15:12 | 显示全部楼层
liuguansky 发表于 2013-3-8 11:17
这明显是在整自己。弄合并单元格的一律不好处理。建议用字段表示缺口和收盘种类,而不是各自行合并显 ...

老师说得是,我也正想着如何调整结果表格式,避免合并单元格的出现。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-26 22:22 , Processed in 0.337402 second(s), 10 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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