ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[讨论] 复杂的多表汇总(难度有点大,做出来有分加哦)

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2010-1-25 21:31 | 显示全部楼层

回复 100楼 kaiyuanmdf 的帖子

本帖已被收录到知识树中,索引项:多表合并和汇总
看了ldy 版主的,确实具有一定的通用性了,通过MERGE来整合标题行,列以及查找两个 合*计 来获得表格的数据位置。
可改动的地方:用数组取得表数据,再按照前面已答出几种答案的网友数组方法判断来整合标题行,另外其他地方也都用数组解决,快点而已,当然这本身就是ldy 版主的这个全面高手的拿手好戏。 也曾做过 多工作簿多表不等行、列,就是没有做到行、列标题是复合的,这里只要多做一些手脚就可以了,当时记得是用SQL和字典两种方法分别做了,放到这题上字典仍旧可以解决,SQL就巨难了,如有谁用SQL挑战试试,我想彭总肯定会加分的,呵呵。

用数组套数组把所有工作簿的工作表数据全部一次取得,然后再细化吧。


只要有规律总的来说并不难,难就难在有些表与表之间相差太多,规律很勉强和模糊。

[ 本帖最后由 office2008 于 2010-1-25 21:34 编辑 ]

TA的精华主题

TA的得分主题

发表于 2010-1-25 22:42 | 显示全部楼层
楼上说的是。我需对此再进一步的优化与改进。
下面说说对这个题的认识及解题思路,请指正。
这个工作簿是由一个总表和几张月表组成。看后发现,销售网点是唯一的,只是列标有合并单元格的现象,而总表在列标和行标上最全的,可以和其他几个表合并计算,可能不改变列标排序,做完后试了一下,可行。如果列标符合规范了,对表内数据的处理可以用consolidata方法来处理了,其sources参数指定合并计算的源数据区域,为字符串数组形式且必须是R1C1样式的引用。

TA的精华主题

TA的得分主题

发表于 2010-1-26 14:05 | 显示全部楼层
汇总.rar (27.5 KB, 下载次数: 104)
费了很大劲,绣花一般编了个演示程序,可以支持纵向及横向分类层级的变化,目前我把每个方向的层级限制在1~3级。合计的事先不做了,累了。

[ 本帖最后由 hupanshan 于 2010-1-26 14:10 编辑 ]

TA的精华主题

TA的得分主题

发表于 2010-1-26 14:59 | 显示全部楼层
原帖由 hupanshan 于 2010-1-26 14:05 发表
657073
费了很大劲,绣花一般编了个演示程序,可以支持纵向及横向分类层级的变化,目前我把每个方向的层级限制在1~3级。合计的事先不做了,累了。

请问表芯位置在哪?若是弄个弹出框,让使用者输入表头行数和左边条件列数可能更好。

TA的精华主题

TA的得分主题

发表于 2010-1-26 15:20 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
原帖由 wenwen000424 于 2010-1-26 14:59 发表

请问表芯位置在哪?若是弄个弹出框,让使用者输入表头行数和左边条件列数可能更好。

无非是个演示程序,弄个弹出窗还要额外“绣花”,太累人。“表芯”是我自造的概念,就是除去上表头、左表头外,填写具体汇总数据的位置。
这个上传的文件按我的设想填好了“3*3”直接按汇总钮就可以了 汇总.rar (25.21 KB, 下载次数: 107)

TA的精华主题

TA的得分主题

发表于 2010-1-26 20:47 | 显示全部楼层
原帖由 hupanshan 于 2010-1-26 15:20 发表

无非是个演示程序,弄个弹出窗还要额外“绣花”,太累人。“表芯”是我自造的概念,就是除去上表头、左表头外,填写具体汇总数据的位置。
这个上传的文件按我的设想填好了“3*3”直接按汇总钮就可以了657146

测试过了,不错。要好好学习一下代码。

TA的精华主题

TA的得分主题

