Соединения слайсера не показывают сводный источник данных пост-изменения - PullRequest
1 голос
/ 08 июля 2019

У меня есть две сводные таблицы на двух разных листах (Sheet1 и Sheet2), полученные из общего листа (Sheet3). На сводной таблице на листе 1 создается слайсер. Если мы пойдем сообщать о соединениях, мы увидим обе сводные таблицы в списке.

Теперь я динамически меняю источник сводных данных для обеих сводных таблиц по очереди. Единственное изменение - это расширение диапазона, включающее новые строки, скопированные другим процессом. После выполнения кода в соединениях отчетов больше не отображаются обе сводные таблицы. Это просто показывает один.

с помощью приведенного ниже кода для изменения источника сводных данных.


                    Dim objwrksheet As Worksheet = mWorkBook.Worksheets(mPivotWorksheetname)
                    Dim objwrksheet2 As Worksheet = mWorkBook.Worksheets(mDataWorksheetname)
                    If Not IsNothing(objwrksheet) Then
                        Dim objpivottable As PivotTable = objwrksheet.PivotTables(mPivotTable)
                        If objpivottable IsNot Nothing Then
                            Dim sourceDataRange As Range = objwrksheet2.Range(mSourceRange)
                            Dim cache As PivotCache = mWorkBook.PivotCaches.Create(SourceType:=XlPivotTableSourceType.xlDatabase, SourceData:=sourceDataRange)
                            objpivottable.ChangePivotCache(cache)
                            objpivottable.RefreshTable()
                            mRetval = "Successful"
                        Else
                            mRetval = "Pivot open failed"
                        End If
                    Else
                        mRetval = "Worksheet open failed"
                    End If

Ожидаемый результат должен состоять в том, что после изменения источника данных для обеих сводных таблиц соединения отчетов среза должны продолжать отображать оба сводных имени в списке.

1 Ответ

0 голосов
/ 12 июля 2019

Это общий подход VBA:

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

Если вы измените источники данных нескольких сводных таблиц, вы можете снова переназначить их соединения отчета в пределах среза, если все включенные сводные таблицы основаны на одной и той же PivotCache.

Следовательно, после изменения исходных данных первой сводной таблицы вам придется «повторно использовать» ее новую сводную кэш для всех остальных сводных таблиц. Это «повторное использование» может быть выполнено путем установки PivotTable.CacheIndex, который работает до тех пор, пока дальнейшие сводные таблицы используют те же поля (или их подмножество), что и первая сводная таблица.

Примечание: Чтобы использовать следующий код, все соединения отчета среза должны быть сначала включены (так как SlicerCache.PivotTables возвращает только проверенные соединения отчета).

Private Sub ChangeAllPivotSources()
    Dim objSlicerCache As SlicerCache
    Dim objPivotTable As PivotTable
    Dim objPivotTables() As PivotTable
    Dim i As Long

    ' get the slicercache, e. g. via its first pivottable:
    Set objPivotTable = ActiveWorkbook.Sheets(1).PivotTables(1)
    Set objSlicerCache = objPivotTable.Slicers(1).SlicerCache

    ' dimension array with all pivottable objects of the slicercache
    ReDim objPivotTables(1 To objSlicerCache.PivotTables.Count)

    ' remove all pivottables from slicer's report connections
    For i = objSlicerCache.PivotTables.Count To 1 Step -1
        Set objPivotTables(i) = objSlicerCache.PivotTables(i)
        objSlicerCache.PivotTables.RemovePivotTable objPivotTables(i)
    Next i

    ' create new pivotcache based on a new range for the first pivottable,
    ' use this pivotcache for all other pivottables also
    For i = 1 To UBound(objPivotTables)
        If i = 1 Then
            objPivotTables(i).ChangePivotCache ActiveWorkbook.PivotCaches.Create( _
                SourceType:=xlDatabase, _
                SourceData:=ActiveWorkbook.Sheets(3).Range("A1").CurrentRegion)
        Else
            objPivotTables(i).CacheIndex = objPivotTables(1).PivotCache.Index
        End If
    Next i

    ' reassign the report connections again
    For i = 1 To UBound(objPivotTables)
        objSlicerCache.PivotTables.AddPivotTable objPivotTables(i)
    Next i

End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...