Это может помочь вам: 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, чем удали это.