Как обрабатывать ошибку сводной таблицы при отсутствии поля?

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