Excel 如果数据透视表没有相关筛选器,如何在复制时忽略该数据透视表
我已经创建了一个包含两个过滤器组合的透视表。。。 假设过滤器A为是,过滤器B为是。。。我需要从pivot复制数据,当且仅当两者都为是时,否则在复制数据时应忽略pivot 通过VBA代码创建透视表并选择“是”过滤器。。。因此,在代码执行完成之前,我们不知道表在哪里有两个过滤器YesExcel 如果数据透视表没有相关筛选器,如何在复制时忽略该数据透视表,excel,vba,Excel,Vba,我已经创建了一个包含两个过滤器组合的透视表。。。 假设过滤器A为是,过滤器B为是。。。我需要从pivot复制数据,当且仅当两者都为是时,否则在复制数据时应忽略pivot 通过VBA代码创建透视表并选择“是”过滤器。。。因此,在代码执行完成之前,我们不知道表在哪里有两个过滤器Yes 'Create Pivot Cache Set PCache = ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:=PRange
'Create Pivot Cache
Set PCache = ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:=PRange).CreatePivotTable(TableDestination:=PSheet.Cells(2, 1), _
TableName:="PivotTable1")
'Insert Blank Pivot Table
Set PTable1 = PCache.CreatePivotTable(TableDestination:=PSheet.Cells(2, 1), TableName:="PivotTable1")
'Insert Row Fields
With ActiveSheet.PivotTables("PivotTable1").PivotFields("CLIENT_PATIENT_ID")
.Orientation = xlRowField
.Position = 1
End With
With ActiveSheet.PivotTables("PivotTable1").PivotFields("ED")
.Orientation = xlPageField
.Position = 1
ActiveSheet.PivotTables("PivotTable1").PivotFields("ED"). _
EnableMultiplePageItems = True
With ActiveSheet.PivotTables("PivotTable1").PivotFields("ED")
.PivotItems("No").Visible = False
End With
With ActiveSheet.PivotTables("PivotTable1").PivotFields("Diabetes")
.Orientation = xlPageField
.Position = 2
ActiveSheet.PivotTables("PivotTable1").PivotFields("Diabetes"). _
EnableMultiplePageItems = True
End With
With ActiveSheet.PivotTables("PivotTable1").PivotFields("Diabetes")
.PivotItems("No").Visible = False
'Copy data from PIVOT
Set PivotTable = ActiveSheet.PivotTables(1)
PivotTable.DataBodyRange.Copy
'Paste the copied data from PIVOT
ThisWorkbook.Worksheets("PivotTable").Range
ActiveSheet.Paste Destination:=Worksheets("Calculate").Range("B2")
End With
End With
如果两种情况下的过滤器都不是“是”,则必须忽略VBA代码。下面是一个如何检查透视表过滤器的示例 注意:将实际筛选器(
数据透视筛选器
)应用于数据透视表字段(手动或通过VBA)与设置数据透视字段的可见性(手动或通过VBA)之间存在差异。透视过滤器是一种逻辑条件,具有多种透视过滤器类型(XlPivotFilterType
)。如果在字段上设置了任何筛选器,则.PivotFields().PivotFields.Count
将大于0。更改数据透视字段中项目的可见性看起来可能完全相同,但由于它不是数据透视筛选器
,因此.PivotFields.Count
将为0
在我的示例中,我使用如下透视表定义了数据:
然后要检查筛选器,必须指定要查看的字段,然后指定特定筛选器的值。因此,如果我定义这样的过滤器:
然后要检查筛选器,必须指定要查看的字段,然后指定特定筛选器的值。如果我定义一个这样的过滤器
然后,数据透视表中的过滤器将使用以下术语设置:
- 透视字段名称=“颜色”
- 枢轴过滤器值1=“红色”
- 透视筛选器值2=
(基本上未定义/未使用)vbNullString
- 透视过滤器类型=
(请参阅)xlCaptionEquals
Option Explicit
Sub test()
Dim pTable As PivotTable
Set pTable = ActiveSheet.PivotTables(1)
Debug.Print "The table is filtered: " & _
PivotFilterExists(pTable, "Color", "Red", xlCaptionEquals)
End Sub
Public Function PivotFilterExists(ByRef pTable As PivotTable, _
ByVal fieldName As String, _
ByVal checkValue As Variant, _
ByVal checkFilter As XlPivotFilterType) As Boolean
PivotFilterExists = False
Dim pField As PivotField
Set pField = pTable.PivotFields(fieldName)
Dim pFilters As PivotFilters
Set pFilters = pField.PivotFilters
'--- check if a filter is set to show only the requested value
If pFilters.Count > 0 Then
Dim pFilter As PivotFilter
Set pFilter = pFilters.Item(1)
If (pFilter.Value1 = checkValue) And _
(pFilter.filterType = checkFilter) Then
PivotFilterExists = True
End If
End If
End Function
完整地说,使用复选标记“过滤”透视表是通过禁用字段中项目的可见性来完成的。这种情况需要在字段项之间循环,并检查每个项的可见性——如果允许显示多个项,这可能会变得复杂
下面是一个如何检查透视表筛选器的示例 注意:将实际筛选器(
数据透视筛选器
)应用于数据透视表字段(手动或通过VBA)与设置数据透视字段的可见性(手动或通过VBA)之间存在差异。透视过滤器是一种逻辑条件,具有多种透视过滤器类型(XlPivotFilterType
)。如果在字段上设置了任何筛选器,则.PivotFields().PivotFields.Count
将大于0。更改数据透视字段中项目的可见性看起来可能完全相同,但由于它不是数据透视筛选器
,因此.PivotFields.Count
将为0
在我的示例中,我使用如下透视表定义了数据:
然后要检查筛选器,必须指定要查看的字段,然后指定特定筛选器的值。因此,如果我定义这样的过滤器:
然后要检查筛选器,必须指定要查看的字段,然后指定特定筛选器的值。如果我定义一个这样的过滤器
然后,数据透视表中的过滤器将使用以下术语设置:
- 透视字段名称=“颜色”
- 枢轴过滤器值1=“红色”
- 透视筛选器值2=
(基本上未定义/未使用)vbNullString
- 透视过滤器类型=
(请参阅)xlCaptionEquals
Option Explicit
Sub test()
Dim pTable As PivotTable
Set pTable = ActiveSheet.PivotTables(1)
Debug.Print "The table is filtered: " & _
PivotFilterExists(pTable, "Color", "Red", xlCaptionEquals)
End Sub
Public Function PivotFilterExists(ByRef pTable As PivotTable, _
ByVal fieldName As String, _
ByVal checkValue As Variant, _
ByVal checkFilter As XlPivotFilterType) As Boolean
PivotFilterExists = False
Dim pField As PivotField
Set pField = pTable.PivotFields(fieldName)
Dim pFilters As PivotFilters
Set pFilters = pField.PivotFilters
'--- check if a filter is set to show only the requested value
If pFilters.Count > 0 Then
Dim pFilter As PivotFilter
Set pFilter = pFilters.Item(1)
If (pFilter.Value1 = checkValue) And _
(pFilter.filterType = checkFilter) Then
PivotFilterExists = True
End If
End If
End Function
完整地说,使用复选标记“过滤”透视表是通过禁用字段中项目的可见性来完成的。这种情况需要在字段项之间循环,并检查每个项的可见性——如果允许显示多个项,这可能会变得复杂
@PEH。。任何解决方案:)@PEH。。任何解决方案:)嗨,彼得谢谢你的投入和解释。。。但是它将如何解决忽略我不想要的透视表的问题呢?您可以修改上面的示例来检查任意多的筛选条件,然后使用逻辑来确定接受或忽略哪些组合。例如,如果将变量
Dim redFilter用作布尔值
,则redFilter=PivotFilterExists(pTable,“Color”,“Red”,xlCaptionEquals)
。使用Dim blueFilter作为布尔值检查不同的过滤器;blueFilter=PivotFilterExists(pTable,“Color”,“Blue”,xlCaptionEquals)
。只需将它们组合在一个If语句中进行检查,例如如果redFilter和blueFilter然后…
或如果redFilter和notbluefilter然后…
。不管你想要什么。嗨,彼得谢谢你的投入和解释。。。但是它将如何解决忽略我不想要的透视表的问题呢?您可以修改上面的示例来检查任意多的筛选条件,然后使用逻辑来确定接受或忽略哪些组合。例如,如果将变量Dim redFilter用作布尔值
,则redFilter=PivotFilterExists(pTable,“Color”,“Red”,xlCaptionEquals)
。使用Dim blueFilter作为布尔值检查不同的过滤器;blueFilter=PivotFilterExists(pTable,“Color”,“Blue”,xlCaptionEquals)
。只需将它们组合在一个If语句中进行检查,例如如果redFilter和blueFilter然后…
或如果redFilter和notbluefilter然后…
。你要什么都行。