ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 求各位大神帮忙写个高级分类汇总的VBA,万分感谢!!

[复制链接]

TA的精华主题

TA的得分主题

发表于 2018-6-23 16:17 | 显示全部楼层 |阅读模式
求各位大神帮忙写个分类汇总的VBA,万分感谢!!祥情见附件。

线别.zip

108.75 KB, 下载次数: 16

TA的精华主题

TA的得分主题

发表于 2018-6-23 16:39 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
你这个好像是用物料代码来匹配带颜色的几个Sheet,然后做成一张表。
在把做好的表用指令号来去重,将类型归类,再把计划组填进对应的类型?

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-6-23 17:31 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
活在理想的世界 发表于 2018-6-23 16:39
你这个好像是用物料代码来匹配带颜色的几个Sheet,然后做成一张表。
在把做好的表用指令号来去重,将类型 ...

用指令号查找全部的物料代码,再用物料代码匹配,麻烦帮忙看看。感谢 感谢!!!

TA的精华主题

TA的得分主题

发表于 2018-6-23 19:14 来自手机 | 显示全部楼层
2728911088 发表于 2018-6-23 17:31
用指令号查找全部的物料代码,再用物料代码匹配,麻烦帮忙看看。感谢 感谢!!!

不知1839这个数据怎么来的?

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-6-23 20:06 | 显示全部楼层
LMY123 发表于 2018-6-23 19:14
不知1839这个数据怎么来的?




是这2个代码的数量,这2个代码是同一类型的。
指令号物料代码物料名称已发数
FDSGF2018379690179610509913FDSF4932646FD941
FDSGF2018379690153554608681FDSF5461646FD898

TA的精华主题

TA的得分主题

发表于 2018-6-23 20:20 | 显示全部楼层
考验转置功力的时候到了

14885553.jpg

  1.     Set SH0 = Worksheets("齐套明细")
  2.     Set SH1 = Worksheets("任务类型")
  3.     Rem 各个分表数据
  4.     StrA = ""
  5.     For Each SH In Worksheets
  6.         If InStr(SH.Name, "晶") > 0 Then
  7.             If StrA <> "" Then StrA = StrA & " UNION ALL "
  8.             StrA = StrA & "SELECT [物料代码],[物料名称],[计划组],[类别],[类型]"
  9.             StrA = StrA & " FROM [" & SH.Name & "$]"
  10.             StrA = StrA & " WHERE LEN([物料代码])>0"
  11.         End If
  12.     Next
  13.     Rem 分类汇总
  14.     StrB = ""
  15.     StrB = StrB & "SELECT [指令号],[物料代码],[类型],SUM([已发数]) AS [已发数] FROM ("
  16.     StrB = StrB & "SELECT A.[指令号],A.[物料代码],A.[物料名称],A.[已发数],A.[计划组]"
  17.     StrB = StrB & ",IIF(ISNULL(B.[类型])=TRUE,'备件',B.[类型]) AS [类型]"
  18.     StrB = StrB & " FROM ("
  19.     StrB = StrB & "SELECT [指令号],[物料代码],[物料名称],[已发数],[计划组]"
  20.     StrB = StrB & " FROM [" & SH0.Name & "$]"
  21.     StrB = StrB & ") AS A LEFT JOIN ("
  22.     StrB = StrB & "SELECT [物料代码],[类型]"
  23.     StrB = StrB & " FROM (" & StrA & ")"
  24.     StrB = StrB & ") AS B ON A.[物料代码]=B.[物料代码]"
  25.     StrB = StrB & ") GROUP BY [指令号],[物料代码],[类型]"
  26.     Rem SQL进行转置
  27.     StrSQL = ""
  28.     StrSQL = StrSQL & "TRANSFORM SUM([已发数])"
  29.     StrSQL = StrSQL & " SELECT [指令号],[物料代码],'' AS [类型],SUM([已发数]) AS [合计]"
  30.     StrSQL = StrSQL & " FROM (" & StrB & ")"
  31.     StrSQL = StrSQL & " GROUP BY [指令号],[物料代码]"
  32.     StrSQL = StrSQL & " PIVOT [类型]"
  33.     Str_coon = "HDR=yes';Data Source =" & ThisWorkbook.FullName     '//OFFICE2003,2007 通用
  34.     SQLARR = GET_SQL_To_Arr(StrSQL, Str_coon, True)
  35.     Rem 组合类型
  36.     For X = 1 To UBound(SQLARR, 1)
  37.         Str类型 = ""
  38.         For ICOL = 4 To UBound(SQLARR, 2)  '//没有合计时,ICOL=3
  39.             If IsNumeric(SQLARR(X, ICOL)) = True And Abs(SQLARR(X, ICOL)) > 0 Then
  40.                 If Str类型 <> "" Then Str类型 = Str类型 & "、"
  41.                 Str类型 = Str类型 & SQLARR(0, ICOL)
  42.             End If
  43.         Next
  44.         SQLARR(X, 2) = Str类型
  45.     Next
  46.     Rem 粘贴数据
  47.     SH1.Range("A1:IT65536").ClearContents
  48.     SH1.Range("A1").Resize(UBound(SQLARR, 1) + 1, UBound(SQLARR, 2) + 1) = SQLARR
