ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 求助大神在多表数据中提取有用数据进行汇总分析

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-5-10 09:42 | 显示全部楼层 |阅读模式
本帖最后由 xt100 于 2024-5-10 09:45 编辑

诉求:

1、数据表中的数据因是不同人员提供的,有些相同客户名称,写法不同,首先需要先将客户名称统一(客户名称对应在”客户对应“表中)。
2、在相同月份中有可能发生”销售明细“表中的客户有销售额,但在”运输明细“表中确没有体现这个客户,相反”运输明细“表中有,”销售明细“表中没有,也可能发生。所以需要在以月份为前提,先将这个客户名称先提取、汇在一起,然后去除重复值。
3、根据提取后的客户名称,来提取,月份、业务担当、销售数量、销售金额、运输费。最后用数据透视表作出以下图表。
1715305076491.png


不知道我表达清楚了没有,请老师们看看用什么方法能达成诉求,先行感谢啦

销售额与费用比.zip

42.91 KB, 下载次数: 12

TA的精华主题

TA的得分主题

发表于 2024-5-10 10:51 | 显示全部楼层
Sub 分类汇总()
Application.ScreenUpdating = False
Dim ar As Variant, br As Variant, cr As Variant
Dim d As Object, dc As Object, dic As Object
Set d = CreateObject("scripting.dictionary")
Set dc = CreateObject("scripting.dictionary")
Set dic = CreateObject("scripting.dictionary")
Dim arr()
With Sheets("客户对应")
    r = .Cells(Rows.Count, 2).End(xlUp).Row
    If r < 2 Then MsgBox "客户对应表为空!": End
    ar = .Range("b1:d" & r)
End With
With Sheets("销售明细")
    rs = .Cells(Rows.Count, 2).End(xlUp).Row
    If rs < 2 Then MsgBox "销售明细为空!": End
    br = .Range("a1:g" & rs)
End With
With Sheets("运输明细")
    ws = .Cells(Rows.Count, 2).End(xlUp).Row
    If ws < 3 Then MsgBox "运输明细为空!": End
    cr = .Range("a2:h" & ws)
End With
For i = 2 To UBound(ar)
    If ar(i, 1) <> "" Then
        d(ar(i, 1)) = i
    End If
    If ar(i, 3) <> "" Then
        dc(ar(i, 3)) = i
    End If
Next i
ReDim arr(1 To UBound(br) + UBound(cr), 1 To 7)
For i = 2 To UBound(br)
    If br(i, 1) <> "" Then
        If IsDate(br(i, 1)) Then
            yf = Month(br(i, 1))
            zd = yf & "|" & br(i, 2)
            t = dic(zd)
            If t = "" Then
                k = k + 1
                dic(zd) = k
                t = k
                arr(k, 1) = yf & "月"
                arr(k, 2) = br(i, 2)
                xh = d(br(i, 2))
                If xh <> "" Then
                    arr(k, 3) = ar(xh, 2)
                    arr(k, 4) = ar(xh, 3)
                End If
            End If
            arr(t, 5) = arr(t, 5) + br(i, 5)
            arr(t, 6) = arr(t, 6) + br(i, 7)
        End If
    End If
Next i
For i = 2 To UBound(cr)
    If cr(i, 1) <> "" Then
        If IsDate(cr(i, 1)) Then
            yf = Month(cr(i, 1))
            h = dc(cr(i, 4))
            If h <> "" Then
                dw = ar(h, 1)
                zd = yf & "|" & dw
                t = dic(zd)
                If t = "" Then
                    k = k + 1
                    dic(zd) = k
                    t = k
                    arr(k, 1) = yf & "月"
                    arr(k, 2) = dw
                    arr(k, 3) = ar(h, 2)
                    arr(k, 4) = cr(i, 4)
                End If
                arr(t, 7) = arr(t, 7) + cr(i, 8)
            End If
        End If
    End If
Next i
With Sheets("数据汇总")
    .UsedRange.Offset(3) = Empty
    .[a4].Resize(k, UBound(arr, 2)) = arr
End With
Set d = Nothing
Set dc = Nothing
Set dic = Nothing
Application.ScreenUpdating = True
MsgBox "ok!"
End Sub

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-5-10 10:51 | 显示全部楼层
销售额与费用比.rar (45.63 KB, 下载次数: 8)

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-5-10 10:52 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
第一行与模拟结果不完全相符,代码仅供参考,
实在不行,可以加v

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-5-10 11:25 | 显示全部楼层
3190496160 发表于 2024-5-10 10:52
第一行与模拟结果不完全相符,代码仅供参考,
实在不行,可以加v

好的谢谢,大神

TA的精华主题

TA的得分主题

发表于 2024-5-10 13:39 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
VBA有点复杂了吧,数据查询更简单一些 1.jpg

销售额与费用比.zip

43.19 KB, 下载次数: 9

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-5-10 13:51 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
pxy0409 发表于 2024-5-10 13:39
VBA有点复杂了吧,数据查询更简单一些

VBA太高大上了,由于本人太笨,研究半天还是不懂。谢谢老师提供的其它解决方案。

TA的精华主题

TA的得分主题

发表于 2024-5-10 16:46 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
SQL方法:


sql.jpg

  1. SELECT 年份,月份,客户名称,业务担当,销售数量,销售金额,0 AS 运输费 FROM
  2. (SELECT YEAR(CDATE(时间)) AS 年份,MONTH(CDATE(时间)) AS 月份,发货单位,SUM(数量(KG)) AS 销售数量,SUM(金额) AS 销售金额 FROM [销售明细$] GROUP BY YEAR(CDATE(时间)),MONTH(CDATE(时间)),发货单位) T1 LEFT JOIN [客户对应$] T2 ON T1.发货单位=T2.发货单位
  3. UNION ALL
  4. SELECT YEAR(CDATE(发货日期)) AS 年份,MONTH(CDATE(发货日期)) AS 月份,客户名称,业务担当, 0 AS 销售数量,0 AS 销售金额,SUM(运输费) AS 运输费 FROM [运输明细$] GROUP BY YEAR(CDATE(发货日期)),MONTH(CDATE(发货日期)),客户名称,业务担当
复制代码


销售额与费用比.rar

34.02 KB, 下载次数: 5

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-5-12 12:00 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

谢谢老师,同一个问题竟然会有这多的方法。向您学习,非常感谢。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-25 05:34 , Processed in 0.047559 second(s), 18 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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