在excel中可以为数据透视表、智能表格添加切片器。
切片器的作用是用于筛选数据。
在vba中如果要为数据透视表、智能表格添加切片器,可以先录制宏,录制的宏代码如下所示:
Sub 宏1()
'为数据透视表添加切片器
ActiveWorkbook.SlicerCaches.Add2(ActiveSheet.PivotTables("第一个透视表"), "姓名"). _
Slicers.Add ActiveSheet, , "姓名 1", "姓名", 154.5, 381, 144, 187.5
ActiveWorkbook.SlicerCaches.Add2(ActiveSheet.PivotTables("第一个透视表"), "店名"). _
Slicers.Add ActiveSheet, , "店名", "店名", 192, 418.5, 144, 187.5
End Sub
Sub 宏2()
'为智能表格添加切片器
ActiveWorkbook.SlicerCaches.Add2(ActiveSheet.ListObjects("表6"), "姓名").Slicers. _
Add ActiveSheet, , "姓名 2", "姓名", 154.5, 381, 144, 187.5
ActiveWorkbook.SlicerCaches.Add2(ActiveSheet.ListObjects("表6"), "店名").Slicers. _
Add ActiveSheet, , "店名 1", "店名", 192, 418.5, 144, 187.5
ActiveSheet.Shapes.Range(Array("店名 1")).Select
End Sub
从录制的宏中可以看出,要用vba添加切片器,首先要用Workbook对象的SlicerCaches的切片器缓存集合对象的Add方法添加SlicerCache切片器缓存对象。然后用SlicerCache切片器缓存对象的Slicers切片器集合对象的Add方法添加Slicer切片器对象。
经过上述的分析,可以将代码修改为如下的形式:
Sub QQ1722187970()
Dim oPC As PivotCache
Dim oPT As PivotTable
Dim oSC As SlicerCache
Dim oSlicer As Slicer
Dim oSP As Shape
Dim oWB As Workbook
Dim oWK As Worksheet
Dim oWKR As Worksheet
Dim oPF As PivotField
Dim oRng As Range
Set oWK = Excel.ActiveSheet
With oWK
iCount = .PivotTables.Count
If iCount = 0 Then
MsgBox "当前工作表没有数据透视表"
Else
Set oPT = .PivotTables(1)
With oPT
For Each oPF In .PivotFields
With oPF
'判断属于哪种字段,是行字段,列字段,数值字段,筛选字段,还是其它
sType = .Orientation
End With
Next
End With
Set oWB = Excel.ThisWorkbook
With oWB
'删除所有切片器缓存以及切片器
For Each oSC In .SlicerCaches
With oSC
.Delete
End With
Next
'用于存放切片器的工作表
Set oWKR = .Worksheets("图表")
'添加一个切片器缓存对象
Set oSC = .SlicerCaches.Add2(oPT, "姓名")
'添加一个切片器
With oSC
'直接用命名参数的方式无效
'Set oSlicer = .Slicers.Add(SlicerDestination:=oWKR, Top:=oWKR.Range("a1").Top, Left:=oWKR.Range("a1").Left, Width:=oWKR.Range("a1:C1").Width, Height:=oWKR.Range("A1:A10").Height)
Set oSlicer = .Slicers.Add(oWKR, , , , oWKR.Range("a1").Top, oWKR.Range("a1").Left, oWKR.Range("a1:C1").Width, oWKR.Range("A1:A15").Height)
End With
'添加一个切片器缓存对象
Set oSC = .SlicerCaches.Add2(oPT, "大指标")
'添加一个切片器
With oSC
Set oSlicer = .Slicers.Add(oWKR, , , , oWKR.Range("a16").Top, oWKR.Range("a16").Left, oWKR.Range("a1:C1").Width, oWKR.Range("A1:A15").Height)
End With
End With
End If
End With
End Sub


发表评论