选择数据透视表

时间:2018-03-22 16:10:05

标签: vba pivot-table

我有一些需要选择Prod的VBA代码。代码,Lims#,SampleID,日志日期,地区名称,地区,机器ID,灰,cNDF,CP,Ca,Cl来自数据透视表。

当我使用整行时,我可以选择在A列中进行干净粘贴所需的所有数据。但是,现在我想要粘贴到列

.PivotItems(PivotFieldName.Caption).DataRange.EntireRow.Select

我试图只做数据范围,但它不会拉出Prod.Code,Lims#等列。它只会抓取分析物列。

.PivotItems(PivotFieldName.Caption).DataRange.Select

我也尝试从WholeRow做一个范围,然而我无法弄清楚如何获得所选Prod的最后一列或最后一行。代码。

.PivotItems(PivotFieldName.Caption).DataRange.EntireRow.Range("A1:BB1").Select

如何获取Prod的所有列。代码选择像整行方法,排除额外的行?

The Prod.Code Columns&行数可能会根据数据而改变,因此我需要使其能够抓住正确的范围。

进一步的代码结构:

Dim PvtTbl As PivotTable
Dim PvtFld As PivotField
Set PvtTbl = Sheets("NEP Pivot").PivotTables("NEP_Pivot")
Set PvtFld = PvtTbl.PivotFields("Prod. Code")
For Each PivotFieldName In PvtFld.PivotItems
'PivotFieldName.Caption represents "EHB" 
If IsError(Application.Match(PivotFieldName.Caption, rngList, 0)) Then

With PvtFld
On Error Resume Next

.PivotItems(PivotFieldName.Caption).ShowDetail = True 'Show pivot item
.PivotItems(PivotFieldName.Caption).DataRange.EntireRow.Copy 
 Destination:=Sheets(PivotFieldName.Caption).Range("A3")
 ...
 ..
 .

1 个答案:

答案 0 :(得分:1)

使用.DataBodyRange属性来获取数据透视表中的所有数据

PivotTable.DataBodyRange Property (Excel)

  

返回一个Range对象,该对象表示a中的值范围   数据透视表。只读。

     

语法

     

表达。 DataBodyRange

     

expression表示数据透视表对象的变量。

由于您还需要行元素,您可以执行以下操作,您可以根据较大的TableRange2属性与内部数据透视区域之间的列数差异来调整数据正文范围的大小。请注意,总计等可能会影响这一点,但这会告诉您如何开始考虑它。还有一个带有枢轴的TableRange1属性。

示例枢轴:

Image

代码:

Option Explicit
Sub test()

    Dim ws As Worksheet
    Dim pvt As PivotTable
    Dim columnsDifference As Long

    Set ws = ActiveSheet
    Set pvt = ws.PivotTables("PivotTable4")

    columnsDifference = pvt.TableRange2.Columns.Count - pvt.DataBodyRange.Columns.Count

    With pvt.DataBodyRange
        Debug.Print .Offset(, -columnsDifference).Resize(.Rows.Count, .Columns.Count + columnsDifference).Address
    End With

End Sub

我建议您阅读引用pivottable ranges in VBA。 您可以使用各种属性来确定范围,例如用于fieldItems的LabelRange和DataRange。你似乎已经探索了其中的一些。我的经验是,这些受到您的可旋转布局的影响,您需要确定获取数据的当前方法组合。

例如,我使用以下内容获取EHB的所有数据,数据布局如下:

Data

Option Explicit

Sub test()

    Dim ws As Worksheet
    Dim pvt As PivotTable
    Dim columnsDifference As Long
    Dim wb As Workbook

    Set wb = ThisWorkbook
    Set ws = wb.Worksheets("mySheetName")
    Set pvt = ws.PivotTables("NEP_Pivot")

    columnsDifference = pvt.TableRange2.Columns.Count - pvt.DataBodyRange.Columns.Count

    With pvt.DataBodyRange
        Debug.Print pvt.PivotFields("Prod. Code").PivotItems("EHB").LabelRange.Offset(-1, 0).Resize(pvt.PivotFields("Prod. Code").PivotItems("EHB").LabelRange.Rows.Count, .Columns.Count + columnsDifference).Address
    End With

End Sub

这产生了结果

$C$11:$N$13

请注意我必须组合函数才能获得此结果,如果可更改轴位布局发生变化,则会崩溃。

我也能用:

写作
With pvt.TableRange1

   Debug.Print pvt.PivotFields("Prod. Code").PivotItems("EHB").LabelRange.Resize(pvt.PivotFields("Prod. Code").PivotItems("EHB").LabelRange.Rows.Count, .Columns.Count).Offset(-1, 0).Address

End With