ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

ADO分别创建Excel\Access\SQLServer数据源透视表

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2012-7-21 22:38 | 显示全部楼层 |阅读模式
本帖最后由 fankairong 于 2012-7-21 22:47 编辑

数据透视表绝对是Excel数据分析的最强大工具(没有之一);但同时限于Excel本身的局限,日常工作中更多的数据源都是存在类似Access\SQL Server等数据库中.在这种情况下,我们应该如何发挥数据透视表的优势呢?或许你会说可以用外部数据源\MQ等,但他们都存在不少的明显缺点,比如条件判断,变量使用等等,那如果直接用VBA来创建数据透视表呢?那不就可以完美解决以上问题了吗?
接下来就分别以最常用的三种数据源来举例说明.
ADO透视表.rar (595.99 KB, 下载次数: 903)
1\Excel数据源
关键点:表名需要以$结尾,如[订单$],日期标识符为#

Private Sub 以Excel为数据源创建透视表()
    Dim mySQL As String
    Dim mycnn
    Dim wsh As Worksheet
    Set wsh = Worksheets("Excel为数据源透视表")
    Set mycnn = CreateObject("ADODB.connection")

    Dim pt As PivotCache

    '删除旧的数据透视表,以免接下来新建时出错
    On Error Resume Next
    wsh.PivotTables("数据透视表1").TableRange2.Delete

    '建立链接
    Set mycnn = CreateObject("adodb.connection")
    mycnn.Open ("provider=microsoft.jet.oledb.4.0;extended properties=excel 8.0;data source=" & ThisWorkbook.FullName)

    mySQL = "SELECT `订单$`.订单ID, `订单$`.客户, `订单$`.雇员, `订单$`.订购日期, `订单$`.到货日期, `订单$`.发货日期, `订单$`.运货商, `订单$`.运货费, `订单$`.货主名称,"
    mySQL = mySQL & " `订单$`.货主地址, `订单$`.货主城市, `订单$`.货主地区, `订单$`.货主邮政编码, `订单$`.货主国家, `订单明细$`.产品, `订单明细$`.单价, `订单明细$`.数量, `订单明细$`.折扣"
    mySQL = mySQL & " FROM `订单$` `订单$`, `订单明细$` `订单明细$` WHERE `订单$`.订单ID = `订单明细$`.订单ID and 发货日期>=#1997-1-1# "    '建立透视表缓存

    Set pt = ActiveWorkbook.PivotCaches.Create(xlExternal)
    Set pt.Recordset = mycnn.Execute(mySQL)
    pt.CreatePivotTable TableDestination:=wsh.Range("a3"), TableName:="数据透视表1"

    '透视表布局
    With wsh.PivotTables("数据透视表1")
        .PivotFields("产品").Orientation = xlRowField
        .PivotFields("产品").Position = 1
        .AddDataField wsh.PivotTables("数据透视表1").PivotFields("数量"), "数量合计", xlSum
    End With
    '清空对象
    mycnn.Close
    Set mycnn = Nothing
End Sub


评分

4

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-7-21 22:41 | 显示全部楼层
2\Access数据源
关键点:表名不需要以$结尾,可直接使用表名,在这部分基本上市面上的SQL语法书里的内容都可以直接使用
  1. Sub 以Access为数据源创建透视表()

  2.     Dim sht As Worksheet
  3.     Set sht = Worksheets("Access透视表")

  4.     Application.ScreenUpdating = False
  5.     On Error Resume Next
  6.     Worksheets("sht").TableRange2.Delete

  7.     '-----------------------------------------------------------------------

  8.     '用ADO建立数据连接,用Sql提取数据,把所得数据提供给新建的数据透视表高速缓存

  9.     '然后关闭连接,释放对象空间

  10.     Set conn = CreateObject("ADODB.Connection")

  11.     conn.Open "provider=microsoft.jet.oledb.4.0;data source=" & ThisWorkbook.Path & "\Northwind.mdb"    '连接2003及以下版本
  12.     'conn.Open "provider=Microsoft.ACE.OLEDB.12.0;data source=" & ThisWorkbook.Path & "\Northwind.accdb" '2007及以上版本

  13.     Sql = "select * from 订单 where 发货日期 between #1996-1-1# and #1998-12-1#"    '与以Excel为数据源的区别是表名不用加$

  14.     ' 创建透视表高速缓存及创建透视表
  15.     Dim objPivotCache As PivotCache
  16.     Set objPivotCache = ActiveWorkbook.PivotCaches.Add(SourceType:=xlExternal)
  17.     Set objPivotCache.Recordset = conn.Execute(Sql)

  18.     With objPivotCache
  19.         .CreatePivotTable TableDestination:=sht.Range("A3"), TableName:="数据透视表1"
  20.     End With
  21. '透视表布局
  22.     With wsh.PivotTables("数据透视表1")
  23.         .PivotFields("产品").Orientation = xlRowField
  24.         .PivotFields("产品").Position = 1
  25.         .AddDataField wsh.PivotTables("数据透视表1").PivotFields("数量"), "数量合计", xlSum
  26.     End With
  27.     '清空对象

  28.     conn.Close
  29.     Set conn = Nothing

  30.     Application.ScreenUpdating = True

  31. End Sub
