Сгенерированная макрокомандой ошибка выброса сводной таблицы 5 - PullRequest
0 голосов
/ 05 марта 2020

У меня есть отчет Excel, который требует много шагов для подготовки. Чтобы автоматизировать это, я записал макрос. Я просматривал сгенерированный код, чтобы внести некоторые незначительные исправления, такие как создание таблицы из CurrentSelection вместо жестко заданного значения и фильтрация по вычисленной дате вместо жестко запрограммированной.

При создании третьей сводной таблицы в процессе я получаю следующую ошибку:

Ошибка времени выполнения '5':

Недопустимый вызов процедуры или аргумент

В справке предлагается значение за пределами допустимого или что-то, допустимое для одной платформы, но не для другой. Однако, поскольку это генерирующий код, ни один из них не должен применяться. Вот соответствующий код:

ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
        "Table3", Version:=6).CreatePivotTable TableDestination:= _
        "On Time Pivot!R3C16", TableName:="PivotTable12", DefaultVersion:=6
    Sheets("On Time Pivot").Select
    Cells(3, 16).Select

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

Редактировать на основе предложений

Следуя ссылке в ответе Сандора, я изменил код создания сводной таблицы следующим образом:

Dim pvt_cache As PivotCache
Dim pvt As PivotTable
Dim src_data As String
Dim pvt_location As String
src_data = "Table3"
pvt_location = "On Time Pivot!P3"
Set pvt_cache = ActiveWorkbook.PivotCaches.Create( _
    SourceType:=xlDatabase, SourceData:=src_data)
Set pvt = pvt_cache.CreatePivotTable( _
    TableDestination:=pvt_location, TableName:="PivotTable12")
Cells(3, 16).Select

Теперь я получаю ошибку 5 на линии, где я звоню CreatePivotTable.

Ответы [ 2 ]

0 голосов
/ 09 марта 2020

Проблема решена, но неудовлетворительно. Случайно начало появляться другая ошибка с другой сводной таблицей относительно неправильной установки фильтра. Так как я не смог найти ничего плохого, исправлять фильтр вручную каждый раз, когда я запускаю макрос, не составляет особого труда, и он внезапно начал появляться в коде, которого я не трогал, я заключил его в on error resume next и on error goto 0. Сразу все сообщения об ошибках прекратились, и макрос с тех пор работал правильно. Я не могу представить, как это могло бы исправить это, но я закончил возиться с этим.

0 голосов
/ 06 марта 2020

Это может помочь вам: https://www.thespreadsheetguru.com/blog/2014/9/27/vba-guide-excel-pivot-tables

Sub CreatePivotTable()
'PURPOSE: Creates a brand new Pivot table on a new worksheet from data in the ActiveSheet
'Source: www.TheSpreadsheetGuru.com

Dim sht As Worksheet
Dim pvtCache As PivotCache
Dim pvt As PivotTable
Dim StartPvt As String
Dim SrcData As String

'Determine the data range you want to pivot
  SrcData = ActiveSheet.Name & "!" & Range("A1:R100").Address(ReferenceStyle:=xlR1C1)

'Create a new worksheet
  Set sht = Sheets.Add

'Where do you want Pivot Table to start?
  StartPvt = sht.Name & "!" & sht.Range("A3").Address(ReferenceStyle:=xlR1C1)

'Create Pivot Cache from Source Data
  Set pvtCache = ActiveWorkbook.PivotCaches.Create( _
    SourceType:=xlDatabase, _
    SourceData:=SrcData)

'Create Pivot table from Pivot Cache
  Set pvt = pvtCache.CreatePivotTable( _
    TableDestination:=StartPvt, _
    TableName:="PivotTable1")

End Sub

Добавьте ваши фактические настройки сводки (копия из записанного макроса), например, сумму field2 в строки field1:

ActiveSheet.PivotTables("PivotTable1").AddDataField ActiveSheet.PivotTables( _
    "PivotTable1").PivotFields("field2"), "Sum / field2", xlSum
With ActiveSheet.PivotTables("PivotTable1").PivotFields("field1")
    .Orientation = xlRowField
    .Position = 1
End With

Вы можете изменить «Диапазон» на координаты выбранной области, например строки:

x = Selection.Rows(1).Row
y = Selection.Rows.Count + x - 1

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

Например, отображается только в том случае, если field2 = 6

    With ActiveSheet.PivotTables("PivotTable1").PivotFields("field2")
        .Orientation = xlPageField
        .Position = 1
    End With

    With ActiveSheet.PivotTables("PivotTable1").PivotFields("field2")
        For i = 1 To .PivotItems.Count
            If .PivotItems(i).Value = 6 Then
                .PivotItems(.PivotItems(i).Name).Visible = True
            Else
                .PivotItems(.PivotItems(i).Name).Visible = False
            End If
        Next i
    End With

Измените "= 6" между датами в правильном формате даты.

РЕДАКТИРОВАТЬ

Вы можете создать лист tmp с отфильтрованными строками

Range("A:R").SpecialCells(xlCellTypeVisible).Copy

Или объединить его с Selection.Rows и Selection.Columns и создать сводную таблицу из листа tmp, чем удали это.

...