VBA创建多个数据源的数据透视表
时间:2022-07-22
本文章向大家介绍VBA创建多个数据源的数据透视表,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
1、需求:
有多个表数据,格式一致,需要创建到1个数据透视表。
2、举例:
比如要分析工资的数据,工资表是按月分了不同Sheet管理的,现在需要把12个月的数据放到一起创建1个数据透视表。
3、代码实现
用过Excel的应该都用过透视表功能,透视表功能非常强大,而且简单易用,我们一般用透视表都是处理单独1个Sheet的数据,如果要完成多个Sheet的透视处理,可能大家想到的最直接的方法是复制到1个表里再处理,但是这样一旦数据源有变化,又要重新复制。
我们要完成这个功能,比较好的方法是用SQL语句将多个表拼接到一起再用数据透视表。用SQL语句对数据源的格式要求比较严格,所以表格要比较规范,建议:
- 标题在第1行
- 每一列保证数据格式是一致的,不要又有数字又有文本
如果你会SQL语句的话,不需要VBA也可以完成这个任务,例子需要的SQL语句是:
Select *,'1月' as 月份 from [1月$]
Union All
Select *,'2月' as 月份 from [2月$]
Union All
Select *,'3月' as 月份 from [3月$]
'x月' as 月份目的是为了在透视表里看出数据是属于哪一个Sheet的。
不用VBA的操作演示:
使用VBA代码自动创建,这种能更加方便的增加Sheet:
Sub vba_main()
Dim str_sql As String
str_sql = GetSql()
Worksheets("透视表").Activate
Cells.Clear
CreatePivotCache str_sql, Range("A4")
End Sub
Function GetSql() As String
Dim arr() As String
ReDim arr(Worksheets.Count - 1 - 1) As String
Dim i As Long
For i = 1 To Worksheets.Count - 1
arr(i - 1) = "Select *,'" & Worksheets(i).Name & "' as 月份 from [" & Worksheets(i).Name & "$]"
Next
GetSql = VBA.Join(arr, vbNewLine & " Union All " & vbNewLine)
End Function
'str_sql sql语句
'rng 透视表的位置
Function CreatePivotCache(str_sql As String, rng As Range) As Long
Dim AdoConn As Object, rst As Object
Set AdoConn = CreateObject("ADODB.Connection")
Set rst = CreateObject("ADODB.Recordset")
AdoConn.Open ProviderStr(rng.Parent.Parent.FullName)
rst.Open str_sql, AdoConn
With rng.Parent.Parent.PivotCaches.Add(xlExternal)
Set .Recordset = rst
.CreatePivotTable rng
End With
rst.Close
AdoConn.Close
Set rst = Nothing
Set AdoConn = Nothing
End Function
Function ProviderStr(fileName As String) As String
If Val(Application.Version) > 11 Then
ProviderStr = "Provider =Microsoft.ACE.OLEDB.12.0;Data Source=" _
& fileName & ";Extended Properties=""Excel 12.0;HDR=YES"";"
Else
ProviderStr = "OLEDB;Provider =Microsoft.Jet.OLEDB.4.0;Data Source=" _
& fileName & ";Extended Properties=""Excel 8.0;HDR=YES"";"
End If
End Function
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法