Цикл по PivotItems: ошибка времени выполнения 91 - PullRequest
0 голосов
/ 15 декабря 2008

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

.PivotItems("Administratie").Visible = False

Если это конкретное значение отсутствует в моем наборе данных, скрипт VBA завершается ошибкой, говоря, что он не может определить элемент в указанном поле. (ошибка 1004)

Так что я подумал, что цикл может работать. У меня есть следующее:

Dim pvtField As PivotField
Dim pvtItem As PivotItem
Dim pvtItems As PivotItems

For Each pvtItem In pvtField.pvtItems
        pvtItem.Visible = False
Next

Но это дает мне ошибку 91 в строке For Each pvtItem:

Object variable or With block variable not set

Я думал, что достаточно хорошо объявил переменные, но, скорее всего, мне не хватает чего-то очевидного ...

Ответы [ 9 ]

1 голос
/ 19 декабря 2008

Я понял! : D

Dim Table As PivotTable
Dim FoundCell As Object
Dim All As Range
Dim PvI As PivotItem

    Set All = Worksheets("Analyse").Range("A7:AZ10000")
    Set Table = Worksheets("Analyse").PivotTables("tablename")
    For Each PvI In Table.PivotFields("fieldname").PivotItems
        Set FoundCell = All.Find(PvI.Name)
        If FoundCell <> "itemname" Then
            PvI.Visible = False
        End If
    Next

Woohoo

Благодаря MrExcel, ответ был там в конце концов, хотя и глубоко похоронен.

0 голосов
/ 13 октября 2009

У меня была ошибка, которая говорила "невозможно установить свойство visible класса элементов сводки" на этой линии:

For Each pi In pt.PivotFields("Fecha").PivotItems
    If pi.Name = ffan Then
        pi.Visible = True
    Else
        pi.Visible = False '<------------------------
    End If
Next pi

Затем я прочитал в интернете, что мне нужно было отсортировать руководство, а затем очистить кеш. я сделал это, но ошибка все еще появилась ..... тогда я прочитал, что это произошло потому, что у меня была дата в этом поле сводки, поэтому я изменил ее, для моего столбца на общее число, а затем дату, которую я хотел установить видимым, я изменил на общий номер тоже. тогда нет проблем !!!!!!!!!!!!!! .... вот оно .... я надеюсь, что это может быть полезным, потому что я был в отчаянии !!!

Dim an As Variant
an = UserForm8.Label1.Caption 'this label contains the date i want to see its the pivot item i want to see of my pivot fiel that is "Date"
Dim fan
fan = Format(an, "d m yyyy")  
Dim ffan
ffan = Format(fan, "general number")

Sheets("Datos refrigerante").Activate 'this is the sheet that has the data of the pivottable
Dim rango1 As Range
Range("B1").Select
Range(Selection, Selection.End(xlDown)).Select

Set rango1 = Selection
ActiveSheet.Cells(1, 1).Select
rango1.Select

Selection.NumberFormat = "General" 'I change the format of the column that has all my dates

'clear the cache
Dim pt As PivotTable
Dim ws As Worksheet
Dim pc As PivotCache

'change the settings
For Each ws In ActiveWorkbook.Worksheets
    For Each pt In ws.PivotTables
        pt.PivotCache.MissingItemsLimit = xlMissingItemsNone
    Next pt
Next ws

'refresh all the pivot caches
For Each pc In ActiveWorkbook.PivotCaches
  On Error Resume Next
  pc.Refresh
Next pc

'now select the pivot item i want
Dim pi As PivotItem

Set pt = Sheets("TD Refrigerante").PivotTables("PivotTable2")

'Sets Pivot Table to Manual Sort so you can manipulate PivotItems in PivotField
pt.PivotFields("Fecha").AutoSort xlManual, "Fecha"

'Speeds up code dramatically
pt.ManualUpdate = True

For Each pi In pt.PivotFields("Fecha").PivotItems
    If pi.Name = ffan Then
        pi.Visible = True
    Else
        pi.Visible = False
    End If
Next pi

pt.ManualUpdate = False
pt.PivotFields("Fecha").AutoSort xlAscending, "Fecha"
0 голосов
/ 13 марта 2009

У меня тоже было одно и то же сообщение об ошибке, когда я пытался установить pivotitem видимым true и false ... раньше это работало, но больше не работало ... я сравнивал два значения и явно не менял строку на целое для сравнение .. при этом ошибка исчезла ..

.. поэтому, если вы получаете это сообщение, проверьте, сравниваются ли какие-либо значения, чтобы сделать элемент видимым или нет, если сравнивать должным образом ... в противном случае pivotitem имеет значение null и не может сделать это видимым или нет.

0 голосов
/ 17 декабря 2008

Сводные элементы - это отдельные значения в поле (столбец, строка, данные). Я думаю о них как о «корзинах», которые содержат все отдельные элементы данных, которые вы хотите объединить.

Вместо того, чтобы проходить через все поля сводной таблицы (столбец, строка и данные), вы можете просто пройти через интересующие вас поля. Например, этот код будет показывать только указанные сводные элементы для указанного поля. :

Public Sub ShowInPivot(Field As String, Item As String)
    On Error GoTo ShowInPivot_EH

    Dim pvtField As PivotField
    Dim pvtItem As PivotItem
    Dim pvtItems As PivotItems

    For Each pvtItem In Worksheets("Pivot").PivotTables("PivotTable1").PivotFields(Field).PivotItems
        If pvtItem.Name = Item Then
            pvtItem.Visible = True
        Else
            pvtItem.Visible = False
        End If
    Next

    Exit Sub