复制代码

TA的精华主题

TA的得分主题

发表于 2018-6-23 20:25 | 显示全部楼层

SQL TRANSFORM

本帖最后由 opiona 于 2018-7-19 20:53 编辑

QQ14885553.rar (148.71 KB, 下载次数: 14)

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-6-23 20:27 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
opiona 发表于 2018-6-23 20:20
考验转置功力的时候到了

感谢感谢,我先测试下,

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-6-23 20:34 | 显示全部楼层
opiona 发表于 2018-6-23 20:20
考验转置功力的时候到了

您好,辛苦了,测试了下,还需要改动改动,请您抽空再看看。您的结果是:
指令号
物料代码
类型
FDSGF2018379690
130871799466
ADDJFD
FDSGF2018379690
147016560140
DJFDF
FDSGF2018379690
153554608681
JFEWETE
FDSGF2018379690
179610509913
JFEWETE
FDSGF2018379690
183086777074
备件
我想要的结果应该是:
指令号类型
FDSGF2018379690备件、JFEWETE、ADDJFD、DJFDF

TA的精华主题

TA的得分主题

发表于 2018-6-23 20:34 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 一把小刀闯天下 于 2018-6-23 21:11 编辑

'自己测试一下,估计差不多

Option Explicit

Sub test()
  Dim i, j, dic(3), sht, t, arr, n, cnt, key, s
  For i = 0 To UBound(dic)
    Set dic(i) = CreateObject("scripting.dictionary")
  Next
  n = 4
  For Each sht In Sheets
    With Sheets(sht.Name)
      If InStr(sht.Name, "晶") Then
        arr = .[a1].CurrentRegion
        For i = 2 To UBound(arr, 1)
          dic(2)(arr(i, 1)) = arr(i, 5) '物料代码->类型
          If Not dic(3).exists(arr(i, 5)) Then
            n = n + 1: dic(3)(arr(i, 5)) = n '类型种类
          End If
        Next
      ElseIf sht.Name = "齐套明细" Then
        arr = .[a1].CurrentRegion
        For i = 2 To UBound(arr, 1)
          dic(1)(arr(i, 1) & arr(i, 2)) = arr(i, 4) '指令、种类->已发数
          If dic(0).exists(arr(i, 1)) Then '每个指令包含的物料代码
            t = dic(0)(arr(i, 1)): ReDim Preserve t(UBound(t) + 1)
            t(UBound(t)) = arr(i, 2): dic(0)(arr(i, 1)) = t
          Else
            dic(0)(arr(i, 1)) = Array(arr(i, 2))
          End If
        Next
      End If
    End With
  Next
  ReDim arr(1 To dic(0).Count, 1 To dic(3).Count + 4)
  For Each key In dic(0).keys
    ReDim n(1 To dic(3).Count + 4)
    cnt = cnt + 1: arr(cnt, 1) = key: s = vbNullString
    t = dic(0)(key) '单个指令中的物料代码
    For i = 0 To UBound(t)
      If dic(2).exists(t(i)) Then '按物料代码获取类型
        If InStr(s, dic(2)(t(i))) = 0 Then s = s & dic(2)(t(i)) & "、"
        n(dic(3)(dic(2)(t(i)))) = n(dic(3)(dic(2)(t(i)))) + dic(1)(key & t(i))
      Else
        s = s & "备件" & "、": n(4) = n(4) + dic(1)(key & t(i))
      End If
    Next
    s = Left(s, Len(s) - 1): arr(cnt, 3) = s '类型
    For i = 4 To UBound(arr, 2): arr(cnt, i) = n(i): Next '不同种类已发数汇总
  Next
  With Sheets("任务类型").[n1] '输出位置自己修改,作比较用
    .Resize(Rows.Count, UBound(arr, 2)).ClearContents
    .Offset(1).Resize(UBound(arr, 1), UBound(arr, 2)) = arr
    .Offset(, 4).Resize(, dic(3).Count) = dic(3).keys
    .Resize(, 4) = Split("指令号  类型 备件")
  End With
End Sub

评分

1

查看全部评分

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

本版积分规则

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

GMT+8, 2024-12-27 05:39 , Processed in 0.051226 second(s), 15 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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