ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[分享] 用SQL汇总或合并工作表、工作簿和跨文件夹和工作表汇总

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2014-12-3 21:55 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 opiona 于 2014-12-4 13:20 编辑

看到很多汇总需求,但是大多数是字典解决的,
我提供一个SQL的方法,最然不是最快的,是对以后编程进步有用哟!
学习SQL,请参观:http://club.excelhome.net/thread-859194-1-1.html

汇总方式1:

单个工作簿内全部工作表汇总,要求SQL所含标题名在每一个要统计的工作表中都有
完整的代码和自定义函数见附件: 全部工作表汇总到一个工作表.rar (25.45 KB, 下载次数: 3096)




  1. '*********************************
  2. '*******  北极狐工作室出品  ******
  3. '*******  QQ:14885553      ******
  4. '*********************************

  5. Sub Opiona()
  6. 'On Error Resume Next    '// 发生错误,自动执行下一句,就是忽略错误
  7. Application.ScreenUpdating = False '//关闭屏幕刷新
  8. Application.DisplayAlerts = False '//关闭系统提示
  9. t = Timer   '//开始时间

  10.     Set SH0 = Sheets("汇总")
  11.     SH0.Cells.Clear  '//清空保存区域,全部数据第一行是标题行,且只占一行,无合并单元格
  12.     Str_coon = "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties='Excel 12.0;HDR=yes';data source=" & ThisWorkbook.FullName   '//Excel2007
  13. '   Str_coon = "Provider=Microsoft.JET.OLEDB.4.0;Extended Properties='Excel 8.0;HDR=yes';data source=" & ThisWorkbook.FullName    '//OFFICE2003,根据情况选择

  14.     For Each SH In ThisWorkbook.Worksheets
  15.         If SH.Name <> SH0.Name Then
  16.             StrSQL = "SELECT 居间人,应发佣金,营业税,城建税,教育附加,'" & SH.Name & "' AS 来自工作表 FROM [" & SH.Name & "$]"   '//SQL语句自己发挥吧,这里是精髓。
  17.             IROW = SH0.Range("A1048576").End(3).Row + 1
  18.             If IROW <= 2 Then
  19.                 IROW = 1
  20.                 Crr = GET_SQLCoon(StrSQL, Str_coon, True)  '//第一次,带上标题
  21.             Else
  22.                 Crr = GET_SQLCoon(StrSQL, Str_coon, False)
  23.             End If
  24.             SH0.Range("A" & IROW).Resize(UBound(Crr, 1) + 1, UBound(Crr, 2) + 1) = Crr  '//粘贴查询结果
  25.         End If
  26.    
  27.     Next SH
  28. Application.ScreenUpdating = True '//恢复屏幕刷新
  29. Application.DisplayAlerts = True '//恢复系统提示
  30. MsgBox "汇总用时:" & Format(Timer - t, "#0.0000") & " 秒", , "北极狐提示!!"  '//提示所用时间
  31. End Sub
复制代码

补充内容 (2018-4-9 22:06):
通用一些的:汇总,然后:拆分   
可增减表格数,详见:79楼

补充内容 (2018-4-18 15:51):

汇总多个文件指定表中多个固定位置数据-通用型,80楼问题,答案见80,81  

评分

6

查看全部评分

TA的精华主题

TA的得分主题

发表于 2014-12-3 22:03 | 显示全部楼层
没多大作用。sheet2中的个人所得税都没有汇总到。

全部工作表汇总到一个工作表.rar

27.95 KB, 下载次数: 557

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-12-3 22:11 | 显示全部楼层
本帖最后由 opiona 于 2014-12-3 22:28 编辑

汇总方式2:

