Excel VBA获取选定数据透视表行的项目详细信息

Posted

技术标签:

【中文标题】Excel VBA获取选定数据透视表行的项目详细信息【英文标题】:Excel VBA to get item detail of selected Pivot Table row 【发布时间】:2017-07-12 13:52:30 【问题描述】:

好的,我一直在挖掘大量资源,但找不到任何关于如何实现这一目标的线索。我已经挖掘了对象模型,但似乎没有一个属性或方法可以满足我的需求。

我想获取所选行的行数据。我不想将数据提取到新工作表上,我只想获取活动行的行标签。然后,我将该行数据放入一个工作表中,该工作表以比仅提取方法更好的格式显示详细信息。

为了简化示例,我的枢轴具有:

行标签:Case_Name、Case_Ref(1:1 关系) 列标签:状态 值:调用计数

理想情况下,我希望在 Pivot 中隐藏 Case_Ref,但这是我需要为下一步提取的键。

我希望用户在数据透视表中选择一个项目(行),然后按下我的按钮并让宏返回所选行的 Case_Ref。

到目前为止,我的(不成功的)代码如下所示:

Sub Pivot_Detail_By_Case__Customer_Contacts_By_Case()
    'CCBC = Customer Contacts By Case
    Set CCBC_PivotTable = Worksheets("Customer contacts by case").PivotTables(1)
    HeaderRow = CCBC_PivotTable.RowRange.Row
    RowCount = CCBC_PivotTable.RowRange.Count

    'Confirm limits of row range
    'Range(Cells(HeaderRow + 1, 1), Cells(HeaderRow + RowCount - 2, 1)).Select

    PivotDataStartRow = HeaderRow + 1
    PivotDataEndRow = HeaderRow + RowCount - 2

    If ActiveCell.Row >= PivotDataStartRow And ActiveCell.Row <= PivotDataEndRow Then
        ItemNumber = ActiveCell.Row - PivotDataStartRow
        'SelectedField = CCBC_PivotTable.DataPivotField.PivotItems(ItemNumer)
        'pvt_InnerDetail = CCBC_PivotTable.InnerDetail
        'SelectedField = CCBC_PivotTable.RowFields("Case_Ref")
    End If

End Sub

ItemNumber 似乎可以工作,但我如何从那里获取 Case_Ref?

感谢您的帮助。

【问题讨论】:

我不会添加作为答案,因为它是指向外部站点的链接。这概述了如何引用数据透视表的不同部分:peltiertech.com/referencing-pivot-table-ranges-in-vba 【参考方案1】:

好的,成功破解了。找到了另一个示例,展示了如何遍历项目并进行推断。最初有点混乱,因为项目编号不是表中的顺序,因此与所选行无关。

对上一个答案的修订:如果项目不可见(被活动过滤器隐藏),则 PivotItem.DataRange.Row 引发错误。现在使用错误测试来查看行是否可见:

 Sub Pivot_Detail_By_Case__Customer_Contacts_By_Case()
    'CCBC = Customer Contacts By Case
    Set CCBC_PivotTable = Worksheets("Customer contacts by case").PivotTables(1)
    HeaderRow = CCBC_PivotTable.RowRange.Row
    RowCount = CCBC_PivotTable.RowRange.Count

   'Confirm limits of row range
   'Range(Cells(HeaderRow + 1, 1), Cells(HeaderRow + RowCount - 2, 1)).Select

    PivotDataStartRow = HeaderRow + 1
    PivotDataEndRow = HeaderRow + RowCount - 2


    If ActiveCell.Row >= PivotDataStartRow And ActiveCell.Row <= PivotDataEndRow Then
        For Each PivotItem In CCBC_PivotTable.PivotFields("Case_Ref").PivotItems
            'Debug.Print PivotItem.DataRange.Row
            'PivotItem.DataRange.Row throws an error if the item is hidden by the active filter
            Err.Number = 0
            'Debug.Print Err.Number
            TestIfVisible = PivotItem.DataRange.Row
            'Debug.Print Err.Number
            If Err.Number = 0 Then 'Last line didn't cause an error, i.e. item is visible
                If PivotItem.DataRange.Row = ActiveCell.Row Then
                    SelectedCallRef = PivotItem.Value
                    GoTo RowFound
                End If
            End If
        Next
RowFound:
    End If

    MsgBox SelectedCaseRef

End Sub

【讨论】:

仍在寻找更多关于这个的想法 - 如果我在枢轴上显示 Case_Ref,它会使图表标签非常难看。如果我把它隐藏了,这个宏就不起作用了......

以上是关于Excel VBA获取选定数据透视表行的项目详细信息的主要内容,如果未能解决你的问题,请参考以下文章

使用 jquery 在引导程序中获取选定表行的值

在 OBIEE 中将总计添加到数据透视表行的末尾

Excel 请问资料透视表如何去掉汇总行

JQuery 使用来自选定表行的数据填充表单字段

用于将数据粘贴到新表行中的 VBA 宏 - Excel

使用 VBA 过滤 Excel 数据透视表