У меня есть набор данных на листе, который каждый раз может отличаться. Я создаю сводную таблицу из этих данных, но возможно, что одного из элементов 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
Я думал, что достаточно хорошо объявил переменные, но, скорее всего, я упускаю что-то очевидное ...





Попробуйте что-то вроде этого:
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 при попытке доступа к уже невидимому сводному элементу; Я думаю, вы можете их игнорировать.
Когда я реализую код, опубликованный Патриком, -
Unable to set the visible property of the PivotItem class
- выдается ошибка.
Microsoft признает наличие ошибки: M $ помощь
Но просто скрыть линию ... это, конечно, не вариант.
Выдается ли эта ошибка сразу или после установки других элементов? Excel не может установить для свойства Visible значение false для всех элементов, потому что для сводной таблицы требуется как минимум одно поле строки, одно поле столбца и один видимый элемент данных. Почему вы устанавливаете элементы невидимыми? Что это решает?
Ответ здесь не поместился, размещен ниже :)
Ошибка выдается в конце цикла. Я объединил оба ответа Патрика в следующее:
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» ...
Я понял! : 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 () и это решение, по крайней мере, в моей книге.
С вашим решением я все еще сталкивался с ошибками ... с этим - нет. Когда я набираю F8 по вашему коду, pivotItem.Name возвращает значение, а не имя. В этом решении возвращается строка. Возможно ли, что в этом виноват Excel 2003?
Я сомневаюсь в этом; Трудно сказать, что происходит, не имея книги и не видя, как определяется ваша сводная таблица и как вы вызываете код. В обоих решениях элемент сводки создается одинаково, поэтому свойство .Name должно быть одинаковым в обоих.
У меня тоже было такое же сообщение об ошибке, когда я пытался установить 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
Извините, я не включил весь код, который у меня есть, этот бит, который я разместил здесь, заключен в блок With. Спасибо за доработку, сейчас попробую. :)