本周工作中,用到了数据透视表的操作,这里汇总一下,学习途径来自网络,学习成果我也乐于分享一二~,代码整理为模块,供大家举一反三,可以套用。
① 创建数据透视表,及基本设置
先展示数据源和结果吧:
对应的code如下:
Sub pivot()
' 创建数据透视表
ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _"Sheet1!R1C1:R8C4", Version:=6).CreatePivotTable _TableDestination:="sheet1!R2C6", TableName:="尝试", DefaultVersion:=6 '注意,数据区域及透视表位置,使用的格式都要是R1C1这种样式,否则报错' 拖拽字段。可以分开写,如下:
' 添加列
Sheets(1).Activate
With ActiveSheet.PivotTables("尝试").PivotFields("科目") '表示对于名称为"尝试"的数据透视表中名为"姓名"的字段进行操作.Orientation = xlColumnField '表示字段在数据透视表中的位置为列字段(行字段是xlRowField).Position = 1 '表示该字段所在列字段的位置为第1个位置
End With' 添加行
With ActiveSheet.PivotTables("尝试").PivotFields("姓名").Orientation = xlRowField.Position = 1
End With
With ActiveSheet.PivotTables("尝试").PivotFields("性别").Orientation = xlRowField.Position = 2
End WithActiveSheet.PivotTables("尝试").AddDataField ActiveSheet.PivotTables("尝试").PivotFields("分数"), "求和:分数", xlSumWith ActiveSheet.PivotTables("尝试").RowAxisLayout xlTabularRow '报表布局-以表格形式展示。参数:xlTabularRow表格,xlOutlineRow大纲,xlCompactRow压缩(默认).RepeatAllLabels xlRepeatLabels 'xlRepeatLabels重复,xlDoNotRepeatLabels不重复(默认).ColumnGrand = False '总计。.ColumnGrand列.RowGrand行'默认都启用True'也可以这样:一次性设置所有行变量pf = Array("姓名", "性别")For Each pfi In pfWith .PivotFields(pfi).Orientation = xlRowField ' 设置为行变量.Subtotals = Array(False, False, False, False, False, False, False, False, False, False, False, False) ' 去掉默认的分类汇总End WithNext
End With
② 值筛选--筛选器中
透视表中,筛选器字段又叫页字段,不清楚这个情况的我刚开始吃了些苦头,死活搜索不到自己想要的。要对数据透视表的页字段(筛选字段)进行筛选,先使用ClearAllFilters方法清除原字段的选项:PivotFields("×××").CurrentPage = "(all)",然后可以直接使用CurrentPage属性设置要显示的筛选值即可。
' 例子:对透视表,将日期筛选为昨天,日期选项为单选。
Sub 设置日期()
With Sheets("数据统计").PivotTables("数据透视表3").PivotFields("日期").EnableMultiplePageItems = False '仅单选n = .PivotItems.CountFor i = 1 To n '遍历所有值If .PivotItems(i).Name = "(blank)" Then '处理可能遇到的讨厌的空白.PivotItems("(blank)").Visible = FalseElseIf CDate(.PivotItems(i).Name) = Date - 1 Then '如果日期为昨天。小心!name属性得到都是文本,即使源数据是日期,所以这里要转化下.PivotItems(i).Visible = TrueElse.PivotItems(i).Visible = False '当然最好每一项都进行设置,不过这里multiple是falseEnd IfEnd IfNext
End With
End Sub
③ 值筛选--行标签中追加
Sub 行标签追加()Dim n, iApplication.ScreenUpdating = FalseActiveWorkbook.RefreshAllWith Sheets("数据汇总").PivotTables("数据透视表1").PivotFields("日期") '字段.EnableMultiplePageItems = True ' 允许多选,追加显示项n = .PivotItems.Count '有多少个不重复的项For i = 1 To nIf .PivotItems(i).Name = Date Then '判断条件,如果是昨天.PivotItems(i).Visible = TrueEnd IfNextEnd WithApplication.ScreenUpdating = True
End Sub
我本菜鸟,但乐意学习。坚持用技术的复杂性代替手工操作的复杂性,继续加油!