ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 一簿中多表创建透视表的练习

[复制链接]

TA的精华主题

TA的得分主题

发表于 2021-4-10 11:48 | 显示全部楼层 |阅读模式
本帖最后由 OKJSJSF 于 2021-4-19 07:40 编辑

在一个工作簿中联合多个工作表再创建透视表的方法适合数据记录较少的情况,如果记录多到超过表格上限就不行(比如联合每天的数据记录,一年366天,比如数据范围扩大至全系统、从村、乡镇扩大至县、市或省)。所以决定学习采用多表直接创建透视表。但为多表写SQL命令也较麻烦,于是决定改为小程序,
按照《excel2007实战技巧精粹》技巧164“多表动态汇总”的办法录了一个宏(空白的透视表,字段由用户自行拖放,以不变应万变),发现比没有采用“连接‘的单表生成透视表的程序多了太多代码,而且代码顺序与操作顺序并不同,想改成单击按钮执行事件过程的通用宏,不知哪些语句是多余的,怎么改动?数据连接的知识一穷二白,特求助。下面是录制的宏,包含一个工作簿中的四个表,黄色底纹是变量。
Option Explicit

Sub Macro1()
'
' Macro1 Macro
'

'
    With ActiveWorkbook.Connections("贷款明细2").OLEDBConnection
        .BackgroundQuery = True
        .CommandText = Array( _
        "select ""贷"" , * from [贷$] union all select ""款"" , * from [款$] union all select ""明"" , * from [明$] union all select ""细""" _
        , " , * from [细$]"
)
        .CommandType = xlCmdTable
        .Connection = Array( _
        "OLEDB;Provider=Microsoft.ACE.OLEDB.12.0;Password="""";User ID=Admin;Data Source=C:\Users\Administrator\Desktop\贷款明细2.xlsm;Mode=Share Den" _
        , _
        "y Write;Extended Properties=""HDR=YES;"";Jet OLEDB:System database="""";Jet OLEDB:Registry Path="""";Jet OLEDB:Database Password="""";Je" _
        , _
        "t OLEDB:Engine Type=35;Jet OLEDB:Database Locking Mode=0;Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=" _
        , _
        "1;Jet OLEDB:New Database Password="""";Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;Jet OLEDB:Don't Cop" _
        , _
        "y Locale on Compact=False;Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False;Jet OLEDB:Support Complex Data=Fals" _
        , "e")
        .RefreshOnFileOpen = True
        .SavePassword = False
        .SourceConnectionFile = ""
        .SourceDataFile = "C:\Users\Administrator\Desktop\贷款明细2.xlsm"
        .ServerCredentialsMethod = xlCredentialsMethodIntegrated
        .AlwaysUseConnectionFile = False
        .ServerFillColor = False
        .ServerFontStyle = False
        .ServerNumberFormat = False
        .ServerTextColor = False
    End With
    With ActiveWorkbook.Connections("贷款明细2")
        .Name = "贷款明细2"
        .Description = ""
    End With
    Workbooks("贷款明细2.xlsm").Connections.Add "贷款明细2", "", Array( _
        "OLEDB;Provider=Microsoft.ACE.OLEDB.12.0;Password="""";User ID=Admin;Data Source=C:\Users\Administrator\Desktop\贷款明细2.xlsm;Mode=Share Den" _
        , _
        "y Write;Extended Properties=""HDR=YES;"";Jet OLEDB:System database="""";Jet OLEDB:Registry Path="""";Jet OLEDB:Database Password="""";Je" _
        , _
        "t OLEDB:Engine Type=35;Jet OLEDB:Database Locking Mode=0;Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=" _
        , _
        "1;Jet OLEDB:New Database Password="""";Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;Jet OLEDB:Don't Cop" _
        , _
        "y Locale on Compact=False;Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False;Jet OLEDB:Support Complex Data=Fals" _
        , "e"), Array( _
        "select ""贷"" , * from [贷$] union all select ""款"" , * from [款$] union all select ""明"" , * from [明$] union all select ""细""" _
        , " , * from [细$]"
), 3
    ActiveWorkbook.PivotCaches.Create(SourceType:=xlExternal, SourceData:= _
        ActiveWorkbook.Connections("贷款明细2"), Version:=xlPivotTableVersion12). _
        CreatePivotTable TableDestination:="多表动态汇总!R1C1", TableName:="数据透视表1", _
        DefaultVersion:=xlPivotTableVersion12
    Cells(1, 1).Select
    ActiveWorkbook.ShowPivotTableFieldList = True
    ActiveSheet.PivotTables("数据透视表1").ShowDrillIndicators = False
    ActiveSheet.PivotTables("数据透视表1").HasAutoFormat = False
    ActiveSheet.PivotTables("数据透视表1").RowAxisLayout xlTabularRow
End Sub


TA的精华主题

TA的得分主题

 楼主| 发表于 2021-4-10 11:55 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 OKJSJSF 于 2021-4-10 22:45 编辑

虽然看上去很多代码,实际上大部份是自动的、默认的。我仅仅操作了选择文件,勾选打开时刷新,录入命令文本,取消展开折叠按钮,取消自动列宽,采用表格形式布局等,仅仅单击关联宏的按钮是会出错的,无法执行的。

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-4-11 12:08 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 OKJSJSF 于 2021-4-11 12:17 编辑