发表于 2010-1-26 23:58 | 显示全部楼层
第一种: 多簿多表不等复合行,列的字典法 ,请测试。
  1. '引用 Microsoft Scripting Runtime  'C:\WINDOWS\system32\scrrun.dll
  2. Sub 汇总()
  3.     Dim xDic As New dictionary, yDic As New dictionary
  4.     Dim filePath As String, fileName As String
  5.     Dim eBook As Workbook, eSheet As Worksheet
  6.     Dim xRng As Range, yRng As Range, zRng As Range, rng As Range
  7.     Dim rngArr() As Variant, arr() As Variant
  8.     Dim x As Integer, y As Integer, i As Integer, j As Integer
  9.     Dim m As Integer, n As Integer, Index As Integer
  10.     t = Timer
  11.     Application.ScreenUpdating = False
  12.     Application.DisplayAlerts = False
  13.     filePath = ThisWorkbook.Path & "\各部门销售"
  14.     fileName = Dir(filePath & "\*.xls")
  15.     Do While Len(fileName) > 0
  16.         Set eBook = Workbooks.Open(filePath & "" & fileName)
  17.         For Each eSheet In eBook.Sheets
  18.             If eSheet.Name Like "*销量" Then
  19.                 Index = Index + 1
  20.                 With eSheet                     ' 合*计 预防“ 合 计 ”这类非规范写法
  21.                     Set xRng = .Cells.Find(What:="合*计", After:=.Range("a1"))
  22.                     Set yRng = .Cells.FindNext(After:=xRng)
  23.                     ReDim Preserve rngArr(1 To Index)
  24.                     rngArr(Index) = .Range(.Cells(xRng.Row, yRng.Column), .Cells(yRng.Row - 1, xRng.Column - 1))
  25.                 End With
  26.             End If
  27.         Next
  28.         eBook.Close False
  29.         fileName = Dir()
  30.     Loop
  31.    
  32.     For Index = 1 To UBound(rngArr)
  33.         For i = 3 To UBound(rngArr(Index))
  34.             If rngArr(Index)(i, 1) = "" Then rngArr(Index)(i, 1) = rngArr(Index)(i - 1, 1)
  35.             If Not xDic.Exists(rngArr(Index)(i, 1) & "|" & rngArr(Index)(i, 2)) Then
  36.                 x = x + 1
  37.                 xDic(rngArr(Index)(i, 1) & "|" & rngArr(Index)(i, 2)) = x
  38.             End If
  39.         Next
  40.         For i = 3 To UBound(rngArr(Index), 2)
  41.             If rngArr(Index)(1, i) = "" Then rngArr(Index)(1, i) = rngArr(Index)(1, i - 1)
  42.             If Not yDic.Exists(rngArr(Index)(1, i) & "|" & rngArr(Index)(2, i)) Then
  43.                 y = y + 1
  44.                 yDic(rngArr(Index)(1, i) & "|" & rngArr(Index)(2, i)) = y
  45.             End If
  46.         Next
  47.     Next
  48.     ReDim arr(1 To x, 1 To y)
  49.     For Index = 1 To UBound(rngArr)
  50.         For i = 3 To UBound(rngArr(Index))
  51.             For j = 3 To UBound(rngArr(Index), 2)
  52.                 m = xDic(rngArr(Index)(i, 1) & "|" & rngArr(Index)(i, 2))
  53.                 n = yDic(rngArr(Index)(1, j) & "|" & rngArr(Index)(2, j))
  54.                 arr(m, n) = arr(m, n) + rngArr(Index)(i, j)
  55.             Next
  56.         Next
  57.     Next

  58.     With Sheets("总表")
  59.         .Cells.Delete
  60.         Set xRng = .Range("b4").Resize(xDic.Count, 1)
  61.         xRng = Application.Transpose(xDic.Keys)
  62.         For Each rng In xRng
  63.             rng.Resize(, 2) = Split(rng, "|")
  64.         Next
  65.         Set yRng = .Range("d2").Resize(1, yDic.Count)
  66.         yRng = yDic.Keys
  67.         For Each rng In yRng
  68.             rng.Resize(2) = Application.Transpose(Split(rng, "|"))
  69.         Next
  70.         .Range("d4").Resize(xDic.Count, yDic.Count) = arr

  71.         Set zRng = .Range("d2").Resize(xDic.Count + 2, yDic.Count)
  72.         zRng.Sort Key1:=.Range("D2"), Orientation:=xlSortRows

  73.         Set zRng = .Range("b4").Resize(xDic.Count, yDic.Count + 2)
  74.         zRng.Sort Key1:=.Range("b4"), Orientation:=xlSortColumns
  75.         x = 0
  76.         For Each rng In xRng
  77.             If rng.Text <> rng.Offset(1).Text Then
  78.                 If x > 0 Then rng.Offset(-x).Resize(x + 1).Merge
  79.                 x = 0
  80.             Else
  81.                 x = x + 1
  82.             End If
  83.         Next
  84.         y = 0
  85.         For Each rng In yRng
  86.             If rng.Text <> rng.Offset(, 1).Text Then
  87.                 If y > 0 Then rng.Offset(, -y).Resize(1, y + 1).Merge
  88.                 y = 0
  89.             Else
  90.                 y = y + 1
  91.             End If
  92.         Next
  93.         .Range("b2:b3").Merge
  94.         .Range("c2:c3").Merge
  95.         .Range("b2") = "省份"
  96.         .Range("c2") = "销售网点"

  97.         With .Cells(2, yDic.Count + 4).Resize(2)
  98.             .Merge
  99.             .Value = "合计"
  100.         End With

  101.         With .Cells(xDic.Count + 4, 2).Resize(, 2)
  102.             .Merge
  103.             .Value = "合计"
  104.         End With

  105.         Set rng = Range("b2").Resize(xDic.Count + 3, yDic.Count + 3)
  106.         rng.Borders.LineStyle = True
  107.         For i = 3 To xDic.Count + 3
  108.             rng.Cells(i, yDic.Count + 3) = "=SUM(RC[-" & yDic.Count + 3 - 3 & "]:RC[-1])"
  109.         Next
  110.         For i = 3 To yDic.Count + 3
  111.             rng.Cells(xDic.Count + 3, i) = "=SUM(R[-" & xDic.Count + 3 - 3 & "]C:R[-1]C)"
  112.         Next
  113.     End With
  114.     Application.DisplayAlerts = True
  115.     Application.ScreenUpdating = True
  116.     MsgBox Timer - t
  117. End Sub
