Excel VBA идентифицирует сводные элементы, видимые в интерфейсе Excel - PullRequest
0 голосов
/ 25 октября 2018

Моя сводная таблица содержит фильтр для фильтрации элементов с "Days_Outstnading_Category"=">180 days".

enter image description here

После фильтрации мое поле строки "Operating Units" имеет только 2 элемента, отображаемых в интерфейсе Excel, "США" и "Индия", хотя все элементыв «Операционных единицах» есть Visible=True, на самом деле в интерфейсе Excel действительно видимы только 2 элемента.

Интересно, как я могу идентифицировать эти два элемента, поскольку If pivotItem.Visible=True теперь не будет работать.

В конечном итоге я хотел выполнить итерацию и выбрать LabelRange для каждого элемента, отображаемого в интерфейсе Excel (A5: A12, A14: A27, B5, B6: B9 и т. Д.), И внести некоторые изменения в форматирование для каждого диапазона.И мой код ниже приводит к ошибке, когда labelrange не может быть найден.

> For Each ptRowField In pt.RowFields
>      For Each ptRowFieldItem In ptRowField.PivotItems
>          If ptRowFieldItem.Visible = True Then
>              Call SetOusideBorder(ptRowFieldItem.LabelRange)
>          End If
>      Next ptRowFieldItem 
> Next ptRowField

1 Ответ

0 голосов
/ 26 октября 2018

Самый простой способ, который я использовал, - это взять столбец в сводной таблице с метками строк.

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

enter image description here

Таким образом, вы можете получить доступстолбец меток строк в сводной таблице со свойством .RowRange.Как только вы это сделаете, вы можете уменьшить количество ячеек:

Option Explicit

Public Sub ListVisibleItems()
    Dim thisPivot As PivotTable
    Set thisPivot = ActiveSheet.PivotTables(1)

    Dim rowField As PivotField
    Set rowField = thisPivot.RowFields("Color")

    Dim theseRows As Range
    Set theseRows = thisPivot.RowRange

    Dim i As Long
    '--- start at 2 to skip the "Row Labels" and end at Count-1
    '    to skip the "Grand Total" 
    For i = 2 To theseRows.Count - 1
        Debug.Print theseRows.Cells(i, 1) & " is visible"
    Next i
End Sub

РЕДАКТИРОВАТЬ: обновленный пример кода для анализа данных примера OP

Option Explicit

Public Sub ListVisibleItems()
    Dim thisPivot As PivotTable
    Set thisPivot = ActiveSheet.PivotTables(1)

    Dim rowField As PivotField
    Set rowField = thisPivot.RowFields("Color")

    Dim theseRows As Range
    Set theseRows = thisPivot.RowRange

    Dim i As Long
    '--- start at 2 to skip the "Operating Units" and end at Count-1
    '    to skip the "Grand Total" 
    For i = 2 To theseRows.Count - 1
        '--- check to make sure the row is not empty and that
        '    the value does NOT have the word "Total"
        If Len(theseRows.Cells(i, 1)) > 0 Then
            If Not theseRows.Cells(i, 1) Like "*Total" Then
                Debug.Print theseRows.Cells(i, 1) & " is visible"
                '--- you can use this result as the field name
                '    to select and format the data area
            End If
        End If
    Next i
End Sub
...