2016-12-15 3 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':' для каждого PvField в PvTable.RowFields' – bobajob

+0

Это работает, но его цикл неправильный, он дает мне все первые данные столбцов, а затем второй столбец и т. д., но я хочу перейти через целую строку, затем перейдите к следующему – Jeffrey

+0

Из любопытства, каково намерение этих сообщений? Что вам нужно, чтобы пользователь после каждого отображал? И вы дадите пользователю способ выйти из процедуры на полпути? – jeffreyweir

ответ

1

Это довольно грубый подход, и, надеюсь, кто-то придумает что-то более элегантное, но мы можем прочитать подробную информацию илы из строк полей в массив массивов, а затем запустить через этот массив в обратном порядке индекс:

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 
Смежные вопросы