Вместо этого используйте метод 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