复制代码
为上面这些代码已经用了4个多小时了
第二种: 多簿多表不等复合行,列的SQL法 ,已经解决复合 行和复合列标题(域函数),有空再做。

彭希仁:非常不错,能想到多工作薄,但离傻瓜式还有差距,你的东西只能给会VBA的人使用。

[ 本帖最后由 彭希仁 于 2010-1-29 17:32 编辑 ]

销量汇总(多簿多表复合不等行、列)字典法.rar

120.01 KB, 下载次数: 218

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2010-1-27 09:16 | 显示全部楼层

103楼的程序有个缺陷,补上了,对说明做了点改进

汇总.rar (27.31 KB, 下载次数: 164)

彭希仁:非常不错,但离傻瓜式还有差距,你的东西只能给会VBA的人使用。

[ 本帖最后由 彭希仁 于 2010-1-29 17:34 编辑 ]

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2010-1-29 17:28 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
非常不错,在通用性方面,有了很大的提高,但是离我期望的目标还相差很远,希望大家站在用户的角度去想想他们能用不。

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2010-1-30 08:15 | 显示全部楼层
原帖由 彭希仁 于 2010-1-29 17:28 发表
非常不错,在通用性方面,有了很大的提高,但是离我期望的目标还相差很远,希望大家站在用户的角度去想想他们能用不。

同意,以上的程序都只是针对版主提供的特定表格,换了其它含有合并单元格的表格就需修改代码。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-24 02:22 , Processed in 0.044284 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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