激活汇总表,单击选项卡的组中的命令按钮,(其他表联合缓存),立即生成空的透视表。

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-4-11 12:15 | 显示全部楼层
    <button id="button25" visible="true" label="一簿多表汇总透视" enabled="true" image="图标名" size="large"  screentip="命令按钮button25" supertip="汇总表激活后单击命令,生成数据透视表,简化手工操作。" keytip="V"/>


TA的精华主题

TA的得分主题

 楼主| 发表于 2021-4-11 12:42 | 显示全部楼层
如果我做不出来,我就只能在手工操作过程中,单击按钮,用循环语句获取其他表的名称,生成SQL命令文本,复制到粘贴板。再手工粘贴到《连接属性定义》文本框中。

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-4-11 12:50 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
OKJSJSF 发表于 2021-4-11 12:42
如果我做不出来,我就只能在手工操作过程中,单击按钮,用循环语句获取其他表的名称,生成SQL命令文本,复 ...

VBA这样太初级了。

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-4-17 22:21 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 OKJSJSF 于 2021-4-17 23:29 编辑

Excel 开发人员参考
PivotCache.Recordset 属性
返回或设置一个 Recordset 对象,该对象作为指定查询表的数据源。可读写。
语法
表达式.Recordset
表达式   一个代表 PivotCache 对象的变量。
说明
如果此属性用来覆盖现有记录集,更改将在运行 Refresh 方法时生效。
示例
此示例在活动工作表的 A3 单元格上,通过连接到 Microsoft Jet 上的 ADO 创建一个新的数据透视表高速缓存,然后再基于该高速缓存新建一个数据透视表。
Visual Basic for Applications
Dim cnnConn As ADODB.Connection
Dim rstRecordset As ADODB.Recordset
Dim cmdCommand As ADODB.Command

' Open the connection.
Set cnnConn = New ADODB.Connection
With cnnConn
    .ConnectionString = _
        "Provider=Microsoft.Jet.OLEDB.4.0"
    .Open "C:\perfdate\record.mdb"
End With

' Set the command text.
Set cmdCommand = New ADODB.Command
Set cmdCommand.ActiveConnection = cnnConn
With cmdCommand
    .CommandText = "Select Speed, Pressure, Time From DynoRun"
    .CommandType = adCmdText
    .Execute
End With

' Open the recordset.
Set rstRecordset = New ADODB.Recordset
Set rstRecordset.ActiveConnection = cnnConn
rstRecordset.Open cmdCommand

' Create a PivotTable cache and report.
Set objPivotCache = ActiveWorkbook.PivotCaches.Add( _
    SourceType:=xlExternal)
Set objPivotCache.Recordset = rstRecordset
With objPivotCache
    .CreatePivotTable TableDestination:=Range("A3"), _
        TableName:="Performance"
End With

With ActiveSheet.PivotTables("Performance")
    .SmallGrid = False
    With .PivotFields("Pressure")
        .Orientation = xlRowField
        .Position = 1
    End With
    With .PivotFields("Speed")
        .Orientation = xlColumnField
        .Position = 1
    End With
    With .PivotFields("Time")
        .Orientation = xlDataField
        .Position = 1
    End With

End With

' Close the connections and clean up.
cnnConn.Close
Set cmdCommand = Nothing
Set rstRecordSet = Nothing
Set cnnConn = Nothing

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-4-17 22:22 | 显示全部楼层
Private Sub CommandButton1_Click()
    Dim str As String
    Dim stri As String
    Dim i As Integer
    Dim sh As Worksheet
    Dim sql As String
    Dim objcn As New ADODB.Connection
    Range("a2:b65536").ClearContents
    Application.ScreenUpdating = False
    str = Dir(ActiveWorkbook.Path & "\*.xlsx")
    Do
        If InStr(1, str, "汇总") = 0 Then
            objcn.Open "Provider=Microsoft.Ace.OLEDB.12.0;Extended Properties='Excel 12.0;HDR=Yes';Data Source=" & ThisWorkbook.Path & "\" & str
            For Each sh In Worksheets
                stri = sh.Name
                If sql = "" Then
                    sql = "select * from [" & stri & "$]"
                Else
                    sql = sql & " union all select * from [" & stri & "$]"
                End If
            Next
            i = [A65536].End(xlUp).Row + 1
            Cells(i, 1).CopyFromRecordset objcn.Execute(sql)
            objcn.Close
            Set objcn = Nothing
        End If
        str = Dir
    Loop Until Len(str) = 0
    Application.ScreenUpdating = True

End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-4-17 22:26 | 显示全部楼层
Sub Macro1()
    Dim sh As Worksheet
    Dim SQL$
    For Each sh In Worksheets
        If sh.Name <> ActiveSheet.Name Then      '排除当前工作表,如果全部都要,去掉本If语句
            If SQL <> "" Then SQL = SQL & " union all "
            SQL = SQL & "select * from [" & sh.Name & "$]"
        End If
    Next
    MsgBox SQL
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-4-17 22:36 | 显示全部楼层
Sub Macro1()
    Dim sh As Worksheet
    Dim SQL$
    For Each sh In Worksheets
        If sh.Name <> ActiveSheet.Name Then      '排除当前工作表,如果全部都要,去掉本If语句
            If SQL <> "" Then SQL = SQL & " union all "
            SQL = SQL & "select """ & sh.Name & """ , * from [" & sh.Name & "$]"
'            SQL = SQL & "select * from [" & sh.Name & "$]"
        End If
    Next
    MsgBox SQL
End Sub
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-25 10:37 , Processed in 0.042962 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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