#excel #vba #pivot
#excel #vba #сводная
Вопрос:
Я написал макрос, который включает в себя создание нескольких сводных таблиц из ежемесячных отчетов.
В отчетах не всегда есть все поля, которые необходимо отфильтровать.
Макрос выдает ошибку
Объект не поддерживает это свойство или метод.
Есть ли способ включить оператор IF в команды форматирования таблицы, чтобы он пропускал отсутствующие поля?
Сообщение об ошибке отладки относится к строке: If HasPivotItem(.PivotFields("PH Rel Independent Risk Unit Credit Organization")
Dim PT As Excel.PivotTable
Set PT = ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
"Raw Data!R1C1:R480C37", Version:=xlPivotTableVersion14).CreatePivotTable( _
TableDestination:="'Pivot of Certain Data'!R1C1", TableName:="Pivot of Certain Data", _
DefaultVersion:=xlPivotTableVersion14)
With PT
With .PivotFields( _
"field 1")
.Orientation = xlRowField
.Position = 1
End With
With .PivotFields( _
"field 1")
.PivotItems("item 1").Visible = False
If HasPivotItem(.PivotFields("field 1"), "item 2") Then
.PivotFields("field 1").PivotItems("item 2").Visible = False
End If
.PivotItems("item 3").Visible = False
End With
Ответ №1:
Вы могли бы использовать подобную функцию, чтобы проверить, существует ли элемент:
Private Function HasPivotItem(ByRef pField As PivotField, ByVal Item As String) As Boolean
On Error Resume Next
HasPivotItem = Not IsNull(pField.PivotItems(Item))
On Error GoTo 0
End Function
И используйте его как:
Dim PT As Excel.PivotTable
Set PT = ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
"Raw Data!R1C1:R480C37", Version:=xlPivotTableVersion14).CreatePivotTable( _
TableDestination:="'Pivot of Certain Data'!R1C1", TableName:="Pivot of Certain Data", _
DefaultVersion:=xlPivotTableVersion14)
With PT.PivotFields("field 1")
.Orientation = xlRowField
.Position = 1
.PivotItems("item 1").Visible = False
If HasPivotItem(PT.PivotFields("field 1"), "item 2") Then
.PivotItems("item 2").Visible = False
End If
.PivotItems("item 3").Visible = False
End With
Комментарии:
1. @PEH Я попробовал ваше предложение, но оно выдало ошибку компиляции: «Sub или функция не определены». Ошибка была связана с
If HasPivotItem(**PivotFields**("field 1"), "item 2")
2. @GarrettBremer Я пропустил
.
начало.PivotFields
, чтобы заставить его использовать вашWith
блок. По ошибке исправлено.3. @PEH О, я тоже это пропустил! Я добавил его, но теперь он выдает мне ошибку для всей этой строки: «Объект не поддерживает это свойство или метод».
4. @GarrettBremer хорошо, вы можете отредактировать свой первоначальный вопрос и добавить код, который вы используете?
5. @PEH Я скорректировал свой первоначальный вопрос, чтобы включить больше кода. Я надеюсь, что это поможет прояснить, как все это сочетается.