Excel VBA选择数据透视字段以及与该数据透视字段行关联的数据值

Excel VBA选择数据透视字段以及与该数据透视字段行关联的数据值,excel,vba,pivot-table,Excel,Vba,Pivot Table,我想从行项目中选择与一个特定数据透视字段关联的所有数据单元格,我该怎么做 我的数据如下所示: Sum of x Sum of y Sum of z Class1 2.5 1 2 *Name1 *1 *0 *0 *Name2 *1 *1 *1 *Name3 *.5 *0 *1 Class2 3.8

我想从行项目中选择与一个特定数据透视字段关联的所有数据单元格,我该怎么做

我的数据如下所示:

          Sum of x  Sum of y  Sum of z
Class1       2.5        1         2
   *Name1    *1        *0        *0
   *Name2    *1        *1        *1
   *Name3    *.5       *0        *1
Class2       3.8       2.6        2
   *NameA    *1        *1        *0
   *NameB   *0.8       *0        *1
   *NameC    *1       *0.6       *0 
   *NameD    *1        *1        *1
现在,我只想选择前面带*的数据并执行条件格式设置-如果单元格值小于1,则突出显示单元格。如果大于1,则使用不同颜色高亮显示。如上所述,我在选择所需的数据范围时遇到问题

以下是尝试的代码:(错误:对象不支持此属性或方法)


任何帮助都将不胜感激。

希望这就是您所寻找的

代码如下:

  • 循环“名称”
    数据透视字段中的每个
    数据透视项
    ,并使用
    联合
    建立一个
    名称范围
    namesRange
    对应于屏幕截图中的
    $B$5:$B$7,$B$9:$B$12
  • 然后使用整个数据透视表的
    Intersect
    namesRange.EntireRow
    dataodyrange
    来获取
    condFormRange
    condFormRange
    对应于屏幕截图中的
    $B$5:$D$7,$B$9:$D$12
  • 从这里开始,条件格式就是您已经拥有的格式

    Sub FormatPivotTable()
        Dim pt As PivotTable
        Set pt = ActiveSheet.PivotTables("test")
    
        Dim pf As PivotField
        Set pf = pt.PivotFields("Name")
    
        Dim pi As PivotItem
        Dim namesRange As Range
    
        For Each pi In pf.PivotItems
            If namesRange Is Nothing Then
                Set namesRange = pi.DataRange
            Else
                Set namesRange = Union(namesRange, pi.DataRange)
            End If
        Next pi
    
        Debug.Print namesRange.Address ' returns $B$5:$B$7,$B$9:$B$12
    
        If Not namesRange Is Nothing Then
            Dim condFormRange As Range
            Set condFormRange = Intersect(namesRange.EntireRow, pt.DataBodyRange)
            Debug.Print condFormRange.Address ' returns $B$5:$D$7,$B$9:$D$12
    
            With condFormRange
                .Interior.ColorIndex = 6
                .FormatConditions.Delete
                .FormatConditions.Add Type:=xlCellValue, Operator:=xlLess, Formula1:="=1"
    
                With .FormatConditions(1)
                    .Interior.ColorIndex = 3
                End With
    
                .FormatConditions.Add Type:=xlCellValue, Operator:=xlGreater, Formula1:="=1"
    
                With .FormatConditions(2)
                    .Interior.ColorIndex = 4
                End With
            End With
        End If
    End Sub
    

    我想你不需要选择任何东西。。。未测试,但基于将该行更改为
    Set pf=pt.PivotFields(“Name”)
    ?@BigBen中的示例,该行仅选择我的行,而不选择数据字段。它选择了从Class1到NameD的所有行项目。我只想选择名称行和关联的数据字段。我总是发现Jon Peltier关于如何选择透视表范围的文章很有帮助。如果我以后有时间的话,我也许可以再看一看你的问题。谢谢@BigBen,那会很有帮助的。我确实看了乔恩·佩尔蒂埃的解释,但我找不到我想要做的事情。太棒了!非常感谢你!它很有魅力,太棒了!我很高兴弄明白了。很乐意帮忙。
    Sub FormatPivotTable()
        Dim pt As PivotTable
        Set pt = ActiveSheet.PivotTables("test")
    
        Dim pf As PivotField
        Set pf = pt.PivotFields("Name")
    
        Dim pi As PivotItem
        Dim namesRange As Range
    
        For Each pi In pf.PivotItems
            If namesRange Is Nothing Then
                Set namesRange = pi.DataRange
            Else
                Set namesRange = Union(namesRange, pi.DataRange)
            End If
        Next pi
    
        Debug.Print namesRange.Address ' returns $B$5:$B$7,$B$9:$B$12
    
        If Not namesRange Is Nothing Then
            Dim condFormRange As Range
            Set condFormRange = Intersect(namesRange.EntireRow, pt.DataBodyRange)
            Debug.Print condFormRange.Address ' returns $B$5:$D$7,$B$9:$D$12
    
            With condFormRange
                .Interior.ColorIndex = 6
                .FormatConditions.Delete
                .FormatConditions.Add Type:=xlCellValue, Operator:=xlLess, Formula1:="=1"
    
                With .FormatConditions(1)
                    .Interior.ColorIndex = 3
                End With
    
                .FormatConditions.Add Type:=xlCellValue, Operator:=xlGreater, Formula1:="=1"
    
                With .FormatConditions(2)
                    .Interior.ColorIndex = 4
                End With
            End With
        End If
    End Sub