Цикл через PivotItems: ошибка времени выполнения 91

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

.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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
17 377
10
Перейти к ответу Данный вопрос помечен как решенный

Ответы 10

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

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
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, чтобы проверить, действительно ли определенный PivotItem находится в данных сводной таблицы? Что-то вроде

If PivotItem("name_of_the_thing") = present Then {
    do_something()
}

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

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

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

Извините, я не включил весь код, который у меня есть, этот бит, который я разместил здесь, заключен в блок With. Спасибо за доработку, сейчас попробую. :)

Kablam 16.12.2008 15:40

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

Unable to set the visible property of the PivotItem class

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

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

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

Patrick Cuff 16.12.2008 18:21

Ответ здесь не поместился, размещен ниже :)

Kablam 17.12.2008 11:23

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

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. Еще; Набор предметов False. При условии False выдается ошибка. Я знаю, что существует ровно одно совпадение с условием True. Хотя, когда я нажимаю клавишу F8 в макросе, условие True никогда не вводится ...

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

Подводит меня к вопросу ... что такое ЯВЛЯЕТСЯ PivotItem?



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

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

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

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. «Клиент» и «Выпуск» - поля столбцов, а «Фаза» - поле строки. Если бы я хотел ограничить сводную таблицу подсчетом проблем для CustomerA, Release 1.2 во время QA, я мог бы использовать приведенную выше подпрограмму следующим образом:

ShowInPivot "Customer", "CustomerA"
ShowInPivot "Release", "1.2"
ShowInPivot "Phase", "QA"

По-прежнему не работает, PivotItem.Name возвращает значение, например «974» вместо «itemname» ...

Kablam 19.12.2008 13:03
Ответ принят как подходящий

Я понял! : 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

уууу

Спасибо MrExcel, ответ было все-таки есть, хоть и глубоко похоронен.

Хммм ... Я не вижу разницы в итоговой сводной таблице, когда я запускаю свое решение с помощью ShowInTable () и это решение, по крайней мере, в моей книге.

Patrick Cuff 19.12.2008 15:36

С вашим решением я все еще сталкивался с ошибками ... с этим - нет. Когда я набираю F8 по вашему коду, pivotItem.Name возвращает значение, а не имя. В этом решении возвращается строка. Возможно ли, что в этом виноват Excel 2003?

Kablam 21.12.2008 17:10

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

Patrick Cuff 25.12.2008 18:24

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

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

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

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"

Используйте Подпись вместо Имя.

For Each pvtItem In ActiveSheet.PivotTables("PivotTable1").PivotFields("Something").PivotItems
    If Not pvtItem.Caption = "Example" Then
       pvtItem.Visible = False
    End If
Next

Другие вопросы по теме