Авто Refre sh пивот из модели данных - PullRequest
0 голосов
/ 10 апреля 2020

У меня есть электронная таблица, и я создал подфункцию (см. Ниже), чтобы сделать вызов для обновления указанных c сводных таблиц. Одна конкретная сводная таблица («DataModel») имеет текст в качестве значений, поэтому, когда я создал эту сводную таблицу, я добавил ее в модель данных, затем произвел «Добавить меру» и создал строчный код =CONCATENATEX(DataModel,[DataValue],”, “), чтобы я мог поворачиваться на текстовое значение.

В любом случае, когда я запускаю приведенный ниже код, он обновляет все нужные мне сводные таблицы, кроме таблицы, созданной из модели данных. Кто-нибудь знает, как я могу использовать Excel VBA для автоматизации сводной таблицы, созданной из модели данных?

---- вызов модуля ---

Call RefreshPivots("DataModel")

---- Excel VBA Code ---

Public Sub RefreshPivots(ByVal sheetName As String)
Dim sheetExists As Boolean

    sheetExists = False

    For Each ws In Worksheets
        If ws.Name = sheetName Then sheetExists = True
    Next ws

    If sheetExists Then
        Sheets(sheetName).Visible = True
        Sheets(sheetName).Activate

        For Each pivotTab In ActiveSheet.PivotTables
            pivotTab.PivotCache.Refresh
        Next pivotTab
    End If

End Sub

1 Ответ

0 голосов
/ 11 апреля 2020

Вместо этого используйте метод RefreshTable объекта PivotTable.

Кстати, рабочий лист сводной таблицы не должен быть видимым, чтобы обновить sh сводную таблицу.

Кроме того, считается хорошей практикой программирования следовать принципу «Посвящение долгу». В основном это говорит о том, что функция должна быть выделена для выполнения одной вещи, а не чего-либо другого.

Так, например, RefreshPivots должен только ссылаться на sh сводные таблицы. Прежде чем вызывать вашу функцию для обновления сводных таблиц, следует проверить, существует ли рабочая таблица.

Я переписал ваш код соответствующим образом ...

Option Explicit

Sub test()

    Dim worksheetName As String
    worksheetName = "DataModel"

    If Not WorksheetExists(worksheetName) Then
        MsgBox "'" & worksheetName & "' not found!", vbExclamation
        Exit Sub
    End If

    RefreshWorksheetPivots worksheetName

    'make worksheet visible, if so desired

End Sub

Public Function WorksheetExists(ByVal worksheetName As String) As Boolean

    Dim ws As Worksheet

    For Each ws In Worksheets
        If UCase(ws.Name) = UCase(worksheetName) Then 'case-insensitive comparison
            WorksheetExists = True
            Exit Function
        End If
    Next ws

    WorksheetExists = False

End Function

Public Sub RefreshWorksheetPivots(ByVal worksheetName As String)

    Dim pt As PivotTable

    For Each pt In Worksheets(worksheetName).PivotTables
        pt.RefreshTable
    Next pt

End Sub
...