ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[原创] SQL+数据透视表+VBA 数据透视表的超级应用

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2009-6-1 23:36 | 显示全部楼层 |阅读模式
本帖已被收录到知识树中,索引项:数据透视表
SQL+数据透视表+VBA 使数据透视表走向更灵活,更智能,更适用。
这个是我和师傅一撇首度合作,他提供了文件并提出了要求,我帮他实现其效果
下面从几个方面解释一下:

1、功能
一个源文件和一个通过用SQL查询生成的数据透视表
将源文件拖到电脑的任意位置,甚至将文件名也改掉,用VBA配上代码和窗体找到文件,数据透视表仍然能够正常工作
2、套用
现在来讲讲怎么使做出来的东东适应大家的需要
2、1
用OLE DB窗口引用工作表或写SQL语句,因为用这个方法同VBA相通,copy下来代码区的的语句
2、2
打开透视表文件,将透视表中的字段全部拖出来,也就是变成一个空数据透视表。
右击下面工作表图标 或者 工具》宏》visual basic 编辑器,点击模块看到代码区
2、3
将2、1步骤copy的语句commandtext的数据Array中的引号中
.CommandText = Array("    ")
可能不同版本会有一些差别,同时SQL语句中如果添加了文本生成新字段,双引号要成对翻倍
如:"出库" AS 表单选项 要改成 ""出库"" AS 表单选项
2、4
语句太长的处理:在代码区如果你想好看一些,你可以插入“ _”来换行,当然不能插在一个单词或自动名等中间。
2、5
将文件存盘,重新打开就会有了数据,你可以将字段拖入数据透视表中,创建你自己的数据透视表,
2、6
这样文件就可以使用,相信VBA的引导不用教就可以交给别人使用了

下面附上代码,包含3个区:

1、 工作簿去,打开文件时工作
Private Sub Workbook_Open()
Dim OP

If Dir(Sheets("path").Range("A1")) = "" Then
    OP = MsgBox("源文件已被移走,请选择下列选项" + Chr(10) + "1、选择是,重新输入文件全名" + Chr(10) + "2、选择否,打开原有的数据透视表" + Chr(10) + "3、选择取消,关闭文件", vbYesNoCancel, "Scarlett温馨提示")
    If OP = vbYes Then
        UserForm1.Show
    End If
    If OP = vbNo Then
        ActiveWorkbook.Close True
    End If
   
    If OP = vbCancel Then
        Exit Sub
    End If
   
Else
    Call refreshpv
End If
End Sub

2、窗体区,实现文件的查找
Private Sub CommandButton1_Click()
Dim fopen As FileDialog
Set fopen = Application.FileDialog(msoFileDialogFilePicker)
fopen.Show
TextBox1.Value = fopen.SelectedItems(1)
Set fopen = Nothing
End Sub

Private Sub CommandButton2_Click()
If InStr(TextBox1.Value, ".") > 0 Then
    Sheets("path").Range("A1") = TextBox1.Value
    Call refreshpv
    unload me
Else
    MsgBox "文件名要带路径含后缀的文件名", "Scarlett_88温馨提示"
    TextBox1.SetFocus
End If
End Sub

Private Sub CommandButton3_Click()
Unload Me
End Sub

Private Sub TextBox1_Change()

End Sub

Private Sub UserForm_Activate()

End Sub

Private Sub UserForm_Click()
TextBox1.Value = Sheets("path").Range("A1")
End Sub

3、模块区,实现SQL语句的地址更新和刷新数据透视表的数据源

Sub refreshpv()
    With ActiveSheet.PivotTables("数据透视表1").PivotCache
        .Connection = Array( _
        "OLEDB;Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=" & Sheets("path").Range("A1") & ";Mode=Share Deny Write;" _
        , _
        "Extended Properties=""HDR=YES;"";Jet OLEDB:System database="""";Jet OLEDB:Registry Path="""";Jet OLEDB:Engine Type=35;Jet OLEDB:Databa" _
        , _
        "se Locking Mode=0;Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New Database Password="""";Je" _
        , _
        "t OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;Jet OLEDB:Don't Copy Locale on Compact=False;Jet OLEDB:Com" _
        , "pact Without Replica Repair=False;Jet OLEDB:SFP=False")
        .CommandType = xlCmdTable
        .CommandText = Array( _
        "select ""期初""  AS 表单选项,规格型号,机器号,数量,0 as 数量3, 0 as 数量2, 金额,0 as 金额3, 0 as 金额2  from  [期初$]  union  all  select ""入库"" AS 表单选项,规格型号,机器号, 0" _
        , _
        " as 数量2, 数量,0 as 数量3, 0 as 金额2, 金额,0 as 金额3 from  [入库$]  union  all  select ""出库"" AS 表单选项,规格型号,机器号, 0 as 数量3, 0 as 数量2,数量, 0 as 金额3, 0 as 金额2,金额 from [出库$]" _
        )
    End With
    ActiveSheet.PivotTables("数据透视表1").PivotCache.Refresh
End Sub

[ 本帖最后由 Scarlett_88 于 2009-6-2 03:52 编辑 ]

数据透视表VBA搜寻路径.rar

30.69 KB, 下载次数: 4050

TA的精华主题

TA的得分主题

发表于 2009-6-1 23:48 | 显示全部楼层
超级实用的东东,感谢分享。有时间再搞搞多工作簿数据源的、2007版本的吧。

TA的精华主题

TA的得分主题

发表于 2009-6-1 23:52 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2009-6-1 23:58 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-6-2 00:01 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
原帖由 BIN_YANG168 于 2009-6-1 23:48 发表
超级实用的东东,感谢分享。有时间再搞搞多工作簿数据源的、2007版本的吧。


多工作簿的在考虑

TA的精华主题

TA的得分主题

发表于 2009-6-2 00:24 | 显示全部楼层
很是实用,感谢斯嘉丽分享,学习了。
ps:有这么多老师,羡慕ing……

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-6-2 00:34 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
原帖由 xowi99 于 2009-6-2 00:24 发表
很是实用,感谢斯嘉丽分享,学习了。
ps:有这么多老师,羡慕ing……

老师布置的作业要做的

TA的精华主题

TA的得分主题

发表于 2009-6-2 01:18 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
谢谢分享,好用,但看上去好难哦!

TA的精华主题

TA的得分主题

发表于 2009-6-2 06:45 | 显示全部楼层
那值得研究。这么多人晚上都很迟睡啊。真佩服。

TA的精华主题

TA的得分主题

发表于 2009-6-2 08:18 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-3-29 23:50 , Processed in 0.057899 second(s), 9 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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