2016-12-15 113 views
0

我有一个数据透视表和下面的VBA显示第一行字段的msgbox,但我需要它通过显示每个消息框的所有行字段,可以有人点我在正确的方向,我似乎无法找出如何做到这一点Excel VBA读数据透视表并显示msgbox

Sub Piv() 

    Dim PvTable As PivotTable 
    Dim PvField As PivotField 
    Dim PvItem As PivotItem 

    Set PvTable = ActiveSheet.PivotTables("RawDataTable") 
    Set PvField = PvTable.RowFields(1) 

    With ws 
    For Each PvItem In PvField.PivotItems 
     MsgBox PvItem 

    Next 
    End With 

End Sub 

我也可以把它给我所有的字段标题,而不是数据

Sub Piv() 

    Dim PvTable As PivotTable 
    Dim PvField As PivotField 
    Dim PvItem As PivotItem 

    Set PvTable = ActiveSheet.PivotTables("RawDataTable") 

    With ws 
    For Each PvField In PvTable.PivotFields 
     MsgBox PvField 

    Next 
    End With 

End Sub 
+1

我可能失去了一些东西,但在第一个例子中,你能不能换你的'For'循环在另一个'For'循环中:'对于PvTable.RowFields中的每个PvField' – bobajob

+0

这有效,但它循环错误,它给了我所有的第一列数据,然后第二列等等,但我想穿过整行然后移动到下一个 – Jeffrey

+0

出于好奇,这些消息框的意图是什么?用户在每个显示器后都需要做什么?你会给用户一种退出程序的途径吗? – jeffreyweir

回答

1

这是一个相当强悍的方法,并希望有人会想出更优雅的东西,但我们可以阅读详细信息行字段到一个数组的数组的ILS,然后通过这个数组中的反向索引顺序运行:

Option Explicit 

Sub Piv() 

    Dim PvTable As PivotTable 
    Dim PvField As PivotField 
    Dim PvItem As PivotItem 
    Dim dataArray() As Variant 
    Dim dummyArray() As Variant 
    Dim i As Long 
    Dim j As Long 

    Set PvTable = ActiveSheet.PivotTables("RawDataTable") 

    ReDim dataArray(1 To PvTable.RowFields.Count) 
    ReDim dummyArray(1 To PvTable.RowFields(1).PivotItems.Count) 

    For i = 1 To PvTable.RowFields.Count 
     dataArray(i) = dummyArray 
     For j = 1 To PvTable.RowFields(i).PivotItems.Count 
      dataArray(i)(j) = PvTable.RowFields(i).PivotItems(j) 
     Next j 
    Next i 

    For i = 1 To UBound(dataArray(1)) 
     For j = 1 To UBound(dataArray) 
      MsgBox dataArray(j)(i) 
     Next j 
    Next i 

End Sub