ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 2045|回复: 10

VBV 多条件分类汇总,请大神帮忙~

[复制链接]

TA的精华主题

TA的得分主题

发表于 2020-2-25 15:28 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
亲爱的朋友您好! 非常感谢您百忙中抽出宝贵的时间,查看我的求助帖子,非常希望得到您的帮助,谢谢!

附件中 A-I列为原始数据,怎么用VBA实现按条件分类汇总到 指定的单元格中;

请各位大神指点 ,非常感谢!
Capture.PNG

VBA 分类汇总.zip

12.14 KB, 下载次数: 13

TA的精华主题

TA的得分主题

发表于 2020-2-25 16:20 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
Sub test()
Set d = CreateObject("scripting.dictionary")
rr = Array("101", "102", "531", "532")
With Sheet1
    .Range("k3:p5000") = Empty
    ar = .[a1].CurrentRegion
    For s = 0 To UBound(rr)
        k = 0: d.RemoveAll
        ReDim br(1 To UBound(ar), 1 To 6)
        For i = 2 To UBound(ar)
            If Trim(ar(i, 2)) = Trim(rr(s)) Then
                t = d(Trim(ar(i, 5)))
                If t = "" Then
                    k = k + 1
                    d(Trim(ar(i, 5))) = k
                    t = k
                    br(k, 1) = Date
                    br(k, 2) = ar(i, 1)
                    br(k, 3) = ar(i, 4)
                    br(k, 4) = ar(i, 6)
                    br(k, 5) = ar(i, 5)
                End If
                br(t, 6) = br(t, 6) + (ar(i, 8) * 1000)
            End If
        Next i
        If s = 0 Then
            If k <> 0 Then
                .Cells(3, "k").Resize(k, UBound(br, 2)) = br
            End If
        ElseIf s > 0 Then
            If k <> "" Then
                ws = .Cells(Rows.Count, "k").End(xlUp).Row + 1
                .Range("k2:p2").Copy .Cells(ws, "k")
                .Cells(ws + 1, "k").Resize(k, UBound(br, 2)) = br
            End If
        End If
    Next s
End With
End Sub

TA的精华主题

TA的得分主题

发表于 2020-2-25 16:21 | 显示全部楼层
只写了第一个区域的代码,第二个区域自己依样画葫芦吧
VBA 分类汇总.rar (21.73 KB, 下载次数: 5)

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-2-25 16:36 | 显示全部楼层
3190496160 发表于 2020-2-25 16:20
Sub test()
Set d = CreateObject("scripting.dictionary")
rr = Array("101", "102", "531", "532")

非常感谢你的帮助,可否按图片的格式显示呢?

如果第二区的数据也是关联同一个订单下条件为:261,262吗?

另外:在单位换算的代码里 , 是需要把TO(即吨的换算为千克),我运行代码后显示的是 KG*1000
1.PNG

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-2-25 16:47 | 显示全部楼层
3190496160 发表于 2020-2-25 16:20
Sub test()
Set d = CreateObject("scripting.dictionary")
rr = Array("101", "102", "531", "532")

非常感谢您的帮助,我运行显示是每一行字段下面有一行数据:
字段
数据
字段
数据
.
.
.

可以实现如图片 K列到P列的 要格式吗?

另外:I列 单位是:TO的 需要转换为KG 并把H列对应的数量*1000

TA的精华主题

TA的得分主题

发表于 2020-2-25 17:05 | 显示全部楼层
不明白你在说什么,既然是批次取唯一值,那就必须同一个批次的数量相加呀,
比如:101,总共有四行数据,只有两个批次,0012033258和 0012493261
那最终结果,101肯定只有两行数据呀,哪来的很多行呢?

TA的精华主题

TA的得分主题

发表于 2020-2-25 17:08 | 显示全部楼层
至于 吨 的换算,戴增加一个判断即可
Sub test()
Set d = CreateObject("scripting.dictionary")
rr = Array("101", "102", "531", "532")
With Sheet1
    .Range("k3:p5000") = Empty
    ar = .[a1].CurrentRegion
    For s = 0 To UBound(rr)
        k = 0: d.RemoveAll
        ReDim br(1 To UBound(ar), 1 To 6)
        For i = 2 To UBound(ar)
            If Trim(ar(i, 2)) = Trim(rr(s)) Then
                t = d(Trim(ar(i, 5)))
                If t = "" Then
                    k = k + 1
                    d(Trim(ar(i, 5))) = k
                    t = k
                    br(k, 1) = Date
                    br(k, 2) = ar(i, 1)
                    br(k, 3) = ar(i, 4)
                    br(k, 4) = ar(i, 6)
                    br(k, 5) = ar(i, 5)
                End If
                If Trim(ar(i, 9)) = "TO" Then
                    br(t, 6) = br(t, 6) + (ar(i, 8) * 1000)
                Else
                   br(t, 6) = br(t, 6) + ar(i, 8)
                End If
            End If
        Next i
        If s = 0 Then
            If k <> 0 Then
                .Cells(3, "k").Resize(k, UBound(br, 2)) = br
            End If
        ElseIf s > 0 Then
            If k <> "" Then
                ws = .Cells(Rows.Count, "k").End(xlUp).Row + 1
                .Range("k2:p2").Copy .Cells(ws, "k")
                .Cells(ws + 1, "k").Resize(k, UBound(br, 2)) = br
            End If
        End If
    Next s
End With
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-2-25 17:47 | 显示全部楼层
3190496160 发表于 2020-2-25 17:05
不明白你在说什么,既然是批次取唯一值,那就必须同一个批次的数量相加呀,
比如:101,总共有四行数据, ...

对于我来说,大部分都已经成功了, 可能我不太了解VBA对中间的逻辑不是很清楚
我就想:对同一个订单下面的 移库类型为:101,102,531,532 以:订单号,物料号,批次取不重复值 汇总到K:P列,而表头的字段,如果订单号不同就加一个表头,如果相同的就不加!

TA的精华主题

TA的得分主题

发表于 2020-2-25 18:07 | 显示全部楼层
ccrxao 发表于 2020-2-25 17:47
对于我来说,大部分都已经成功了, 可能我不太了解VBA对中间的逻辑不是很清楚
我就想:对同一个订单下面 ...

呵呵,这样的话,代码就是另外一个思路的,呵呵

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-2-25 18:49 来自手机 | 显示全部楼层
抽时间,请帮忙写一个好吗?
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-4-26 01:07 , Processed in 0.047416 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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