ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 求助:用vba实现多表透视的效果

[复制链接]

TA的精华主题

TA的得分主题

发表于 2015-4-26 23:23 | 显示全部楼层 |阅读模式
本帖最后由 toadandswan 于 2015-4-26 23:25 编辑

求助各位大侠,想要用vba实现 用sql多表透视的效果
透视效果 和要求都在附件中说明,望大侠们不惜赐教!
用VBA实现多表透视的效果.rar (9.97 KB, 下载次数: 8)
1.jpg

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-4-27 10:33 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
( ▼-▼ ) 又要沉了么

TA的精华主题

TA的得分主题

发表于 2015-4-27 10:54 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
  1. Sub test()
  2.   Dim r%, i%
  3.   Dim arr, brr
  4.   Dim d As Object
  5.   Set d = CreateObject("scripting.dictionary")
  6.   xm = [{"期初","入库","出库"}]
  7.   With Worksheets("结存")
  8.     rq1 = .Range("b1")
  9.     rq2 = .Range("d1")
  10.   End With
  11.   For k = 1 To UBound(xm)
  12.     With Worksheets(xm(k))
  13.       r = .Cells(.Rows.Count, 1).End(xlUp).Row
  14.       arr = .Range("a2:d" & r)
  15.       For i = 1 To UBound(arr)
  16.         If arr(i, 1) >= rq1 And arr(i, 1) <= rq2 Then
  17.           If Not d.exists(arr(i, 2)) Then
  18.             ReDim brr(1 To 6)
  19.             brr(1) = arr(i, 2)
  20.             brr(2) = arr(i, 3)
  21.           Else
  22.             brr = d(arr(i, 2))
  23.           End If
  24.           brr(k + 2) = brr(k + 2) + arr(i, 4)
  25.           d(arr(i, 2)) = brr
  26.         End If
  27.       Next
  28.     End With
  29.   Next
  30.   brr = Application.Transpose(Application.Transpose(d.items))
  31.   ReDim crr(1 To UBound(brr, 2))
  32.   crr(1) = "总计"
  33.   For i = 1 To UBound(brr)
  34.     brr(i, 6) = brr(i, 3) + brr(i, 4) - brr(i, 5)
  35.     For j = 3 To UBound(brr, 2)
  36.       crr(j) = crr(j) + brr(i, j)
  37.     Next
  38.   Next
  39.   With Worksheets("结存")
  40.     .UsedRange.Offset(3, 0).ClearContents
  41.     .Range("a4").Resize(UBound(brr), UBound(brr, 2)) = brr
  42.     r = .Cells(.Rows.Count, 1).End(xlUp).Row
  43.     Range("a" & r + 1).Resize(1, UBound(crr)) = crr
  44.   End With
  45. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2015-4-27 10:55 | 显示全部楼层
详见附件。

用VBA实现多表透视的效果.rar

17.08 KB, 下载次数: 9

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-4-27 11:09 | 显示全部楼层
chxw68 发表于 2015-4-27 10:55
详见附件。

非常感谢 chxw68 老师的解答,操作了下可以达到要求,但是还有个小问题就是 筛选日期为同一天的时候 会提示下表越界 QQ图片20150427110618.jpg

TA的精华主题

TA的得分主题

发表于 2015-4-27 11:14 | 显示全部楼层
chxw68 发表于 2015-4-27 10:55
详见附件。

老师,
冒昧的麻烦您了,还可以帮我一个大忙吗.......1、点击按钮时   选择文件夹
2、自动统计被选择文件夹下的文件(包括子文件夹)    不需要子文件夹名称,全部word的内容就行了!  


这个附件代码有点小问题,可以帮我改一下吗
[url=]大众 TSI - 副本v1.zip[/url]

大众 TSI - 副本v1.zip

707.56 KB, 下载次数: 1

点评

有空了我看看。  发表于 2015-4-27 11:21

TA的精华主题

TA的得分主题

发表于 2015-4-27 11:19 | 显示全部楼层
  1. Sub test11()
  2.   Dim cnn As New ADODB.Connection
  3.   Dim rs As New ADODB.Recordset
  4.   Dim sql As String
  5.   Dim mybook As String
  6.   mybook = ThisWorkbook.FullName
  7.   With Worksheets("结存")
  8.     rq1 = .Range("b1")
  9.     rq2 = .Range("d1")
  10.   End With
  11.   With cnn
  12.     If Application.Version = "11.0" Then
  13.       .Provider = "microsoft.jet.oledb.4.0"
  14.       .ConnectionString = "extended properties=""excel 8.0;HDR=YES;"";data source=" & mybook
  15.     Else
  16.       .Provider = "microsoft.ACE.oledb.12.0"
  17.       .ConnectionString = "extended properties=""excel 12.0;HDR=YES;"";data source=" & mybook
  18.     End If
  19.     .Open
  20.   End With
  21.   sql1 = "select 编码,名称,sum(数量) as 数量 from [期初$a1:d] where 日期 between #" & rq1 & "# and #" & rq2 & "# group by 编码,名称"
  22.   sql2 = "select 编码,名称,sum(数量) as 数量 from [入库$a1:d] where 日期 between #" & rq1 & "# and #" & rq2 & "# group by 编码,名称"
  23.   sql3 = "select 编码,名称,sum(数量) as 数量 from [出库$a1:d] where 日期 between #" & rq1 & "# and #" & rq2 & "# group by 编码,名称"
  24.   sql = "select a.编码,a.名称,a.数量 as 期初数量,b.数量 as 入库数量,c.数量 as 出库数量,a.数量+b.数量-c.数量 as 结存数量 from ((" & sql1 & ") a left outer join (" & sql2 & ") b on a.编码=b.编码) left outer join (" & sql3 & ") c on a.编码=c.编码"
  25.   rs.Open sql, cnn, adOpenKeyset, adLockOptimistic
  26.   With Worksheets("结存")
  27.     .UsedRange.Offset(3, 0).Delete
  28.     .Range("a4").CopyFromRecordset rs
  29.     r = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
  30.     .Cells(r, 1) = "合计"
  31.     .Cells(r, 3).Resize(1, 4).FormulaR1C1 = "=SUM(R[" & 4 - r & "]C:R[-1]C)"
  32.   End With
  33. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2015-4-27 11:20 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
提供了字典和ADO两种方法。

用VBA实现多表透视的效果.rar

14.66 KB, 下载次数: 13

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-4-27 11:28 | 显示全部楼层
chxw68 发表于 2015-4-27 11:20
提供了字典和ADO两种方法。

非常感谢老师的解答..
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-5-1 00:33 , Processed in 0.035168 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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