复制代码


评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-7-21 22:42 | 显示全部楼层
3\SQL Server数据源
关键点:表名不需以$结尾,但日期标识符不是#,而是'
  1. Sub 以SQLServer为数据源创建透视表()

  2. '-----------------------------------------------------------------------

  3. '用VBA操作ADO+SQL+数据透视表(Pivot)的综合运用
  4.     Application.ScreenUpdating = False
  5.     Dim sht As Worksheet
  6.     Set sht = Worksheets("SQLServer数据透视表")
  7.     On Error Resume Next
  8.     sht.PivotTables("数据透视表1").TableRange2.Delete

  9.     '用ADO建立数据连接,用Sql提取数据,把所得数据提供给新建的数据透视表高速缓存

  10.     '然后关闭连接,释放对象空间

  11.     Set conn = CreateObject("ADODB.Connection")

  12.     conn.Open "provider=SQLOLEDB.1;User ID=sa;Password=admin;Data Source=192.168.0.168;Initial Catalog=NorthWind"    'SQL Server
  13.     Sql = "select * from 订单明细  where 开票日期>='1996-1-1' and 开票日期<='1998-1-1'"    '区别最大在于日期的标识符是英文逗号而不是井字号

  14.     ' 创建透视表高速缓存及创建透视表
  15.     Dim objPivotCache As PivotCache
  16.     Set objPivotCache = ActiveWorkbook.PivotCaches.Add(SourceType:=xlExternal)
  17.     Set objPivotCache.Recordset = conn.Execute(Sql)

  18.     With objPivotCache
  19.         .CreatePivotTable TableDestination:=sht.Range("A3"), TableName:="数据透视表1"
  20.     End With

  21.     conn.Close
  22.     Set conn = Nothing

  23.     Application.ScreenUpdating = True

  24. End Sub
复制代码
以上仅当抛砖引玉,基本内容都可直接引用,只有把握住关键点,然后根据自己的实际情况编写SQL语句即可自由自在的享受数据透视表的强大功能了!

TA的精华主题

TA的得分主题

发表于 2012-7-29 18:25 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-7-31 21:22 | 显示全部楼层
本帖最后由 fankairong 于 2012-7-31 21:22 编辑

从有密码的Mdb里取数,以给一位朋友解答为例
http://club.excelhome.net/forum. ... =900372&pid=6170608
  1. Sub 从Access中取数()
  2.     Set conn = CreateObject("ADODB.Connection")
  3.     conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & ThisWorkbook.Path & "\database\backup.mdb ;Persist Security Info=False;Jet OLEDB:Database Password=jpdy61046"
  4.     Sql = "select top 1 skm from T66FPMX"   
  5.     Worksheets("往来票据").[M4].CopyFromRecordset conn.Execute(Sql)
  6.     conn.Close
  7.     Set conn = Nothing
  8. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2012-8-1 20:24 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
fankairong 发表于 2012-7-21 22:41
2\Access数据源
关键点:表名不需要以$结尾,可直接使用表名,在这部分基本上市面上的SQL语法书里的内容都可以 ...

可不可以详细说明下具体操作步骤?具体这个代码将写在哪里呢?

TA的精华主题

TA的得分主题

发表于 2012-8-5 10:13 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-8-6 09:51 | 显示全部楼层
amiaosheng 发表于 2012-8-5 20:40
楼主,我下了一楼的附件,感觉非常强大。
由于本人基础薄弱,现在用高级筛选+表,生成的透视 ...

看过你的附件,但是不明白您是需要我帮你做什么呢?

TA的精华主题

TA的得分主题

发表于 2012-8-5 20:40 | 显示全部楼层
本帖最后由 amiaosheng 于 2012-8-5 21:11 编辑

楼主,我下了一楼的附件,感觉非常强大。{:soso_e179:}
由于本人基础薄弱,现在用高级筛选+表,生成的透视表使用起来不是很方便(尤其日期无法进行自动组合,不得已我又用辅助列增加了年、月{:soso_e127:})。
想请您帮我把附件中订单执行统计表按您一楼的模板优化一下,不甚感激!
Ps:除了删除其中数据,表单的格式和数据类型我一点都没变。
订单执行统计表.rar (8.05 KB, 下载次数: 86)

TA的精华主题

TA的得分主题

发表于 2012-8-6 13:10 | 显示全部楼层
fankairong 发表于 2012-8-6 09:51
看过你的附件,但是不明白您是需要我帮你做什么呢?

创建数据透视表供分析使用,透视表字段用VBA从Excel数据源中生成。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-5-2 11:07 , Processed in 0.040630 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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