ShowInPivot_EH:
    Debug.Print "Error(" & Err.Number & "): " & Err.Description
    Exit Sub

End Sub

Предположим, у меня есть сводная таблица, показывающая количество проблем для каждого выпуска клиента и место их обнаружения в нашем SDLC. «Customer» и «Release» - это поля столбца, а «Phase» - поле строки. Если бы я хотел ограничить сводную таблицу подсчетом проблем для CustomerA, выпуск 1.2 во время QA, я мог бы использовать вышеприведенный подпункт, например:

ShowInPivot "Customer", "CustomerA"
ShowInPivot "Release", "1.2"
ShowInPivot "Phase", "QA"
0 голосов
/ 17 декабря 2008

Ошибка выдается в конце цикла.
Я объединил оба ответа Патрика в следующее:

With ActiveSheet.PivotTables("Table").PivotFields("Field")

    Dim pvtField As Excel.PivotField
    Dim pvtItem As Excel.PivotItem
    Dim pvtItems As Excel.PivotItems

    For Each pvtField In Worksheets("Sheet").PivotTables("Table").PivotFields
        For Each pvtItem In pvtField.PivotItems
            If pvtItem.Name = "ItemTitle" Then
                pvtField.PivotItems("ItemTitle").Visible = True
            Else
                pvtField.PivotItems(pvtItem.Name).Visible = False
            End If
        Next
    Next
End With

Если Элемент соответствует определенной строке, этот Элемент устанавливается в True. Else; Предмет установлен False. При ложном состоянии выдается ошибка.
Я знаю, что для Истинного состояния есть ровно одно совпадение. Хотя, когда я "F8" пробираюсь через макрос, условие True никогда не вводится ...

И это объясняет ошибку, все установлено в False. (спасибо, Патрик!)

Приводит меня к вопросу ... что именно IS PivotItem?



Идея вещи:
Он решает (или должен решить) следующее: набор данных с переменным размером, где для этой конкретной таблицы интерес представляет один столбец. Из этого столбца мне нужно подсчитать значение и положить его в таблицу. В таблице есть некоторые условия, а также необходима комбинация с другим столбцом, поэтому PivotTable является лучшим решением.
Проблема в том, что в некоторых наборах данных одно конкретное значение не отображается. Значения, которые появляются, отличаются каждый раз.

0 голосов
/ 16 декабря 2008

Когда я реализую код, опубликованный Патриком, -

Невозможно установить свойство visible класса PivotItem

- выдается ошибка.

Microsoft признает, что есть ошибка: M $ help
Но просто скрыть линию ... это не вариант, конечно.

0 голосов
/ 16 декабря 2008

Вы не можете сказать ".PivotItems(pvtItem).Visible" вне блока "With". Скажите "pvtField.PivotItems(pvtItem.Name).Visible = False" вместо.

Я также отредактировал свой исходный ответ, включив в него обработку ошибок, когда Excel не может установить свойство Visible. Это происходит потому, что сводной таблице требуется по крайней мере одно поле строки, одно поле столбца и один элемент данных, поэтому последний из каждого из них нельзя сделать невидимым.

Вы также получите ошибку 1004 при попытке получить доступ к элементу сводки, который уже невидим; Я думаю, вы можете игнорировать их.

0 голосов
/ 16 декабря 2008
For Each pvtField In Worksheets("my_sheet").PivotTables("my_table").PivotFields
    For Each pvtItem In pvtField.PivotItems
        Debug.Print vbTab & pvtItem.Name & ".Visible = " & pvtItem.Visible
        /*.PivotItems(pvtItem).Visible = False*/ 
    Next
Next
.PivotItems("certain_Item").Visible = True

Это все еще не работает ... все переменные все еще видны. Ошибка не отображается, она компилируется, но значения все еще там.
В комментариях, которые я добавил, было мое «изобретение», но оно недействительно.

Изменить: Быстрый вопрос: Могу ли я использовать оператор IF, чтобы проверить, действительно ли определенный элемент сводной таблицы находится в данных сводной таблицы? Что-то вроде

If PivotItem("name_of_the_thing") = present Then {
    do_something()
}
0 голосов
/ 15 декабря 2008

Попробуйте что-то вроде этого:

Public Function Test()
    On Error GoTo Test_EH

    Dim pvtField As PivotField
    Dim pvtItem As PivotItem
    Dim pvtItems As PivotItems

    ' Change "Pivot" to the name of the worksheet that has the pivot table.
    ' Change "PivotTable1" to the name of the pivot table; right-click on the
    ' pivot table, and select Table Options... from the context menu to get the name.
    For Each pvtField In Worksheets("Pivot").PivotTables("PivotTable1").PivotFields
        Debug.Print "Pivot Field: " & pvtField.Name
        For Each pvtItem In pvtField.VisibleItems
            pvtItem.Visible = False
        Next
    Next

Exit Function

Test_EH:
    Debug.Print pvtItem.Name & " error(" & Err.Number & "): " & Err.Description
    Resume Next

End Function

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

Public Function PivotItemPresent(sName As String) As Boolean
    On Error GoTo PivotItemPresent_EH

    PivotItemPresent = False

    For Each pvtField In Worksheets("Pivot").PivotTables("PivotTable1").PivotFields
        For Each pvtItem In pvtField.VisibleItems
            If pvtItem.Name = sName Then
                PivotItemPresent = True
                Exit Function
            End If
        Next
    Next

    Exit Function

PivotItemPresent_EH:
    Debug.Print "Error(" & Err.Number & "): " & Err.Description
    Exit Function

End Function

Вы можете вызвать это из своего кода следующим образом:

If PivotItemPresent("name_of_the_thing") Then
    ' Do something
End If
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...