很多工作簿在文件夹和子文件夹内,汇总全部工作簿内的同名工作表
完整的代码在附件中: 跨工作簿汇总同名工作表.rar (70.73 KB, 下载次数: 2219)

  1. '*********************************
  2. '******* 北极狐工作室出品 ******
  3. '******* QQ:14885553 ******
  4. '*********************************

  5. Sub Opiona()
  6. 'On Error Resume Next '// 发生错误,自动执行下一句,就是忽略错误
  7. Application.ScreenUpdating = False '//关闭屏幕刷新
  8. Application.DisplayAlerts = False '//关闭系统提示
  9. t = Timer '//开始时间
  10. Set SH0 = Sheets("汇总")
  11. SH0.Cells.Clear '//清空保存区域,全部数据第一行是标题行,且只占一行,无合并单元格
  12. ARR = FileAllArr(ThisWorkbook.Path, "*.xlsx", ThisWorkbook.Name, False) '//详见函数说明
  13. SHName = "数据表" '//要求所有工作簿内需要统计的工作表名称相同,
  14. For I = 0 To UBound(ARR)
  15. Str_coon = "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties='Excel 12.0;HDR=yes';data source=" & ARR(I) '//Excel2007
  16. ' Str_coon = "Provider=Microsoft.JET.OLEDB.4.0;Extended Properties='Excel 8.0;HDR=yes';data source=" & & ARR(I) '//OFFICE2003,根据情况选择
  17. StrSQL = "SELECT 居间人,应发佣金,营业税,城建税,教育附加,'" & GetPathFromFileName(ARR(I), False) & "' AS 来自工作簿 FROM [" & SHName & "$]" '//SQL语句自己发挥吧,这里是精髓。
  18. IROW = SH0.Range("A1048576").End(3).Row + 1
  19. If IROW <= 2 Then
  20. IROW = 1
  21. Crr = GET_SQLCoon(StrSQL, Str_coon, True) '//第一次,带上标题
  22. Else
  23. Crr = GET_SQLCoon(StrSQL, Str_coon, False)
  24. End If
  25. SH0.Range("A" & IROW).Resize(UBound(Crr, 1) + 1, UBound(Crr, 2) + 1) = Crr '//粘贴查询结果
  26. Next

  27. Application.ScreenUpdating = True '//恢复屏幕刷新
  28. Application.DisplayAlerts = True '//恢复系统提示
  29. MsgBox "汇总用时:" & Format(Timer - t, "#0.0000") & " 秒", , "北极狐提示!!" '//提示所用时间
  30. End Sub

  31. Rem 下面是为方便整理的自定义函数,上面的代码执行必不可少哟!!
复制代码

评分

3

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-12-3 22:14 | 显示全部楼层
本帖最后由 opiona 于 2014-12-3 22:25 编辑
张雄友 发表于 2014-12-3 22:03
没多大作用。sheet2中的个人所得税都没有汇总到。
每个表都要加上:个人所得税  否则会提示出错!
SQL语句修改成下面这样既可


  1. StrSQL = "SELECT 居间人,应发佣金,营业税,城建税,教育附加,个人所得税,'" & SH.Name & "' AS 来自工作表 FROM [" & SH.Name & "$]"  
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2014-12-3 22:31 | 显示全部楼层
opiona 发表于 2014-12-3 22:14
每个表都要加上:个人所得税  否则会提示出错!
SQL语句修改成下面这样既可

这个查询怎么办?

这个查询.rar

44.91 KB, 下载次数: 148

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-12-3 22:46 | 显示全部楼层
汇总方式3:

多个工作簿在文件夹和子文件夹内,
各个工作簿含有数量的工作表
汇总指定工作表,相同名称的工作表标题相同
完整代码和自定义函数见附件: 跨工作簿汇总多个工作表.rar (90.27 KB, 下载次数: 1651)

  1. '*********************************
  2. '*******  北极狐工作室出品  ******
  3. '*******  QQ:14885553      ******
  4. '*********************************

  5. Sub Opiona()
  6. 'On Error Resume Next    '// 发生错误,自动执行下一句,就是忽略错误
  7. Application.ScreenUpdating = False '//关闭屏幕刷新
  8. Application.DisplayAlerts = False '//关闭系统提示
  9. t = Timer   '//开始时间

  10.    
  11.     Set SH0 = Worksheets("首页")
  12.    
  13.     For Each SH In ThisWorkbook.Sheets
  14.          If SH.Name <> SH0.Name Then
  15.                SH.Delete
  16.          End If
  17.     Next SH
  18.    
  19.     ARR = FileAllArr(ThisWorkbook.Path, "*.xls?", ThisWorkbook.Name, False)
  20.     For k = 2 To SH0.Range("A1048576").End(3).Row
  21.         If SH0.Cells(k, 1) <> "" Then
  22.             ThisWorkbook.Worksheets.Add(After:=ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count)).Name = SH0.Cells(k, 1) '//添加此工作表
  23.             Set SH = ThisWorkbook.Worksheets(SH0.Cells(k, 1).Value)

  24.             For I = 0 To UBound(ARR)
  25.                 Str_coon = "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties='Excel 12.0;HDR=yes';data source=" & ARR(I)   '//Excel2007
  26.             '   Str_coon = "Provider=Microsoft.JET.OLEDB.4.0;Extended Properties='Excel 8.0;HDR=yes';data source=" & & ARR(I)     '//OFFICE2003,根据情况选择
  27.                
  28.                 StrSQL = "SELECT *,'" & GetPathFromFileName(ARR(I)) & "' AS 来自工作簿 FROM [" & SH.Name & "$]"
  29.                 IROW = SH.Range("a65536").End(3).Row + 1
  30.                 If IROW <= 2 Then
  31.                     IROW = 1
  32.                     CRR = GET_SQLCoon(StrSQL, Str_coon, True)
  33.                 Else
  34.                     CRR = GET_SQLCoon(StrSQL, Str_coon, False)
  35.                 End If
  36.                 SH.Range("A" & IROW).Resize(UBound(CRR, 1) + 1, UBound(CRR, 2) + 1) = CRR
  37.             Next I
  38.    
  39.         End If
  40.     Next k

  41. Application.ScreenUpdating = True '//恢复屏幕刷新
  42. Application.DisplayAlerts = True '//恢复系统提示
  43. MsgBox "汇总用时:" & Format(Timer - t, "#0.0000") & " 秒", , "北极狐提示!!"  '//提示所用时间
  44. End Sub
