Excel 如果数据透视表没有相关筛选器,如何在复制时忽略该数据透视表

Excel 如果数据透视表没有相关筛选器,如何在复制时忽略该数据透视表,excel,vba,Excel,Vba,我已经创建了一个包含两个过滤器组合的透视表。。。 假设过滤器A为是,过滤器B为是。。。我需要从pivot复制数据,当且仅当两者都为是时,否则在复制数据时应忽略pivot 通过VBA代码创建透视表并选择“是”过滤器。。。因此,在代码执行完成之前,我们不知道表在哪里有两个过滤器Yes 'Create Pivot Cache Set PCache = ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:=PRange

我已经创建了一个包含两个过滤器组合的透视表。。。 假设过滤器A为是,过滤器B为是。。。我需要从pivot复制数据,当且仅当两者都为是时,否则在复制数据时应忽略pivot

通过VBA代码创建透视表并选择“是”过滤器。。。因此,在代码执行完成之前,我们不知道表在哪里有两个过滤器Yes

'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然后…
。你要什么都行。