标签:
杂谈 |
分类: 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函数配合使用,批量设置字段,字段名称必须跟透视表源数据的字段名字完全一样,否则会出错;可以添加页字段,行字段和列字段,不能添加数据项
-
.AddFields RowFields:=Array("客户名称", "生产单号", "类别", "运营商", "厂家", "品名", _"匹配电源", "匹配电源口径", "产品代数", "端口数量", "其它", "调用名称单号记录"), _PageFields:="符号"'添加数据字段.AddDataField .PivotFields("待测试"), "sum of 待测试", xlSum'添加行字段方法2,PivotFields属性,逐个设置比较麻烦
-
'With .PivotFields("customer") -
'.Orientation = xlRowField 'xlColumnField 同理表示添加列字段 -
'.Position = 1 ‘position定义字段的层级,数值越大表示位置越往下(靠后) -
'End With -
.RowAxisLayout xlTabularRow '数据透视表的布局模式,PivotTable.RowAxisLayout 方法 (Excel) -
.RowGrand = False '每行汇总不显示.ColumnGrand = False '每列汇总不显示.PivotFields("客户名称").Subtotals(1) = False '求和汇总不显示,PivotField.Subtotals 属性 (Excel)On Error Resume Next '错误处理.PivotFields("符号").CurrentPage = "领" '指定页字段,思考,找不到关键字怎么办?.PivotFields("调用名称单号记录").PivotItems("(blank)").Visible = False 'Visible属性隐藏项目,筛选非空值,思考,如果全为空怎么办? On Error Goto 0 '用于再次打开正常的VBA错误处理,否则,将忽略更多的错误,也可以进行如下处理:'If ERR.Number<>0 then 'Number 属性(Err 对象)'ERR.Clear
'End if .CalculatedFields.Add "dianjilv", "=点击次数 /展现次数", True '添加计算字段,需要在汇总源数据之后才执行计算 .AddDataField ActiveSheet.PivotTables("PivotTable2").PivotFields("符号"), "Count of 符号", xlCount With .PivotFields("Count of 符号") .Caption = "Sum of 符号".Function = xlSum 'function属性修改数据字段的汇总方式 .NumberFormat="0" '设置数字的显示格式 End With -
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

加载中…