标签:
杂谈 |
分类: Excel |
- PivotTables——数据透视表。
- PivotCaches——数据透视表缓存。数据缓冲区,充当数据源和透视表之间的传递途径。优点:1)很大程度上控制了从数据源中获得的数据,尤其是与ADO协作时,可对外部数据源实现高级编程控制,有很大的灵活性,2)从同一数据源生成多个数据透视表(也可以使用PivotTable集合,无特别优势,只是提供丰富性选择),这比强制每个数据透视表维护自己的数据源更有效率。
-
- set pvt=Activesheet.PivotTables.add(PivotCache:=pvc,tabledestination:=range("A3"))
- PivotFields——数据透视字段。包括源数据所有字段以及已添加的计算字段(源数据表不可见)。两种技术添加:1)PivotTable.AddFields方法;addfields方法可以添加多个行字段/列字段或者页字段,添加的新字段将替换任何现有的字段,除非addtotable=true,不能用来添加或者替换数据字段。2)给PivotField对象的Orientation属性赋值。
-
-
With Activesheet.PivotTables(1)
-
'添加新的行字段state
-
.AddFields RowFields:="state",AddToTable:=true
-
'将date字段作为新的页字段
-
.PivotFields("date").Orientation=xlPageField
-
End with
-
- PivotItems——数据透视项。是PivotField对象的方法而非属性,包含在字段中的唯一值。
- PivotCharts——数据透视图
-
Sub creatpivotchart()
-
Dim shp As Shape
-
'在shape对象中创建图表
-
Set shp = activehseet.Shapes.AddChart(xlColumnStacked)
-
shp.Chart.SetSourceData Source:=ActiveSheet.PivotTables(1).TableRange1, PlotBy:=xlsoumns
-
'调整图表大小位置与某单元格区域相同
-
With Range("a11:f28")
-
shp.Left = .Left
-
shp.Top = .Top
-
shp.Width = .Width
-
shp.Height = .Height
-
End With
-
'更改数据透视表和数据透视图的布局
-
With shp.Chart.PivotLayout.PivotTable
-
.PivotFields("customer").Orientation = xlColumnField
-
.PivotFields("product").Orientation = xlRowField
-
End With
-
'修改数据透视图的格式
-
shp.Chart.ChartType = xlCylinderColStacked
-
End Sub
-
Sub CreatePivotTable()
-
Dim wks As Worksheet
-
Dim pvc As PivotCache
-
Dim pvt As PivotTable
-
-
'添加新工作表
-
Set wks = Worksheets.Add
-
- '建立数据透视表缓存
-
Set pvc = ActiveWorkbook.PivotCaches.Create( _
-
SourceType:=xlDatabase, _
-
SourceData:=Sheet1.ListObjects("table1").Range) '引用区域可以是range,表或者自定义名称,如名称可以写为:SourceData:="database"
-
-
'创建数据透视表,
tabledestination为数据透视表的最左上方区域 -
Set pvt = pvc.CreatePivotTable(tabledestination:=wks.Range("a3"), _
-
defaultversion:=xlPivotTableVersion12)
- 'xlPivotTableVersion12为Excel2007及以上版本的默认模板,见XlPivotTableVersionList 枚举 (Excel)
-
-
'定义数据透视表的字段
-
-
With pvt
-
'添加行字段方法1,AddFields方法,可以跟Array函数配合使用,批量设置字段,字段名称必须跟透视表源数据的字段名字完全一样,否则会出错;可以添加页字段,行字段和列字段,不能添加数据项
-
"匹配电源", "匹配电源口径", "产品代数", "端口数量", "其它", "调用名称单号记录"), _
PageFields:="符号"
'添加数据字段
.AddDataField .PivotFields("待测试"), "sum of 待测试", xlSum
'添加行字段方法2,PivotFields属性,逐个设置比较麻烦
-
'With .PivotFields("customer")
-
'.Orientation = xlRowField '
xlColumnField 同理表示添加列字段 -
'.Position = 1 ‘position定义字段的层级,数值越大表示位置越往下(靠后)
-
'End With
-
-
.ColumnGrand = False '每列汇总不显示
.PivotFields("客户名称").Subtotals(1) = False '求和汇总不显示,
PivotField.Subtotals 属性 (Excel)On Error Resume Next '错误处理
.
PivotFields("符号").CurrentPage = "领" '指定页字段,思考,找不到关键字怎么办?.PivotFields("调用名称单号记录").PivotItems("(blank)").Visible = False 'Visible属性隐藏项目,筛选非空值,思考,如果全为空怎么办?
'If ERR.Number<>0 then 'Number 属性(Err 对象)
'ERR.Clear
'End if
.Function = xlSum 'function属性修改数据字段的汇总方式
-
End With
- End Sub
-
Sub Groupdates()
-
With pvt
-
Set Rng = .PivotFields("date").DataRange.Cells(1, 1) 'datarange不能引用该数据区域的全部单元格
-
Rng.Group Start:=True, End:=True, _
-
periods:=Array(False, False, False, False, True, False, True)
'Start:=True, End:=True表示包含所有日期,array里面7个参数分别对应,秒/分/小时/日/月/季/年 -
End With
-
'取消分组
-
'Set Rng = .PivotFields("date").DataRange
-
'rng.ungroup
-
'重新分组
-
'Set Rng = .PivotFields("date").DataRange.Cells(1, 1)
-
'Rng.Group Start:=True, End:=True, _
-
periods:=Array(False, False, False, False, true, False, True)
-
End Sub
-
Function bnameexists(smyname As String) As Boolean
-
Dim sname As String
-
On Error Resume Next
-
sname = Names(smyname).RefersTo
-
If Err.Number <> 0 Then
-
bnameexists = False
-
Err.Clear
-
Else
-
bnameexists = True
-
End If
-
End Function
-
Sub test()
-
Dim DataRng As Range '定义一个数据范围,用来储存生成数据透视表的数据
-
Dim MyPivot As Worksheet '定义一个工作表,存放数据透视表"
-
Dim MyPivotTable As PivotTable '定义一个数据透视表,用来储存数据透视表对象”
-
Dim MyTable As Worksheet '定义一个工作表,做为汇总表
-
Dim sh As Worksheet '定义工作表变量,删除数据透视表时使用
-
Set DataRng = Range("明细表!A1:E59") '确定生成数据透视表的数据
-
'也可以用inputbox方法选择,语句如下
-
'Set DataRng = Application.InputBox("请选择需要生成数据透视表的数据", Type:=8)
-
Set MyPivot = Sheets.Add '新建一个工作表,用来存放数据透视表
-
'下面这一句是利用PivotTableWizard方法生成一个空的数据透视表;
-
Set MyPivotTable = MyPivot.PivotTableWizard(SourceType:=xlDatabase, SourceData:=DataRng)
-
'添加数据透视表行字段和列字段,如果需要同时添加多个行字段或者列字段,用arr函数
-
MyPivotTable.AddFields RowFields:=Array("BH", "XM"), ColumnFields:="MC"
-
'添加数据透视表数据字段和汇总方法,注意这里需要写完整数据字段“MyPivotTable.PivotFields("JE")”
-
MyPivotTable.AddDataField MyPivotTable.PivotFields("JE"), Function:=xlSum
-
'去掉BH字段中分类汇总功能,Subtotals(1)=false代表将索引 1(自动)为 false,则其他所有值将设置为 False。如果需要分类汇总功能,则设置为true或不要这句;
-
MyPivotTable.PivotFields("BH").Subtotals(1) = False
-
'建一个新表,将所需内容copy到新表
-
Set MyTable = Sheets.Add
-
Range(MyPivot.Cells.Find("BH"), MyPivot.UsedRange.Item(MyPivot.UsedRange.Count)).Copy MyTable.Range("A1")
-
'以下内容是将新表改为汇总表,如果有汇总表存在,则弹出提示
-
On Error GoTo ErrorHandler
-
MyTable.Name = "汇总表"
-
ErrorHandler:
-
If Err.Number = 1004 Then
-
MsgBox "汇总表已存在"
-
'删除生成的数据透视表
-
Application.DisplayAlerts = False
-
For Each sh In Worksheets
-
If sh.Name Like "Sheet*" Then sh.Delete
-
Next
-
Application.DisplayAlerts = True
-
Else
-
'删除生成的数据透视表
-
Application.DisplayAlerts = False
-
For Each sh In Worksheets
-
If sh.Name Like "Sheet*" Then sh.Delete
-
Next
-
Application.DisplayAlerts = True
-
End If
-
End Sub
案例研究:
以下内容摘录国外一本书上:
一.用数据透视表向导创建透视表的方法:
-
Worksheets(“Sheet2”).PivotTableWizard SourceType:=xlDatabase,SourceData:=Range(“Sheet1!A4:E250”)
用PivotTableWizard方法,创建一个透视表,2个参数,一个SourceType数据源类型,采用excel数据库;另外一个SourceData数据源,采用工作表Sheet1!A4:E250单元格区域,透视表的放置位置在当前活动的单元格。
当然,你也可以给数据透视表指定放置的详细位置,例如,把它放在D4单元格,透视表命名为:=”My Pivot Table”,代码变为:
-
Worksheets(“Sheet2”).PivotTableWizard SourceType:=xlDatabase, SourceData:=Range(“Sheet1!A4:E250”), _
-
TableDestination:=Range(“D4”), TableName:=”My Pivot Table”
最后,你还可以指定“行合计”和“列合计”,则代码变为:
-
Worksheets(“Sheet2”).PivotTableWizard SourceType:=xlDatabase, SourceData:=Range(“Sheet1!A4:E250”), _
-
TableDestination:=Range(“D4”),TableName:=”My Pivot Table”, _
-
RowGrand:=True, ColumnGrand:=True
我们一般使用3个参数即可,其它的省略:
-
Worksheets(“Sheet2”).PivotTableWizard SourceType:=xlDatabase, _
-
SourceData:=Range(“Sheet1!A4:C28”),TableDestination:=Range(“B2”)
二.用PivotCache透视表内存缓存创建一个数据透视表:
-
Public Sub CreatePivotTable()
-
Dim wb As Workbook ’声明3个变量!
-
Dim pt As PivotTable
-
Dim pc As PivotCache
-
On Error GoTo ErrorHandler
-
‘ Open the workbook.即设置打开一个工作簿的变量。
-
Set wb = Workbooks.Open(“c:\PivotData\VideoStoreRawData.xls”)
-
‘ Create the PivotCache.创建一个透视表内存缓存!
-
Set pc = wb.PivotCaches.Add(SourceType:=xlDatabase, SourceData:=”[VideoStoreRawData.xls]Sheet1!A4:C28”)
-
‘ 采用CreatePivotTable方法,利用透视表缓存创建一个数据透视表!
-
Set pt = pc.CreatePivotTable TableDestination:=”[VideoStoreRawData.xls]Sheet2! “,TableName:=”Video Data”
-
‘下面是错误处理程序,可以借鉴一下,很常用的方法!
-
wb.Worksheets(“Sheet2”).Activate
-
EndOfSub:
-
Exit Sub
-
ErrorHandler:
-
If Err.Number = 5 Or Err.Number = 9 Then
-
MsgBox “The file could not be found”
-
ElseIf Err.Number = 1004 Then
-
MsgBox “There is already a PivotTable at that location”
-
Else
-
MsgBox “Error “ & Err & “ - “ & Err.Description
-
End If
-
Resume EndOfSub
-
End Sub
以上2种方法,创建出一个奇怪的4个单元格形状的数据透视表,透视表中没有任何字段!
下面是添加行字段,列字段和页字段的方法:
用Addfields方法,来添加,它的语法是:
AddFields(RowFields, ColumnFields, PageFields, _ AddToTable)
如果你只添加一个字段,例如:
-
Worksheets(“Sheet1”).PivotTables(1).AddFields _
-
(ColumnFields:=”Region”, AddToTable:=True)
如果添加多个字段,则用Array来添加:
-
myPivotTable.AddFields(RowFields:=Array(“Status”, “DueDate”))
下面的代码是一个完整的例子,包括行,列和页字段的添加:
-
myPivotTable.AddFields(RowFields:=”Region”, _
-
ColumnFields:=”Quarter”, _
-
PageFields:=Array(“Status”, “DueDate”))
下面继续介绍向数据区域添加数据字段的方法:
如果你只添加一个数据字段,则用AddDataField方法,它的语法是:
AddDataField(Field,Caption,Function)
Field参数的表示方法:PivotFields(Name)
例子如下:
-
Dim pt As PivotTable
-
Set pt = Worksheets(“Sheet1”).PivotTables(“PivotTable1”)
-
pt.AddDataField pt.PivotFields(“Sales”), “Total Sales”
下面是一个创建数据透视表的完整例子:
-
Public Sub CreateCompletePivotTable
() -
Dim wb As Workbook
-
Dim pt As PivotTable
-
On Error GoTo ErrorHandler
-
‘ Open the workbook.
-
Set wb = Workbooks.Open(“c:\PivotData\VideoStoreRawData.xls”)
-
‘ Create the PivotTable and get a reference to it.
-
Set pt = Worksheets(“Sheet2”).PivotTableWizard(SourceType:=xlDatabase, _
-
SourceData:=Range(“Sheet1!A4:C28”), _
-
TableDestination:=Range(“Sheet2!B2”))
-
‘ Add row and column fields.
-
pt.AddFields RowFields:=”Store”, ColumnFields:=”Category”
-
‘ Add data field.
-
pt.AddDataField pt.PivotFields(“Titles”), “Total Titles”
-
EndOfSub:
-
Exit Sub
-
ErrorHandler:
-
If Err.Number = 5 Or Err.Number = 9 Then
-
MsgBox “The file could not be found”
-
ElseIf Err.Number = 1004 Then
-
MsgBox “There is already a PivotTable at that location”
-
Else
-
MsgBox “Error “ & Err & “ - “ & Err.Description
-
End If
-
Resume EndOfSub
-
End Sub