复制代码

评分

3

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-12-3 22:57 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
张雄友 发表于 2014-12-3 22:31
这个查询怎么办?

提示太复杂,可能是SQL语句超出3000字符,建议加一个中间表。
再有就是SQL连接有点问题
建议改成:

  1.             If sh.Name <> ActiveSheet.Name Then
  2.                 If .CountA(sh.UsedRange) Then
  3.                     If SQL = "" Then
  4.                         SQL = "select * from [" & sh.Name & "$A2:D65536]"
  5.                     Else
  6.                         SQL = SQL & " union all select * from [" & sh.Name & "$A2:D65536]"
  7.                     End If
  8.                 End If
  9.             End If
复制代码

点评

不行的。  发表于 2014-12-3 23:00

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-12-3 23:03 | 显示全部楼层
原来弄错了:
提示太复杂,可能是SQL语句超出3000字符,
减少表到20以内,可以直接出结果
建议加一个中间表,弄到一个表之后再分类汇总。

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-12-3 23:31 | 显示全部楼层
张雄友 发表于 2014-12-3 22:31
这个查询怎么办?

SQL语句有限制,工作表太多要找个地方存中间数据
然后再求和等分类汇总,见附件模块2: 这个查询.rar (68.66 KB, 下载次数: 814)
  1. Sub Opiona()
  2. 'On Error Resume Next    '// 发生错误,自动执行下一句,就是忽略错误
  3. Application.ScreenUpdating = False '//关闭屏幕刷新
  4. Application.DisplayAlerts = False '//关闭系统提示
  5. t = Timer   '//开始时间

  6.     Set sh0 = Sheets("汇总")
  7.     sh0.Range("A3:E1048500").ClearContents '//清空保存区域,全部数据第一行是标题行,且只占一行,无合并单元格
  8.     sh0.Range("i3:m1048500").ClearContents
  9.     Str_coon = "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties='Excel 12.0;HDR=yes';data source=" & ThisWorkbook.FullName   '//Excel2007
  10. '   Str_coon = "Provider=Microsoft.JET.OLEDB.4.0;Extended Properties='Excel 8.0;HDR=yes';data source=" & ThisWorkbook.FullName    '//OFFICE2003,根据情况选择

  11.     For Each sh In ThisWorkbook.Worksheets
  12.         If sh.Name <> sh0.Name Then
  13.             StrSQL = "SELECT * FROM [" & sh.Name & "$A2:D]"   '//SQL语句自己发挥吧,这里是精髓。
  14.             IROW = sh0.Range("A1048576").End(3).Row + 1
  15.             Crr = GET_SQLCoon(StrSQL, Str_coon, False)
  16.             sh0.Range("A" & IROW).Resize(UBound(Crr, 1) + 1, UBound(Crr, 2) + 1) = Crr  '//粘贴查询结果
  17.         End If

  18.     Next sh
  19.    
  20.     StrSQL = "select 名称,sum(数量) AS 数量合计,sum(金额) AS 金额合计,max(单价) AS 最大单价,min(单价) AS 最小单价 from [" & sh0.Name & "$a2:d] group by 名称"
  21.     Crr = GET_SQLCoon(StrSQL, Str_coon, False)
  22.     sh0.Range("I3").Resize(UBound(Crr, 1) + 1, UBound(Crr, 2) + 1) = Crr  '//粘贴查询结果
  23.     sh0.Select
  24. Application.ScreenUpdating = True '//恢复屏幕刷新
  25. Application.DisplayAlerts = True '//恢复系统提示
  26. MsgBox "汇总用时:" & Format(Timer - t, "#0.0000") & " 秒", , "北极狐提示!!"  '//提示所用时间
  27. End Sub
复制代码

评分

4

查看全部评分

TA的精华主题

TA的得分主题

发表于 2014-12-4 08:10 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
sql语句做通用的怕是总是容易出错  如果是对sql很了解的用是可以的
单列稀疏数据 单列文本数字混合 合并单元格表头 这些情况sql都极易出错
个人觉得还是用数组或者字典保险一点
当然更重要的是源数据要规范 混乱格式的源数据 什么方法也汇总出来

评分

1

查看全部评分

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

本版积分规则

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

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

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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