Sub CreateNewPivotTables() Dim originalPivotTable As PivotTable Dim newPivotTable As PivotTable Dim pivotField As PivotField Dim newSheet As Worksheet ' Loop through all sheets in the workbook For Each sheet In ThisWorkbook.Worksheets ' Loop through all PivotTables in the sheet For Each originalPivotTable In sheet.PivotTables ' Create a new sheet for the new PivotTable Set newSheet = ThisWorkbook.Worksheets.Add newSheet.Name = originalPivotTable.Name & "_new" ' Create a new PivotTable using the internal Data Model as the data source Set newPivotTable = newSheet.PivotTableWizard( _ SourceType:=xlExternal, _ SourceData:=ThisWorkbook.Connections("ThisWorkbookDataModel"), _ TableDestination:=newSheet.Range("A3")) ' Set the properties of the new PivotTable to match the original PivotTable With newPivotTable .ColumnGrand = originalPivotTable.ColumnGrand .RowGrand = originalPivotTable.RowGrand .ColumnRange.Cells.HorizontalAlignment = originalPivotTable.ColumnRange.Cells.HorizontalAlignment .RowRange.Cells.HorizontalAlignment = originalPivotTable.RowRange.Cells.HorizontalAlignment ' Add fields to the row area For Each pivotField In originalPivotTable.RowFields .PivotFields(pivotField.Name).Orientation = xlRowField .PivotFields(pivotField.Name).Position = pivotField.Position Next pivotField ' Add fields to the column area For Each pivotField In originalPivotTable.ColumnFields .PivotFields(pivotField.Name).Orientation = xlColumnField .PivotFields(pivotField.Name).Position = pivotField.Position Next pivotField ' Add fields to the values area For Each pivotField In originalPivotTable.DataFields .AddDataField .PivotFields(pivotField.Name), _ pivotField.Caption, _ pivotField.Function Next pivotField ' Add fields to the filters area For Each pivotField In originalPivotTable.PageFields .PivotFields(pivotField.Name).Orientation = xlPageField .PivotFields(pivotField.Name).Position = pivotField.Position ' Set filter values to match the original PivotTable If Not IsNull(pivotField.CurrentPage) Then .PivotFields(pivotField.Name).CurrentPage = pivotField.CurrentPage.Value End If If Not IsNull(p If Not IsNull(pivotField.CurrentPageList) Then .PivotFields(pivotField.Name).EnableMultiplePageItems = True For i = 1 To UBound(pivotField.CurrentPageList) .PivotFields(pivotField.Name).CurrentPageList(i) = pivotField.CurrentPageList(i) Next i .PivotFields(pivotField.Name).EnableMultiplePageItems = False End If If Not IsNull(pivotField.VisibleItemsList) Then For i = 1 To UBound(pivotField.VisibleItemsList) .PivotFields(pivotField.Name).VisibleItemsList(i) = pivotField.VisibleItemsList(i) Next i End If Next pivotField End With Next originalPivotTable Next sheet End Sub #comments VBA script that demonstrates how to loop through all of the PivotTables in a workbook, read their properties, and create new PivotTables using the internal Data Model as the data source: This script is intended to serve as a starting point and may need to be modified to fit your specific needs. You can run this script by opening the VBA editor in Excel (by pressing Alt+F11), pasting the script into a new module, and then running the CreateNewPivotTables subroutine.